parent
34a268624b
commit
a0141624b9
4 changed files with 175 additions and 24 deletions
|
|
@ -5,6 +5,58 @@
|
|||
## Find the absolute path to the go build tool.
|
||||
find_program(GOLANG_BUILD_TOOL NAMES go REQUIRED)
|
||||
|
||||
## Build a library file from a golang project.
|
||||
function(build_go_archive OUTPUT_NAME MODULE_FILE)
|
||||
cmake_parse_arguments(GOBUILD
|
||||
""
|
||||
"GOOS;GOARCH"
|
||||
"CGO_CFLAGS;CGO_LDFLAGS;SOURCES"
|
||||
${ARGN})
|
||||
|
||||
string(REGEX REPLACE "\\.[^/]*$" ".h" GOBUILD_HEADER_FILE ${OUTPUT_NAME})
|
||||
get_filename_component(GOBUILD_MODULE_ABS ${MODULE_FILE} ABSOLUTE)
|
||||
get_filename_component(GOBUILD_MODULE_DIR ${GOBUILD_MODULE_ABS} DIRECTORY)
|
||||
set(GOBUILD_ARGS -buildmode=c-archive -trimpath -v)
|
||||
if(IS_DIRECTORY ${GOBUILD_MODULE_DIR}/vendor)
|
||||
list(APPEND GOBUILD_ARGS -mod vendor)
|
||||
endif()
|
||||
|
||||
## Collect arguments, or find their defaults.
|
||||
if(NOT GOBUILD_CGO_CFLAGS)
|
||||
execute_process(OUTPUT_VARIABLE GOBUILD_CGO_CFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE COMMAND ${GOLANG_BUILD_TOOL} env CGO_CFLAGS)
|
||||
separate_arguments(GOBUILD_CGO_CFLAGS NATIVE_COMMAND ${GOBUILD_CGO_CFLAGS})
|
||||
endif()
|
||||
if(NOT GOBUILD_CGO_LDFLAGS)
|
||||
execute_process(OUTPUT_VARIABLE GOBUILD_CGO_LDFLAGS OUTPUT_STRIP_TRAILING_WHITESPACE COMMAND ${GOLANG_BUILD_TOOL} env CGO_LDFLAGS)
|
||||
separate_arguments(GOBUILD_CGO_LDFLAGS NATIVE_COMMAND ${GOBUILD_CGO_LDFLAGS})
|
||||
endif()
|
||||
if(NOT GOBUILD_GOOS)
|
||||
execute_process(OUTPUT_VARIABLE GOBUILD_GOOS OUTPUT_STRIP_TRAILING_WHITESPACE COMMAND ${GOLANG_BUILD_TOOL} env GOOS)
|
||||
endif()
|
||||
if(NOT GOBUILD_GOARCH)
|
||||
execute_process(OUTPUT_VARIABLE GOBUILD_GOARCH OUTPUT_STRIP_TRAILING_WHITESPACE COMMAND ${GOLANG_BUILD_TOOL} env GOARCH)
|
||||
endif()
|
||||
|
||||
## Use a go-cache isolated to our project
|
||||
set(GOCACHE ${CMAKE_BINARY_DIR}/go-cache)
|
||||
set_directory_properties(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ${CMAKE_BINARY_DIR}/go-cache)
|
||||
|
||||
## The command that does the building
|
||||
get_filename_component(ABS_OUTPUT_NAME ${OUTPUT_NAME} ABSOLUTE)
|
||||
add_custom_command(
|
||||
OUTPUT ${OUTPUT_NAME} ${GOBUILD_HEADER_FILE}
|
||||
DEPENDS ${MODULE_FILE} ${GOBUILD_SOURCES}
|
||||
WORKING_DIRECTORY ${GOBUILD_MODULE_DIR}
|
||||
COMMAND ${CMAKE_COMMAND} -E env GOCACHE=${GOCACHE}
|
||||
CGO_ENABLED=1
|
||||
CGO_CFLAGS="${GOBUILD_CGO_CFLAGS}"
|
||||
CGO_LDFLAGS="${GOBUILD_CGO_LDFLAGS}"
|
||||
GOOS=${GOBUILD_GOOS}
|
||||
GOARCH=${GOBUILD_GOARCH}
|
||||
${GOLANG_BUILD_TOOL} build ${GOBUILD_ARGS} -o ${ABS_OUTPUT_NAME}
|
||||
)
|
||||
endfunction(build_go_archive)
|
||||
|
||||
## Create a library target built from a golang c-archive.
|
||||
function(add_go_library GOTARGET SOURCE)
|
||||
cmake_parse_arguments(GOLANG
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue