blob: ee4f1ea311b44691d883fe2f42663ba27a8c88ce [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001#
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
8ifeq ($(origin GO_INCLUDE_DIR),undefined)
9 GO_INCLUDE_DIR:=$(dir $(lastword $(MAKEFILE_LIST)))
10endif
11
12include $(GO_INCLUDE_DIR)/golang-values.mk
13
14
15# these variables have the same meanings as in golang-package.mk
16GO_HOST_INSTALL_EXTRA?=$(GO_PKG_INSTALL_EXTRA)
17GO_HOST_INSTALL_ALL?=$(GO_PKG_INSTALL_ALL)
18GO_HOST_SOURCE_ONLY?=$(GO_PKG_SOURCE_ONLY)
19GO_HOST_BUILD_PKG?=$(GO_PKG_BUILD_PKG)
20GO_HOST_EXCLUDES?=$(GO_PKG_EXCLUDES)
21GO_HOST_GO_GENERATE?=$(GO_PKG_GO_GENERATE)
22GO_HOST_GCFLAGS?=$(GO_PKG_GCFLAGS)
23GO_HOST_LDFLAGS?=$(GO_PKG_LDFLAGS)
24GO_HOST_LDFLAGS_X?=$(GO_PKG_LDFLAGS_X)
25GO_HOST_TAGS?=$(GO_PKG_TAGS)
26GO_HOST_INSTALL_BIN_PATH?=/bin
27
28
29# need to repeat this here in case golang-package.mk is not included
30GO_PKG_BUILD_PKG?=$(strip $(GO_PKG))/...
31
32GO_HOST_WORK_DIR_NAME:=.go_work
33GO_HOST_BUILD_DIR=$(HOST_BUILD_DIR)/$(GO_HOST_WORK_DIR_NAME)/build
34GO_HOST_BUILD_BIN_DIR=$(GO_HOST_BUILD_DIR)/bin
35
36GO_HOST_BUILD_DEPENDS_PATH:=/share/gocode
37GO_HOST_BUILD_DEPENDS_SRC=$(STAGING_DIR_HOSTPKG)$(GO_HOST_BUILD_DEPENDS_PATH)/src
38
39GO_HOST_DIR_NAME:=$(lastword $(subst /,$(space),$(CURDIR)))
40GO_HOST_STAGING_DIR:=$(TMP_DIR)/host-stage-$(GO_HOST_DIR_NAME)
41GO_HOST_STAGING_FILES_LIST_DIR:=$(HOST_BUILD_PREFIX)/stamp
42GO_HOST_BIN_STAGING_FILES_LIST:=$(GO_HOST_STAGING_FILES_LIST_DIR)/$(GO_HOST_DIR_NAME)-bin.list
43GO_HOST_SRC_STAGING_FILES_LIST:=$(GO_HOST_STAGING_FILES_LIST_DIR)/$(GO_HOST_DIR_NAME)-src.list
44
45ifeq ($(GO_HOST_PIE_SUPPORTED),1)
46 GO_HOST_ENABLE_PIE:=1
47endif
48
49GO_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
64GO_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
71GO_HOST_MORE_LDFLAGS?= \
72 -znow -zrelro \
73 $(if $(GO_HOST_ENABLE_PIE),$(FPIC) -specs=$(INCLUDE_DIR)/hardened-ld-pie.specs)
74
75GO_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
89GO_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
95GO_HOST_VARS= \
96 $(GO_HOST_TARGET_VARS) \
97 $(GO_HOST_BUILD_VARS)
98
99GO_HOST_DEFAULT_LDFLAGS= \
100 -linkmode external \
101 -extldflags '$(patsubst -z%,-Wl$(comma)-z$(comma)%,$(HOST_LDFLAGS) $(GO_HOST_MORE_LDFLAGS))'
102
103GO_HOST_CUSTOM_LDFLAGS= \
104 $(GO_HOST_LDFLAGS) \
105 $(patsubst %,-X %,$(GO_HOST_LDFLAGS_X))
106
107GO_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
115define GoHost/Host/Configure
116 $(GO_GENERAL_BUILD_CONFIG_VARS) \
117 $(GO_HOST_BUILD_CONFIG_VARS) \
118 $(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh configure
119endef
120
121# $(1) additional arguments for go command line (optional)
122define 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)
127endef
128
129define 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)"
152endef
153
154define 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)"
177endef
178
179define 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))
184endef
185
186define 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
200endef
201
202
203ifneq ($(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))
208endif
209
210define GoHostBuild
211 Host/Install=$$(call GoHost/Host/Install,$$(1))
212endef
213
214define GoBinHostBuild
215 Host/Install=$$(call GoHost/Host/Install/Bin,$$(1))
216endef
217
218define GoSrcHostBuild
219 Host/Install=$$(call GoHost/Host/Install/Src,$$(1))
220endef