b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame^] | 1 | # |
| 2 | # Copyright (C) 2020 Jeffery To |
| 3 | # |
| 4 | # This is free software, licensed under the GNU General Public License v2. |
| 5 | # See /LICENSE for more information. |
| 6 | # |
| 7 | |
| 8 | ifeq ($(origin GO_INCLUDE_DIR),undefined) |
| 9 | GO_INCLUDE_DIR:=$(dir $(lastword $(MAKEFILE_LIST))) |
| 10 | endif |
| 11 | |
| 12 | include $(GO_INCLUDE_DIR)/golang-values.mk |
| 13 | |
| 14 | |
| 15 | # these variables have the same meanings as in golang-package.mk |
| 16 | GO_HOST_INSTALL_EXTRA?=$(GO_PKG_INSTALL_EXTRA) |
| 17 | GO_HOST_INSTALL_ALL?=$(GO_PKG_INSTALL_ALL) |
| 18 | GO_HOST_SOURCE_ONLY?=$(GO_PKG_SOURCE_ONLY) |
| 19 | GO_HOST_BUILD_PKG?=$(GO_PKG_BUILD_PKG) |
| 20 | GO_HOST_EXCLUDES?=$(GO_PKG_EXCLUDES) |
| 21 | GO_HOST_GO_GENERATE?=$(GO_PKG_GO_GENERATE) |
| 22 | GO_HOST_GCFLAGS?=$(GO_PKG_GCFLAGS) |
| 23 | GO_HOST_LDFLAGS?=$(GO_PKG_LDFLAGS) |
| 24 | GO_HOST_LDFLAGS_X?=$(GO_PKG_LDFLAGS_X) |
| 25 | GO_HOST_TAGS?=$(GO_PKG_TAGS) |
| 26 | GO_HOST_INSTALL_BIN_PATH?=/bin |
| 27 | |
| 28 | |
| 29 | # need to repeat this here in case golang-package.mk is not included |
| 30 | GO_PKG_BUILD_PKG?=$(strip $(GO_PKG))/... |
| 31 | |
| 32 | GO_HOST_WORK_DIR_NAME:=.go_work |
| 33 | GO_HOST_BUILD_DIR=$(HOST_BUILD_DIR)/$(GO_HOST_WORK_DIR_NAME)/build |
| 34 | GO_HOST_BUILD_BIN_DIR=$(GO_HOST_BUILD_DIR)/bin |
| 35 | |
| 36 | GO_HOST_BUILD_DEPENDS_PATH:=/share/gocode |
| 37 | GO_HOST_BUILD_DEPENDS_SRC=$(STAGING_DIR_HOSTPKG)$(GO_HOST_BUILD_DEPENDS_PATH)/src |
| 38 | |
| 39 | GO_HOST_DIR_NAME:=$(lastword $(subst /,$(space),$(CURDIR))) |
| 40 | GO_HOST_STAGING_DIR:=$(TMP_DIR)/host-stage-$(GO_HOST_DIR_NAME) |
| 41 | GO_HOST_STAGING_FILES_LIST_DIR:=$(HOST_BUILD_PREFIX)/stamp |
| 42 | GO_HOST_BIN_STAGING_FILES_LIST:=$(GO_HOST_STAGING_FILES_LIST_DIR)/$(GO_HOST_DIR_NAME)-bin.list |
| 43 | GO_HOST_SRC_STAGING_FILES_LIST:=$(GO_HOST_STAGING_FILES_LIST_DIR)/$(GO_HOST_DIR_NAME)-src.list |
| 44 | |
| 45 | ifeq ($(GO_HOST_PIE_SUPPORTED),1) |
| 46 | GO_HOST_ENABLE_PIE:=1 |
| 47 | endif |
| 48 | |
| 49 | GO_HOST_BUILD_CONFIG_VARS= \ |
| 50 | GO_PKG="$(strip $(GO_PKG))" \ |
| 51 | GO_INSTALL_EXTRA="$(strip $(GO_HOST_INSTALL_EXTRA))" \ |
| 52 | GO_INSTALL_ALL="$(strip $(GO_HOST_INSTALL_ALL))" \ |
| 53 | GO_SOURCE_ONLY="$(strip $(GO_HOST_SOURCE_ONLY))" \ |
| 54 | GO_BUILD_PKG="$(strip $(GO_HOST_BUILD_PKG))" \ |
| 55 | GO_EXCLUDES="$(strip $(GO_HOST_EXCLUDES))" \ |
| 56 | GO_GO_GENERATE="$(strip $(GO_HOST_GO_GENERATE))" \ |
| 57 | GO_INSTALL_BIN_PATH="$(strip $(GO_HOST_INSTALL_BIN_PATH))" \ |
| 58 | BUILD_DIR="$(HOST_BUILD_DIR)" \ |
| 59 | GO_BUILD_DIR="$(GO_HOST_BUILD_DIR)" \ |
| 60 | GO_BUILD_BIN_DIR="$(GO_HOST_BUILD_BIN_DIR)" \ |
| 61 | GO_BUILD_DEPENDS_PATH="$(GO_HOST_BUILD_DEPENDS_PATH)" \ |
| 62 | GO_BUILD_DEPENDS_SRC="$(GO_HOST_BUILD_DEPENDS_SRC)" |
| 63 | |
| 64 | GO_HOST_MORE_CFLAGS?= \ |
| 65 | -Wformat -Werror=format-security \ |
| 66 | -fstack-protector-strong \ |
| 67 | -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 \ |
| 68 | -Wl,-z,now -Wl,-z,relro \ |
| 69 | $(if $(GO_HOST_ENABLE_PIE),$(FPIC)) |
| 70 | |
| 71 | GO_HOST_MORE_LDFLAGS?= \ |
| 72 | -znow -zrelro \ |
| 73 | $(if $(GO_HOST_ENABLE_PIE),$(FPIC) -specs=$(INCLUDE_DIR)/hardened-ld-pie.specs) |
| 74 | |
| 75 | GO_HOST_TARGET_VARS= \ |
| 76 | CGO_ENABLED=1 \ |
| 77 | CC=gcc \ |
| 78 | CXX=g++ \ |
| 79 | PKG_CONFIG=pkg-config \ |
| 80 | CGO_CFLAGS="$(HOST_CFLAGS) $(GO_HOST_MORE_CFLAGS)" \ |
| 81 | CGO_CPPFLAGS="$(HOST_CPPFLAGS) $(GO_HOST_MORE_CPPFLAGS)" \ |
| 82 | CGO_CXXFLAGS="$(HOST_CFLAGS) $(GO_HOST_MORE_CFLAGS)" \ |
| 83 | CGO_LDFLAGS="$(HOST_LDFLAGS) $(GO_HOST_MORE_LDFLAGS)" \ |
| 84 | GO_GCC_HELPER_CC="$(HOSTCC)" \ |
| 85 | GO_GCC_HELPER_CXX="$(HOSTCXX)" \ |
| 86 | GO_GCC_HELPER_PATH="$$$$PATH" \ |
| 87 | PATH="$(STAGING_DIR_HOSTPKG)/lib/go-cross/openwrt:$$$$PATH" |
| 88 | |
| 89 | GO_HOST_BUILD_VARS= \ |
| 90 | GOPATH="$(GO_HOST_BUILD_DIR)" \ |
| 91 | GOCACHE="$(GO_BUILD_CACHE_DIR)" \ |
| 92 | GOMODCACHE="$(GO_MOD_CACHE_DIR)" \ |
| 93 | GOENV=off |
| 94 | |
| 95 | GO_HOST_VARS= \ |
| 96 | $(GO_HOST_TARGET_VARS) \ |
| 97 | $(GO_HOST_BUILD_VARS) |
| 98 | |
| 99 | GO_HOST_DEFAULT_LDFLAGS= \ |
| 100 | -linkmode external \ |
| 101 | -extldflags '$(patsubst -z%,-Wl$(comma)-z$(comma)%,$(HOST_LDFLAGS) $(GO_HOST_MORE_LDFLAGS))' |
| 102 | |
| 103 | GO_HOST_CUSTOM_LDFLAGS= \ |
| 104 | $(GO_HOST_LDFLAGS) \ |
| 105 | $(patsubst %,-X %,$(GO_HOST_LDFLAGS_X)) |
| 106 | |
| 107 | GO_HOST_INSTALL_ARGS= \ |
| 108 | -v \ |
| 109 | -ldflags "all=$(GO_HOST_DEFAULT_LDFLAGS)" \ |
| 110 | $(if $(filter $(GO_HOST_ENABLE_PIE),1),-buildmode pie) \ |
| 111 | $(if $(GO_HOST_GCFLAGS),-gcflags "$(GO_HOST_GCFLAGS)") \ |
| 112 | $(if $(GO_HOST_CUSTOM_LDFLAGS),-ldflags "$(GO_HOST_CUSTOM_LDFLAGS) $(GO_HOST_DEFAULT_LDFLAGS)") \ |
| 113 | $(if $(GO_HOST_TAGS),-tags "$(GO_HOST_TAGS)") |
| 114 | |
| 115 | define GoHost/Host/Configure |
| 116 | $(GO_GENERAL_BUILD_CONFIG_VARS) \ |
| 117 | $(GO_HOST_BUILD_CONFIG_VARS) \ |
| 118 | $(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh configure |
| 119 | endef |
| 120 | |
| 121 | # $(1) additional arguments for go command line (optional) |
| 122 | define GoHost/Host/Compile |
| 123 | $(GO_GENERAL_BUILD_CONFIG_VARS) \ |
| 124 | $(GO_HOST_BUILD_CONFIG_VARS) \ |
| 125 | $(GO_HOST_VARS) \ |
| 126 | $(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh build $(GO_HOST_INSTALL_ARGS) $(1) |
| 127 | endef |
| 128 | |
| 129 | define GoHost/Host/Install/Bin |
| 130 | rm -rf "$(GO_HOST_STAGING_DIR)" |
| 131 | mkdir -p "$(GO_HOST_STAGING_DIR)" "$(GO_HOST_STAGING_FILES_LIST_DIR)" |
| 132 | |
| 133 | $(GO_GENERAL_BUILD_CONFIG_VARS) \ |
| 134 | $(GO_HOST_BUILD_CONFIG_VARS) \ |
| 135 | $(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh install_bin "$(GO_HOST_STAGING_DIR)" |
| 136 | |
| 137 | if [ -f "$(GO_HOST_BIN_STAGING_FILES_LIST)" ]; then \ |
| 138 | "$(SCRIPT_DIR)/clean-package.sh" \ |
| 139 | "$(GO_HOST_BIN_STAGING_FILES_LIST)" \ |
| 140 | "$(1)" ; \ |
| 141 | fi |
| 142 | |
| 143 | cd "$(GO_HOST_STAGING_DIR)" && find ./ > "$(GO_HOST_STAGING_DIR).files" |
| 144 | |
| 145 | $(call locked, \ |
| 146 | mv "$(GO_HOST_STAGING_DIR).files" "$(GO_HOST_BIN_STAGING_FILES_LIST)" && \ |
| 147 | $(CP) "$(GO_HOST_STAGING_DIR)"/* "$(1)/", \ |
| 148 | host-staging-dir \ |
| 149 | ) |
| 150 | |
| 151 | rm -rf "$(GO_HOST_STAGING_DIR)" |
| 152 | endef |
| 153 | |
| 154 | define GoHost/Host/Install/Src |
| 155 | rm -rf "$(GO_HOST_STAGING_DIR)" |
| 156 | mkdir -p "$(GO_HOST_STAGING_DIR)" "$(GO_HOST_STAGING_FILES_LIST_DIR)" |
| 157 | |
| 158 | $(GO_GENERAL_BUILD_CONFIG_VARS) \ |
| 159 | $(GO_HOST_BUILD_CONFIG_VARS) \ |
| 160 | $(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh install_src "$(GO_HOST_STAGING_DIR)" |
| 161 | |
| 162 | if [ -f "$(GO_HOST_SRC_STAGING_FILES_LIST)" ]; then \ |
| 163 | "$(SCRIPT_DIR)/clean-package.sh" \ |
| 164 | "$(GO_HOST_SRC_STAGING_FILES_LIST)" \ |
| 165 | "$(1)" ; \ |
| 166 | fi |
| 167 | |
| 168 | cd "$(GO_HOST_STAGING_DIR)" && find ./ > "$(GO_HOST_STAGING_DIR).files" |
| 169 | |
| 170 | $(call locked, \ |
| 171 | mv "$(GO_HOST_STAGING_DIR).files" "$(GO_HOST_SRC_STAGING_FILES_LIST)" && \ |
| 172 | $(CP) "$(GO_HOST_STAGING_DIR)"/* "$(1)/", \ |
| 173 | host-staging-dir \ |
| 174 | ) |
| 175 | |
| 176 | rm -rf "$(GO_HOST_STAGING_DIR)" |
| 177 | endef |
| 178 | |
| 179 | define GoHost/Host/Install |
| 180 | $(if $(filter $(GO_HOST_SOURCE_ONLY),1),, \ |
| 181 | $(call GoHost/Host/Install/Bin,$(1)) \ |
| 182 | ) |
| 183 | $(call GoHost/Host/Install/Src,$(1)) |
| 184 | endef |
| 185 | |
| 186 | define GoHost/Host/Uninstall |
| 187 | if [ -f "$(GO_HOST_BIN_STAGING_FILES_LIST)" ]; then \ |
| 188 | "$(SCRIPT_DIR)/clean-package.sh" \ |
| 189 | "$(GO_HOST_BIN_STAGING_FILES_LIST)" \ |
| 190 | "$(HOST_BUILD_PREFIX)" ; \ |
| 191 | rm -f "$(GO_HOST_BIN_STAGING_FILES_LIST)" ; \ |
| 192 | fi |
| 193 | |
| 194 | if [ -f "$(GO_HOST_SRC_STAGING_FILES_LIST)" ]; then \ |
| 195 | "$(SCRIPT_DIR)/clean-package.sh" \ |
| 196 | "$(GO_HOST_SRC_STAGING_FILES_LIST)" \ |
| 197 | "$(HOST_BUILD_PREFIX)" ; \ |
| 198 | rm -f "$(GO_HOST_SRC_STAGING_FILES_LIST)" ; \ |
| 199 | fi |
| 200 | endef |
| 201 | |
| 202 | |
| 203 | ifneq ($(strip $(GO_PKG)),) |
| 204 | Host/Configure=$(call GoHost/Host/Configure) |
| 205 | Host/Compile=$(call GoHost/Host/Compile) |
| 206 | Hooks/HostCompile/Post+=Go/CacheCleanup |
| 207 | Host/Uninstall=$(call GoHost/Host/Uninstall,$(1)) |
| 208 | endif |
| 209 | |
| 210 | define GoHostBuild |
| 211 | Host/Install=$$(call GoHost/Host/Install,$$(1)) |
| 212 | endef |
| 213 | |
| 214 | define GoBinHostBuild |
| 215 | Host/Install=$$(call GoHost/Host/Install/Bin,$$(1)) |
| 216 | endef |
| 217 | |
| 218 | define GoSrcHostBuild |
| 219 | Host/Install=$$(call GoHost/Host/Install/Src,$$(1)) |
| 220 | endef |