xref: /freebsd/share/mk/bsd.compat.mk (revision c09aa2145ab281567daf3364d19e044352dd85fc)
1bbcf7eddSBrooks Davis# $FreeBSD$
2bbcf7eddSBrooks Davis
3bbcf7eddSBrooks Davis.if !targets(__<${_this:T}>__)
4bbcf7eddSBrooks Davis__<${_this:T}>__:
5bbcf7eddSBrooks Davis
6*c09aa214SBrooks Davis.if defined(_LIBCOMPAT)
7*c09aa214SBrooks DavisCOMPAT_ARCH=	${TARGET_ARCH}
8*c09aa214SBrooks DavisCOMPAT_CPUTYPE=	${TARGET_CPUTYPE}
9*c09aa214SBrooks Davis.else
10*c09aa214SBrooks DavisCOMPAT_ARCH=	${MACHINE_ARCH}
11*c09aa214SBrooks DavisCOMPAT_CPUTYPE=	${CPUTYPE}
12*c09aa214SBrooks Davis.endif
13*c09aa214SBrooks Davis
14bbcf7eddSBrooks Davis# -------------------------------------------------------------------
15bbcf7eddSBrooks Davis# 32 bit world
16*c09aa214SBrooks Davis.if ${COMPAT_ARCH} == "amd64"
176b53d510SBrooks DavisHAS_COMPAT=32
18*c09aa214SBrooks Davis.if empty(COMPAT_CPUTYPE)
19bbcf7eddSBrooks DavisLIB32CPUFLAGS=	-march=i686 -mmmx -msse -msse2
20bbcf7eddSBrooks Davis.else
21*c09aa214SBrooks DavisLIB32CPUFLAGS=	-march=${COMPAT_CPUTYPE}
22bbcf7eddSBrooks Davis.endif
236b53d510SBrooks Davis.if (defined(WANT_COMPILER_TYPE) && ${WANT_COMPILER_TYPE} == gcc) || \
24bbcf7eddSBrooks Davis    (defined(X_COMPILER_TYPE) && ${X_COMPILER_TYPE} == gcc)
25bbcf7eddSBrooks Davis.else
26bbcf7eddSBrooks DavisLIB32CPUFLAGS+=	-target x86_64-unknown-freebsd13.0
27bbcf7eddSBrooks Davis.endif
28bbcf7eddSBrooks DavisLIB32CPUFLAGS+=	-m32
29bbcf7eddSBrooks DavisLIB32WMAKEENV=	MACHINE=i386 MACHINE_ARCH=i386 \
30bbcf7eddSBrooks Davis		MACHINE_CPU="i686 mmx sse sse2"
31bbcf7eddSBrooks DavisLIB32WMAKEFLAGS=	\
32bbcf7eddSBrooks Davis		AS="${XAS} --32" \
33bbcf7eddSBrooks Davis		LD="${XLD} -m elf_i386_fbsd -L${LIBCOMPATTMP}/usr/lib32"
34bbcf7eddSBrooks Davis
35*c09aa214SBrooks Davis.elif ${COMPAT_ARCH} == "powerpc64"
366b53d510SBrooks DavisHAS_COMPAT=32
37*c09aa214SBrooks Davis.if empty(COMPAT_CPUTYPE)
38bbcf7eddSBrooks DavisLIB32CPUFLAGS=	-mcpu=powerpc
39bbcf7eddSBrooks Davis.else
40*c09aa214SBrooks DavisLIB32CPUFLAGS=	-mcpu=${COMPAT_CPUTYPE}
41bbcf7eddSBrooks Davis.endif
42bbcf7eddSBrooks DavisLIB32CPUFLAGS+=	-m32
43bbcf7eddSBrooks DavisLIB32WMAKEENV=	MACHINE=powerpc MACHINE_ARCH=powerpc
44bbcf7eddSBrooks DavisLIB32WMAKEFLAGS=	\
45bbcf7eddSBrooks Davis		LD="${XLD} -m elf32ppc_fbsd"
46bbcf7eddSBrooks Davis
47*c09aa214SBrooks Davis.elif ${COMPAT_ARCH:Mmips64*} != ""
486b53d510SBrooks DavisHAS_COMPAT=32
495626bc0aSBrooks Davis.if (defined(WANT_COMPILER_TYPE) && ${WANT_COMPILER_TYPE} == gcc) || \
50bbcf7eddSBrooks Davis    (defined(X_COMPILER_TYPE) && ${X_COMPILER_TYPE} == gcc)
51*c09aa214SBrooks Davis.if empty(COMPAT_CPUTYPE)
52bbcf7eddSBrooks DavisLIB32CPUFLAGS=	-march=mips3
53bbcf7eddSBrooks Davis.else
54*c09aa214SBrooks DavisLIB32CPUFLAGS=	-march=${COMPAT_CPUTYPE}
55bbcf7eddSBrooks Davis.endif
56bbcf7eddSBrooks Davis.else
57*c09aa214SBrooks Davis.if ${COMPAT_ARCH:Mmips64el*} != ""
58bbcf7eddSBrooks DavisLIB32CPUFLAGS=  -target mipsel-unknown-freebsd13.0
59bbcf7eddSBrooks Davis.else
60bbcf7eddSBrooks DavisLIB32CPUFLAGS=  -target mips-unknown-freebsd13.0
61bbcf7eddSBrooks Davis.endif
62bbcf7eddSBrooks Davis.endif
63bbcf7eddSBrooks DavisLIB32CPUFLAGS+= -mabi=32
64bbcf7eddSBrooks DavisLIB32WMAKEENV=	MACHINE=mips MACHINE_ARCH=mips
65*c09aa214SBrooks Davis.if ${COMPAT_ARCH:Mmips64el*} != ""
66bbcf7eddSBrooks DavisLIB32WMAKEFLAGS= LD="${XLD} -m elf32ltsmip_fbsd"
67bbcf7eddSBrooks Davis.else
68bbcf7eddSBrooks DavisLIB32WMAKEFLAGS= LD="${XLD} -m elf32btsmip_fbsd"
69bbcf7eddSBrooks Davis.endif
70bbcf7eddSBrooks Davis.endif
71bbcf7eddSBrooks Davis
72bbcf7eddSBrooks DavisLIB32WMAKEFLAGS+= NM="${XNM}"
73bbcf7eddSBrooks DavisLIB32WMAKEFLAGS+= OBJCOPY="${XOBJCOPY}"
74bbcf7eddSBrooks Davis
75bbcf7eddSBrooks DavisLIB32CFLAGS=	-DCOMPAT_32BIT
76bbcf7eddSBrooks DavisLIB32DTRACE=	${DTRACE} -32
77bbcf7eddSBrooks DavisLIB32WMAKEFLAGS+=	-DCOMPAT_32BIT
78bbcf7eddSBrooks Davis
79bbcf7eddSBrooks Davis# -------------------------------------------------------------------
80bbcf7eddSBrooks Davis# soft-fp world
81*c09aa214SBrooks Davis.if ${COMPAT_ARCH:Marmv[67]*} != ""
826b53d510SBrooks DavisHAS_COMPAT=SOFT
83bbcf7eddSBrooks DavisLIBSOFTCFLAGS=        -DCOMPAT_SOFTFP
84bbcf7eddSBrooks DavisLIBSOFTCPUFLAGS= -mfloat-abi=softfp
85*c09aa214SBrooks DavisLIBSOFTWMAKEENV= CPUTYPE=soft MACHINE=arm MACHINE_ARCH=${COMPAT_ARCH}
86bbcf7eddSBrooks DavisLIBSOFTWMAKEFLAGS=        -DCOMPAT_SOFTFP
87bbcf7eddSBrooks Davis.endif
88bbcf7eddSBrooks Davis
896b53d510SBrooks Davis# -------------------------------------------------------------------
906b53d510SBrooks Davis# In the program linking case, select LIBCOMPAT
916b53d510SBrooks Davis.if defined(NEED_COMPAT)
926b53d510SBrooks Davis.ifndef HAS_COMPAT
936b53d510SBrooks Davis.error NEED_COMPAT defined, but no LIBCOMPAT is available
946b53d510SBrooks Davis.elif !${HAS_COMPAT:M${NEED_COMPAT}} && ${NEED_COMPAT} != "any"
956b53d510SBrooks Davis.error NEED_COMPAT (${NEED_COMPAT}) defined, but not in HAS_COMPAT ($HAS_COMPAT)
966b53d510SBrooks Davis.elif ${NEED_COMPAT} == "any"
976b53d510SBrooks Davis.endif
986b53d510SBrooks Davis.ifdef WANT_COMPAT
996b53d510SBrooks Davis.error Both WANT_COMPAT and NEED_COMPAT defined
1006b53d510SBrooks Davis.endif
1016b53d510SBrooks DavisWANT_COMPAT:=	${NEED_COMPAT}
1026b53d510SBrooks Davis.endif
1036b53d510SBrooks Davis
1046b53d510SBrooks Davis.if defined(HAS_COMPAT) && defined(WANT_COMPAT)
1056b53d510SBrooks Davis.if ${WANT_COMPAT} == "any"
1066b53d510SBrooks Davis_LIBCOMPAT:=	${HAS_COMPAT:[1]}
1076b53d510SBrooks Davis.else
1086b53d510SBrooks Davis_LIBCOMPAT:=	${WANT_COMPAT}
1096b53d510SBrooks Davis.endif
1106b53d510SBrooks Davis.endif
1116b53d510SBrooks Davis
112bbcf7eddSBrooks Davis
113bbcf7eddSBrooks Davis# -------------------------------------------------------------------
114bbcf7eddSBrooks Davis# Generic code for each type.
115bbcf7eddSBrooks Davis# Set defaults based on type.
116ad2dd70bSBrooks Davislibcompat=	${_LIBCOMPAT:tl}
117bbcf7eddSBrooks Davis_LIBCOMPAT_MAKEVARS=	_OBJTOP TMP CPUFLAGS CFLAGS CXXFLAGS WMAKEENV \
118bbcf7eddSBrooks Davis			WMAKEFLAGS WMAKE
119bbcf7eddSBrooks Davis.for _var in ${_LIBCOMPAT_MAKEVARS}
120ad2dd70bSBrooks Davis.if !empty(LIB${_LIBCOMPAT}${_var})
121ad2dd70bSBrooks DavisLIBCOMPAT${_var}?=	${LIB${_LIBCOMPAT}${_var}}
122bbcf7eddSBrooks Davis.endif
123bbcf7eddSBrooks Davis.endfor
124bbcf7eddSBrooks Davis
125bbcf7eddSBrooks Davis# Shared flags
126bbcf7eddSBrooks DavisLIBCOMPAT_OBJTOP?=	${OBJTOP}/obj-lib${libcompat}
127bbcf7eddSBrooks DavisLIBCOMPATTMP?=		${LIBCOMPAT_OBJTOP}/tmp
128bbcf7eddSBrooks Davis
129bbcf7eddSBrooks DavisLIBCOMPATCFLAGS+=	${LIBCOMPATCPUFLAGS} \
130bbcf7eddSBrooks Davis			-L${LIBCOMPATTMP}/usr/lib${libcompat} \
131bbcf7eddSBrooks Davis			--sysroot=${LIBCOMPATTMP} \
132bbcf7eddSBrooks Davis			${BFLAGS}
133bbcf7eddSBrooks Davis
134bbcf7eddSBrooks Davis# -B is needed to find /usr/lib32/crti.o for GCC and /usr/libsoft/crti.o for
135bbcf7eddSBrooks Davis# Clang/GCC.
136bbcf7eddSBrooks DavisLIBCOMPATCFLAGS+=	-B${LIBCOMPATTMP}/usr/lib${libcompat}
137bbcf7eddSBrooks Davis
1386b53d510SBrooks Davis.if defined(WANT_COMPAT)
1396b53d510SBrooks DavisLIBDIR_BASE:=	/usr/lib${libcompat}
1406b53d510SBrooks Davis_LIB_OBJTOP=	${LIBCOMPAT_OBJTOP}
1416b53d510SBrooks DavisCFLAGS+=	${LIBCOMPATCFLAGS}
1426b53d510SBrooks Davis.endif
1436b53d510SBrooks Davis
144bbcf7eddSBrooks Davis.endif
145