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 <bbe@google.com>
Commit-Queue: David Benjamin <davidben@google.com>
diff --git a/CMakeLists.txt b/CMakeLists.txt
index a2d45ae..9fa818c 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -16,6 +16,7 @@
endif()
include(sources.cmake)
+include(cmake/go.cmake)
include(cmake/perlasm.cmake)
enable_language(C)
@@ -29,17 +30,13 @@
add_custom_target(global_target)
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 PERL_EXECUTABLE)
set(PERL_EXECUTABLE "perl")
endif()
- if(NOT GO_EXECUTABLE)
- set(GO_EXECUTABLE "go")
- endif()
else()
find_package(Perl REQUIRED)
- find_program(GO_EXECUTABLE go)
endif()
if(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND NOT CMAKE_CROSSCOMPILING)
@@ -56,10 +53,6 @@
endif()
endif()
-if(NOT GO_EXECUTABLE)
- message(FATAL_ERROR "Could not find Go")
-endif()
-
if(USE_CUSTOM_LIBCXX)
set(BORINGSSL_ALLOW_CXX_RUNTIME 1)
endif()
@@ -365,45 +358,6 @@
add_definitions(-DBORINGSSL_MALLOC_FAILURE_TESTING)
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()
-
if(OPENSSL_NO_ASM)
add_definitions(-DOPENSSL_NO_ASM)
endif()
diff --git a/cmake/go.cmake b/cmake/go.cmake
new file mode 100644
index 0000000..6aca79a
--- /dev/null
+++ b/cmake/go.cmake
@@ -0,0 +1,53 @@
+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 GO_EXECUTABLE)
+ set(GO_EXECUTABLE "go")
+ endif()
+else()
+ find_program(GO_EXECUTABLE go)
+endif()
+
+if(NOT GO_EXECUTABLE)
+ 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()
+