Add standalone CMake build to generate_build_files.py This change adds a 'cmake' build type to generate_build_files.py, which creates a standalone, CMake build without (most) of the complexities of the full development CMake build. (This is just a sketch for now. Some deduplication of the CMake is called for before landing, presuming that this is useful.) Change-Id: I1f91a8905cabaedf8f9ec588da5784edd67bfed0 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/38744 Reviewed-by: Adam Langley <agl@google.com>
diff --git a/util/generate_build_files.py b/util/generate_build_files.py index 6bd3abc..af02ed0 100644 --- a/util/generate_build_files.py +++ b/util/generate_build_files.py
@@ -1,3 +1,5 @@ +# coding=utf8 + # Copyright (c) 2015, Google Inc. # # Permission to use, copy, modify, and/or distribute this software for any @@ -413,6 +415,177 @@ gypi.write(' }\n}\n') +class CMake(object): + + def __init__(self): + self.header = \ +R'''# Copyright (c) 2019 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +# This file is created by generate_build_files.py. Do not edit manually. + +cmake_minimum_required(VERSION 3.0) + +project(BoringSSL LANGUAGES C CXX) + +if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + set(CLANG 1) +endif() + +if(CMAKE_COMPILER_IS_GNUCXX OR CLANG) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fvisibility=hidden -fno-common -fno-exceptions -fno-rtti") + if(APPLE) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") + endif() + + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden -fno-common") + if((CMAKE_C_COMPILER_VERSION VERSION_GREATER "4.8.99") OR CLANG) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11") + else() + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c99") + endif() +endif() + +# pthread_rwlock_t requires a feature flag. +if(NOT WIN32) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_XOPEN_SOURCE=700") +endif() + +if(WIN32) + add_definitions(-D_HAS_EXCEPTIONS=0) + add_definitions(-DWIN32_LEAN_AND_MEAN) + add_definitions(-DNOMINMAX) + # Allow use of fopen. + add_definitions(-D_CRT_SECURE_NO_WARNINGS) + # VS 2017 and higher supports STL-only warning suppressions. + # A bug in CMake < 3.13.0 may cause the space in this value to + # cause issues when building with NASM. In that case, update CMake. + add_definitions("-D_STL_EXTRA_DISABLED_WARNINGS=4774 4987") +endif() + +add_definitions(-DBORINGSSL_IMPLEMENTATION) + +if(OPENSSL_NO_ASM) + add_definitions(-DOPENSSL_NO_ASM) + set(ARCH "generic") +elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86_64") + set(ARCH "x86_64") +elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "amd64") + set(ARCH "x86_64") +elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "AMD64") + # cmake reports AMD64 on Windows, but we might be building for 32-bit. + if(CMAKE_CL_64) + set(ARCH "x86_64") + else() + set(ARCH "x86") + endif() +elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "x86") + set(ARCH "x86") +elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i386") + set(ARCH "x86") +elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "i686") + set(ARCH "x86") +elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "aarch64") + set(ARCH "aarch64") +elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "arm64") + set(ARCH "aarch64") +# Apple A12 Bionic chipset which is added in iPhone XS/XS Max/XR uses arm64e architecture. +elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "arm64e") + set(ARCH "aarch64") +elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "^arm*") + set(ARCH "arm") +elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "mips") + # Just to avoid the “unknown processor” error. + set(ARCH "generic") +elseif(${CMAKE_SYSTEM_PROCESSOR} STREQUAL "ppc64le") + set(ARCH "ppc64le") +else() + message(FATAL_ERROR "Unknown processor:" ${CMAKE_SYSTEM_PROCESSOR}) +endif() + +if(NOT OPENSSL_NO_ASM) + if(UNIX) + enable_language(ASM) + + # Clang's integerated assembler does not support debug symbols. + if(NOT CMAKE_ASM_COMPILER_ID MATCHES "Clang") + set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -Wa,-g") + endif() + + # CMake does not add -isysroot and -arch flags to assembly. + if(APPLE) + if(CMAKE_OSX_SYSROOT) + set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -isysroot \"${CMAKE_OSX_SYSROOT}\"") + endif() + foreach(arch ${CMAKE_OSX_ARCHITECTURES}) + set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -arch ${arch}") + endforeach() + endif() + else() + set(CMAKE_ASM_NASM_FLAGS "${CMAKE_ASM_NASM_FLAGS} -gcv8") + enable_language(ASM_NASM) + endif() +endif() + +include_directories(src/include) + +''' + + def PrintLibrary(self, out, name, files): + out.write('add_library(\n') + out.write(' %s\n\n' % name) + + for f in sorted(files): + out.write(' %s\n' % PathOf(f)) + + out.write(')\n\n') + + def PrintExe(self, out, name, files, libs): + out.write('add_executable(\n') + out.write(' %s\n\n' % name) + + for f in sorted(files): + out.write(' %s\n' % PathOf(f)) + + out.write(')\n\n') + out.write('target_link_libraries(%s %s)\n\n' % (name, ' '.join(libs))) + + def PrintSection(self, out, name, files): + out.write('set(\n') + out.write(' %s\n\n' % name) + for f in sorted(files): + out.write(' %s\n' % PathOf(f)) + out.write(')\n\n') + + def WriteFiles(self, files, asm_outputs): + with open('CMakeLists.txt', 'w+') as cmake: + cmake.write(self.header) + + for ((osname, arch), asm_files) in asm_outputs: + self.PrintSection(cmake, 'CRYPTO_%s_%s_SOURCES' % (osname, arch), + asm_files) + + cmake.write( +R'''if(APPLE AND ${ARCH} STREQUAL "aarch64") + set(CRYPTO_ARCH_SOURCES ${CRYPTO_ios_aarch64_SOURCES}) +elseif(APPLE AND ${ARCH} STREQUAL "arm") + set(CRYPTO_ARCH_SOURCES ${CRYPTO_ios_arm_SOURCES}) +elseif(APPLE) + set(CRYPTO_ARCH_SOURCES ${CRYPTO_mac_${ARCH}_SOURCES}) +elseif(UNIX) + set(CRYPTO_ARCH_SOURCES ${CRYPTO_linux_${ARCH}_SOURCES}) +elseif(WIN32) + set(CRYPTO_ARCH_SOURCES ${CRYPTO_win_${ARCH}_SOURCES}) +endif() + +''') + + self.PrintLibrary(cmake, 'crypto', + files['crypto'] + ['${CRYPTO_ARCH_SOURCES}']) + self.PrintLibrary(cmake, 'ssl', files['ssl']) + self.PrintExe(cmake, 'bssl', files['tool'], + ['ssl', 'crypto', '-lpthread']) def FindCMakeFiles(directory): """Returns list of all CMakeLists.txt files recursively in directory.""" @@ -781,6 +954,8 @@ platforms.append(GN()) elif s == 'gyp': platforms.append(GYP()) + elif s == 'cmake': + platforms.append(CMake()) else: parser.print_help() sys.exit(1)