#! /usr/bin/make -f

include ../source.mk

CFLAGS = -g -O2

nop:
	@:

configure:
	# Generate the main makefile.
	#   * Use multiarch library search directories.
	#     - The library path is given to ld/configure through
	#       host_configargs in Makefile's "configure-host" target.
	#     - If we're building a cross ld, search only target-specific
	#       library paths.
	#   * Use shared BFD and opcodes libraries for all utilities.
	#     - That is, dynamically link the utilities against a single copy of
	#       the BFD and opcodes libraries.
	#   * Don't enable multilib (multiarch is better).
	#   * Enable plugins.
	for target in $$(cat ../targets); do \
		if [ '$(OPK_HOST_ARCH)' = "$${target}" ]; then \
			LIB_PATH="=/usr/local/lib/$${target}:=/usr/local/lib"; \
			LIB_PATH="$${LIB_PATH}:=/lib/$${target}:=/lib"; \
			LIB_PATH="$${LIB_PATH}:=/usr/lib/$${target}:=/usr/lib"; \
		else \
			LIB_PATH="=/usr/local/lib/$${target}"; \
			LIB_PATH="$${LIB_PATH}:=/lib/$${target}"; \
			LIB_PATH="$${LIB_PATH}:=/usr/lib/$${target}"; \
		fi; \
		CFLAGS='$(CFLAGS)' \
			host_configargs="--with-lib-path=$${LIB_PATH}" \
			oh-autoconfigure \
			-B "build-$${target}" -t "$${target}" -- \
			--with-sysroot="$${OPK_SYSROOT:-/}" \
			--program-transform-name="s&^&$${target}-&" \
			--enable-shared --disable-multilib \
			--enable-plugins \
			--with-pkgversion='GNU Binutils for ProteanOS' || \
		exit 1; \
	done
	# Generate all the individual program makefiles.
	for target in $$(cat ../targets); do \
		oh-autobuild -B "build-$${target}" -T configure-host \
			tooldir='/usr/tool' scriptdir="/usr/lib/$${target}" \
			bfdlibdir="/usr/lib/$(OPK_HOST_ARCH)/$${target}" \
			bfdincludedir="/usr/include/$(OPK_HOST_ARCH)/$${target}" || \
		exit 1; \
	done
	touch $@

build: configure
	touch src/bfd/doc/bfd.info
	# Build BFD header files.
	for target in $$(cat ../targets); do \
		oh-autobuild -B "build-$${target}/bfd" -T headers \
			tooldir='/usr/tool' scriptdir="/usr/lib/$${target}" \
			bfdlibdir="/usr/lib/$(OPK_HOST_ARCH)/$${target}" \
			bfdincludedir="/usr/include/$(OPK_HOST_ARCH)/$${target}" || \
			exit 1; \
	done
	# Build ALL the things!
	for target in $$(cat ../targets); do \
		oh-autobuild -B "build-$${target}" CFLAGS='$(CFLAGS)' \
			MAKEINFO=true \
			tooldir='/usr/tool' scriptdir="/usr/lib/$${target}" \
			bfdlibdir="/usr/lib/$(OPK_HOST_ARCH)/$${target}" \
			bfdincludedir="/usr/include/$(OPK_HOST_ARCH)/$${target}" || \
			exit 1; \
	done
	touch $@
	# Run tests if natively building.
	if [ '$(OPK_BUILD_ARCH)' = '$(OPK_HOST_ARCH)' ]; then \
		for target in $$(cat ../targets); do \
			oh-autotest -B "build-$${target}" || \
				exit 1; \
		done; \
	fi

install: build
	# Install everything.
	#   * scriptdir contains target ldscripts.
	#   * ldscripts are specific to both the host and target architectures.
	#     - If host != target, only target-specific paths are passed as
	#       arguments to SEARCH_DIR commands in ldscripts.  (See the
	#       LIB_PATH stuff in the "configure" target above.)
	#   * All of these macro settings are effective thanks to 
	#     `patches/01_pass-some-dirs-to-child-makes.patch`.
	for target in $$(cat ../targets); do \
		oh-autoinstall \
			-B "build-$${target}" -d "binutils-$${target}.data" \
			CFLAGS='$(CFLAGS)' MAKEINFO=true \
			tooldir='/usr/tool' \
			scriptdir="/usr/lib/$(OPK_HOST_ARCH)/$${target}" \
			bfdlibdir="/usr/lib/$(OPK_HOST_ARCH)/$${target}" \
			bfdincludedir="/usr/include/$(OPK_HOST_ARCH)/$${target}" || \
		exit 1; \
	done
	# Do some cleanup.
	#   * /usr/tool/bin (TOOLBINDIR) contains hard links to tools.  A quick
	#     look at the code suggests we don't need them; ld *should* work
	#     without them in any sane configuration.
	#   * We don't need a static libiberty.
	#   * Remove static library dependency metadata generated by libtool.
	for target in $$(cat ../targets); do \
		rm -Rf "binutils-$${target}.data/usr/tool" && \
		find "binutils-$${target}.data/usr/lib" -name 'libiberty.a' \
			-exec rm -f '{}' ';' && \
		find "binutils-$${target}.data/usr/lib" -name '*.la' \
			-exec rm -f '{}' ';' && \
		for dir in "binutils-$${target}.data/usr/lib/"*/; do \
			case "$${dir#binutils-$${target}.data/usr/lib/}" in \
				'$(OPK_HOST_ARCH)/') ;; \
				"$${target}/") ;; \
				*) rmdir "$${dir}" ;; \
			esac; \
		done; \
	done
	# Make symbolic links to native utilities.
	for target in $$(cat ../targets); do \
		if [ '$(OPK_HOST_ARCH)' = "$${target}" ]; then \
			for util in "binutils-$${target}.data/usr/bin/$${target}-"*; do \
				if [ "$${util##*/$${target}-}" = 'ar' ]; then \
					dest='ar.binutils'; \
				elif [ "$${util##*/$${target}-}" = 'strings' ]; then \
					dest='strings.binutils'; \
				else \
					dest="$${util##*/$${target}-}"; \
				fi; \
				ln -sf "$${util##*/}" \
					"$${util%/*}/$${dest}"; \
			done \
		fi; \
	done
	# Write GNU ld configuration to point to BFD libraries.
	for target in $$(cat ../targets); do \
		ld_so_conf_d="binutils-$${target}.data/etc/ld.so.conf.d" && \
		ld_so_conf="$${ld_so_conf_d}/bfd_$(OPK_HOST_ARCH)_$${target}" && \
		mkdir -p "$${ld_so_conf_d}" && \
		printf '# GNU BFD libraries\n/usr/lib/%s/%s\n' \
			'$(OPK_HOST_ARCH)' "$${target}" \
			>"$${ld_so_conf}"; \
	done
	# Move documentation into binutils-doc data directory.
	# Move locale files into binutils-locales data directory.
	mkdir -p 'binutils-doc.data/usr/share'
	mkdir -p 'binutils-locales.data/usr/share'
	for target in $$(cat ../targets); do \
		if [ ! -d 'binutils-doc.data/usr/share/man' ]; then \
			mv "binutils-$${target}.data/usr/share/man" \
				'binutils-doc.data/usr/share' || \
			exit 1; \
			for file in 'binutils-doc.data/usr/share/man/man1/'*; do \
				mv "$${file}" "$${file%/*}/$${file##*/$${target}-}" || \
				exit 1; \
			done; \
		fi; \
		if [ ! -d 'binutils-doc.data/usr/share/info' ]; then \
			mv "binutils-$${target}.data/usr/share/info" \
				'binutils-doc.data/usr/share' || \
			exit 1; \
		fi; \
		if [ ! -d 'binutils-locales.data/usr/share/locale' ]; then \
			mv "binutils-$${target}.data/usr/share/locale" \
				'binutils-locales.data/usr/share' || \
			exit 1; \
		fi; \
		rm -Rf "binutils-$${target}.data/usr/share" || \
		exit 1; \
	done
	# Remove info index.
	rm -f binutils-doc.data/usr/share/info/dir
	# Remove common info files.
	rm -f binutils-doc.data/usr/share/info/configure.info
	rm -f binutils-doc.data/usr/share/info/standards.info
	# Move BFD development files into libbfd-dev-* data directory.
	for target in $$(cat ../targets); do \
		if [ -d "libbfd-dev-$${target}.data/usr" ]; then \
			rm -Rf "libbfd-dev-$${target}.data/usr" || \
			exit 1; \
		fi; \
		mkdir -p "libbfd-dev-$${target}.data/usr/lib/$(OPK_HOST_ARCH)/$${target}" && \
		mv "binutils-$${target}.data/usr/include" \
			"libbfd-dev-$${target}.data/usr" && \
		mv "binutils-$${target}.data/usr/lib/$(OPK_HOST_ARCH)/$${target}/libbfd.so" \
			"binutils-$${target}.data/usr/lib/$(OPK_HOST_ARCH)/$${target}/libbfd.a" \
			"binutils-$${target}.data/usr/lib/$(OPK_HOST_ARCH)/$${target}/libopcodes.so" \
			"binutils-$${target}.data/usr/lib/$(OPK_HOST_ARCH)/$${target}/libopcodes.a" \
			"libbfd-dev-$${target}.data/usr/lib/$(OPK_HOST_ARCH)/$${target}" || \
		exit 1; \
	done
	# Post-process and install everything.
	for target in $$(cat ../targets); do \
		oh-fixperms -d "binutils-$${target}.data" && \
		oh-strip -d "binutils-$${target}.data" || \
		exit 1; \
	done

clean: clean-build clean-install

clean-build:
	for target in $$(cat ../targets); do \
		oh-autoclean -B "build-$${target}" || \
			exit 1; \
	done
	rm -f configure build

clean-install:
	rm -Rf *.data