blob: 51ecb45ced49ec61839e3114ca56724dc26621fc [file] [log] [blame]
David Benjamin8378dad2024-01-23 15:22:45 -05001find_program(GO_EXECUTABLE go)
David Benjamin261ec612023-01-29 16:34:48 -05002if(NOT GO_EXECUTABLE)
3 message(FATAL_ERROR "Could not find Go")
4endif()
5
6function(go_executable dest package)
David Benjamin8c4ec3b2023-02-27 12:46:12 -05007 set(godeps "${PROJECT_SOURCE_DIR}/util/godeps.go")
David Benjamin261ec612023-01-29 16:34:48 -05008 if(NOT CMAKE_GENERATOR STREQUAL "Ninja")
9 # The DEPFILE parameter to add_custom_command only works with Ninja. Query
10 # the sources at configure time. Additionally, everything depends on go.mod.
11 # That affects what external packages to use.
12 #
13 # TODO(davidben): Starting CMake 3.20, it also works with Make. Starting
14 # 3.21, it works with Visual Studio and Xcode too.
15 execute_process(COMMAND ${GO_EXECUTABLE} run ${godeps} -format cmake
16 -pkg ${package}
17 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
18 OUTPUT_VARIABLE sources
19 RESULT_VARIABLE godeps_result)
20 add_custom_command(OUTPUT ${dest}
21 COMMAND ${GO_EXECUTABLE} build
22 -o ${CMAKE_CURRENT_BINARY_DIR}/${dest} ${package}
23 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
David Benjamin8c4ec3b2023-02-27 12:46:12 -050024 DEPENDS ${sources} ${PROJECT_SOURCE_DIR}/go.mod)
David Benjamin261ec612023-01-29 16:34:48 -050025 else()
26 # Ninja expects the target in the depfile to match the output. This is a
27 # relative path from the build directory.
David Benjaminb0b1f9d2023-04-19 17:18:27 -040028 binary_dir_relative_path(${dest} target)
David Benjamin261ec612023-01-29 16:34:48 -050029
30 set(depfile "${CMAKE_CURRENT_BINARY_DIR}/${dest}.d")
31 add_custom_command(OUTPUT ${dest}
32 COMMAND ${GO_EXECUTABLE} build
33 -o ${CMAKE_CURRENT_BINARY_DIR}/${dest} ${package}
34 COMMAND ${GO_EXECUTABLE} run ${godeps} -format depfile
35 -target ${target} -pkg ${package} -out ${depfile}
36 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
David Benjamin8c4ec3b2023-02-27 12:46:12 -050037 DEPENDS ${godeps} ${PROJECT_SOURCE_DIR}/go.mod
David Benjamin261ec612023-01-29 16:34:48 -050038 DEPFILE ${depfile})
39 endif()
40endfunction()
41