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