xref: /freebsd/share/mk/bsd.compat.mk (revision c1903b634c3db81f3283bc508e1feeb3fc8316db)
1# $FreeBSD$
2
3.if !targets(__<${_this:T}>__)
4__<${_this:T}>__:
5
6.if defined(_LIBCOMPAT)
7COMPAT_ARCH=	${TARGET_ARCH}
8COMPAT_CPUTYPE=	${TARGET_CPUTYPE}
9.else
10COMPAT_ARCH=	${MACHINE_ARCH}
11COMPAT_CPUTYPE=	${CPUTYPE}
12.endif
13
14# -------------------------------------------------------------------
15# 32 bit world
16.if ${COMPAT_ARCH} == "amd64"
17HAS_COMPAT=32
18.if empty(COMPAT_CPUTYPE)
19LIB32CPUFLAGS=	-march=i686 -mmmx -msse -msse2
20.else
21LIB32CPUFLAGS=	-march=${COMPAT_CPUTYPE}
22.endif
23.if (defined(WANT_COMPILER_TYPE) && ${WANT_COMPILER_TYPE} == gcc) || \
24    (defined(X_COMPILER_TYPE) && ${X_COMPILER_TYPE} == gcc)
25.else
26LIB32CPUFLAGS+=	-target x86_64-unknown-freebsd13.0
27.endif
28LIB32CPUFLAGS+=	-m32
29LIB32WMAKEENV=	MACHINE=i386 MACHINE_ARCH=i386 \
30		MACHINE_CPU="i686 mmx sse sse2"
31LIB32WMAKEFLAGS=	\
32		AS="${XAS} --32" \
33		LD="${XLD} -m elf_i386_fbsd -L${LIBCOMPATTMP}/usr/lib32"
34
35.elif ${COMPAT_ARCH} == "powerpc64"
36HAS_COMPAT=32
37.if empty(COMPAT_CPUTYPE)
38LIB32CPUFLAGS=	-mcpu=powerpc
39.else
40LIB32CPUFLAGS=	-mcpu=${COMPAT_CPUTYPE}
41.endif
42LIB32CPUFLAGS+=	-m32
43LIB32WMAKEENV=	MACHINE=powerpc MACHINE_ARCH=powerpc
44LIB32WMAKEFLAGS=	\
45		LD="${XLD} -m elf32ppc_fbsd"
46
47.elif ${COMPAT_ARCH:Mmips64*} != ""
48HAS_COMPAT=32
49.if (defined(WANT_COMPILER_TYPE) && ${WANT_COMPILER_TYPE} == gcc) || \
50    (defined(X_COMPILER_TYPE) && ${X_COMPILER_TYPE} == gcc)
51.if empty(COMPAT_CPUTYPE)
52LIB32CPUFLAGS=	-march=mips3
53.else
54LIB32CPUFLAGS=	-march=${COMPAT_CPUTYPE}
55.endif
56.else
57.if ${COMPAT_ARCH:Mmips64el*} != ""
58LIB32CPUFLAGS=  -target mipsel-unknown-freebsd13.0
59.else
60LIB32CPUFLAGS=  -target mips-unknown-freebsd13.0
61.endif
62.endif
63LIB32CPUFLAGS+= -mabi=32
64LIB32WMAKEENV=	MACHINE=mips MACHINE_ARCH=mips
65.if ${COMPAT_ARCH:Mmips64el*} != ""
66LIB32WMAKEFLAGS= LD="${XLD} -m elf32ltsmip_fbsd"
67.else
68LIB32WMAKEFLAGS= LD="${XLD} -m elf32btsmip_fbsd"
69.endif
70.endif
71
72LIB32WMAKEFLAGS+= NM="${XNM}"
73LIB32WMAKEFLAGS+= OBJCOPY="${XOBJCOPY}"
74
75LIB32CFLAGS=	-DCOMPAT_32BIT
76LIB32DTRACE=	${DTRACE} -32
77LIB32WMAKEFLAGS+=	-DCOMPAT_32BIT
78
79# -------------------------------------------------------------------
80# soft-fp world
81.if ${COMPAT_ARCH:Marmv[67]*} != ""
82HAS_COMPAT=SOFT
83LIBSOFTCFLAGS=        -DCOMPAT_SOFTFP
84LIBSOFTCPUFLAGS= -mfloat-abi=softfp
85LIBSOFTWMAKEENV= CPUTYPE=soft MACHINE=arm MACHINE_ARCH=${COMPAT_ARCH}
86LIBSOFTWMAKEFLAGS=        -DCOMPAT_SOFTFP
87.endif
88
89# -------------------------------------------------------------------
90# In the program linking case, select LIBCOMPAT
91.if defined(NEED_COMPAT)
92.ifndef HAS_COMPAT
93.error NEED_COMPAT defined, but no LIBCOMPAT is available
94.elif !${HAS_COMPAT:M${NEED_COMPAT}} && ${NEED_COMPAT} != "any"
95.error NEED_COMPAT (${NEED_COMPAT}) defined, but not in HAS_COMPAT ($HAS_COMPAT)
96.elif ${NEED_COMPAT} == "any"
97.endif
98.ifdef WANT_COMPAT
99.error Both WANT_COMPAT and NEED_COMPAT defined
100.endif
101WANT_COMPAT:=	${NEED_COMPAT}
102.endif
103
104.if defined(HAS_COMPAT) && defined(WANT_COMPAT)
105.if ${WANT_COMPAT} == "any"
106_LIBCOMPAT:=	${HAS_COMPAT:[1]}
107.else
108_LIBCOMPAT:=	${WANT_COMPAT}
109.endif
110.endif
111
112
113# -------------------------------------------------------------------
114# Generic code for each type.
115# Set defaults based on type.
116libcompat=	${_LIBCOMPAT:tl}
117_LIBCOMPAT_MAKEVARS=	_OBJTOP TMP CPUFLAGS CFLAGS CXXFLAGS WMAKEENV \
118			WMAKEFLAGS WMAKE
119.for _var in ${_LIBCOMPAT_MAKEVARS}
120.if !empty(LIB${_LIBCOMPAT}${_var})
121LIBCOMPAT${_var}?=	${LIB${_LIBCOMPAT}${_var}}
122.endif
123.endfor
124
125# Shared flags
126LIBCOMPAT_OBJTOP?=	${OBJTOP}/obj-lib${libcompat}
127LIBCOMPATTMP?=		${LIBCOMPAT_OBJTOP}/tmp
128
129LIBCOMPATCFLAGS+=	${LIBCOMPATCPUFLAGS} \
130			-L${LIBCOMPATTMP}/usr/lib${libcompat} \
131			--sysroot=${LIBCOMPATTMP} \
132			${BFLAGS}
133
134# -B is needed to find /usr/lib32/crti.o for GCC and /usr/libsoft/crti.o for
135# Clang/GCC.
136LIBCOMPATCFLAGS+=	-B${LIBCOMPATTMP}/usr/lib${libcompat}
137
138.if defined(WANT_COMPAT)
139LIBDIR_BASE:=	/usr/lib${libcompat}
140_LIB_OBJTOP=	${LIBCOMPAT_OBJTOP}
141CFLAGS+=	${LIBCOMPATCFLAGS}
142.endif
143
144.endif
145