From 22b15345e169682159888ac17c0b600a1efa35ac Mon Sep 17 00:00:00 2001 From: David Benjamin Date: Sun, 29 Jan 2023 16:34:48 -0500 Subject: [PATCH] Move Go CMake support into its own file. Slowly reduce clutter in the top-level CMake file. Change-Id: Ib7ca2aee7337db82ed1989c56bbaaf6ee5da0768 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/56569 Reviewed-by: Bob Beck Commit-Queue: David Benjamin (cherry picked from commit 261ec612e21b81a4c16bbda615d0850556483b4f) --- CMakeLists.txt | 49 +++----------------------------------------- cmake/go.cmake | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 46 deletions(-) create mode 100644 cmake/go.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index d16b5740d5..f79264b6c6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,6 +21,7 @@ option(BUILD_LIBSSL "Build libssl for AWS-LC" ON) option(DISABLE_PERL "Disable Perl for AWS-LC" OFF) option(DISABLE_GO "Disable Go for AWS-LC" OFF) option(ENABLE_FIPS_ENTROPY_CPU_JITTER "Enable FIPS entropy source: CPU Jitter" OFF) +include(cmake/go.cmake) enable_language(C) @@ -71,21 +72,15 @@ install(DIRECTORY include/openssl ) if(ANDROID) - # Android-NDK CMake files reconfigure the path and so Go and Perl won't be - # found. However, ninja will still find them in $PATH if we just name them. + # Android-NDK CMake files reconfigure the path and so Perl won't be found. + # However, ninja will still find them in $PATH if we just name them. if(NOT DISABLE_PERL AND NOT PERL_EXECUTABLE) set(PERL_EXECUTABLE "perl") endif() - if(NOT DISABLE_GO AND NOT GO_EXECUTABLE) - set(GO_EXECUTABLE "go") - endif() else() if(NOT DISABLE_PERL) find_package(Perl) endif() - if(NOT DISABLE_GO) - find_program(GO_EXECUTABLE go) - endif() endif() if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux" AND NOT CMAKE_CROSSCOMPILING) @@ -102,9 +97,6 @@ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux" AND NOT CMAKE_CROSSCOMPILING) endif() endif() -if(NOT GO_EXECUTABLE) - message(STATUS "Go not found. Disabling some code generation and using pre-generated code in generated-src/") -endif() if (NOT PERL_EXECUTABLE) message(STATUS "Perl not found. Disabling some code generation and using pre-generated code in generated-src/") endif() @@ -679,41 +671,6 @@ if(CONSTANT_TIME_VALIDATION) add_definitions(-DNDEBUG) endif() -function(go_executable dest package) - set(godeps "${PROJECT_SOURCE_DIR}/util/godeps.go") - if(CMAKE_VERSION VERSION_LESS "3.7" OR NOT CMAKE_GENERATOR STREQUAL "Ninja") - # The DEPFILE parameter to add_custom_command is new as of CMake 3.7 and - # only works with Ninja. Query the sources at configure time. Additionally, - # everything depends on go.mod. That affects what external packages to use. - execute_process(COMMAND ${GO_EXECUTABLE} run ${godeps} -format cmake - -pkg ${package} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - OUTPUT_VARIABLE sources - RESULT_VARIABLE godeps_result) - add_custom_command(OUTPUT ${dest} - COMMAND ${GO_EXECUTABLE} build - -o ${CMAKE_CURRENT_BINARY_DIR}/${dest} ${package} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - DEPENDS ${sources} ${PROJECT_SOURCE_DIR}/go.mod) - else() - # Ninja expects the target in the depfile to match the output. This is a - # relative path from the build directory. - string(LENGTH "${PROJECT_BINARY_DIR}" root_dir_length) - math(EXPR root_dir_length "${root_dir_length} + 1") - string(SUBSTRING "${CMAKE_CURRENT_BINARY_DIR}" ${root_dir_length} -1 target) - set(target "${target}/${dest}") - - set(depfile "${CMAKE_CURRENT_BINARY_DIR}/${dest}.d") - add_custom_command(OUTPUT ${dest} - COMMAND ${GO_EXECUTABLE} build - -o ${CMAKE_CURRENT_BINARY_DIR}/${dest} ${package} - COMMAND ${GO_EXECUTABLE} run ${godeps} -format depfile - -target ${target} -pkg ${package} -out ${depfile} - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - DEPENDS ${godeps} ${PROJECT_SOURCE_DIR}/go.mod - DEPFILE ${depfile}) - endif() -endfunction() # CMake's iOS support uses Apple's multiple-architecture toolchain. It takes an # architecture list from CMAKE_OSX_ARCHITECTURES, leaves CMAKE_SYSTEM_PROCESSOR diff --git a/cmake/go.cmake b/cmake/go.cmake new file mode 100644 index 0000000000..c05e2f06e0 --- /dev/null +++ b/cmake/go.cmake @@ -0,0 +1,55 @@ +if(ANDROID) + # Android-NDK CMake files reconfigure the path and so Go won't be found. + # However, ninja will still find them in $PATH if we just name them. + if(NOT DISABLE_GO AND NOT GO_EXECUTABLE) + set(GO_EXECUTABLE "go") + endif() +else() + if(NOT DISABLE_GO) + find_program(GO_EXECUTABLE go) + endif() +endif() + +if(NOT GO_EXECUTABLE AND NOT DISABLE_GO) + message(FATAL_ERROR "Could not find Go") +endif() + +function(go_executable dest package) + set(godeps "${CMAKE_SOURCE_DIR}/util/godeps.go") + if(NOT CMAKE_GENERATOR STREQUAL "Ninja") + # The DEPFILE parameter to add_custom_command only works with Ninja. Query + # the sources at configure time. Additionally, everything depends on go.mod. + # That affects what external packages to use. + # + # TODO(davidben): Starting CMake 3.20, it also works with Make. Starting + # 3.21, it works with Visual Studio and Xcode too. + execute_process(COMMAND ${GO_EXECUTABLE} run ${godeps} -format cmake + -pkg ${package} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + OUTPUT_VARIABLE sources + RESULT_VARIABLE godeps_result) + add_custom_command(OUTPUT ${dest} + COMMAND ${GO_EXECUTABLE} build + -o ${CMAKE_CURRENT_BINARY_DIR}/${dest} ${package} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DEPENDS ${sources} ${CMAKE_SOURCE_DIR}/go.mod) + else() + # Ninja expects the target in the depfile to match the output. This is a + # relative path from the build directory. + string(LENGTH "${CMAKE_BINARY_DIR}" root_dir_length) + math(EXPR root_dir_length "${root_dir_length} + 1") + string(SUBSTRING "${CMAKE_CURRENT_BINARY_DIR}" ${root_dir_length} -1 target) + set(target "${target}/${dest}") + + set(depfile "${CMAKE_CURRENT_BINARY_DIR}/${dest}.d") + add_custom_command(OUTPUT ${dest} + COMMAND ${GO_EXECUTABLE} build + -o ${CMAKE_CURRENT_BINARY_DIR}/${dest} ${package} + COMMAND ${GO_EXECUTABLE} run ${godeps} -format depfile + -target ${target} -pkg ${package} -out ${depfile} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + DEPENDS ${godeps} ${CMAKE_SOURCE_DIR}/go.mod + DEPFILE ${depfile}) + endif() +endfunction() +