xref: /freebsd/share/mk/bsd.compat.mk (revision b3e7694832e81d7a904a10f525f8797b753bf0d3)
1# $FreeBSD$
2
3.if !targets(__<${_this:T}>__)
4__<${_this:T}>__:
5
6.include <bsd.compat.pre.mk>
7
8.if defined(_LIBCOMPATS)
9COMPAT_ARCH?=	${TARGET_ARCH}
10.for _LIBCOMPAT in ${_ALL_LIBCOMPATS}
11LIB${_LIBCOMPAT}CPUTYPE?=	${CPUTYPE_${_LIBCOMPAT}}
12.endfor
13.if (defined(WANT_COMPILER_TYPE) && ${WANT_COMPILER_TYPE} == gcc) || \
14    (defined(X_COMPILER_TYPE) && ${X_COMPILER_TYPE} == gcc)
15COMPAT_COMPILER_TYPE=	gcc
16.else
17COMPAT_COMPILER_TYPE=	clang
18.endif
19.else
20COMPAT_ARCH=	${MACHINE_ARCH}
21.for _LIBCOMPAT in ${_ALL_LIBCOMPATS}
22LIB${_LIBCOMPAT}CPUTYPE=	${CPUTYPE}
23.endfor
24.include <bsd.compiler.mk>
25COMPAT_COMPILER_TYPE=${COMPILER_TYPE}
26.endif
27
28# -------------------------------------------------------------------
29# 32 bit world
30.if ${COMPAT_ARCH} == "amd64"
31HAS_COMPAT+=	32
32.if empty(LIB32CPUTYPE)
33LIB32CPUFLAGS=	-march=i686 -mmmx -msse -msse2
34.else
35LIB32CPUFLAGS=	-march=${LIB32CPUTYPE}
36.endif
37.if ${COMPAT_COMPILER_TYPE} == gcc
38.else
39LIB32CPUFLAGS+=	-target x86_64-unknown-freebsd${OS_REVISION}
40.endif
41LIB32CPUFLAGS+=	-m32
42LIB32_MACHINE=	i386
43LIB32_MACHINE_ARCH=	i386
44LIB32WMAKEENV=	MACHINE_CPU="i686 mmx sse sse2"
45LIB32WMAKEFLAGS=	\
46		LD="${XLD} -m elf_i386_fbsd"
47
48.elif ${COMPAT_ARCH} == "powerpc64"
49HAS_COMPAT+=	32
50.if empty(LIB32CPUTYPE)
51LIB32CPUFLAGS=	-mcpu=powerpc
52.else
53LIB32CPUFLAGS=	-mcpu=${LIB32CPUTYPE}
54.endif
55
56.if ${COMPAT_COMPILER_TYPE} == "gcc"
57LIB32CPUFLAGS+=	-m32
58.else
59LIB32CPUFLAGS+=	-target powerpc-unknown-freebsd${OS_REVISION}
60.endif
61
62LIB32_MACHINE=	powerpc
63LIB32_MACHINE_ARCH=	powerpc
64LIB32WMAKEFLAGS=	\
65		LD="${XLD} -m elf32ppc_fbsd"
66
67.elif ${COMPAT_ARCH} == "aarch64"
68HAS_COMPAT+=	32
69.if empty(LIB32CPUTYPE)
70LIB32CPUFLAGS=	-march=armv7
71.else
72LIB32CPUFLAGS=	-mcpu=${LIB32CPUTYPE}
73.endif
74
75LIB32CPUFLAGS+=	-m32
76.if ${COMPAT_COMPILER_TYPE} == "gcc"
77.else
78LIB32CPUFLAGS+=	-target armv7-unknown-freebsd${OS_REVISION}-gnueabihf
79.endif
80
81LIB32_MACHINE=	arm
82LIB32_MACHINE_ARCH=	armv7
83LIB32WMAKEFLAGS=	\
84		LD="${XLD} -m armelf_fbsd"
85.endif
86
87LIB32WMAKEFLAGS+= NM="${XNM}"
88LIB32WMAKEFLAGS+= OBJCOPY="${XOBJCOPY}"
89
90LIB32DTRACE=	${DTRACE} -32
91LIB32_MACHINE_ABI=	${MACHINE_ABI:N*64} long32 ptr32
92.if ${COMPAT_ARCH} == "amd64"
93LIB32_MACHINE_ABI+=	time32
94.else
95LIB32_MACHINE_ABI+=	time64
96.endif
97
98# -------------------------------------------------------------------
99# In the program linking case, select LIBCOMPAT
100.if defined(NEED_COMPAT)
101.ifndef HAS_COMPAT
102.warning NEED_COMPAT defined, but no LIBCOMPAT is available (COMPAT_ARCH == ${COMPAT_ARCH})
103.elif !${HAS_COMPAT:M${NEED_COMPAT}} && ${NEED_COMPAT} != "any"
104.error NEED_COMPAT (${NEED_COMPAT}) defined, but not in HAS_COMPAT (${HAS_COMPAT})
105.elif ${NEED_COMPAT} == "any"
106.endif
107.ifdef WANT_COMPAT
108.error Both WANT_COMPAT and NEED_COMPAT defined
109.endif
110WANT_COMPAT:=	${NEED_COMPAT}
111.endif
112
113.if defined(HAS_COMPAT) && defined(WANT_COMPAT)
114.if ${WANT_COMPAT} == "any"
115USE_COMPAT:=	${HAS_COMPAT:[1]}
116.else
117USE_COMPAT:=	${WANT_COMPAT}
118.endif
119
120_LIBCOMPATS=	${USE_COMPAT}
121.endif
122
123libcompats=	${_LIBCOMPATS:tl}
124
125# -------------------------------------------------------------------
126# Generic code for each type.
127# Set defaults based on type.
128.for _LIBCOMPAT _libcompat in ${_LIBCOMPATS:@v@${v} ${v:tl}@}
129WORLDTMP?=		${SYSROOT}
130
131# Shared flags
132LIB${_LIBCOMPAT}_OBJTOP?=	${OBJTOP}/obj-lib${_libcompat}
133
134LIB${_LIBCOMPAT}CFLAGS+=	${LIB${_LIBCOMPAT}CPUFLAGS} \
135				-DCOMPAT_LIBCOMPAT=\"${_LIBCOMPAT}\" \
136				-DCOMPAT_libcompat=\"${_libcompat}\" \
137				-DCOMPAT_LIB${_LIBCOMPAT} \
138				--sysroot=${WORLDTMP} \
139				${BFLAGS}
140
141LIB${_LIBCOMPAT}LDFLAGS+=	-L${WORLDTMP}/usr/lib${_libcompat}
142
143LIB${_LIBCOMPAT}WMAKEFLAGS+=	COMPAT_LIBCOMPAT=${_LIBCOMPAT} \
144				COMPAT_libcompat=${_libcompat}
145
146LIB${_LIBCOMPAT}WMAKEENV+=	MACHINE=${LIB${_LIBCOMPAT}_MACHINE}
147LIB${_LIBCOMPAT}WMAKEENV+=	MACHINE_ARCH=${LIB${_LIBCOMPAT}_MACHINE_ARCH}
148
149# -B is needed to find /usr/lib32/crti.o for gcc.
150LIB${_LIBCOMPAT}CFLAGS+=	-B${WORLDTMP}/usr/lib${_libcompat}
151.endfor
152
153.if defined(USE_COMPAT)
154libcompat=	${USE_COMPAT:tl}
155
156_LIBCOMPAT_MAKEVARS=	_OBJTOP TMP CPUFLAGS CFLAGS CXXFLAGS LDFLAGS \
157			_MACHINE _MACHINE_ARCH _MACHINE_ABI \
158			WMAKEENV WMAKEFLAGS WMAKE WORLDTMP
159.for _var in ${_LIBCOMPAT_MAKEVARS}
160.if !empty(LIB${USE_COMPAT}${_var})
161LIBCOMPAT${_var}?=	${LIB${USE_COMPAT}${_var}}
162.endif
163.endfor
164
165LIBDIR_BASE:=	/usr/lib${libcompat}
166LIBDATADIR:=	/usr/lib${libcompat}
167_LIB_OBJTOP=	${LIBCOMPAT_OBJTOP}
168CFLAGS+=	${LIBCOMPATCFLAGS}
169LDFLAGS+=	${CFLAGS} ${LIBCOMPATLDFLAGS}
170MACHINE=	${LIBCOMPAT_MACHINE}
171MACHINE_ARCH=	${LIBCOMPAT_MACHINE_ARCH}
172.endif
173
174.endif
175