Improve passing flags to Go build system

* Pass C/C++ flags from CMake to CGo
* Allow overriding flags passed via "-ldflags"
* Add default GOFLAGS and add CMake variable to override GOFLAGS
    * `-trimpath`: Prevent embedding full paths
    * `-modcacherw`: Ensure that go modules creates a write-able path
    * `-mod=readonly`: Ensure the module files are not updated in any go actions
This commit is contained in:
Martchus 2020-10-31 21:50:24 +01:00
parent dfe7091eb5
commit 0348c78e98
1 changed files with 21 additions and 6 deletions

View File

@ -38,6 +38,7 @@ elseif (CMAKE_SYSTEM_NAME MATCHES "(ppc64|ppc64le|arm|arm64|s390x)")
else ()
message(FATAL_ERROR "Unable to auto-determine GOARCH. Please set GO_TARGET_ARCH_OVERRIDE manually.")
endif ()
# determine GOOS for target
set(GO_TARGET_OS_OVERRIDE
""
@ -61,6 +62,16 @@ else ()
endif ()
message(STATUS "Using GOOS=${GO_TARGET_OS} and GOARCH=${GO_TARGET_ARCH}")
# define default GOFLAGS
set(GO_FLAGS_OVERRIDE
""
CACHE STRING "overrides the 'GOFLAGS' variable")
if (GO_FLAGS_OVERRIDE)
set(GO_FLAGS "${GO_FLAGS_OVERRIDE}")
else ()
set(GO_FLAGS "-trimpath -mod=readonly -modcacherw")
endif ()
# locate the Syncthing checkout
set(GO_DEVELOPMENT_PATH
"${CMAKE_CURRENT_SOURCE_DIR}/go"
@ -100,7 +111,10 @@ list(APPEND SRC_FILES_SYNCTHING "${SYNCTHING_PATH}/${GENERATED_SYNCTHING_GUI_FIL
message(STATUS "Syncthing's source files: ${SRC_FILES_SYNCTHING}")
# set Go linker flags
set(GO_LINKER_FLAGS)
set(GO_LINKER_FLAGS_OVERRIDE
""
CACHE STRING "overrides flags passed to Go's build system via -ldflags")
set(GO_LINKER_FLAGS "${GO_LINKER_FLAGS_OVERRIDE}")
if (CMAKE_BUILD_TYPE STREQUAL Release OR CMAKE_BUILD_TYPE STREQUAL MinSizeRel)
set(GO_LINKER_FLAGS "${GO_LINKER_FLAGS} -w")
endif ()
@ -125,8 +139,8 @@ endif ()
# generate Syncthing's assets (not setting GOARCH/GOOS here, this is supposed to run on the host)
add_custom_command(
OUTPUT "${SYNCTHING_PATH}/${GENERATED_SYNCTHING_GUI_FILES_RELATIVE_PATH}"
COMMAND "GOPATH=${GO_DEVELOPMENT_PATH}" "GO111MODULE=on" "${GO_BIN}" run ./script/genassets.go gui >
"${GENERATED_SYNCTHING_GUI_FILES_RELATIVE_PATH}"
COMMAND "GO111MODULE=on" "GOPATH=${GO_DEVELOPMENT_PATH}" "GOFLAGS=${GO_FLAGS}" "${GO_BIN}" run ./script/genassets.go gui
> "${GENERATED_SYNCTHING_GUI_FILES_RELATIVE_PATH}"
DEPENDS ${SRC_FILES_SYNCTHING_ASSETS}
WORKING_DIRECTORY "${SYNCTHING_PATH}"
COMMENT "Building Syncthing's assets")
@ -138,9 +152,10 @@ add_custom_command(
OUTPUT "${SYNCTHINGINTERNAL_LIBRARY_PATH}" "${SYNCTHINGINTERNAL_HEADER_PATH}"
COMMAND
"CC=${CMAKE_C_COMPILER}" "CXX=${CMAKE_CXX_COMPILER}" "AR=${CMAKE_C_COMPILER_AR}" "GOOS=${GO_TARGET_OS}"
"GOARCH=${GO_TARGET_ARCH}" "CGO_ENABLED=1" "GO111MODULE=on" "GOPATH=${GO_DEVELOPMENT_PATH}" "${GO_BIN}" build -v
-buildmode c-archive -o "${SYNCTHINGINTERNAL_LIBRARY_PATH}" -ldflags "${GO_LINKER_FLAGS}" ./c-bindings &&
"${CMAKE_RANLIB}" "${SYNCTHINGINTERNAL_LIBRARY_PATH}"
"CGO_CFLAGS=${CMAKE_C_FLAGS}" "CGO_CXXFLAGS=${CMAKE_CXX_FLAGS}" "GOARCH=${GO_TARGET_ARCH}" "CGO_ENABLED=1"
"GO111MODULE=on" "GOPATH=${GO_DEVELOPMENT_PATH}" "GOFLAGS=${GO_FLAGS}" "${GO_BIN}" build -v -buildmode c-archive -o
"${SYNCTHINGINTERNAL_LIBRARY_PATH}" -ldflags "${GO_LINKER_FLAGS}" ./c-bindings && "${CMAKE_RANLIB}"
"${SYNCTHINGINTERNAL_LIBRARY_PATH}"
DEPENDS ${SRC_FILES_SYNCTHING}
WORKING_DIRECTORY "${SYNCTHING_PATH}"
COMMENT "Building Syncthing itself")