mirror of
				https://github.com/Ysurac/openmptcprouter-feeds.git
				synced 2025-03-09 15:40:03 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			318 lines
		
	
	
	
		
			8.9 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
			
		
		
	
	
			318 lines
		
	
	
	
		
			8.9 KiB
		
	
	
	
		
			Makefile
		
	
	
	
	
	
#
 | 
						|
# 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
 | 
						|
 | 
						|
include $(GO_INCLUDE_DIR)/golang-values.mk
 | 
						|
 | 
						|
 | 
						|
# Variables (all optional, except GO_PKG) to be set in package
 | 
						|
# Makefiles:
 | 
						|
#
 | 
						|
# GO_PKG (required) - name of Go package
 | 
						|
#
 | 
						|
#   Go name of the package.
 | 
						|
#
 | 
						|
#   e.g. GO_PKG:=golang.org/x/text
 | 
						|
#
 | 
						|
#
 | 
						|
# GO_PKG_INSTALL_EXTRA - list of regular expressions, default empty
 | 
						|
#
 | 
						|
#   Additional files/directories to install. By default, only these
 | 
						|
#   files are installed:
 | 
						|
#
 | 
						|
#   * Files with one of these extensions:
 | 
						|
#     .go, .c, .cc, .h, .hh, .proto, .s
 | 
						|
#
 | 
						|
#   * Files in any 'testdata' directory
 | 
						|
#
 | 
						|
#   e.g. GO_PKG_INSTALL_EXTRA:=example.toml marshal_test.toml
 | 
						|
#
 | 
						|
#
 | 
						|
# GO_PKG_INSTALL_ALL - boolean (0 or 1), default false
 | 
						|
#
 | 
						|
#   If true, install all files regardless of extension or directory.
 | 
						|
#
 | 
						|
#   e.g. GO_PKG_INSTALL_ALL:=1
 | 
						|
#
 | 
						|
#
 | 
						|
# GO_PKG_SOURCE_ONLY - boolean (0 or 1), default false
 | 
						|
#
 | 
						|
#   If true, 'go install' will not be called. If the package does not
 | 
						|
#   (or should not) build any binaries, then specifying this option will
 | 
						|
#   save build time.
 | 
						|
#
 | 
						|
#   e.g. GO_PKG_SOURCE_ONLY:=1
 | 
						|
#
 | 
						|
#
 | 
						|
# GO_PKG_BUILD_PKG - list of build targets, default GO_PKG/...
 | 
						|
#
 | 
						|
#   Build targets for compiling this Go package, i.e. arguments passed
 | 
						|
#   to 'go install'
 | 
						|
#
 | 
						|
#   e.g. GO_PKG_BUILD_PKG:=github.com/debian/ratt/cmd/...
 | 
						|
#
 | 
						|
#
 | 
						|
# GO_PKG_EXCLUDES - list of regular expressions, default empty
 | 
						|
#
 | 
						|
#   Patterns to exclude from the build targets expanded from
 | 
						|
#   GO_PKG_BUILD_PKG.
 | 
						|
#
 | 
						|
#   e.g. GO_PKG_EXCLUDES:=examples/
 | 
						|
#
 | 
						|
#
 | 
						|
# GO_PKG_GO_GENERATE - boolean (0 or 1), default false
 | 
						|
#
 | 
						|
#   If true, 'go generate' will be called on all build targets (as
 | 
						|
#   determined by GO_PKG_BUILD_PKG and GO_PKG_EXCLUDES). This is usually
 | 
						|
#   not necessary.
 | 
						|
#
 | 
						|
#   e.g. GO_PKG_GO_GENERATE:=1
 | 
						|
 | 
						|
# Credit for this package build process (GoPackage/Build/Configure and
 | 
						|
# GoPackage/Build/Compile) belong to Debian's dh-golang completely.
 | 
						|
# https://anonscm.debian.org/cgit/pkg-go/packages/dh-golang.git
 | 
						|
 | 
						|
 | 
						|
# for building packages, not user code
 | 
						|
GO_PKG_PATH:=/usr/share/gocode
 | 
						|
 | 
						|
GO_PKG_BUILD_PKG?=$(GO_PKG)/...
 | 
						|
 | 
						|
GO_PKG_WORK_DIR_NAME:=.go_work
 | 
						|
GO_PKG_WORK_DIR:=$(PKG_BUILD_DIR)/$(GO_PKG_WORK_DIR_NAME)
 | 
						|
 | 
						|
GO_PKG_BUILD_DIR:=$(GO_PKG_WORK_DIR)/build
 | 
						|
GO_PKG_CACHE_DIR:=$(GO_PKG_WORK_DIR)/cache
 | 
						|
GO_PKG_TMP_DIR:=$(GO_PKG_WORK_DIR)/tmp
 | 
						|
 | 
						|
GO_PKG_BUILD_BIN_DIR:=$(GO_PKG_BUILD_DIR)/bin$(if \
 | 
						|
  $(GO_HOST_TARGET_DIFFERENT),/$(GO_OS)_$(GO_ARCH))
 | 
						|
 | 
						|
GO_PKG_BUILD_DEPENDS_SRC:=$(STAGING_DIR)$(GO_PKG_PATH)/src
 | 
						|
 | 
						|
# sstrip causes corrupted section header size
 | 
						|
ifneq ($(CONFIG_USE_SSTRIP),)
 | 
						|
  ifneq ($(CONFIG_DEBUG),)
 | 
						|
    GO_PKG_STRIP_ARGS:=--strip-unneeded --remove-section=.comment --remove-section=.note
 | 
						|
  else
 | 
						|
    GO_PKG_STRIP_ARGS:=--strip-all
 | 
						|
  endif
 | 
						|
  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
 | 
						|
 | 
						|
define GoPackage/GoSubMenu
 | 
						|
  SUBMENU:=Go
 | 
						|
  SECTION:=lang
 | 
						|
  CATEGORY:=Languages
 | 
						|
endef
 | 
						|
 | 
						|
define GoPackage/Environment
 | 
						|
	GOOS=$(GO_OS) \
 | 
						|
	GOARCH=$(GO_ARCH) \
 | 
						|
	GO386=$(GO_386) \
 | 
						|
	GOARM=$(GO_ARM) \
 | 
						|
	GOMIPS=$(GO_MIPS) \
 | 
						|
	GOMIPS64=$(GO_MIPS64) \
 | 
						|
	CGO_ENABLED=1 \
 | 
						|
	CGO_CFLAGS="$(filter-out $(GO_CFLAGS_TO_REMOVE),$(TARGET_CFLAGS))" \
 | 
						|
	CGO_CPPFLAGS="$(TARGET_CPPFLAGS)" \
 | 
						|
	CGO_CXXFLAGS="$(filter-out $(GO_CFLAGS_TO_REMOVE),$(TARGET_CXXFLAGS))"
 | 
						|
endef
 | 
						|
 | 
						|
# false if directory does not exist
 | 
						|
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))
 | 
						|
 | 
						|
define GoPackage/Build/Configure
 | 
						|
	( \
 | 
						|
		cd $(PKG_BUILD_DIR) ; \
 | 
						|
		mkdir -p $(GO_PKG_BUILD_DIR)/bin $(GO_PKG_BUILD_DIR)/src \
 | 
						|
			$(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
 | 
						|
 | 
						|
# $(1) additional arguments for go command line (optional)
 | 
						|
define GoPackage/Build/Compile
 | 
						|
	( \
 | 
						|
		cd $(GO_PKG_BUILD_DIR) ; \
 | 
						|
		export GOPATH=$(GO_PKG_BUILD_DIR) \
 | 
						|
			GOCACHE=$(GO_PKG_CACHE_DIR) \
 | 
						|
			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
 | 
						|
 | 
						|
define GoPackage/Build/InstallDev
 | 
						|
	$(call GoPackage/Package/Install/Src,$(1))
 | 
						|
endef
 | 
						|
 | 
						|
define GoPackage/Package/Install/Bin
 | 
						|
	if [ -n "$(call GoPackage/has_binaries)" ]; then \
 | 
						|
		$(INSTALL_DIR) $(1)/usr/bin ; \
 | 
						|
		$(INSTALL_BIN) $(GO_PKG_BUILD_BIN_DIR)/* $(1)/usr/bin/ ; \
 | 
						|
	fi
 | 
						|
endef
 | 
						|
 | 
						|
define GoPackage/Package/Install/Src
 | 
						|
	dir=$$$$(dirname $(GO_PKG)) ; \
 | 
						|
	$(INSTALL_DIR) $(1)$(GO_PKG_PATH)/src/$$$$dir ; \
 | 
						|
	$(CP) $(GO_PKG_BUILD_DIR)/src/$(GO_PKG) $(1)$(GO_PKG_PATH)/src/$$$$dir/
 | 
						|
endef
 | 
						|
 | 
						|
define GoPackage/Package/Install
 | 
						|
	$(call GoPackage/Package/Install/Bin,$(1))
 | 
						|
	$(call GoPackage/Package/Install/Src,$(1))
 | 
						|
endef
 | 
						|
 | 
						|
 | 
						|
ifneq ($(GO_PKG),)
 | 
						|
  Build/Configure=$(call GoPackage/Build/Configure)
 | 
						|
  Build/Compile=$(call GoPackage/Build/Compile)
 | 
						|
  Build/InstallDev=$(call GoPackage/Build/InstallDev,$(1))
 | 
						|
endif
 | 
						|
 | 
						|
define GoPackage
 | 
						|
  ifndef Package/$(1)/install
 | 
						|
    Package/$(1)/install=$$(call GoPackage/Package/Install,$$(1))
 | 
						|
  endif
 | 
						|
endef
 | 
						|
 | 
						|
define GoBinPackage
 | 
						|
  ifndef Package/$(1)/install
 | 
						|
    Package/$(1)/install=$$(call GoPackage/Package/Install/Bin,$$(1))
 | 
						|
  endif
 | 
						|
endef
 | 
						|
 | 
						|
define GoSrcPackage
 | 
						|
  ifndef Package/$(1)/install
 | 
						|
    Package/$(1)/install=$$(call GoPackage/Package/Install/Src,$$(1))
 | 
						|
  endif
 | 
						|
endef
 |