1*8fb009dcSAndroid Build Coastguard Worker# Go is an optional dependency. It's a necessary dependency if running tests or 2*8fb009dcSAndroid Build Coastguard Worker# the FIPS build, which will check these. 3*8fb009dcSAndroid Build Coastguard Workerfind_program(GO_EXECUTABLE go) 4*8fb009dcSAndroid Build Coastguard Worker 5*8fb009dcSAndroid Build Coastguard Workerfunction(require_go) 6*8fb009dcSAndroid Build Coastguard Worker if(NOT GO_EXECUTABLE) 7*8fb009dcSAndroid Build Coastguard Worker message(FATAL_ERROR "Could not find Go") 8*8fb009dcSAndroid Build Coastguard Worker endif() 9*8fb009dcSAndroid Build Coastguard Workerendfunction() 10*8fb009dcSAndroid Build Coastguard Worker 11*8fb009dcSAndroid Build Coastguard Workerfunction(go_executable dest package) 12*8fb009dcSAndroid Build Coastguard Worker require_go() 13*8fb009dcSAndroid Build Coastguard Worker set(godeps "${PROJECT_SOURCE_DIR}/util/godeps.go") 14*8fb009dcSAndroid Build Coastguard Worker if(NOT CMAKE_GENERATOR STREQUAL "Ninja") 15*8fb009dcSAndroid Build Coastguard Worker # The DEPFILE parameter to add_custom_command only works with Ninja. Query 16*8fb009dcSAndroid Build Coastguard Worker # the sources at configure time. Additionally, everything depends on go.mod. 17*8fb009dcSAndroid Build Coastguard Worker # That affects what external packages to use. 18*8fb009dcSAndroid Build Coastguard Worker # 19*8fb009dcSAndroid Build Coastguard Worker # TODO(davidben): Starting CMake 3.20, it also works with Make. Starting 20*8fb009dcSAndroid Build Coastguard Worker # 3.21, it works with Visual Studio and Xcode too. 21*8fb009dcSAndroid Build Coastguard Worker execute_process(COMMAND ${GO_EXECUTABLE} run ${godeps} -format cmake 22*8fb009dcSAndroid Build Coastguard Worker -pkg ${package} 23*8fb009dcSAndroid Build Coastguard Worker WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 24*8fb009dcSAndroid Build Coastguard Worker OUTPUT_VARIABLE sources 25*8fb009dcSAndroid Build Coastguard Worker RESULT_VARIABLE godeps_result) 26*8fb009dcSAndroid Build Coastguard Worker add_custom_command(OUTPUT ${dest} 27*8fb009dcSAndroid Build Coastguard Worker COMMAND ${GO_EXECUTABLE} build 28*8fb009dcSAndroid Build Coastguard Worker -o ${CMAKE_CURRENT_BINARY_DIR}/${dest} ${package} 29*8fb009dcSAndroid Build Coastguard Worker WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 30*8fb009dcSAndroid Build Coastguard Worker DEPENDS ${sources} ${PROJECT_SOURCE_DIR}/go.mod) 31*8fb009dcSAndroid Build Coastguard Worker else() 32*8fb009dcSAndroid Build Coastguard Worker # Ninja expects the target in the depfile to match the output. This is a 33*8fb009dcSAndroid Build Coastguard Worker # relative path from the build directory. 34*8fb009dcSAndroid Build Coastguard Worker binary_dir_relative_path(${dest} target) 35*8fb009dcSAndroid Build Coastguard Worker 36*8fb009dcSAndroid Build Coastguard Worker set(depfile "${CMAKE_CURRENT_BINARY_DIR}/${dest}.d") 37*8fb009dcSAndroid Build Coastguard Worker add_custom_command(OUTPUT ${dest} 38*8fb009dcSAndroid Build Coastguard Worker COMMAND ${GO_EXECUTABLE} build 39*8fb009dcSAndroid Build Coastguard Worker -o ${CMAKE_CURRENT_BINARY_DIR}/${dest} ${package} 40*8fb009dcSAndroid Build Coastguard Worker COMMAND ${GO_EXECUTABLE} run ${godeps} -format depfile 41*8fb009dcSAndroid Build Coastguard Worker -target ${target} -pkg ${package} -out ${depfile} 42*8fb009dcSAndroid Build Coastguard Worker WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 43*8fb009dcSAndroid Build Coastguard Worker DEPENDS ${godeps} ${PROJECT_SOURCE_DIR}/go.mod 44*8fb009dcSAndroid Build Coastguard Worker DEPFILE ${depfile}) 45*8fb009dcSAndroid Build Coastguard Worker endif() 46*8fb009dcSAndroid Build Coastguard Workerendfunction() 47*8fb009dcSAndroid Build Coastguard Worker 48