xref: /freebsd/share/mk/bsd.compat.mk (revision b451cd45449385ac7c5b8d8b809f80109e60e3ff)
1bbcf7eddSBrooks Davis# $FreeBSD$
2bbcf7eddSBrooks Davis
3bbcf7eddSBrooks Davis.if !targets(__<${_this:T}>__)
4bbcf7eddSBrooks Davis__<${_this:T}>__:
5bbcf7eddSBrooks Davis
6c09aa214SBrooks Davis.if defined(_LIBCOMPAT)
7c09aa214SBrooks DavisCOMPAT_ARCH=	${TARGET_ARCH}
8c09aa214SBrooks DavisCOMPAT_CPUTYPE=	${TARGET_CPUTYPE}
9a4330302SBrooks Davis.if (defined(WANT_COMPILER_TYPE) && ${WANT_COMPILER_TYPE} == gcc) || \
10a4330302SBrooks Davis    (defined(X_COMPILER_TYPE) && ${X_COMPILER_TYPE} == gcc)
11a4330302SBrooks DavisCOMPAT_COMPILER_TYPE=	gcc
12a4330302SBrooks Davis.else
13a4330302SBrooks DavisCOMPAT_COMPILER_TYPE=	clang
14a4330302SBrooks Davis.endif
15c09aa214SBrooks Davis.else
16c09aa214SBrooks DavisCOMPAT_ARCH=	${MACHINE_ARCH}
17c09aa214SBrooks DavisCOMPAT_CPUTYPE=	${CPUTYPE}
18a4330302SBrooks Davis.include <bsd.compiler.mk>
19a4330302SBrooks DavisCOMPAT_COMPILER_TYPE=${COMPILER_TYPE}
20c09aa214SBrooks Davis.endif
21c09aa214SBrooks Davis
22bbcf7eddSBrooks Davis# -------------------------------------------------------------------
23bbcf7eddSBrooks Davis# 32 bit world
24c09aa214SBrooks Davis.if ${COMPAT_ARCH} == "amd64"
256b53d510SBrooks DavisHAS_COMPAT=32
26c09aa214SBrooks Davis.if empty(COMPAT_CPUTYPE)
27bbcf7eddSBrooks DavisLIB32CPUFLAGS=	-march=i686 -mmmx -msse -msse2
28bbcf7eddSBrooks Davis.else
29c09aa214SBrooks DavisLIB32CPUFLAGS=	-march=${COMPAT_CPUTYPE}
30bbcf7eddSBrooks Davis.endif
31a4330302SBrooks Davis.if ${COMPAT_COMPILER_TYPE} == gcc
32bbcf7eddSBrooks Davis.else
33bbcf7eddSBrooks DavisLIB32CPUFLAGS+=	-target x86_64-unknown-freebsd13.0
34bbcf7eddSBrooks Davis.endif
35bbcf7eddSBrooks DavisLIB32CPUFLAGS+=	-m32
36a4330302SBrooks DavisLIB32_MACHINE=	i386
37a4330302SBrooks DavisLIB32_MACHINE_ARCH=	i386
38a4330302SBrooks DavisLIB32WMAKEENV=	MACHINE_CPU="i686 mmx sse sse2"
39bbcf7eddSBrooks DavisLIB32WMAKEFLAGS=	\
40bbcf7eddSBrooks Davis		AS="${XAS} --32" \
41bbcf7eddSBrooks Davis		LD="${XLD} -m elf_i386_fbsd -L${LIBCOMPATTMP}/usr/lib32"
42bbcf7eddSBrooks Davis
43c09aa214SBrooks Davis.elif ${COMPAT_ARCH} == "powerpc64"
446b53d510SBrooks DavisHAS_COMPAT=32
45c09aa214SBrooks Davis.if empty(COMPAT_CPUTYPE)
46bbcf7eddSBrooks DavisLIB32CPUFLAGS=	-mcpu=powerpc
47bbcf7eddSBrooks Davis.else
48c09aa214SBrooks DavisLIB32CPUFLAGS=	-mcpu=${COMPAT_CPUTYPE}
49bbcf7eddSBrooks Davis.endif
50*b451cd45SJustin Hibbits
51*b451cd45SJustin Hibbits.if ${COMPAT_COMPILER_TYPE} == "gcc"
52bbcf7eddSBrooks DavisLIB32CPUFLAGS+=	-m32
53*b451cd45SJustin Hibbits.else
54*b451cd45SJustin HibbitsLIB32CPUFLAGS+=	-target powerpc-unknown-freebsd13.0
55*b451cd45SJustin Hibbits
56*b451cd45SJustin Hibbits# Use BFD to workaround ld.lld issues on PowerPC 32 bit
57*b451cd45SJustin HibbitsLIB32CPUFLAGS+= -fuse-ld=${LD_BFD}
58*b451cd45SJustin Hibbits.endif
59*b451cd45SJustin Hibbits
60a4330302SBrooks DavisLIB32_MACHINE=	powerpc
61a4330302SBrooks DavisLIB32_MACHINE_ARCH=	powerpc
62bbcf7eddSBrooks DavisLIB32WMAKEFLAGS=	\
63*b451cd45SJustin Hibbits		LD="${LD_BFD} -m elf32ppc_fbsd"
64bbcf7eddSBrooks Davis
65c09aa214SBrooks Davis.elif ${COMPAT_ARCH:Mmips64*} != ""
666b53d510SBrooks DavisHAS_COMPAT=32
67a4330302SBrooks Davis.if ${COMPAT_COMPILER_TYPE} == gcc
68c09aa214SBrooks Davis.if empty(COMPAT_CPUTYPE)
69bbcf7eddSBrooks DavisLIB32CPUFLAGS=	-march=mips3
70bbcf7eddSBrooks Davis.else
71c09aa214SBrooks DavisLIB32CPUFLAGS=	-march=${COMPAT_CPUTYPE}
72bbcf7eddSBrooks Davis.endif
73bbcf7eddSBrooks Davis.else
74c09aa214SBrooks Davis.if ${COMPAT_ARCH:Mmips64el*} != ""
75bbcf7eddSBrooks DavisLIB32CPUFLAGS=  -target mipsel-unknown-freebsd13.0
76bbcf7eddSBrooks Davis.else
77bbcf7eddSBrooks DavisLIB32CPUFLAGS=  -target mips-unknown-freebsd13.0
78bbcf7eddSBrooks Davis.endif
79bbcf7eddSBrooks Davis.endif
80bbcf7eddSBrooks DavisLIB32CPUFLAGS+= -mabi=32
81a4330302SBrooks DavisLIB32_MACHINE=	mips
82a4330302SBrooks DavisLIB32_MACHINE_ARCH=	mips
83c09aa214SBrooks Davis.if ${COMPAT_ARCH:Mmips64el*} != ""
84a4330302SBrooks Davis_EMULATION=	elf32ltsmip_fbsd
85bbcf7eddSBrooks Davis.else
86a4330302SBrooks Davis_EMULATION=	elf32btsmip_fbsd
87bbcf7eddSBrooks Davis.endif
88a4330302SBrooks DavisLIB32WMAKEFLAGS= LD="${XLD} -m ${_EMULATION}"
89a4330302SBrooks DavisLIB32LDFLAGS=	-Wl,-m${_EMULATION}
90bbcf7eddSBrooks Davis.endif
91bbcf7eddSBrooks Davis
92bbcf7eddSBrooks DavisLIB32WMAKEFLAGS+= NM="${XNM}"
93bbcf7eddSBrooks DavisLIB32WMAKEFLAGS+= OBJCOPY="${XOBJCOPY}"
94bbcf7eddSBrooks Davis
95bbcf7eddSBrooks DavisLIB32CFLAGS=	-DCOMPAT_32BIT
96bbcf7eddSBrooks DavisLIB32DTRACE=	${DTRACE} -32
97bbcf7eddSBrooks DavisLIB32WMAKEFLAGS+=	-DCOMPAT_32BIT
98bbcf7eddSBrooks Davis
99bbcf7eddSBrooks Davis# -------------------------------------------------------------------
100bbcf7eddSBrooks Davis# soft-fp world
101c09aa214SBrooks Davis.if ${COMPAT_ARCH:Marmv[67]*} != ""
1026b53d510SBrooks DavisHAS_COMPAT=SOFT
103bbcf7eddSBrooks DavisLIBSOFTCFLAGS=        -DCOMPAT_SOFTFP
104bbcf7eddSBrooks DavisLIBSOFTCPUFLAGS= -mfloat-abi=softfp
105a4330302SBrooks DavisLIBSOFT_MACHINE=	arm
106a4330302SBrooks DavisLIBSOFT_MACHINE_ARCH=	${COMPAT_ARCH}
107a4330302SBrooks DavisLIBSOFTWMAKEENV= CPUTYPE=soft
108bbcf7eddSBrooks DavisLIBSOFTWMAKEFLAGS=        -DCOMPAT_SOFTFP
109bbcf7eddSBrooks Davis.endif
110bbcf7eddSBrooks Davis
1116b53d510SBrooks Davis# -------------------------------------------------------------------
1126b53d510SBrooks Davis# In the program linking case, select LIBCOMPAT
1136b53d510SBrooks Davis.if defined(NEED_COMPAT)
1146b53d510SBrooks Davis.ifndef HAS_COMPAT
11597671666SBrooks Davis.warning NEED_COMPAT defined, but no LIBCOMPAT is available (COMPAT_ARCH == ${COMPAT_ARCH}
1166b53d510SBrooks Davis.elif !${HAS_COMPAT:M${NEED_COMPAT}} && ${NEED_COMPAT} != "any"
1176b53d510SBrooks Davis.error NEED_COMPAT (${NEED_COMPAT}) defined, but not in HAS_COMPAT ($HAS_COMPAT)
1186b53d510SBrooks Davis.elif ${NEED_COMPAT} == "any"
1196b53d510SBrooks Davis.endif
1206b53d510SBrooks Davis.ifdef WANT_COMPAT
1216b53d510SBrooks Davis.error Both WANT_COMPAT and NEED_COMPAT defined
1226b53d510SBrooks Davis.endif
1236b53d510SBrooks DavisWANT_COMPAT:=	${NEED_COMPAT}
1246b53d510SBrooks Davis.endif
1256b53d510SBrooks Davis
1266b53d510SBrooks Davis.if defined(HAS_COMPAT) && defined(WANT_COMPAT)
1276b53d510SBrooks Davis.if ${WANT_COMPAT} == "any"
1286b53d510SBrooks Davis_LIBCOMPAT:=	${HAS_COMPAT:[1]}
1296b53d510SBrooks Davis.else
1306b53d510SBrooks Davis_LIBCOMPAT:=	${WANT_COMPAT}
1316b53d510SBrooks Davis.endif
1326b53d510SBrooks Davis.endif
1336b53d510SBrooks Davis
134bbcf7eddSBrooks Davis
135bbcf7eddSBrooks Davis# -------------------------------------------------------------------
136bbcf7eddSBrooks Davis# Generic code for each type.
137bbcf7eddSBrooks Davis# Set defaults based on type.
138ad2dd70bSBrooks Davislibcompat=	${_LIBCOMPAT:tl}
139a4330302SBrooks Davis_LIBCOMPAT_MAKEVARS=	_OBJTOP TMP CPUFLAGS CFLAGS CXXFLAGS LDFLAGS \
140a4330302SBrooks Davis			_MACHINE _MACHINE_ARCH WMAKEENV WMAKEFLAGS WMAKE
141bbcf7eddSBrooks Davis.for _var in ${_LIBCOMPAT_MAKEVARS}
142ad2dd70bSBrooks Davis.if !empty(LIB${_LIBCOMPAT}${_var})
143ad2dd70bSBrooks DavisLIBCOMPAT${_var}?=	${LIB${_LIBCOMPAT}${_var}}
144bbcf7eddSBrooks Davis.endif
145bbcf7eddSBrooks Davis.endfor
146bbcf7eddSBrooks Davis
147bbcf7eddSBrooks Davis# Shared flags
148bbcf7eddSBrooks DavisLIBCOMPAT_OBJTOP?=	${OBJTOP}/obj-lib${libcompat}
149bbcf7eddSBrooks DavisLIBCOMPATTMP?=		${LIBCOMPAT_OBJTOP}/tmp
150bbcf7eddSBrooks Davis
151bbcf7eddSBrooks DavisLIBCOMPATCFLAGS+=	${LIBCOMPATCPUFLAGS} \
152bbcf7eddSBrooks Davis			-L${LIBCOMPATTMP}/usr/lib${libcompat} \
153bbcf7eddSBrooks Davis			--sysroot=${LIBCOMPATTMP} \
154bbcf7eddSBrooks Davis			${BFLAGS}
155bbcf7eddSBrooks Davis
156a4330302SBrooks DavisLIBCOMPATWMAKEENV+=	MACHINE=${LIBCOMPAT_MACHINE}
157a4330302SBrooks DavisLIBCOMPATWMAKEENV+=	MACHINE_ARCH=${LIBCOMPAT_MACHINE_ARCH}
158a4330302SBrooks Davis
159bbcf7eddSBrooks Davis# -B is needed to find /usr/lib32/crti.o for GCC and /usr/libsoft/crti.o for
160bbcf7eddSBrooks Davis# Clang/GCC.
161bbcf7eddSBrooks DavisLIBCOMPATCFLAGS+=	-B${LIBCOMPATTMP}/usr/lib${libcompat}
162bbcf7eddSBrooks Davis
1636b53d510SBrooks Davis.if defined(WANT_COMPAT)
1646b53d510SBrooks DavisLIBDIR_BASE:=	/usr/lib${libcompat}
1656b53d510SBrooks Davis_LIB_OBJTOP=	${LIBCOMPAT_OBJTOP}
1666b53d510SBrooks DavisCFLAGS+=	${LIBCOMPATCFLAGS}
167a4330302SBrooks DavisLDFLAGS+=	${CFLAGS} ${LIBCOMPATLDFLAGS}
168a4330302SBrooks DavisMACHINE=	${LIBCOMPAT_MACHINE}
169a4330302SBrooks DavisMACHINE_ARCH=	${LIBCOMPAT_MACHINE_ARCH}
1706b53d510SBrooks Davis.endif
1716b53d510SBrooks Davis
172bbcf7eddSBrooks Davis.endif
173