]> git.proxmox.com Git - mirror_iproute2.git/blob - configure
Use libbsd for strlcpy if available
[mirror_iproute2.git] / configure
1 #! /bin/bash
2 # SPDX-License-Identifier: GPL-2.0
3 # This is not an autoconf generated configure
4 #
5 INCLUDE=${1:-"$PWD/include"}
6
7 # Output file which is input to Makefile
8 CONFIG=config.mk
9
10 # Make a temp directory in build tree.
11 TMPDIR=$(mktemp -d config.XXXXXX)
12 trap 'status=$?; rm -rf $TMPDIR; exit $status' EXIT HUP INT QUIT TERM
13
14 check_prog()
15 {
16 echo -n "$2"
17 command -v $1 >/dev/null 2>&1 && (echo "$3:=y" >> $CONFIG; echo "yes") || (echo "no"; return 1)
18 }
19
20 check_toolchain()
21 {
22 : ${PKG_CONFIG:=pkg-config}
23 : ${AR=ar}
24 : ${CC=gcc}
25 echo "PKG_CONFIG:=${PKG_CONFIG}" >>$CONFIG
26 echo "AR:=${AR}" >>$CONFIG
27 echo "CC:=${CC}" >>$CONFIG
28 }
29
30 check_atm()
31 {
32 cat >$TMPDIR/atmtest.c <<EOF
33 #include <atm.h>
34 int main(int argc, char **argv) {
35 struct atm_qos qos;
36 (void) text2qos("aal5,ubr:sdu=9180,rx:none",&qos,0);
37 return 0;
38 }
39 EOF
40
41 $CC -I$INCLUDE -o $TMPDIR/atmtest $TMPDIR/atmtest.c -latm >/dev/null 2>&1
42 if [ $? -eq 0 ]
43 then
44 echo "TC_CONFIG_ATM:=y" >>$CONFIG
45 echo yes
46 else
47 echo no
48 fi
49 rm -f $TMPDIR/atmtest.c $TMPDIR/atmtest
50 }
51
52 check_xtables()
53 {
54 if ! ${PKG_CONFIG} xtables --exists
55 then
56 echo "TC_CONFIG_NO_XT:=y" >>$CONFIG
57 fi
58 }
59
60 check_xt()
61 {
62 #check if we have xtables from iptables >= 1.4.5.
63 cat >$TMPDIR/ipttest.c <<EOF
64 #include <xtables.h>
65 #include <linux/netfilter.h>
66 static struct xtables_globals test_globals = {
67 .option_offset = 0,
68 .program_name = "tc-ipt",
69 .program_version = XTABLES_VERSION,
70 .orig_opts = NULL,
71 .opts = NULL,
72 .exit_err = NULL,
73 };
74
75 int main(int argc, char **argv)
76 {
77 xtables_init_all(&test_globals, NFPROTO_IPV4);
78 return 0;
79 }
80 EOF
81
82 if $CC -I$INCLUDE $IPTC -o $TMPDIR/ipttest $TMPDIR/ipttest.c $IPTL \
83 $(${PKG_CONFIG} xtables --cflags --libs) -ldl >/dev/null 2>&1
84 then
85 echo "TC_CONFIG_XT:=y" >>$CONFIG
86 echo "using xtables"
87 fi
88 rm -f $TMPDIR/ipttest.c $TMPDIR/ipttest
89 }
90
91 check_xt_old()
92 {
93 # bail if previous XT checks has already succeeded.
94 if grep -q TC_CONFIG_XT $CONFIG
95 then
96 return
97 fi
98
99 #check if we don't need our internal header ..
100 cat >$TMPDIR/ipttest.c <<EOF
101 #include <xtables.h>
102 char *lib_dir;
103 unsigned int global_option_offset = 0;
104 const char *program_version = XTABLES_VERSION;
105 const char *program_name = "tc-ipt";
106 struct afinfo afinfo = {
107 .libprefix = "libxt_",
108 };
109
110 void exit_error(enum exittype status, const char *msg, ...)
111 {
112 }
113
114 int main(int argc, char **argv) {
115
116 return 0;
117 }
118
119 EOF
120
121 $CC -I$INCLUDE $IPTC -o $TMPDIR/ipttest $TMPDIR/ipttest.c $IPTL -ldl >/dev/null 2>&1
122 if [ $? -eq 0 ]
123 then
124 echo "TC_CONFIG_XT_OLD:=y" >>$CONFIG
125 echo "using old xtables (no need for xt-internal.h)"
126 fi
127 rm -f $TMPDIR/ipttest.c $TMPDIR/ipttest
128 }
129
130 check_xt_old_internal_h()
131 {
132 # bail if previous XT checks has already succeeded.
133 if grep -q TC_CONFIG_XT $CONFIG
134 then
135 return
136 fi
137
138 #check if we need our own internal.h
139 cat >$TMPDIR/ipttest.c <<EOF
140 #include <xtables.h>
141 #include "xt-internal.h"
142 char *lib_dir;
143 unsigned int global_option_offset = 0;
144 const char *program_version = XTABLES_VERSION;
145 const char *program_name = "tc-ipt";
146 struct afinfo afinfo = {
147 .libprefix = "libxt_",
148 };
149
150 void exit_error(enum exittype status, const char *msg, ...)
151 {
152 }
153
154 int main(int argc, char **argv) {
155
156 return 0;
157 }
158
159 EOF
160 $CC -I$INCLUDE $IPTC -o $TMPDIR/ipttest $TMPDIR/ipttest.c $IPTL -ldl >/dev/null 2>&1
161
162 if [ $? -eq 0 ]
163 then
164 echo "using old xtables with xt-internal.h"
165 echo "TC_CONFIG_XT_OLD_H:=y" >>$CONFIG
166 fi
167 rm -f $TMPDIR/ipttest.c $TMPDIR/ipttest
168 }
169
170 check_ipt()
171 {
172 if ! grep TC_CONFIG_XT $CONFIG > /dev/null
173 then
174 echo "using iptables"
175 fi
176 }
177
178 check_ipt_lib_dir()
179 {
180 IPT_LIB_DIR=$(${PKG_CONFIG} --variable=xtlibdir xtables)
181 if [ -n "$IPT_LIB_DIR" ]; then
182 echo $IPT_LIB_DIR
183 echo "IPT_LIB_DIR:=$IPT_LIB_DIR" >> $CONFIG
184 return
185 fi
186
187 for dir in /lib /usr/lib /usr/local/lib
188 do
189 for file in $dir/{xtables,iptables}/lib*t_*so ; do
190 if [ -f $file ]; then
191 echo ${file%/*}
192 echo "IPT_LIB_DIR:=${file%/*}" >> $CONFIG
193 return
194 fi
195 done
196 done
197 echo "not found!"
198 }
199
200 check_setns()
201 {
202 cat >$TMPDIR/setnstest.c <<EOF
203 #include <sched.h>
204 int main(int argc, char **argv)
205 {
206 (void)setns(0,0);
207 return 0;
208 }
209 EOF
210 $CC -I$INCLUDE -o $TMPDIR/setnstest $TMPDIR/setnstest.c >/dev/null 2>&1
211 if [ $? -eq 0 ]
212 then
213 echo "IP_CONFIG_SETNS:=y" >>$CONFIG
214 echo "yes"
215 echo "CFLAGS += -DHAVE_SETNS" >>$CONFIG
216 else
217 echo "no"
218 fi
219 rm -f $TMPDIR/setnstest.c $TMPDIR/setnstest
220 }
221
222 check_ipset()
223 {
224 cat >$TMPDIR/ipsettest.c <<EOF
225 #include <linux/netfilter/ipset/ip_set.h>
226 #ifndef IP_SET_INVALID
227 #define IPSET_DIM_MAX 3
228 typedef unsigned short ip_set_id_t;
229 #endif
230 #include <linux/netfilter/xt_set.h>
231
232 struct xt_set_info info;
233 #if IPSET_PROTOCOL == 6
234 int main(void)
235 {
236 return IPSET_MAXNAMELEN;
237 }
238 #else
239 #error unknown ipset version
240 #endif
241 EOF
242
243 if $CC -I$INCLUDE -o $TMPDIR/ipsettest $TMPDIR/ipsettest.c >/dev/null 2>&1
244 then
245 echo "TC_CONFIG_IPSET:=y" >>$CONFIG
246 echo "yes"
247 else
248 echo "no"
249 fi
250 rm -f $TMPDIR/ipsettest.c $TMPDIR/ipsettest
251 }
252
253 check_elf()
254 {
255 if ${PKG_CONFIG} libelf --exists
256 then
257 echo "HAVE_ELF:=y" >>$CONFIG
258 echo "yes"
259
260 echo 'CFLAGS += -DHAVE_ELF' `${PKG_CONFIG} libelf --cflags` >> $CONFIG
261 echo 'LDLIBS += ' `${PKG_CONFIG} libelf --libs` >>$CONFIG
262 else
263 echo "no"
264 fi
265 }
266
267 check_selinux()
268 # SELinux is a compile time option in the ss utility
269 {
270 if ${PKG_CONFIG} libselinux --exists
271 then
272 echo "HAVE_SELINUX:=y" >>$CONFIG
273 echo "yes"
274
275 echo 'LDLIBS +=' `${PKG_CONFIG} --libs libselinux` >>$CONFIG
276 echo 'CFLAGS += -DHAVE_SELINUX' `${PKG_CONFIG} --cflags libselinux` >>$CONFIG
277 else
278 echo "no"
279 fi
280 }
281
282 check_mnl()
283 {
284 if ${PKG_CONFIG} libmnl --exists
285 then
286 echo "HAVE_MNL:=y" >>$CONFIG
287 echo "yes"
288
289 echo 'CFLAGS += -DHAVE_LIBMNL' `${PKG_CONFIG} libmnl --cflags` >>$CONFIG
290 echo 'LDLIBS +=' `${PKG_CONFIG} libmnl --libs` >> $CONFIG
291 else
292 echo "no"
293 fi
294 }
295
296 check_berkeley_db()
297 {
298 cat >$TMPDIR/dbtest.c <<EOF
299 #include <fcntl.h>
300 #include <stdlib.h>
301 #include <db_185.h>
302 int main(int argc, char **argv) {
303 dbopen("/tmp/xxx_test_db.db", O_CREAT|O_RDWR, 0644, DB_HASH, NULL);
304 return 0;
305 }
306 EOF
307 $CC -I$INCLUDE -o $TMPDIR/dbtest $TMPDIR/dbtest.c -ldb >/dev/null 2>&1
308 if [ $? -eq 0 ]
309 then
310 echo "HAVE_BERKELEY_DB:=y" >>$CONFIG
311 echo "yes"
312 else
313 echo "no"
314 fi
315 rm -f $TMPDIR/dbtest.c $TMPDIR/dbtest
316 }
317
318 check_strlcpy()
319 {
320 cat >$TMPDIR/strtest.c <<EOF
321 #include <string.h>
322 int main(int argc, char **argv) {
323 char dst[10];
324 strlcpy(dst, "test", sizeof(dst));
325 return 0;
326 }
327 EOF
328 $CC -I$INCLUDE -o $TMPDIR/strtest $TMPDIR/strtest.c >/dev/null 2>&1
329 if [ $? -eq 0 ]
330 then
331 echo "no"
332 else
333 if ${PKG_CONFIG} libbsd --exists
334 then
335 echo 'CFLAGS += -DHAVE_LIBBSD' `${PKG_CONFIG} libbsd --cflags` >>$CONFIG
336 echo 'LDLIBS +=' `${PKG_CONFIG} libbsd --libs` >> $CONFIG
337 echo "no"
338 else
339 echo 'CFLAGS += -DNEED_STRLCPY' >>$CONFIG
340 echo "yes"
341 fi
342 fi
343 rm -f $TMPDIR/strtest.c $TMPDIR/strtest
344 }
345
346 check_cap()
347 {
348 if ${PKG_CONFIG} libcap --exists
349 then
350 echo "HAVE_CAP:=y" >>$CONFIG
351 echo "yes"
352
353 echo 'CFLAGS += -DHAVE_LIBCAP' `${PKG_CONFIG} libcap --cflags` >>$CONFIG
354 echo 'LDLIBS +=' `${PKG_CONFIG} libcap --libs` >> $CONFIG
355 else
356 echo "no"
357 fi
358 }
359
360 quiet_config()
361 {
362 cat <<EOF
363 # user can control verbosity similar to kernel builds (e.g., V=1)
364 ifeq ("\$(origin V)", "command line")
365 VERBOSE = \$(V)
366 endif
367 ifndef VERBOSE
368 VERBOSE = 0
369 endif
370 ifeq (\$(VERBOSE),1)
371 Q =
372 else
373 Q = @
374 endif
375
376 ifeq (\$(VERBOSE), 0)
377 QUIET_CC = @echo ' CC '\$@;
378 QUIET_AR = @echo ' AR '\$@;
379 QUIET_LINK = @echo ' LINK '\$@;
380 QUIET_YACC = @echo ' YACC '\$@;
381 QUIET_LEX = @echo ' LEX '\$@;
382 endif
383 EOF
384 }
385
386 echo "# Generated config based on" $INCLUDE >$CONFIG
387 quiet_config >> $CONFIG
388
389 check_toolchain
390
391 echo "TC schedulers"
392
393 echo -n " ATM "
394 check_atm
395
396 check_xtables
397 if ! grep -q TC_CONFIG_NO_XT $CONFIG
398 then
399 echo -n " IPT "
400 check_xt
401 check_xt_old
402 check_xt_old_internal_h
403 check_ipt
404
405 echo -n " IPSET "
406 check_ipset
407 fi
408
409 echo
410 if ! grep -q TC_CONFIG_NO_XT $CONFIG
411 then
412 echo -n "iptables modules directory: "
413 check_ipt_lib_dir
414 fi
415
416 echo -n "libc has setns: "
417 check_setns
418
419 echo -n "SELinux support: "
420 check_selinux
421
422 echo -n "ELF support: "
423 check_elf
424
425 echo -n "libmnl support: "
426 check_mnl
427
428 echo -n "Berkeley DB: "
429 check_berkeley_db
430
431 echo -n "need for strlcpy: "
432 check_strlcpy
433
434 echo -n "libcap support: "
435 check_cap
436
437 echo >> $CONFIG
438 echo "%.o: %.c" >> $CONFIG
439 echo ' $(QUIET_CC)$(CC) $(CFLAGS) $(EXTRA_CFLAGS) -c -o $@ $<' >> $CONFIG