1
0
Fork 0
mirror of https://github.com/Ysurac/openmptcprouter-feeds.git synced 2025-02-15 03:51:51 +00:00

Merge pull request #5 from Ysurac/develop

同步
This commit is contained in:
suyuan 2020-10-10 01:19:41 +08:00 committed by GitHub
commit e0514426e5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 1104 additions and 332 deletions

204
golang/golang-build.sh Normal file
View file

@ -0,0 +1,204 @@
#!/bin/sh
nl="
"
log() {
# shellcheck disable=SC2039
local IFS=" "
printf '%s\n' "$*"
}
log_error() {
# shellcheck disable=SC2039
local IFS=" "
printf 'Error: %s\n' "$*" >&2
}
link_contents() {
# shellcheck disable=SC2039
local src="$1" dest="$2" IFS="$nl" dirs dir base
if [ -n "$(find "$src" -mindepth 1 -maxdepth 1 -name "*.go" -not -type d)" ]; then
log_error "$src is already a Go library"
return 1
fi
dirs="$(find "$src" -mindepth 1 -maxdepth 1 -type d)"
for dir in $dirs; do
base="${dir##*/}"
if [ -d "$dest/$base" ]; then
case "$dir" in
*$GO_BUILD_DEPENDS_SRC/$GO_PKG)
log "$GO_PKG is already installed. Please check for circular dependencies."
;;
*)
link_contents "$src/$base" "$dest/$base"
;;
esac
else
log "...${src#$GO_BUILD_DEPENDS_SRC}/$base"
ln -sf "$src/$base" "$dest/$base"
fi
done
return 0
}
configure() {
# shellcheck disable=SC2039
local files code testdata gomod pattern extra IFS file dest
cd "$BUILD_DIR" || return 1
files="$(find ./ -path "*/.*" -prune -o -not -type d -print)"
if [ "$GO_INSTALL_ALL" != 1 ]; then
code="$(printf '%s\n' "$files" | grep '\.\(c\|cc\|cpp\|go\|h\|hh\|hpp\|proto\|s\)$')"
testdata="$(printf '%s\n' "$files" | grep '/testdata/')"
gomod="$(printf '%s\n' "$files" | grep '/go\.\(mod\|sum\)$')"
for pattern in $GO_INSTALL_EXTRA; do
extra="$(printf '%s\n' "$extra"; printf '%s\n' "$files" | grep -e "$pattern")"
done
files="$(printf '%s\n%s\n%s\n%s\n' "$code" "$testdata" "$gomod" "$extra" | grep -v '^[[:space:]]*$' | sort -u)"
fi
IFS="$nl"
log "Copying files from $BUILD_DIR into $GO_BUILD_DIR/src/$GO_PKG"
mkdir -p "$GO_BUILD_DIR/src"
for file in $files; do
log "${file#./}"
dest="$GO_BUILD_DIR/src/$GO_PKG/${file#./}"
mkdir -p "${dest%/*}"
cp -fpR "$file" "$dest"
done
log
if [ "$GO_SOURCE_ONLY" != 1 ]; then
if [ -d "$GO_BUILD_DEPENDS_SRC" ]; then
log "Symlinking directories from $GO_BUILD_DEPENDS_SRC into $GO_BUILD_DIR/src"
link_contents "$GO_BUILD_DEPENDS_SRC" "$GO_BUILD_DIR/src"
else
log "$GO_BUILD_DEPENDS_SRC does not exist, skipping symlinks"
fi
else
log "Not building binaries, skipping symlinks"
fi
log
return 0
}
build() {
# shellcheck disable=SC2039
local modargs pattern targets retval
cd "$GO_BUILD_DIR" || return 1
if [ -f "$BUILD_DIR/go.mod" ] ; then
mkdir -p "$GO_MOD_CACHE_DIR"
modargs="$GO_MOD_ARGS"
fi
log "Finding targets"
# shellcheck disable=SC2086
targets="$(go list $modargs $GO_BUILD_PKG)"
for pattern in $GO_EXCLUDES; do
targets="$(printf '%s\n' "$targets" | grep -v "$pattern")"
done
log
if [ "$GO_GO_GENERATE" = 1 ]; then
log "Calling go generate"
# shellcheck disable=SC2086
GOOS='' GOARCH='' GO386='' GOARM='' GOMIPS='' GOMIPS64='' \
go generate -v $targets
log
fi
if [ "$GO_SOURCE_ONLY" = 1 ]; then
return 0
fi
log "Building targets"
mkdir -p "$GO_BUILD_DIR/bin" "$GO_BUILD_CACHE_DIR"
# shellcheck disable=SC2086
go install $modargs "$@" $targets
retval="$?"
log
if [ "$retval" -eq 0 ] && [ -z "$(find "$GO_BUILD_BIN_DIR" -maxdepth 0 -type d -not -empty 2>/dev/null)" ]; then
log_error "No binaries were built"
retval=1
fi
if [ "$retval" -ne 0 ]; then
cache_cleanup
fi
return "$retval"
}
install_bin() {
# shellcheck disable=SC2039
local dest="$1"
install -d -m0755 "$dest/$GO_INSTALL_BIN_PATH"
install -m0755 "$GO_BUILD_BIN_DIR"/* "$dest/$GO_INSTALL_BIN_PATH/"
}
install_src() {
# shellcheck disable=SC2039
local dest="$1" dir="${GO_PKG%/*}"
install -d -m0755 "$dest/$GO_BUILD_DEPENDS_PATH/src/$dir"
cp -fpR "$GO_BUILD_DIR/src/$GO_PKG" "$dest/$GO_BUILD_DEPENDS_PATH/src/$dir/"
}
cache_cleanup() {
if ! [ -d "$GO_MOD_CACHE_DIR" ]; then
return 0
fi
# in case go is called without -modcacherw
find "$GO_MOD_CACHE_DIR" -type d -not -perm -u+w -exec chmod u+w '{}' +
if [ -n "$CONFIG_GOLANG_MOD_CACHE_WORLD_READABLE" ]; then
find "$GO_MOD_CACHE_DIR" -type d -not -perm -go+rx -exec chmod go+rx '{}' +
find "$GO_MOD_CACHE_DIR" -not -type d -not -perm -go+r -exec chmod go+r '{}' +
fi
return 0
}
if [ "$#" -lt 1 ]; then
log_error "Missing command"
exit 1
fi
command="$1"
shift 1
case "$command" in
configure)
configure
;;
build)
build "$@"
;;
install_bin)
install_bin "$@"
;;
install_src)
install_src "$@"
;;
cache_cleanup)
cache_cleanup
;;
*)
log_error "Invalid command \"$command\""
exit 1
;;
esac

View file

@ -1,5 +1,5 @@
# #
# Copyright (C) 2018 Jeffery To # Copyright (C) 2018, 2020 Jeffery To
# #
# This is free software, licensed under the GNU General Public License v2. # This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information. # See /LICENSE for more information.
@ -24,8 +24,8 @@ endef
# $(4) additional environment variables (optional) # $(4) additional environment variables (optional)
define GoCompiler/Default/Make define GoCompiler/Default/Make
( \ ( \
cd $(1)/src ; \ cd "$(1)/src" ; \
$(if $(2),GOROOT_FINAL=$(2)/lib/go-$(3)) \ $(if $(2),GOROOT_FINAL="$(2)/lib/go-$(3)") \
$(4) \ $(4) \
$(BASH) make.bash --no-banner ; \ $(BASH) make.bash --no-banner ; \
) )
@ -34,8 +34,8 @@ endef
# $(1) destination prefix # $(1) destination prefix
# $(2) go version id # $(2) go version id
define GoCompiler/Default/Install/make-dirs define GoCompiler/Default/Install/make-dirs
$(INSTALL_DIR) $(1)/lib/go-$(2) $(INSTALL_DIR) "$(1)/lib/go-$(2)"
$(INSTALL_DIR) $(1)/share/go-$(2) $(INSTALL_DIR) "$(1)/share/go-$(2)"
endef endef
# $(1) source go root # $(1) source go root
@ -43,48 +43,49 @@ endef
# $(3) go version id # $(3) go version id
# $(4) file/directory name # $(4) file/directory name
define GoCompiler/Default/Install/install-share-data define GoCompiler/Default/Install/install-share-data
$(CP) $(1)/$(4) $(2)/share/go-$(3)/ $(CP) "$(1)/$(4)" "$(2)/share/go-$(3)/"
$(LN) ../../share/go-$(3)/$(4) $(2)/lib/go-$(3)/ $(LN) "../../share/go-$(3)/$(4)" "$(2)/lib/go-$(3)/"
endef endef
# $(1) source go root # $(1) source go root
# $(2) destination prefix # $(2) destination prefix
# $(3) go version id # $(3) go version id
# $(4) GOOS_GOARCH # $(4) GOOS_GOARCH
# $(5) install suffix (optional)
define GoCompiler/Default/Install/Bin define GoCompiler/Default/Install/Bin
$(call GoCompiler/Default/Install/make-dirs,$(2),$(3)) $(call GoCompiler/Default/Install/make-dirs,$(2),$(3))
$(call GoCompiler/Default/Install/install-share-data,$(1),$(2),$(3),api) $(call GoCompiler/Default/Install/install-share-data,$(1),$(2),$(3),api)
$(INSTALL_DATA) -p $(1)/VERSION $(2)/lib/go-$(3)/ $(INSTALL_DATA) -p "$(1)/VERSION" "$(2)/lib/go-$(3)/"
for file in AUTHORS CONTRIBUTING.md CONTRIBUTORS LICENSE PATENTS README README.md; do \ for file in AUTHORS CONTRIBUTING.md CONTRIBUTORS LICENSE PATENTS README.md SECURITY.md; do \
if [ -f $(1)/$$$$file ]; then \ if [ -f "$(1)/$$$$file" ]; then \
$(INSTALL_DATA) -p $(1)/$$$$file $(2)/share/go-$(3)/ ; \ $(INSTALL_DATA) -p "$(1)/$$$$file" "$(2)/share/go-$(3)/" ; \
fi ; \ fi ; \
done done
$(INSTALL_DIR) $(2)/lib/go-$(3)/bin $(INSTALL_DIR) "$(2)/lib/go-$(3)/bin"
ifeq ($(4),$(GO_HOST_OS_ARCH)) ifeq ($(4),$(GO_HOST_OS_ARCH))
$(INSTALL_BIN) -p $(1)/bin/* $(2)/lib/go-$(3)/bin/ $(INSTALL_BIN) -p "$(1)/bin"/* "$(2)/lib/go-$(3)/bin/"
else else
$(INSTALL_BIN) -p $(1)/bin/$(4)/* $(2)/lib/go-$(3)/bin/ $(INSTALL_BIN) -p "$(1)/bin/$(4)"/* "$(2)/lib/go-$(3)/bin/"
endif endif
$(INSTALL_DIR) $(2)/lib/go-$(3)/pkg $(INSTALL_DIR) "$(2)/lib/go-$(3)/pkg"
$(CP) $(1)/pkg/$(4) $(2)/lib/go-$(3)/pkg/ $(CP) "$(1)/pkg/$(4)$(if $(5),_$(5))" "$(2)/lib/go-$(3)/pkg/"
$(INSTALL_DIR) $(2)/lib/go-$(3)/pkg/tool/$(4) $(INSTALL_DIR) "$(2)/lib/go-$(3)/pkg/tool/$(4)"
$(INSTALL_BIN) -p $(1)/pkg/tool/$(4)/* $(2)/lib/go-$(3)/pkg/tool/$(4)/ $(INSTALL_BIN) -p "$(1)/pkg/tool/$(4)"/* "$(2)/lib/go-$(3)/pkg/tool/$(4)/"
endef endef
# $(1) destination prefix # $(1) destination prefix
# $(2) go version id # $(2) go version id
define GoCompiler/Default/Install/BinLinks define GoCompiler/Default/Install/BinLinks
$(INSTALL_DIR) $(1)/bin $(INSTALL_DIR) "$(1)/bin"
$(LN) ../lib/go-$(2)/bin/go $(1)/bin/go $(LN) "../lib/go-$(2)/bin/go" "$(1)/bin/go"
$(LN) ../lib/go-$(2)/bin/gofmt $(1)/bin/gofmt $(LN) "../lib/go-$(2)/bin/gofmt" "$(1)/bin/gofmt"
endef endef
# $(1) source go root # $(1) source go root
@ -110,29 +111,29 @@ define GoCompiler/Default/Install/Src
$(call GoCompiler/Default/Install/install-share-data,$(1),$(2),$(3),test) $(call GoCompiler/Default/Install/install-share-data,$(1),$(2),$(3),test)
$(FIND) \ $(FIND) \
$(2)/share/go-$(3)/src/ \ "$(2)/share/go-$(3)/src/" \
\! -type d -a \( -name '*.bat' -o -name '*.rc' \) \ \! -type d -a \( -name "*.bat" -o -name "*.rc" \) \
-delete -delete
if [ -d $(1)/pkg/include ]; then \ if [ -d "$(1)/pkg/include" ]; then \
$(INSTALL_DIR) $(2)/lib/go-$(3)/pkg ; \ $(INSTALL_DIR) "$(2)/lib/go-$(3)/pkg" ; \
$(INSTALL_DIR) $(2)/share/go-$(3)/pkg ; \ $(INSTALL_DIR) "$(2)/share/go-$(3)/pkg" ; \
$(CP) $(1)/pkg/include $(2)/share/go-$(3)/pkg/ ; \ $(CP) "$(1)/pkg/include" "$(2)/share/go-$(3)/pkg/" ; \
$(LN) ../../../share/go-$(3)/pkg/include $(2)/lib/go-$(3)/pkg/ ; \ $(LN) "../../../share/go-$(3)/pkg/include" "$(2)/lib/go-$(3)/pkg/" ; \
fi fi
endef endef
# $(1) destination prefix # $(1) destination prefix
# $(2) go version id # $(2) go version id
define GoCompiler/Default/Uninstall define GoCompiler/Default/Uninstall
rm -rf $(1)/lib/go-$(2) rm -rf "$(1)/lib/go-$(2)"
rm -rf $(1)/share/go-$(2) rm -rf "$(1)/share/go-$(2)"
endef endef
# $(1) destination prefix # $(1) destination prefix
define GoCompiler/Default/Uninstall/BinLinks define GoCompiler/Default/Uninstall/BinLinks
rm -f $(1)/bin/go rm -f "$(1)/bin/go"
rm -f $(1)/bin/gofmt rm -f "$(1)/bin/gofmt"
endef endef
@ -141,6 +142,7 @@ endef
# $(3) destination prefix # $(3) destination prefix
# $(4) go version id # $(4) go version id
# $(5) GOOS_GOARCH # $(5) GOOS_GOARCH
# $(6) install suffix (optional)
define GoCompiler/AddProfile define GoCompiler/AddProfile
# $$(1) valid GOOS_GOARCH combinations # $$(1) valid GOOS_GOARCH combinations
@ -155,7 +157,7 @@ define GoCompiler/AddProfile
# $$(1) override install prefix (optional) # $$(1) override install prefix (optional)
define GoCompiler/$(1)/Install/Bin define GoCompiler/$(1)/Install/Bin
$$(call GoCompiler/Default/Install/Bin,$(2),$$(or $$(1),$(3)),$(4),$(5)) $$(call GoCompiler/Default/Install/Bin,$(2),$$(or $$(1),$(3)),$(4),$(5),$(6))
endef endef
# $$(1) override install prefix (optional) # $$(1) override install prefix (optional)

220
golang/golang-host-build.mk Normal file
View file

@ -0,0 +1,220 @@
#
# Copyright (C) 2020 Jeffery To
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
ifeq ($(origin GO_INCLUDE_DIR),undefined)
GO_INCLUDE_DIR:=$(dir $(lastword $(MAKEFILE_LIST)))
endif
include $(GO_INCLUDE_DIR)/golang-values.mk
# these variables have the same meanings as in golang-package.mk
GO_HOST_INSTALL_EXTRA?=$(GO_PKG_INSTALL_EXTRA)
GO_HOST_INSTALL_ALL?=$(GO_PKG_INSTALL_ALL)
GO_HOST_SOURCE_ONLY?=$(GO_PKG_SOURCE_ONLY)
GO_HOST_BUILD_PKG?=$(GO_PKG_BUILD_PKG)
GO_HOST_EXCLUDES?=$(GO_PKG_EXCLUDES)
GO_HOST_GO_GENERATE?=$(GO_PKG_GO_GENERATE)
GO_HOST_GCFLAGS?=$(GO_PKG_GCFLAGS)
GO_HOST_LDFLAGS?=$(GO_PKG_LDFLAGS)
GO_HOST_LDFLAGS_X?=$(GO_PKG_LDFLAGS_X)
GO_HOST_TAGS?=$(GO_PKG_TAGS)
GO_HOST_INSTALL_BIN_PATH?=/bin
# need to repeat this here in case golang-package.mk is not included
GO_PKG_BUILD_PKG?=$(strip $(GO_PKG))/...
GO_HOST_WORK_DIR_NAME:=.go_work
GO_HOST_BUILD_DIR=$(HOST_BUILD_DIR)/$(GO_HOST_WORK_DIR_NAME)/build
GO_HOST_BUILD_BIN_DIR=$(GO_HOST_BUILD_DIR)/bin
GO_HOST_BUILD_DEPENDS_PATH:=/share/gocode
GO_HOST_BUILD_DEPENDS_SRC=$(STAGING_DIR_HOSTPKG)$(GO_HOST_BUILD_DEPENDS_PATH)/src
GO_HOST_DIR_NAME:=$(lastword $(subst /,$(space),$(CURDIR)))
GO_HOST_STAGING_DIR:=$(TMP_DIR)/host-stage-$(GO_HOST_DIR_NAME)
GO_HOST_STAGING_FILES_LIST_DIR:=$(HOST_BUILD_PREFIX)/stamp
GO_HOST_BIN_STAGING_FILES_LIST:=$(GO_HOST_STAGING_FILES_LIST_DIR)/$(GO_HOST_DIR_NAME)-bin.list
GO_HOST_SRC_STAGING_FILES_LIST:=$(GO_HOST_STAGING_FILES_LIST_DIR)/$(GO_HOST_DIR_NAME)-src.list
ifeq ($(GO_HOST_PIE_SUPPORTED),1)
GO_HOST_ENABLE_PIE:=1
endif
GO_HOST_BUILD_CONFIG_VARS= \
GO_PKG="$(strip $(GO_PKG))" \
GO_INSTALL_EXTRA="$(strip $(GO_HOST_INSTALL_EXTRA))" \
GO_INSTALL_ALL="$(strip $(GO_HOST_INSTALL_ALL))" \
GO_SOURCE_ONLY="$(strip $(GO_HOST_SOURCE_ONLY))" \
GO_BUILD_PKG="$(strip $(GO_HOST_BUILD_PKG))" \
GO_EXCLUDES="$(strip $(GO_HOST_EXCLUDES))" \
GO_GO_GENERATE="$(strip $(GO_HOST_GO_GENERATE))" \
GO_INSTALL_BIN_PATH="$(strip $(GO_HOST_INSTALL_BIN_PATH))" \
BUILD_DIR="$(HOST_BUILD_DIR)" \
GO_BUILD_DIR="$(GO_HOST_BUILD_DIR)" \
GO_BUILD_BIN_DIR="$(GO_HOST_BUILD_BIN_DIR)" \
GO_BUILD_DEPENDS_PATH="$(GO_HOST_BUILD_DEPENDS_PATH)" \
GO_BUILD_DEPENDS_SRC="$(GO_HOST_BUILD_DEPENDS_SRC)"
GO_HOST_MORE_CFLAGS?= \
-Wformat -Werror=format-security \
-fstack-protector-strong \
-U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 \
-Wl,-z,now -Wl,-z,relro \
$(if $(GO_HOST_ENABLE_PIE),$(FPIC))
GO_HOST_MORE_LDFLAGS?= \
-znow -zrelro \
$(if $(GO_HOST_ENABLE_PIE),$(FPIC) -specs=$(INCLUDE_DIR)/hardened-ld-pie.specs)
GO_HOST_TARGET_VARS= \
CGO_ENABLED=1 \
CC=gcc \
CXX=g++ \
PKG_CONFIG=pkg-config \
CGO_CFLAGS="$(HOST_CFLAGS) $(GO_HOST_MORE_CFLAGS)" \
CGO_CPPFLAGS="$(HOST_CPPFLAGS) $(GO_HOST_MORE_CPPFLAGS)" \
CGO_CXXFLAGS="$(HOST_CFLAGS) $(GO_HOST_MORE_CFLAGS)" \
CGO_LDFLAGS="$(HOST_LDFLAGS) $(GO_HOST_MORE_LDFLAGS)" \
GO_GCC_HELPER_CC="$(HOSTCC)" \
GO_GCC_HELPER_CXX="$(HOSTCXX)" \
GO_GCC_HELPER_PATH="$$$$PATH" \
PATH="$(STAGING_DIR_HOSTPKG)/lib/go-cross/openwrt:$$$$PATH"
GO_HOST_BUILD_VARS= \
GOPATH="$(GO_HOST_BUILD_DIR)" \
GOCACHE="$(GO_BUILD_CACHE_DIR)" \
GOMODCACHE="$(GO_MOD_CACHE_DIR)" \
GOENV=off
GO_HOST_VARS= \
$(GO_HOST_TARGET_VARS) \
$(GO_HOST_BUILD_VARS)
GO_HOST_DEFAULT_LDFLAGS= \
-linkmode external \
-extldflags '$(patsubst -z%,-Wl$(comma)-z$(comma)%,$(HOST_LDFLAGS) $(GO_HOST_MORE_LDFLAGS))'
GO_HOST_CUSTOM_LDFLAGS= \
$(GO_HOST_LDFLAGS) \
$(patsubst %,-X %,$(GO_HOST_LDFLAGS_X))
GO_HOST_INSTALL_ARGS= \
-v \
-ldflags "all=$(GO_HOST_DEFAULT_LDFLAGS)" \
$(if $(filter $(GO_HOST_ENABLE_PIE),1),-buildmode pie) \
$(if $(GO_HOST_GCFLAGS),-gcflags "$(GO_HOST_GCFLAGS)") \
$(if $(GO_HOST_CUSTOM_LDFLAGS),-ldflags "$(GO_HOST_CUSTOM_LDFLAGS) $(GO_HOST_DEFAULT_LDFLAGS)") \
$(if $(GO_HOST_TAGS),-tags "$(GO_HOST_TAGS)")
define GoHost/Host/Configure
$(GO_GENERAL_BUILD_CONFIG_VARS) \
$(GO_HOST_BUILD_CONFIG_VARS) \
$(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh configure
endef
# $(1) additional arguments for go command line (optional)
define GoHost/Host/Compile
$(GO_GENERAL_BUILD_CONFIG_VARS) \
$(GO_HOST_BUILD_CONFIG_VARS) \
$(GO_HOST_VARS) \
$(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh build $(GO_HOST_INSTALL_ARGS) $(1)
endef
define GoHost/Host/Install/Bin
rm -rf "$(GO_HOST_STAGING_DIR)"
mkdir -p "$(GO_HOST_STAGING_DIR)" "$(GO_HOST_STAGING_FILES_LIST_DIR)"
$(GO_GENERAL_BUILD_CONFIG_VARS) \
$(GO_HOST_BUILD_CONFIG_VARS) \
$(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh install_bin "$(GO_HOST_STAGING_DIR)"
if [ -f "$(GO_HOST_BIN_STAGING_FILES_LIST)" ]; then \
"$(SCRIPT_DIR)/clean-package.sh" \
"$(GO_HOST_BIN_STAGING_FILES_LIST)" \
"$(1)" ; \
fi
cd "$(GO_HOST_STAGING_DIR)" && find ./ > "$(GO_HOST_STAGING_DIR).files"
$(call locked, \
mv "$(GO_HOST_STAGING_DIR).files" "$(GO_HOST_BIN_STAGING_FILES_LIST)" && \
$(CP) "$(GO_HOST_STAGING_DIR)"/* "$(1)/", \
host-staging-dir \
)
rm -rf "$(GO_HOST_STAGING_DIR)"
endef
define GoHost/Host/Install/Src
rm -rf "$(GO_HOST_STAGING_DIR)"
mkdir -p "$(GO_HOST_STAGING_DIR)" "$(GO_HOST_STAGING_FILES_LIST_DIR)"
$(GO_GENERAL_BUILD_CONFIG_VARS) \
$(GO_HOST_BUILD_CONFIG_VARS) \
$(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh install_src "$(GO_HOST_STAGING_DIR)"
if [ -f "$(GO_HOST_SRC_STAGING_FILES_LIST)" ]; then \
"$(SCRIPT_DIR)/clean-package.sh" \
"$(GO_HOST_SRC_STAGING_FILES_LIST)" \
"$(1)" ; \
fi
cd "$(GO_HOST_STAGING_DIR)" && find ./ > "$(GO_HOST_STAGING_DIR).files"
$(call locked, \
mv "$(GO_HOST_STAGING_DIR).files" "$(GO_HOST_SRC_STAGING_FILES_LIST)" && \
$(CP) "$(GO_HOST_STAGING_DIR)"/* "$(1)/", \
host-staging-dir \
)
rm -rf "$(GO_HOST_STAGING_DIR)"
endef
define GoHost/Host/Install
$(if $(filter $(GO_HOST_SOURCE_ONLY),1),, \
$(call GoHost/Host/Install/Bin,$(1)) \
)
$(call GoHost/Host/Install/Src,$(1))
endef
define GoHost/Host/Uninstall
if [ -f "$(GO_HOST_BIN_STAGING_FILES_LIST)" ]; then \
"$(SCRIPT_DIR)/clean-package.sh" \
"$(GO_HOST_BIN_STAGING_FILES_LIST)" \
"$(HOST_BUILD_PREFIX)" ; \
rm -f "$(GO_HOST_BIN_STAGING_FILES_LIST)" ; \
fi
if [ -f "$(GO_HOST_SRC_STAGING_FILES_LIST)" ]; then \
"$(SCRIPT_DIR)/clean-package.sh" \
"$(GO_HOST_SRC_STAGING_FILES_LIST)" \
"$(HOST_BUILD_PREFIX)" ; \
rm -f "$(GO_HOST_SRC_STAGING_FILES_LIST)" ; \
fi
endef
ifneq ($(strip $(GO_PKG)),)
Host/Configure=$(call GoHost/Host/Configure)
Host/Compile=$(call GoHost/Host/Compile)
Hooks/HostCompile/Post+=Go/CacheCleanup
Host/Uninstall=$(call GoHost/Host/Uninstall,$(1))
endif
define GoHostBuild
Host/Install=$$(call GoHost/Host/Install,$$(1))
endef
define GoBinHostBuild
Host/Install=$$(call GoHost/Host/Install/Bin,$$(1))
endef
define GoSrcHostBuild
Host/Install=$$(call GoHost/Host/Install/Src,$$(1))
endef

View file

@ -1,5 +1,5 @@
# #
# Copyright (C) 2018 Jeffery To # Copyright (C) 2018-2020 Jeffery To
# #
# This is free software, licensed under the GNU General Public License v2. # This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information. # See /LICENSE for more information.
@ -28,10 +28,12 @@ include $(GO_INCLUDE_DIR)/golang-values.mk
# files are installed: # files are installed:
# #
# * Files with one of these extensions: # * Files with one of these extensions:
# .go, .c, .cc, .h, .hh, .proto, .s # .go, .c, .cc, .cpp, .h, .hh, .hpp, .proto, .s
# #
# * Files in any 'testdata' directory # * Files in any 'testdata' directory
# #
# * go.mod and go.sum, in any directory
#
# e.g. GO_PKG_INSTALL_EXTRA:=example.toml marshal_test.toml # e.g. GO_PKG_INSTALL_EXTRA:=example.toml marshal_test.toml
# #
# #
@ -54,7 +56,7 @@ include $(GO_INCLUDE_DIR)/golang-values.mk
# GO_PKG_BUILD_PKG - list of build targets, default GO_PKG/... # GO_PKG_BUILD_PKG - list of build targets, default GO_PKG/...
# #
# Build targets for compiling this Go package, i.e. arguments passed # Build targets for compiling this Go package, i.e. arguments passed
# to 'go install' # to 'go install'.
# #
# e.g. GO_PKG_BUILD_PKG:=github.com/debian/ratt/cmd/... # e.g. GO_PKG_BUILD_PKG:=github.com/debian/ratt/cmd/...
# #
@ -74,28 +76,92 @@ include $(GO_INCLUDE_DIR)/golang-values.mk
# not necessary. # not necessary.
# #
# e.g. GO_PKG_GO_GENERATE:=1 # e.g. GO_PKG_GO_GENERATE:=1
#
#
# GO_PKG_GCFLAGS - list of options, default empty
#
# Additional go tool compile options to use when building targets.
#
# e.g. GO_PKG_GCFLAGS:=-N -l
#
#
# GO_PKG_LDFLAGS - list of options, default empty
#
# Additional go tool link options to use when building targets.
#
# Note that the OpenWrt build system has an option to strip binaries
# (enabled by default), so -s (Omit the symbol table and debug
# information) and -w (Omit the DWARF symbol table) flags are not
# necessary.
#
# e.g. GO_PKG_LDFLAGS:=-r dir1:dir2 -u
#
#
# GO_PKG_LDFLAGS_X - list of string variable definitions, default empty
#
# Each definition will be passed as the parameter to the -X go tool
# link option, i.e. -ldflags "-X importpath.name=value".
#
# e.g. GO_PKG_LDFLAGS_X:=main.Version=$(PKG_VERSION) main.BuildStamp=$(SOURCE_DATE_EPOCH)
#
#
# GO_PKG_TAGS - list of build tags, default empty
#
# Build tags to consider satisfied during the build, passed as the
# parameter to the -tags option for 'go install'.
#
# e.g. GO_PKG_TAGS:=release,noupgrade
#
#
# GO_PKG_INSTALL_BIN_PATH - target directory path, default /usr/bin
#
# Directory path under "dest_dir" where binaries will be installed by
# '$(call GoPackage/Package/Install/Bin,dest_dir)'.
#
# e.g. GO_PKG_INSTALL_BIN_PATH:=/sbin
# Credit for this package build process (GoPackage/Build/Configure and # Credit for this package build process (GoPackage/Build/Configure and
# GoPackage/Build/Compile) belong to Debian's dh-golang completely. # GoPackage/Build/Compile) belong to Debian's dh-golang completely.
# https://anonscm.debian.org/cgit/pkg-go/packages/dh-golang.git # https://salsa.debian.org/go-team/packages/dh-golang
# for building packages, not user code GO_PKG_BUILD_PKG?=$(strip $(GO_PKG))/...
GO_PKG_PATH:=/usr/share/gocode GO_PKG_INSTALL_BIN_PATH?=/usr/bin
GO_PKG_BUILD_PKG?=$(GO_PKG)/...
GO_PKG_WORK_DIR_NAME:=.go_work GO_PKG_WORK_DIR_NAME:=.go_work
GO_PKG_WORK_DIR:=$(PKG_BUILD_DIR)/$(GO_PKG_WORK_DIR_NAME) GO_PKG_BUILD_DIR=$(PKG_BUILD_DIR)/$(GO_PKG_WORK_DIR_NAME)/build
GO_PKG_BUILD_BIN_DIR=$(GO_PKG_BUILD_DIR)/bin$(if $(GO_HOST_TARGET_DIFFERENT),/$(GO_OS_ARCH))
GO_PKG_BUILD_DIR:=$(GO_PKG_WORK_DIR)/build GO_PKG_BUILD_DEPENDS_PATH:=/usr/share/gocode
GO_PKG_CACHE_DIR:=$(GO_PKG_WORK_DIR)/cache GO_PKG_BUILD_DEPENDS_SRC=$(STAGING_DIR)$(GO_PKG_BUILD_DEPENDS_PATH)/src
GO_PKG_TMP_DIR:=$(GO_PKG_WORK_DIR)/tmp
GO_PKG_BUILD_BIN_DIR:=$(GO_PKG_BUILD_DIR)/bin$(if \ ifdef CONFIG_PKG_ASLR_PIE_ALL
$(GO_HOST_TARGET_DIFFERENT),/$(GO_OS)_$(GO_ARCH)) ifeq ($(strip $(PKG_ASLR_PIE)),1)
ifeq ($(GO_TARGET_PIE_SUPPORTED),1)
GO_PKG_ENABLE_PIE:=1
else
$(warning PIE buildmode is not supported for $(GO_OS)/$(GO_ARCH))
endif
endif
endif
GO_PKG_BUILD_DEPENDS_SRC:=$(STAGING_DIR)$(GO_PKG_PATH)/src ifdef CONFIG_PKG_ASLR_PIE_REGULAR
ifeq ($(strip $(PKG_ASLR_PIE_REGULAR)),1)
ifeq ($(GO_TARGET_PIE_SUPPORTED),1)
GO_PKG_ENABLE_PIE:=1
else
$(warning PIE buildmode is not supported for $(GO_OS)/$(GO_ARCH))
endif
endif
endif
ifdef CONFIG_GOLANG_SPECTRE
ifeq ($(GO_TARGET_SPECTRE_SUPPORTED),1)
GO_PKG_ENABLE_SPECTRE:=1
else
$(warning Spectre mitigations are not supported for $(GO_ARCH))
endif
endif
# sstrip causes corrupted section header size # sstrip causes corrupted section header size
ifneq ($(CONFIG_USE_SSTRIP),) ifneq ($(CONFIG_USE_SSTRIP),)
@ -105,16 +171,6 @@ ifneq ($(CONFIG_USE_SSTRIP),)
GO_PKG_STRIP_ARGS:=--strip-all GO_PKG_STRIP_ARGS:=--strip-all
endif endif
STRIP:=$(TARGET_CROSS)strip $(GO_PKG_STRIP_ARGS) STRIP:=$(TARGET_CROSS)strip $(GO_PKG_STRIP_ARGS)
RSTRIP= \
export CROSS="$(TARGET_CROSS)" \
$(if $(PKG_BUILD_ID),KEEP_BUILD_ID=1) \
$(if $(CONFIG_KERNEL_KALLSYMS),NO_RENAME=1) \
$(if $(CONFIG_KERNEL_PROFILING),KEEP_SYMBOLS=1); \
NM="$(TARGET_CROSS)nm" \
STRIP="$(STRIP)" \
STRIP_KMOD="$(SCRIPT_DIR)/strip-kmod.sh" \
PATCHELF="$(STAGING_DIR_HOST)/bin/patchelf" \
$(SCRIPT_DIR)/rstrip.sh
endif endif
define GoPackage/GoSubMenu define GoPackage/GoSubMenu
@ -123,151 +179,87 @@ define GoPackage/GoSubMenu
CATEGORY:=Languages CATEGORY:=Languages
endef endef
define GoPackage/Environment GO_PKG_BUILD_CONFIG_VARS= \
GOOS=$(GO_OS) \ GO_PKG="$(strip $(GO_PKG))" \
GOARCH=$(GO_ARCH) \ GO_INSTALL_EXTRA="$(strip $(GO_PKG_INSTALL_EXTRA))" \
GO386=$(GO_386) \ GO_INSTALL_ALL="$(strip $(GO_PKG_INSTALL_ALL))" \
GOARM=$(GO_ARM) \ GO_SOURCE_ONLY="$(strip $(GO_PKG_SOURCE_ONLY))" \
GOMIPS=$(GO_MIPS) \ GO_BUILD_PKG="$(strip $(GO_PKG_BUILD_PKG))" \
GOMIPS64=$(GO_MIPS64) \ GO_EXCLUDES="$(strip $(GO_PKG_EXCLUDES))" \
GO_GO_GENERATE="$(strip $(GO_PKG_GO_GENERATE))" \
GO_INSTALL_BIN_PATH="$(strip $(GO_PKG_INSTALL_BIN_PATH))" \
BUILD_DIR="$(PKG_BUILD_DIR)" \
GO_BUILD_DIR="$(GO_PKG_BUILD_DIR)" \
GO_BUILD_BIN_DIR="$(GO_PKG_BUILD_BIN_DIR)" \
GO_BUILD_DEPENDS_PATH="$(GO_PKG_BUILD_DEPENDS_PATH)" \
GO_BUILD_DEPENDS_SRC="$(GO_PKG_BUILD_DEPENDS_SRC)"
GO_PKG_TARGET_VARS= \
GOOS="$(GO_OS)" \
GOARCH="$(GO_ARCH)" \
GO386="$(GO_386)" \
GOARM="$(GO_ARM)" \
GOMIPS="$(GO_MIPS)" \
GOMIPS64="$(GO_MIPS64)" \
CGO_ENABLED=1 \ CGO_ENABLED=1 \
CC="$(TARGET_CC)" \
CXX="$(TARGET_CXX)" \
CGO_CFLAGS="$(filter-out $(GO_CFLAGS_TO_REMOVE),$(TARGET_CFLAGS))" \ CGO_CFLAGS="$(filter-out $(GO_CFLAGS_TO_REMOVE),$(TARGET_CFLAGS))" \
CGO_CPPFLAGS="$(TARGET_CPPFLAGS)" \ CGO_CPPFLAGS="$(TARGET_CPPFLAGS)" \
CGO_CXXFLAGS="$(filter-out $(GO_CFLAGS_TO_REMOVE),$(TARGET_CXXFLAGS))" CGO_CXXFLAGS="$(filter-out $(GO_CFLAGS_TO_REMOVE),$(TARGET_CXXFLAGS))" \
endef CGO_LDFLAGS="$(TARGET_LDFLAGS)"
# false if directory does not exist GO_PKG_BUILD_VARS= \
GoPackage/is_dir_not_empty=$$$$($(FIND) $(1) -maxdepth 0 -type d \! -empty 2>/dev/null) GOPATH="$(GO_PKG_BUILD_DIR)" \
GOCACHE="$(GO_BUILD_CACHE_DIR)" \
GOMODCACHE="$(GO_MOD_CACHE_DIR)" \
GOENV=off
GoPackage/has_binaries=$(call GoPackage/is_dir_not_empty,$(GO_PKG_BUILD_BIN_DIR)) GO_PKG_VARS= \
$(GO_PKG_TARGET_VARS) \
$(GO_PKG_BUILD_VARS)
GO_PKG_DEFAULT_GCFLAGS= \
$(if $(GO_PKG_ENABLE_SPECTRE),-spectre all)
GO_PKG_DEFAULT_ASMFLAGS= \
$(if $(GO_PKG_ENABLE_SPECTRE),-spectre all)
GO_PKG_DEFAULT_LDFLAGS= \
-buildid '$(SOURCE_DATE_EPOCH)' \
-linkmode external \
-extldflags '$(patsubst -z%,-Wl$(comma)-z$(comma)%,$(TARGET_LDFLAGS))'
GO_PKG_CUSTOM_LDFLAGS= \
$(GO_PKG_LDFLAGS) \
$(patsubst %,-X %,$(GO_PKG_LDFLAGS_X))
GO_PKG_INSTALL_ARGS= \
-v \
-trimpath \
-ldflags "all=$(GO_PKG_DEFAULT_LDFLAGS)" \
$(if $(GO_PKG_DEFAULT_GCFLAGS),-gcflags "all=$(GO_PKG_DEFAULT_GCFLAGS)") \
$(if $(GO_PKG_DEFAULT_ASMFLAGS),-asmflags "all=$(GO_PKG_DEFAULT_ASMFLAGS)") \
$(if $(filter $(GO_PKG_ENABLE_PIE),1),-buildmode pie) \
$(if $(filter $(GO_ARCH),arm),-installsuffix "v$(GO_ARM)") \
$(if $(filter $(GO_ARCH),mips mipsle),-installsuffix "$(GO_MIPS)") \
$(if $(filter $(GO_ARCH),mips64 mips64le),-installsuffix "$(GO_MIPS64)") \
$(if $(GO_PKG_GCFLAGS),-gcflags "$(GO_PKG_GCFLAGS) $(GO_PKG_DEFAULT_GCFLAGS)") \
$(if $(GO_PKG_CUSTOM_LDFLAGS),-ldflags "$(GO_PKG_CUSTOM_LDFLAGS) $(GO_PKG_DEFAULT_LDFLAGS)") \
$(if $(GO_PKG_TAGS),-tags "$(GO_PKG_TAGS)")
define GoPackage/Build/Configure define GoPackage/Build/Configure
( \ $(GO_GENERAL_BUILD_CONFIG_VARS) \
cd $(PKG_BUILD_DIR) ; \ $(GO_PKG_BUILD_CONFIG_VARS) \
mkdir -p $(GO_PKG_BUILD_DIR)/bin $(GO_PKG_BUILD_DIR)/src \ $(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh configure
$(GO_PKG_CACHE_DIR) $(GO_PKG_TMP_DIR) ; \
\
files=$$$$($(FIND) ./ \
-type d -a \( -path './.git' -o -path './$(GO_PKG_WORK_DIR_NAME)' \) -prune -o \
\! -type d -print | \
sed 's|^\./||') ; \
\
if [ "$(GO_PKG_INSTALL_ALL)" != 1 ]; then \
code=$$$$(echo "$$$$files" | grep '\.\(c\|cc\|go\|h\|hh\|proto\|s\)$$$$') ; \
testdata=$$$$(echo "$$$$files" | grep '\(^\|/\)testdata/') ; \
\
for pattern in $(GO_PKG_INSTALL_EXTRA); do \
extra=$$$$(echo "$$$$extra"; echo "$$$$files" | grep "$$$$pattern") ; \
done ; \
\
files=$$$$(echo "$$$$code"; echo "$$$$testdata"; echo "$$$$extra") ; \
files=$$$$(echo "$$$$files" | grep -v '^[[:space:]]*$$$$' | sort -u) ; \
fi ; \
\
echo "Copying files from $(PKG_BUILD_DIR) into $(GO_PKG_BUILD_DIR)/src/$(GO_PKG)" ; \
for file in $$$$files; do \
echo $$$$file ; \
dest=$(GO_PKG_BUILD_DIR)/src/$(GO_PKG)/$$$$file ; \
mkdir -p $$$$(dirname $$$$dest) ; \
$(CP) $$$$file $$$$dest ; \
done ; \
echo ; \
\
link_contents() { \
local src=$$$$1 ; \
local dest=$$$$2 ; \
local dirs dir base ; \
\
if [ -n "$$$$($(FIND) $$$$src -mindepth 1 -maxdepth 1 -name '*.go' \! -type d)" ]; then \
echo "$$$$src is already a Go library" ; \
return 1 ; \
fi ; \
\
dirs=$$$$($(FIND) $$$$src -mindepth 1 -maxdepth 1 -type d) ; \
for dir in $$$$dirs; do \
base=$$$$(basename $$$$dir) ; \
if [ -d $$$$dest/$$$$base ]; then \
case $$$$dir in \
*$(GO_PKG_PATH)/src/$(GO_PKG)) \
echo "$(GO_PKG) is already installed. Please check for circular dependencies." ;; \
*) \
link_contents $$$$src/$$$$base $$$$dest/$$$$base ;; \
esac ; \
else \
echo "...$$$${src#$(GO_PKG_BUILD_DEPENDS_SRC)}/$$$$base" ; \
$(LN) $$$$src/$$$$base $$$$dest/$$$$base ; \
fi ; \
done ; \
} ; \
\
if [ "$(GO_PKG_SOURCE_ONLY)" != 1 ]; then \
if [ -d $(GO_PKG_BUILD_DEPENDS_SRC) ]; then \
echo "Symlinking directories from $(GO_PKG_BUILD_DEPENDS_SRC) into $(GO_PKG_BUILD_DIR)/src" ; \
link_contents $(GO_PKG_BUILD_DEPENDS_SRC) $(GO_PKG_BUILD_DIR)/src ; \
else \
echo "$(GO_PKG_BUILD_DEPENDS_SRC) does not exist, skipping symlinks" ; \
fi ; \
else \
echo "Not building binaries, skipping symlinks" ; \
fi ; \
echo ; \
)
endef endef
# $(1) additional arguments for go command line (optional) # $(1) additional arguments for go command line (optional)
define GoPackage/Build/Compile define GoPackage/Build/Compile
( \ $(GO_GENERAL_BUILD_CONFIG_VARS) \
cd $(GO_PKG_BUILD_DIR) ; \ $(GO_PKG_BUILD_CONFIG_VARS) \
export GOPATH=$(GO_PKG_BUILD_DIR) \ $(GO_PKG_VARS) \
GOCACHE=$(GO_PKG_CACHE_DIR) \ $(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh build $(GO_PKG_INSTALL_ARGS) $(1)
GOTMPDIR=$(GO_PKG_TMP_DIR) \
GOROOT_FINAL=$(GO_TARGET_ROOT) \
CC=$(TARGET_CC) \
CXX=$(TARGET_CXX) \
$(call GoPackage/Environment) ; \
\
echo "Finding targets" ; \
targets=$$$$(go list $(GO_PKG_BUILD_PKG)) ; \
for pattern in $(GO_PKG_EXCLUDES); do \
targets=$$$$(echo "$$$$targets" | grep -v "$$$$pattern") ; \
done ; \
echo ; \
\
if [ "$(GO_PKG_GO_GENERATE)" = 1 ]; then \
echo "Calling go generate" ; \
go generate -v $(1) $$$$targets ; \
echo ; \
fi ; \
\
if [ "$(GO_PKG_SOURCE_ONLY)" != 1 ]; then \
echo "Building targets" ; \
case $(GO_ARCH) in \
arm) installsuffix="-installsuffix v$(GO_ARM)" ;; \
mips|mipsle) installsuffix="-installsuffix $(GO_MIPS)" ;; \
mips64|mips64le) installsuffix="-installsuffix $(GO_MIPS64)" ;; \
esac ; \
ldflags="all=-linkmode external -extldflags '$(TARGET_LDFLAGS)'" ; \
go install \
$$$$installsuffix \
-trimpath \
-ldflags "$$$$ldflags" \
-v \
$(1) \
$$$$targets ; \
retval=$$$$? ; \
echo ; \
\
if [ "$$$$retval" -eq 0 ] && [ -z "$(call GoPackage/has_binaries)" ]; then \
echo "No binaries were generated, consider adding GO_PKG_SOURCE_ONLY:=1 to Makefile" ; \
echo ; \
fi ; \
\
echo "Cleaning module download cache (golang/go#27455)" ; \
go clean -modcache ; \
echo ; \
fi ; \
exit $$$$retval ; \
)
endef endef
define GoPackage/Build/InstallDev define GoPackage/Build/InstallDev
@ -275,27 +267,33 @@ define GoPackage/Build/InstallDev
endef endef
define GoPackage/Package/Install/Bin define GoPackage/Package/Install/Bin
if [ -n "$(call GoPackage/has_binaries)" ]; then \ $(GO_GENERAL_BUILD_CONFIG_VARS) \
$(INSTALL_DIR) $(1)/usr/bin ; \ $(GO_PKG_BUILD_CONFIG_VARS) \
$(INSTALL_BIN) $(GO_PKG_BUILD_BIN_DIR)/* $(1)/usr/bin/ ; \ $(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh install_bin "$(1)"
fi
endef endef
define GoPackage/Package/Install/Src define GoPackage/Package/Install/Src
dir=$$$$(dirname $(GO_PKG)) ; \ $(GO_GENERAL_BUILD_CONFIG_VARS) \
$(INSTALL_DIR) $(1)$(GO_PKG_PATH)/src/$$$$dir ; \ $(GO_PKG_BUILD_CONFIG_VARS) \
$(CP) $(GO_PKG_BUILD_DIR)/src/$(GO_PKG) $(1)$(GO_PKG_PATH)/src/$$$$dir/ $(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh install_src "$(1)"
endef endef
define GoPackage/Package/Install define GoPackage/Package/Install
$(call GoPackage/Package/Install/Bin,$(1)) $(if $(filter $(GO_PKG_SOURCE_ONLY),1),, \
$(call GoPackage/Package/Install/Bin,$(1)) \
)
$(call GoPackage/Package/Install/Src,$(1)) $(call GoPackage/Package/Install/Src,$(1))
endef endef
ifneq ($(GO_PKG),) ifneq ($(strip $(GO_PKG)),)
ifeq ($(GO_TARGET_SPECTRE_SUPPORTED),1)
PKG_CONFIG_DEPENDS+=CONFIG_GOLANG_SPECTRE
endif
Build/Configure=$(call GoPackage/Build/Configure) Build/Configure=$(call GoPackage/Build/Configure)
Build/Compile=$(call GoPackage/Build/Compile) Build/Compile=$(call GoPackage/Build/Compile)
Hooks/Compile/Post+=Go/CacheCleanup
Build/InstallDev=$(call GoPackage/Build/InstallDev,$(1)) Build/InstallDev=$(call GoPackage/Build/InstallDev,$(1))
endif endif
@ -316,3 +314,14 @@ define GoSrcPackage
Package/$(1)/install=$$(call GoPackage/Package/Install/Src,$$(1)) Package/$(1)/install=$$(call GoPackage/Package/Install/Src,$$(1))
endif endif
endef endef
# Deprecated variables - these will be removed after the next OpenWrt release
GO_PKG_PATH=$(GO_PKG_BUILD_DEPENDS_PATH)
GO_PKG_WORK_DIR=$(PKG_BUILD_DIR)/$(GO_PKG_WORK_DIR_NAME)
GO_PKG_CACHE_DIR=$(GO_BUILD_CACHE_DIR)
GO_PKG_DEFAULT_VARS=$(GO_PKG_VARS)
GoPackage/Environment=$(GO_PKG_VARS)
GoPackage/is_dir_not_empty=$$$$($(FIND) "$(1)" -maxdepth 0 -type d \! -empty 2>/dev/null)
GoPackage/has_binaries=$(call GoPackage/is_dir_not_empty,$(GO_PKG_BUILD_BIN_DIR))
# End of deprecated variables

View file

@ -1,5 +1,5 @@
# #
# Copyright (C) 2018 Jeffery To # Copyright (C) 2018, 2020 Jeffery To
# #
# This is free software, licensed under the GNU General Public License v2. # This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information. # See /LICENSE for more information.
@ -9,23 +9,118 @@ ifeq ($(origin GO_INCLUDE_DIR),undefined)
GO_INCLUDE_DIR:=$(dir $(lastword $(MAKEFILE_LIST))) GO_INCLUDE_DIR:=$(dir $(lastword $(MAKEFILE_LIST)))
endif endif
include $(GO_INCLUDE_DIR)/golang-version.mk
# Unset environment variables
# There are more magic variables to track down, but ain't nobody got time for that
# From https://golang.org/cmd/go/#hdr-Environment_variables
# General-purpose environment variables:
unexport \ unexport \
GOARCH GOBIN GOCACHE GODEBUG GOHOSTARCH GOOS GOPATH GORACE GOROOT GOTMPDIR GCCGO \ GCCGO \
GOARCH \
GOBIN \
GOCACHE \
GOMODCACHE \
GODEBUG \
GOENV \
GOFLAGS \
GOOS \
GOPATH \
GOROOT \
GOTMPDIR
# Unmodified:
# GOINSECURE
# GOPRIVATE
# GOPROXY
# GONOPROXY
# GOSUMDB
# GONOSUMDB
# Environment variables for use with cgo:
unexport \
AR \
CC \
CGO_ENABLED \ CGO_ENABLED \
CGO_CFLAGS CGO_CFLAGS_ALLOW CGO_CFLAGS_DISALLOW \ CGO_CFLAGS CGO_CFLAGS_ALLOW CGO_CFLAGS_DISALLOW \
CGO_CPPFLAGS CGO_CPPFLAGS_ALLOW CGO_CPPFLAGS_DISALLOW \ CGO_CPPFLAGS CGO_CPPFLAGS_ALLOW CGO_CPPFLAGS_DISALLOW \
CGO_CXXFLAGS CGO_CXXFLAGS_ALLOW CGO_CXXFLAGS_DISALLOW \ CGO_CXXFLAGS CGO_CXXFLAGS_ALLOW CGO_CXXFLAGS_DISALLOW \
CGO_FFLAGS CGO_FFLAGS_ALLOW CGO_FFLAGS_DISALLOW \ CGO_FFLAGS CGO_FFLAGS_ALLOW CGO_FFLAGS_DISALLOW \
CGO_LDFLAGS CGO_LDFLAGS_ALLOW CGO_LDFLAGS_DISALLOW \ CGO_LDFLAGS CGO_LDFLAGS_ALLOW CGO_LDFLAGS_DISALLOW \
GOARM GO386 GOMIPS GOMIPS64 \ CXX \
GOROOT_FINAL GO_EXTLINK_ENABLED GIT_ALLOW_PROTOCOL \ FC
CC_FOR_TARGET CXX_FOR_TARGET GO_DISTFLAGS GO_GCFLAGS GO_LDFLAGS GOBUILDTIMELOGFILE GOROOT_BOOTSTRAP \ # Unmodified:
BOOT_GO_GCFLAGS GOEXPERIMENT GOBOOTSTRAP_TOOLEXEC # PKG_CONFIG
# there are more magic environment variables to track down, but ain't nobody got time for that
# deliberately left untouched: GOPROXY GONOPROXY GOSUMDB GONOSUMDB GOPRIVATE # Architecture-specific environment variables:
unexport \
GOARM \
GO386 \
GOMIPS \
GOMIPS64 \
GOWASM
# Special-purpose environment variables:
unexport \
GCCGOTOOLDIR \
GOROOT_FINAL \
GO_EXTLINK_ENABLED
# Unmodified:
# GIT_ALLOW_PROTOCOL
# From https://golang.org/cmd/go/#hdr-Module_support
unexport \
GO111MODULE
# From https://golang.org/pkg/runtime/#hdr-Environment_Variables
unexport \
GOGC \
GOMAXPROCS \
GORACE \
GOTRACEBACK
# From https://golang.org/cmd/cgo/#hdr-Using_cgo_with_the_go_command
unexport \
CC_FOR_TARGET \
CXX_FOR_TARGET
# Todo:
# CC_FOR_${GOOS}_${GOARCH}
# CXX_FOR_${GOOS}_${GOARCH}
# From https://golang.org/doc/install/source#environment
unexport \
GOHOSTOS \
GOHOSTARCH \
GOPPC64
# From https://golang.org/src/make.bash
unexport \
GO_GCFLAGS \
GO_LDFLAGS \
GO_LDSO \
GO_DISTFLAGS \
GOBUILDTIMELOGFILE \
GOROOT_BOOTSTRAP
# From https://golang.org/doc/go1.9#parallel-compile
unexport \
GO19CONCURRENTCOMPILATION
# From https://golang.org/src/cmd/dist/build.go
unexport \
BOOT_GO_GCFLAGS \
BOOT_GO_LDFLAGS
# From https://golang.org/src/cmd/dist/buildruntime.go
unexport \
GOEXPERIMENT
# From https://golang.org/src/cmd/dist/buildtool.go
unexport \
GOBOOTSTRAP_TOOLEXEC
# GOOS / GOARCH
go_arch=$(subst \ go_arch=$(subst \
aarch64,arm64,$(subst \ aarch64,arm64,$(subst \
@ -43,31 +138,117 @@ GO_HOST_OS:=$(call tolower,$(HOST_OS))
GO_HOST_ARCH:=$(call go_arch,$(subst \ GO_HOST_ARCH:=$(call go_arch,$(subst \
armv6l,arm,$(subst \ armv6l,arm,$(subst \
armv7l,arm,$(subst \ armv7l,arm,$(subst \
i486,i386,$(subst \ i686,i386,$(HOST_ARCH)))))
i586,i386,$(subst \
i686,i386,$(HOST_ARCH)))))))
GO_HOST_OS_ARCH:=$(GO_HOST_OS)_$(GO_HOST_ARCH) GO_HOST_OS_ARCH:=$(GO_HOST_OS)_$(GO_HOST_ARCH)
GO_HOST_TARGET_SAME:=$(if $(and $(findstring $(GO_OS_ARCH),$(GO_HOST_OS_ARCH)),$(findstring $(GO_HOST_OS_ARCH),$(GO_OS_ARCH))),1) ifeq ($(GO_OS_ARCH),$(GO_HOST_OS_ARCH))
GO_HOST_TARGET_DIFFERENT:=$(if $(GO_HOST_TARGET_SAME),,1) GO_HOST_TARGET_SAME:=1
else
GO_HOST_TARGET_DIFFERENT:=1
endif
# ensure binaries can run on older CPUs ifeq ($(GO_ARCH),386)
GO_386:=387 # ensure binaries can run on older CPUs
GO_386:=387
GO_ARM:=$(if $(CONFIG_arm_v7),7,$(if $(CONFIG_arm_v6),6,$(if $(findstring $(GO_ARCH),arm),5,))) # -fno-plt: causes "unexpected GOT reloc for non-dynamic symbol" errors
GO_CFLAGS_TO_REMOVE:=-fno-plt
GO_MIPS:=$(if $(filter $(GO_ARCH),mips mipsle),$(if $(CONFIG_HAS_FPU),hardfloat,softfloat),) else ifeq ($(GO_ARCH),arm)
GO_TARGET_FPU:=$(word 2,$(subst +,$(space),$(call qstrip,$(CONFIG_CPU_TYPE))))
GO_MIPS64:=$(if $(filter $(GO_ARCH),mips64 mips64le),$(if $(CONFIG_HAS_FPU),hardfloat,softfloat),) # FPU names from https://gcc.gnu.org/onlinedocs/gcc-8.4.0/gcc/ARM-Options.html#index-mfpu-1
# see also https://github.com/gcc-mirror/gcc/blob/releases/gcc-8.4.0/gcc/config/arm/arm-cpus.in
# -fno-plt: causes "unexpected GOT reloc for non-dynamic symbol" errors ifeq ($(GO_TARGET_FPU),)
# -mips32r2: conflicts with -march=mips32 set by go GO_ARM:=5
GO_CFLAGS_TO_REMOVE:=$(if \ else ifneq ($(filter $(GO_TARGET_FPU),vfp vfpv2),)
$(filter $(GO_ARCH),386),-fno-plt,$(if \ GO_ARM:=6
$(filter $(GO_ARCH),mips mipsle),-mips32r2,)) else
GO_ARM:=7
endif
else ifneq ($(filter $(GO_ARCH),mips mipsle),)
ifeq ($(CONFIG_HAS_FPU),y)
GO_MIPS:=hardfloat
else
GO_MIPS:=softfloat
endif
# -mips32r2: conflicts with -march=mips32 set by go
GO_CFLAGS_TO_REMOVE:=-mips32r2
else ifneq ($(filter $(GO_ARCH),mips64 mips64le),)
ifeq ($(CONFIG_HAS_FPU),y)
GO_MIPS64:=hardfloat
else
GO_MIPS64:=softfloat
endif
endif
# Target Go
GO_ARCH_DEPENDS:=@(aarch64||arm||i386||i686||mips||mips64||mips64el||mipsel||powerpc64||x86_64) GO_ARCH_DEPENDS:=@(aarch64||arm||i386||i686||mips||mips64||mips64el||mipsel||powerpc64||x86_64)
GO_TARGET_PREFIX:=/usr
GO_TARGET_VERSION_ID:=$(GO_VERSION_MAJOR_MINOR) # ASLR/PIE
GO_TARGET_ROOT:=$(GO_TARGET_PREFIX)/lib/go-$(GO_TARGET_VERSION_ID)
GO_PIE_SUPPORTED_OS_ARCH:= \
android_386 android_amd64 android_arm android_arm64 \
linux_386 linux_amd64 linux_arm linux_arm64 \
\
windows_386 windows_amd64 windows_arm \
\
darwin_amd64 \
freebsd_amd64 \
\
aix_ppc64 \
\
linux_ppc64le linux_s390x
go_pie_install_suffix=$(if $(filter $(1),aix_ppc64 windows_386 windows_amd64 windows_arm),,shared)
ifneq ($(filter $(GO_HOST_OS_ARCH),$(GO_PIE_SUPPORTED_OS_ARCH)),)
GO_HOST_PIE_SUPPORTED:=1
GO_HOST_PIE_INSTALL_SUFFIX:=$(call go_pie_install_suffix,$(GO_HOST_OS_ARCH))
endif
ifneq ($(filter $(GO_OS_ARCH),$(GO_PIE_SUPPORTED_OS_ARCH)),)
GO_TARGET_PIE_SUPPORTED:=1
GO_TARGET_PIE_INSTALL_SUFFIX:=$(call go_pie_install_suffix,$(GO_OS_ARCH))
endif
# Spectre mitigations
GO_SPECTRE_SUPPORTED_ARCH:=amd64
ifneq ($(filter $(GO_HOST_ARCH),$(GO_SPECTRE_SUPPORTED_ARCH)),)
GO_HOST_SPECTRE_SUPPORTED:=1
endif
ifneq ($(filter $(GO_ARCH),$(GO_SPECTRE_SUPPORTED_ARCH)),)
GO_TARGET_SPECTRE_SUPPORTED:=1
endif
# General build info
GO_BUILD_CACHE_DIR:=$(or $(call qstrip,$(CONFIG_GOLANG_BUILD_CACHE_DIR)),$(TOPDIR)/.go-build)
GO_MOD_CACHE_DIR:=$(DL_DIR)/go-mod-cache
GO_MOD_ARGS= \
-modcacherw
GO_GENERAL_BUILD_CONFIG_VARS= \
CONFIG_GOLANG_MOD_CACHE_WORLD_READABLE="$(CONFIG_GOLANG_MOD_CACHE_WORLD_READABLE)" \
GO_BUILD_CACHE_DIR="$(GO_BUILD_CACHE_DIR)" \
GO_MOD_CACHE_DIR="$(GO_MOD_CACHE_DIR)" \
GO_MOD_ARGS="$(GO_MOD_ARGS)"
define Go/CacheCleanup
$(GENERAL_BUILD_CONFIG_VARS) \
$(SHELL) $(GO_INCLUDE_DIR)/golang-build.sh cache_cleanup
endef

View file

@ -1,14 +0,0 @@
#
# Copyright (C) 2018 Jeffery To
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
ifeq ($(origin GO_INCLUDE_DIR),undefined)
GO_INCLUDE_DIR:=$(dir $(lastword $(MAKEFILE_LIST)))
endif
GO_VERSION_MAJOR_MINOR:=1.13
GO_VERSION_PATCH:=4

33
golang/golang/Config.in Normal file
View file

@ -0,0 +1,33 @@
menu "Configuration"
config GOLANG_EXTERNAL_BOOTSTRAP_ROOT
string "External bootstrap Go root directory"
default ""
help
Path to a working Go tree (>= Go 1.4), with bin, pkg, and src
subdirectories and the Go compiler at bin/go.
If specified, the existing Go installation will be used to
compile host (buildroot) Go.
Leave blank to compile the default bootstrap Go.
config GOLANG_BUILD_CACHE_DIR
string "Go build cache directory"
default ""
help
Store the Go build cache in this directory.
If not set, uses './.go-build'.
config GOLANG_MOD_CACHE_WORLD_READABLE
bool "Ensure Go module cache is world-readable"
default n
config GOLANG_SPECTRE
bool "Enable Spectre mitigations"
default n
depends on x86_64
help
Currently only available for x86-64 (amd64).
endmenu

View file

@ -1,12 +1,14 @@
# #
# Copyright (C) 2018 Jeffery To # Copyright (C) 2018, 2020 Jeffery To
# #
# This is free software, licensed under the GNU General Public License v2. # This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information. # See /LICENSE for more information.
# #
include $(TOPDIR)/rules.mk include $(TOPDIR)/rules.mk
include ../golang-version.mk
GO_VERSION_MAJOR_MINOR:=1.15
GO_VERSION_PATCH:=2
PKG_NAME:=golang PKG_NAME:=golang
PKG_VERSION:=$(GO_VERSION_MAJOR_MINOR)$(if $(GO_VERSION_PATCH),.$(GO_VERSION_PATCH)) PKG_VERSION:=$(GO_VERSION_MAJOR_MINOR)$(if $(GO_VERSION_PATCH),.$(GO_VERSION_PATCH))
@ -18,21 +20,21 @@ GO_SOURCE_URLS:=https://dl.google.com/go/ \
PKG_SOURCE:=go$(PKG_VERSION).src.tar.gz PKG_SOURCE:=go$(PKG_VERSION).src.tar.gz
PKG_SOURCE_URL:=$(GO_SOURCE_URLS) PKG_SOURCE_URL:=$(GO_SOURCE_URLS)
PKG_HASH:=95dbeab442ee2746b9acf0934c8e2fc26414a0565c008631b04addb8c02e7624 PKG_HASH:=28bf9d0bcde251011caae230a4a05d917b172ea203f2a62f2c2f9533589d4b4d
PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com>
PKG_LICENSE:=BSD-3-Clause PKG_LICENSE:=BSD-3-Clause
PKG_LICENSE_FILES:=LICENSE PKG_LICENSE_FILES:=LICENSE
PKG_MAINTAINER:=Jeffery To <jeffery.to@gmail.com> PKG_CPE_ID:=cpe:/a:golang:go
PKG_BUILD_DEPENDS:=golang/host PKG_BUILD_DEPENDS:=golang/host
PKG_BUILD_DIR:=$(BUILD_DIR)/go-$(PKG_VERSION) PKG_BUILD_DIR:=$(BUILD_DIR)/go-$(PKG_VERSION)
PKG_BUILD_PARALLEL:=1 PKG_BUILD_PARALLEL:=1
PKG_USE_MIPS16:=0 PKG_USE_MIPS16:=0
PKG_GO_WORK_DIR:=$(PKG_BUILD_DIR)/.go_work PKG_GO_PREFIX:=/usr
PKG_GO_HOST_CACHE_DIR:=$(PKG_GO_WORK_DIR)/host_cache PKG_GO_VERSION_ID:=$(GO_VERSION_MAJOR_MINOR)
PKG_GO_TARGET_CACHE_DIR:=$(PKG_GO_WORK_DIR)/target_cache PKG_GO_ROOT:=$(PKG_GO_PREFIX)/lib/go-$(PKG_GO_VERSION_ID)
PKG_GO_TMP_DIR:=$(PKG_GO_WORK_DIR)/tmp
HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/go-$(PKG_VERSION) HOST_BUILD_DIR:=$(BUILD_DIR_HOST)/go-$(PKG_VERSION)
HOST_BUILD_PARALLEL:=1 HOST_BUILD_PARALLEL:=1
@ -42,18 +44,27 @@ HOST_GO_VERSION_ID:=cross
HOST_GO_ROOT:=$(HOST_GO_PREFIX)/lib/go-$(HOST_GO_VERSION_ID) HOST_GO_ROOT:=$(HOST_GO_PREFIX)/lib/go-$(HOST_GO_VERSION_ID)
HOST_GO_VALID_OS_ARCH:= \ HOST_GO_VALID_OS_ARCH:= \
android_arm \ android_386 android_amd64 android_arm android_arm64 \
darwin_386 darwin_amd64 darwin_arm darwin_arm64 \ freebsd_386 freebsd_amd64 freebsd_arm freebsd_arm64 \
dragonfly_amd64 \ linux_386 linux_amd64 linux_arm linux_arm64 \
freebsd_386 freebsd_amd64 freebsd_arm \ openbsd_386 openbsd_amd64 openbsd_arm openbsd_arm64 \
linux_386 linux_amd64 linux_arm linux_arm64 \
netbsd_386 netbsd_amd64 netbsd_arm \
openbsd_386 openbsd_amd64 openbsd_arm \
plan9_386 plan9_amd64 \
solaris_amd64 \
windows_386 windows_amd64 \
\ \
linux_ppc64 linux_ppc64le linux_mips linux_mipsle linux_mips64 linux_mips64le netbsd_386 netbsd_amd64 netbsd_arm \
plan9_386 plan9_amd64 plan9_arm \
windows_386 windows_amd64 windows_arm \
\
darwin_amd64 darwin_arm64 \
\
dragonfly_amd64 \
illumos_amd64 \
solaris_amd64 \
\
aix_ppc64 \
js_wasm \
\
linux_ppc64 linux_ppc64le \
linux_mips linux_mipsle linux_mips64 linux_mips64le \
linux_riscv64 linux_s390x
BOOTSTRAP_SOURCE:=go1.4-bootstrap-20171003.tar.gz BOOTSTRAP_SOURCE:=go1.4-bootstrap-20171003.tar.gz
BOOTSTRAP_SOURCE_URL:=$(GO_SOURCE_URLS) BOOTSTRAP_SOURCE_URL:=$(GO_SOURCE_URLS)
@ -77,14 +88,18 @@ include $(INCLUDE_DIR)/package.mk
include ../golang-compiler.mk include ../golang-compiler.mk
include ../golang-package.mk include ../golang-package.mk
PKG_UNPACK:=$(HOST_TAR) -C $(PKG_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE) PKG_UNPACK:=$(HOST_TAR) -C "$(PKG_BUILD_DIR)" --strip-components=1 -xzf "$(DL_DIR)/$(PKG_SOURCE)"
HOST_UNPACK:=$(HOST_TAR) -C $(HOST_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(PKG_SOURCE) HOST_UNPACK:=$(HOST_TAR) -C "$(HOST_BUILD_DIR)" --strip-components=1 -xzf "$(DL_DIR)/$(PKG_SOURCE)"
BOOTSTRAP_UNPACK:=$(HOST_TAR) -C $(BOOTSTRAP_BUILD_DIR) --strip-components=1 -xzf $(DL_DIR)/$(BOOTSTRAP_SOURCE) BOOTSTRAP_UNPACK:=$(HOST_TAR) -C "$(BOOTSTRAP_BUILD_DIR)" --strip-components=1 -xzf "$(DL_DIR)/$(BOOTSTRAP_SOURCE)"
# don't strip ELF executables in test data (and go itself) # don't strip ELF executables in test data
RSTRIP:=: RSTRIP:=:
STRIP:=: STRIP:=:
ifeq ($(GO_TARGET_SPECTRE_SUPPORTED),1)
PKG_CONFIG_DEPENDS+=CONFIG_GOLANG_SPECTRE
endif
define Package/golang/Default define Package/golang/Default
$(call GoPackage/GoSubMenu) $(call GoPackage/GoSubMenu)
TITLE:=Go programming language TITLE:=Go programming language
@ -120,6 +135,10 @@ This package provides an assembler, compiler, linker, and compiled
libraries for the Go programming language. libraries for the Go programming language.
endef endef
define Package/golang/config
source "$(SOURCE)/Config.in"
endef
define Package/golang-doc define Package/golang-doc
$(call Package/golang/Default) $(call Package/golang/Default)
TITLE+= (documentation) TITLE+= (documentation)
@ -143,36 +162,62 @@ This package provides the Go programming language source files needed
for cross-compilation. for cross-compilation.
endef endef
define Download/golang-bootstrap
FILE:=$(BOOTSTRAP_SOURCE)
URL:=$(BOOTSTRAP_SOURCE_URL)
HASH:=$(BOOTSTRAP_HASH)
endef
$(eval $(call Download,golang-bootstrap))
$(eval $(call GoCompiler/AddProfile,Bootstrap,$(BOOTSTRAP_BUILD_DIR),,bootstrap,$(GO_HOST_OS_ARCH))) # Bootstrap
$(eval $(call GoCompiler/AddProfile,Host,$(HOST_BUILD_DIR),$(HOST_GO_PREFIX),$(HOST_GO_VERSION_ID),$(GO_HOST_OS_ARCH)))
$(eval $(call GoCompiler/AddProfile,Package,$(PKG_BUILD_DIR),$(GO_TARGET_PREFIX),$(GO_TARGET_VERSION_ID),$(GO_OS_ARCH)))
define Host/Prepare BOOTSTRAP_ROOT_DIR:=$(call qstrip,$(CONFIG_GOLANG_EXTERNAL_BOOTSTRAP_ROOT))
$(call Host/Prepare/Default)
mkdir -p $(BOOTSTRAP_BUILD_DIR) ifeq ($(BOOTSTRAP_ROOT_DIR),)
BOOTSTRAP_ROOT_DIR:=$(BOOTSTRAP_BUILD_DIR)
define Download/golang-bootstrap
FILE:=$(BOOTSTRAP_SOURCE)
URL:=$(BOOTSTRAP_SOURCE_URL)
HASH:=$(BOOTSTRAP_HASH)
endef
$(eval $(call Download,golang-bootstrap))
define Bootstrap/Prepare
mkdir -p "$(BOOTSTRAP_BUILD_DIR)"
$(BOOTSTRAP_UNPACK) $(BOOTSTRAP_UNPACK)
endef endef
Hooks/HostPrepare/Post+=Bootstrap/Prepare
$(eval $(call GoCompiler/AddProfile,Bootstrap,$(BOOTSTRAP_BUILD_DIR),,bootstrap,$(GO_HOST_OS_ARCH)))
endif
# Host
ifeq ($(GO_HOST_PIE_SUPPORTED),1)
HOST_GO_ENABLE_PIE:=1
endif
# when using GO_LDFLAGS to set buildmode=pie, the PIE install suffix
# does not apply (we also delete the std lib during Host/Install)
$(eval $(call GoCompiler/AddProfile,Host,$(HOST_BUILD_DIR),$(HOST_GO_PREFIX),$(HOST_GO_VERSION_ID),$(GO_HOST_OS_ARCH),$(HOST_GO_INSTALL_SUFFIX)))
HOST_GO_VARS= \
GOCACHE="$(GO_BUILD_CACHE_DIR)" \
GOENV=off \
CC="$(HOSTCC_NOCACHE)" \
CXX="$(HOSTCXX_NOCACHE)"
define Host/Compile define Host/Compile
$(call GoCompiler/Bootstrap/CheckHost,$(BOOTSTRAP_GO_VALID_OS_ARCH)) $(call GoCompiler/Bootstrap/CheckHost,$(BOOTSTRAP_GO_VALID_OS_ARCH))
$(call GoCompiler/Host/CheckHost,$(HOST_GO_VALID_OS_ARCH)) $(call GoCompiler/Host/CheckHost,$(HOST_GO_VALID_OS_ARCH))
mkdir -p "$(GO_BUILD_CACHE_DIR)"
$(call GoCompiler/Bootstrap/Make, \ $(call GoCompiler/Bootstrap/Make, \
CC=$(HOSTCC_NOCACHE) \ $(HOST_GO_VARS) \
CXX=$(HOSTCXX_NOCACHE) \
) )
$(call GoCompiler/Host/Make, \ $(call GoCompiler/Host/Make, \
GOROOT_BOOTSTRAP=$(BOOTSTRAP_BUILD_DIR) \ GOROOT_BOOTSTRAP="$(BOOTSTRAP_ROOT_DIR)" \
CC=$(HOSTCC_NOCACHE) \ $(if $(HOST_GO_ENABLE_PIE),GO_LDFLAGS="-buildmode pie") \
CXX=$(HOSTCXX_NOCACHE) \ $(HOST_GO_VARS) \
) )
endef endef
@ -187,77 +232,111 @@ define Host/Install
$(call GoCompiler/Host/Install/BinLinks,) $(call GoCompiler/Host/Install/BinLinks,)
rm -rf $(HOST_GO_ROOT)/pkg/$(GO_HOST_OS_ARCH) rm -rf "$(HOST_GO_ROOT)/pkg/$(GO_HOST_OS_ARCH)$(if $(HOST_GO_INSTALL_SUFFIX),_$(HOST_GO_INSTALL_SUFFIX))"
$(INSTALL_DIR) $(HOST_GO_ROOT)/openwrt $(INSTALL_DIR) "$(HOST_GO_ROOT)/openwrt"
$(INSTALL_BIN) ./files/go-gcc-helper $(HOST_GO_ROOT)/openwrt/ $(INSTALL_BIN) ./files/go-gcc-helper "$(HOST_GO_ROOT)/openwrt/"
$(LN) go-gcc-helper $(HOST_GO_ROOT)/openwrt/gcc $(LN) go-gcc-helper "$(HOST_GO_ROOT)/openwrt/gcc"
$(LN) go-gcc-helper $(HOST_GO_ROOT)/openwrt/g++ $(LN) go-gcc-helper "$(HOST_GO_ROOT)/openwrt/g++"
endef endef
define Host/Uninstall define Host/Uninstall
rm -rf $(HOST_GO_ROOT)/openwrt rm -rf "$(HOST_GO_ROOT)/openwrt"
$(call GoCompiler/Host/Uninstall/BinLinks,) $(call GoCompiler/Host/Uninstall/BinLinks,)
$(call GoCompiler/Host/Uninstall,) $(call GoCompiler/Host/Uninstall,)
endef endef
# Target
ifeq ($(GO_PKG_ENABLE_PIE),1)
PKG_GO_INSTALL_SUFFIX:=$(GO_TARGET_PIE_INSTALL_SUFFIX)
endif
$(eval $(call GoCompiler/AddProfile,Package,$(PKG_BUILD_DIR),$(PKG_GO_PREFIX),$(PKG_GO_VERSION_ID),$(GO_OS_ARCH),$(PKG_GO_INSTALL_SUFFIX)))
PKG_GO_ZBOOTSTRAP_MODS:= \
s/defaultGO386 = `[^`]*`/defaultGO386 = `$(or $(GO_386),387)`/; \
s/defaultGOARM = `[^`]*`/defaultGOARM = `$(or $(GO_ARM),5)`/; \
s/defaultGOMIPS = `[^`]*`/defaultGOMIPS = `$(or $(GO_MIPS),hardfloat)`/; \
s/defaultGOMIPS64 = `[^`]*`/defaultGOMIPS64 = `$(or $(GO_MIPS64),hardfloat)`/; \
s/defaultGOPPC64 = `[^`]*`/defaultGOPPC64 = `power8`/;
PKG_GO_VARS= \
GOCACHE="$(GO_BUILD_CACHE_DIR)" \
GOENV=off \
GO_GCC_HELPER_PATH="$$$$PATH" \
CC=gcc \
CXX=g++ \
PKG_CONFIG=pkg-config \
PATH="$(HOST_GO_ROOT)/openwrt:$$$$PATH"
PKG_GO_GCFLAGS= \
$(if $(GO_PKG_ENABLE_SPECTRE),-spectre all)
PKG_GO_ASMFLAGS= \
$(if $(GO_PKG_ENABLE_SPECTRE),-spectre all)
PKG_GO_LDFLAGS= \
-buildid '$(SOURCE_DATE_EPOCH)' \
-linkmode external \
-extldflags '$(patsubst -z%,-Wl$(comma)-z$(comma)%,$(TARGET_LDFLAGS))' \
$(if $(CONFIG_NO_STRIP)$(CONFIG_DEBUG),,-s -w)
# setting -trimpath is not necessary here because the paths inside the
# compiler binary are relative to GOROOT_FINAL (PKG_GO_ROOT), which is
# static / not dependent on the build environment
PKG_GO_INSTALL_ARGS= \
-ldflags "all=$(PKG_GO_LDFLAGS)" \
$(if $(PKG_GO_GCFLAGS),-gcflags "all=$(PKG_GO_GCFLAGS)") \
$(if $(PKG_GO_ASMFLAGS),-asmflags "all=$(PKG_GO_ASMFLAGS)") \
$(if $(filter $(GO_PKG_ENABLE_PIE),1),-buildmode pie)
define Build/Compile define Build/Compile
mkdir -p \ mkdir -p "$(GO_BUILD_CACHE_DIR)"
$(PKG_GO_HOST_CACHE_DIR) \
$(PKG_GO_TARGET_CACHE_DIR) \
$(PKG_GO_TMP_DIR)
@echo "Building target Go first stage" @echo "Building target Go first stage"
$(call GoCompiler/Package/Make, \ $(call GoCompiler/Package/Make, \
GOROOT_BOOTSTRAP=$(HOST_GO_ROOT) \ GOROOT_BOOTSTRAP="$(HOST_GO_ROOT)" \
GOCACHE=$(PKG_GO_HOST_CACHE_DIR) \
GOTMPDIR=$(PKG_GO_TMP_DIR) \
GO_GCC_HELPER_CC="$(HOSTCC)" \ GO_GCC_HELPER_CC="$(HOSTCC)" \
GO_GCC_HELPER_CXX="$(HOSTCXX)" \ GO_GCC_HELPER_CXX="$(HOSTCXX)" \
GO_GCC_HELPER_PATH=$$$$PATH \ $(PKG_GO_VARS) \
CC=gcc \
CXX=g++ \
PKG_CONFIG=pkg-config \
PATH=$(HOST_GO_ROOT)/openwrt:$$$$PATH \
) )
$(SED) '$(PKG_GO_ZBOOTSTRAP_MODS)' \
"$(PKG_BUILD_DIR)/src/cmd/internal/objabi/zbootstrap.go"
@echo "Building target Go second stage" @echo "Building target Go second stage"
( \ ( \
cd $(PKG_BUILD_DIR)/bin ; \ cd "$(PKG_BUILD_DIR)/bin" ; \
export $(GO_PKG_TARGET_VARS) ; \
$(CP) go go-host ; \ $(CP) go go-host ; \
GOROOT_FINAL=$(GO_TARGET_ROOT) \ GOROOT_FINAL="$(PKG_GO_ROOT)" \
GOCACHE=$(PKG_GO_TARGET_CACHE_DIR) \
GOTMPDIR=$(PKG_GO_TMP_DIR) \
GO_GCC_HELPER_CC="$(TARGET_CC)" \ GO_GCC_HELPER_CC="$(TARGET_CC)" \
GO_GCC_HELPER_CXX="$(TARGET_CXX)" \ GO_GCC_HELPER_CXX="$(TARGET_CXX)" \
GO_GCC_HELPER_PATH=$$$$PATH \ $(PKG_GO_VARS) \
CC=gcc \ ./go-host install -a $(PKG_GO_INSTALL_ARGS) std cmd ; \
CXX=g++ \ retval="$$$$?" ; \
PKG_CONFIG=pkg-config \
PATH=$(HOST_GO_ROOT)/openwrt:$$$$PATH \
$(call GoPackage/Environment) \
./go-host install -a -v std cmd ; \
retval=$$$$? ; \
rm -f go-host ; \ rm -f go-host ; \
exit $$$$retval ; \ exit "$$$$retval" ; \
) )
endef endef
define Package/golang/install define Package/golang/install
$(call GoCompiler/Package/Install/Bin,$(1)$(GO_TARGET_PREFIX)) $(call GoCompiler/Package/Install/Bin,$(1)$(PKG_GO_PREFIX))
$(call GoCompiler/Package/Install/BinLinks,$(1)$(GO_TARGET_PREFIX)) $(call GoCompiler/Package/Install/BinLinks,$(1)$(PKG_GO_PREFIX))
endef endef
define Package/golang-doc/install define Package/golang-doc/install
$(call GoCompiler/Package/Install/Doc,$(1)$(GO_TARGET_PREFIX)) $(call GoCompiler/Package/Install/Doc,$(1)$(PKG_GO_PREFIX))
endef endef
define Package/golang-src/install define Package/golang-src/install
$(call GoCompiler/Package/Install/Src,$(1)$(GO_TARGET_PREFIX)) $(call GoCompiler/Package/Install/Src,$(1)$(PKG_GO_PREFIX))
endef endef
# src/debug contains ELF executables as test data # src/debug contains ELF executables as test data
@ -268,6 +347,7 @@ define Package/golang-src/extra_provides
echo 'libc.so.6' echo 'libc.so.6'
endef endef
$(eval $(call HostBuild)) $(eval $(call HostBuild))
$(eval $(call BuildPackage,golang)) $(eval $(call BuildPackage,golang))
$(eval $(call BuildPackage,golang-doc)) $(eval $(call BuildPackage,golang-doc))

View file

@ -1,23 +1,41 @@
#!/bin/sh #!/bin/sh
me=go-gcc-helper me=go-gcc-helper
name=$(basename $0) name="${0##*/}"
case $name in log() {
# shellcheck disable=SC2039
local IFS=" "
printf '%s\n' "$me: $*"
}
case "$name" in
gcc) gcc)
cmd=$GO_GCC_HELPER_CC if [ -z "$GO_GCC_HELPER_CC" ]; then
log "missing GO_GCC_HELPER_CC"
exit 1
fi
cmd="$GO_GCC_HELPER_CC"
;; ;;
g++) g++)
cmd=$GO_GCC_HELPER_CXX if [ -z "$GO_GCC_HELPER_CXX" ]; then
log "missing GO_GCC_HELPER_CXX"
exit 1
fi
cmd="$GO_GCC_HELPER_CXX"
;; ;;
*) *)
echo "$me: unknown command \"$name\"" log "unknown command \"$name\""
exit 1 exit 1
;; ;;
esac esac
export PATH="$GO_GCC_HELPER_PATH" if [ -n "$GO_GCC_HELPER_PATH" ]; then
export PATH="$GO_GCC_HELPER_PATH"
else
log "missing GO_GCC_HELPER_PATH"
fi
echo "$me: running $cmd $@" log "running $cmd $*"
$cmd "$@" $cmd "$@"

View file

@ -559,7 +559,7 @@ fi
[ -z "$download" ] && download="$(uci -q get sqm.$OMR_TRACKER_INTERFACE.download)" [ -z "$download" ] && download="$(uci -q get sqm.$OMR_TRACKER_INTERFACE.download)"
upload="$(uci -q get network.$OMR_TRACKER_INTERFACE.uploadspeed)" upload="$(uci -q get network.$OMR_TRACKER_INTERFACE.uploadspeed)"
[ -z "$upload" ] && upload="$(uci -q get sqm.$OMR_TRACKER_INTERFACE.upload)" [ -z "$upload" ] && upload="$(uci -q get sqm.$OMR_TRACKER_INTERFACE.upload)"
if [ "$(uci show | grep mptcpr)" = "" ]; then if [ "$(uci -q show | grep mptcpr)" = "" ]; then
touch /etc/config/openmptcprouter touch /etc/config/openmptcprouter
fi fi
if [ "$(uci -q get openmptcprouter.$OMR_TRACKER_INTERFACE.vpn)" != "1" ] && [ "$(pgrep glorytun-udp)" != "" ] && ([ "$(glorytun-udp path | grep $OMR_TRACKER_DEVICE_IP)" = "" ] || [ "$(glorytun-udp path $OMR_TRACKER_DEVICE_IP | awk '{print $13}')" = "0" ] || [ "$(glorytun-udp path $OMR_TRACKER_DEVICE_IP | awk '{print $16}')" = "0" ]); then if [ "$(uci -q get openmptcprouter.$OMR_TRACKER_INTERFACE.vpn)" != "1" ] && [ "$(pgrep glorytun-udp)" != "" ] && ([ "$(glorytun-udp path | grep $OMR_TRACKER_DEVICE_IP)" = "" ] || [ "$(glorytun-udp path $OMR_TRACKER_DEVICE_IP | awk '{print $13}')" = "0" ] || [ "$(glorytun-udp path $OMR_TRACKER_DEVICE_IP | awk '{print $16}')" = "0" ]); then

View file

@ -11,7 +11,7 @@ include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=ndpi-netfilter2 PKG_NAME:=ndpi-netfilter2
PKG_RELEASE:=2 PKG_RELEASE:=2
PKG_REV:=d4924d528018d784d6da045c787b3420bbf7ce65 PKG_REV:=86eaa857129cdd63152ebcd483366706e28089cc
PKG_VERSION:=3.2-$(PKG_REV) PKG_VERSION:=3.2-$(PKG_REV)
PKG_SOURCE_PROTO:=git PKG_SOURCE_PROTO:=git

View file

@ -12,7 +12,7 @@ config defaults 'defaults'
list hosts '114.114.114.114' list hosts '114.114.114.114'
list hosts '114.114.115.115' list hosts '114.114.115.115'
option timeout '2' option timeout '2'
option tries '2' option tries '3'
option interval '2' option interval '2'
option interval_tries '1' option interval_tries '1'
option type 'ping' option type 'ping'

View file

@ -16,6 +16,21 @@ mptcp_over_vpn() {
local interface=$1 local interface=$1
nbintf=$(($nbintf+1)) nbintf=$(($nbintf+1))
if [ "$(uci -q get openmptcprouter.${interface}.multipathvpn)" = "1" ]; then if [ "$(uci -q get openmptcprouter.${interface}.multipathvpn)" = "1" ]; then
if [ "$(uci -q get network.${interface})" = "" ]; then
uci -q batch <<-EOF >/dev/null
delete openmptcprouter.${interface}
delete network.ovpn${interface}
delete openvpn.${interface}
commit openvpn
delete openmptcprouter.${interface}
delete openmptcprouter.ovpn${interface}
commit openmptcprouter
commit network
del_list firewall.zone_vpn.network="ovpn${interface}"
commit firewall
EOF
return
fi
nbintfvpn=$(($nbintfvpn+1)) nbintfvpn=$(($nbintfvpn+1))
if [ "$(uci -q get network.ovpn${interface})" = "" ]; then if [ "$(uci -q get network.ovpn${interface})" = "" ]; then
logger -t "MPTCPoverVPN" "Enable MPTCP over VPN for ${interface}" logger -t "MPTCPoverVPN" "Enable MPTCP over VPN for ${interface}"
@ -89,6 +104,21 @@ mptcp_over_vpn() {
del_list firewall.zone_vpn.network="ovpn${interface}" del_list firewall.zone_vpn.network="ovpn${interface}"
commit firewall commit firewall
EOF EOF
elif [ "$(uci -q get openmptcprouter.${interface}.vpn)" = "1" ]; then
intf="$(echo ${interface} | sed 's/ovpn//g')"
if [ -n "$intf" ] && [ "$intf" != "$interface" ] && [ "$(uci -q get network.${intf})" = "" ]; then
uci -q batch <<-EOF >/dev/null
delete network.${interface}
delete openvpn.${intf}
commit openvpn
delete openmptcprouter.${intf}
delete openmptcprouter.${interface}
commit openmptcprouter
commit network
del_list firewall.zone_vpn.network="${interface}"
commit firewall
EOF
fi
fi fi
} }

View file

@ -122,10 +122,19 @@ if [ "$(uci -q get firewall.gre_tunnel)" = "" ]; then
commit firewall commit firewall
EOF EOF
fi fi
if [ "$(uci -q get firewall.fwlantovpn)" = "" ]; then
uci -q batch <<-EOF >/dev/null
set firewall.@zone[0].auto_helper='0'
set firewall.fwlantovpn=forwarding
set firewall.fwlantovpn.src='lan'
set firewall.fwlantovpn.dest='vpn'
commit firewall
EOF
fi
uci -q batch <<-EOF >/dev/null uci -q batch <<-EOF >/dev/null
set firewall.@zone[0].mtu_fix='1' set firewall.@zone[0].mtu_fix='1'
set firewall.zone_vpn.mtu_fix='1' set firewall.zone_vpn.mtu_fix='1'
commit firewall
EOF EOF
rm -f /tmp/luci-indexcache rm -f /tmp/luci-indexcache