# $NetBSD: Makefile.common,v 1.17 2022/03/07 16:18:24 nia Exp $
#
# Common infrastructure for NetBSD compat* packages.
#
# This file should be included after EMUL_PLATFORMS and NETBSD_VERSION are
# defined and before EMUL_PLATFORM is used.
#
# used by emulators/compat12/Makefile
# used by emulators/compat13/Makefile
# used by emulators/compat14/Makefile
# used by emulators/compat15-extras/Makefile
# used by emulators/compat15-extras/Makefile
# used by emulators/compat15/Makefile
# used by emulators/compat15/Makefile
# used by emulators/compat16-extras/Makefile
# used by emulators/compat16-extras/Makefile
# used by emulators/compat16/Makefile
# used by emulators/compat16/Makefile
# used by emulators/compat20-extras/Makefile
# used by emulators/compat20-extras/Makefile
# used by emulators/compat20/Makefile
# used by emulators/compat20/Makefile
# used by emulators/compat30-extras/Makefile
# used by emulators/compat30-extras/Makefile
# used by emulators/compat30/Makefile
# used by emulators/compat30/Makefile
# used by emulators/compat40-extras/Makefile
# used by emulators/compat40-extras/Makefile
# used by emulators/compat40/Makefile
# used by emulators/compat40/Makefile
# used by emulators/compat50-x11/Makefile
# used by emulators/compat50/Makefile
# used by emulators/compat51-x11/Makefile
# used by emulators/compat51/Makefile
# used by emulators/compat60/Makefile
# used by emulators/compat61/Makefile
# used by emulators/compat61-x11/Makefile
# used by emulators/compat80/Makefile
# used by emulators/compat90/Makefile

CATEGORIES=		emulators
MASTER_SITES=		${MASTER_SITE_LOCAL:=${DIST_SUBDIR}${DIST_SUBDIR:D/}}
EXTRACT_SUFX=		.tar.bz2

MAINTAINER=		pkgsrc-users@NetBSD.org

NO_SRC_ON_FTP=		Already in MASTER_SITE_LOCAL

USE_TOOLS+=	pax

NETBSD_PKG=		yes
EMUL_REQD=		netbsd>=${NETBSD_VERSION}

CHECK_PIE_SUPPORTED=	no
CHECK_RELRO_SUPPORTED=	no

.include "../../mk/bsd.prefs.mk"

.if defined(NETBSD_COMPAT32) && defined(ACCEPTABLE_NETBSD)
ONLY_FOR_PLATFORM+=	${ACCEPTABLE_NETBSD:S/$/-sparc64/}
ONLY_FOR_PLATFORM+=	${ACCEPTABLE_NETBSD:S/$/-x86_64/}
.endif

NETBSD_PKGSRCDIR?=	${.CURDIR}/../${.CURDIR:T:S/^netbsd32_//}
FILESDIR=		${NETBSD_PKGSRCDIR}/files
PATCHDIR=		${NETBSD_PKGSRCDIR}/patches
PKGDIR=			${NETBSD_PKGSRCDIR}

.if defined(NETBSD_COMPAT32)
PKGNAME=		netbsd32_${DISTNAME:S/-${EMUL_ARCH}-/-/}
COMMENT:=		${COMMENT:S/NetBSD/NetBSD 32-bit/}
NETBSD_BASE=		netbsd32_
.else
PKGNAME=		${DISTNAME:S/-${EMUL_ARCH}-/-/}
NETBSD_BASE=		# empty
.endif

BUILD_DIRS=		# empty
MAKE_DIRS+=		${EMULDIR}
ELF_SYMLINKS_DATA=	${WRKDIR}/.symlinks-data

#
# PLISTs are composed from the following bits, in order:
#
#	PLIST.${EMUL_ARCH}	e.g. PLIST.alpha
#	PLIST.${EMUL_EXEC_FMT}	e.g. PLIST.ELF
#	PLIST			e.g. PLIST
#
.if exists(${PKGDIR}/PLIST.${EMUL_ARCH})
PLIST_SRC+=		${PKGDIR}/PLIST.${EMUL_ARCH}
.endif
.if exists(${PKGDIR}/PLIST.${EMUL_EXEC_FMT})
PLIST_SRC+=		${PKGDIR}/PLIST.${EMUL_EXEC_FMT}
.endif
.if exists(${PKGDIR}/PLIST)
PLIST_SRC+=		${PKGDIR}/PLIST
.endif

# Set NATIVE_EXEC_FMT and EMUL_EXEC_FMT appropriately.  Normally, these
# are set by mk/emulator.mk, included in bsd.pkg.mk, but this happens
# too late for us here.
#
# Directly set NATIVE_EXEC_FMT and include the correct emulator.mk file
# to define EMUL_EXEC_FMT.
#
NATIVE_EXEC_FMT=	${SHLIB_TYPE}

.include "${PKGSRCDIR}/emulators/${COMPAT_PKG}/emulator.mk"

#
# Different combinations of the native executable format and the emulated
# executable format require different ways of making the installed shared
# libraries useful after installation.
#
#	native	emul	action
#	-----	----	------
#	a.out	a.out	append to ld.so.conf and run ldconfig
#	ELF	a.out	run ldconfig
#	ELF	ELF	create symlinks to shlibs into base system
#	ELF64	ELF32	nothing
#
.if (${NATIVE_EXEC_FMT} == "a.out") && (${EMUL_EXEC_FMT} == "a.out")
INSTALL_TEMPLATES+=	${PKGSRCDIR}/emulators/compat_netbsd/INSTALL.a.out

.elif (${NATIVE_EXEC_FMT} == "ELF") && (${EMUL_EXEC_FMT} == "a.out")
INSTALL_TEMPLATES+=	${PKGSRCDIR}/emulators/compat_netbsd/INSTALL.emulaout

.elif defined(NETBSD_COMPAT32)
INSTALL_TEMPLATES+=	${PKGSRCDIR}/emulators/compat_netbsd/INSTALL.emulnetbsd32

.else # (${NATIVE_EXEC_FMT} == "ELF") && (${EMUL_EXEC_FMT} == "ELF")
INSTALL_TEMPLATES+=	${PKGSRCDIR}/emulators/compat_netbsd/INSTALL.ELF
INSTALL_TEMPLATES+=	${ELF_SYMLINKS_DATA}
post-build: symlinks-data
.endif

DEINSTALL_TEMPLATES+=	${PKGSRCDIR}/emulators/compat_netbsd/DEINSTALL

#
# For ELF platforms, the INSTALL.ELF script needs SYMLINK data lines to
# tell it which shared libraries need to be symlinked to where.  Generate
# this information from the PLIST.
#
.PHONY: symlinks-data
symlinks-data: ${ELF_SYMLINKS_DATA}
${ELF_SYMLINKS_DATA}: plist
	${RUN} ${CAT} ${PLIST} | ${AWK}					\
	'BEGIN { print "#" } END { print "#" } /^@/ { next }		\
	 { src = $$0; dst = src; sub("^${EMULSUBDIRSLASH}", "/", dst);	\
	   print "# SYMLINK: " src " " dst }' > ${.TARGET}

#
# The compat* packages have a very strict package layout:
#
#	${WRKSRC}/lib
#	${WRKSRC}/libexec
#	${WRKSRC}/usr
#
# Each of these directories, if they exist, are copied directly into
# ${EMULDIR}.
#
.PHONY: compat-install
do-install: compat-install
compat-install:
	${INSTALL_DATA_DIR} ${DESTDIR}${PREFIX}/${EMULSUBDIR}
	cd ${WRKSRC} && for dir in lib libexec usr; do			\
		if ${TEST} -d "$$dir"; then				\
			pax -rw "$$dir"				\
				${DESTDIR}${PREFIX}/${EMULSUBDIR};	\
		fi;							\
	done
