mirror of
				https://github.com/Ysurac/openmptcprouter-feeds.git
				synced 2025-03-09 15:40:03 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			204 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			204 lines
		
	
	
	
		
			4.3 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| #!/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
 |