|
|
1.1 root 1: #
2: # nono
1.1.1.3 root 3: # Copyright (C) 2020 nono project
4: # Licensed under nono-license.txt
1.1 root 5: #
6:
7: AC_PREREQ([2.69])
1.1.1.3 root 8: AC_INIT([nono], [0.0], [])
1.1 root 9: AC_CONFIG_SRCDIR(wx/wxapp.cpp)
1.1.1.6 root 10: AC_CONFIG_AUX_DIR([scripts])
1.1 root 11:
12: # Checks for programs.
13: AC_PROG_CXX
14: AC_PROG_CC
1.1.1.3 root 15: AC_PROG_INSTALL
1.1 root 16: AC_C_BIGENDIAN
17:
1.1.1.6 root 18: # OS
19: AC_CANONICAL_HOST
20: AC_SUBST([host_cpu])
21:
1.1.1.4 root 22: # コンパイラをチェック。今のところ clang/gcc のみ。
23: # (autoconf がやってる gcc かどうかのチェックは clang を検出できず使えない)
24: AC_MSG_CHECKING(for compiler)
25: if test -n "`${CC} -v 2>&1 | grep clang`" ; then
26: AC_MSG_RESULT([clang])
27: COMPILER=CLANG
28: elif test -n "`${CC} -v 2>&1 | grep GCC`"; then
29: AC_MSG_RESULT([gcc])
30: COMPILER=GCC
31: else
32: AC_MSG_RESULT([unknown])
33: COMPILER=
34: fi
35: AC_SUBST([COMPILER])
36:
1.1.1.3 root 37: # C++ のバージョンをチェック
38: CXX_STD=-std=c++14
39: AC_LANG_PUSH([C++])
40: AC_MSG_CHECKING(for ${CXX_STD})
1.1 root 41: old_CXXFLAGS="${CXXFLAGS}"
1.1.1.3 root 42: CXXFLAGS="${CXX_STD} ${CXXFLAGS}"
1.1 root 43: AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])],
1.1.1.3 root 44: AC_MSG_RESULT([yes]),
45: AC_MSG_ERROR("*** C++ compiler '${CXX}' doesn't support ${CXX_STD}."))
1.1 root 46: CXXFLAGS="${old_CXXFLAGS}"
1.1.1.3 root 47: CXX="${CXX} ${CXX_STD}"
48: AC_LANG_POP([C++])
49:
50: # C コンパイラのワーニングオプション
51: AC_LANG_PUSH([C])
1.1.1.4 root 52: AC_DEFUN([ADD_CC_WARN_IF],[
1.1.1.3 root 53: AC_MSG_CHECKING([whether cc accepts $1])
54: old_CFLAGS="${CFLAGS}"
55: CFLAGS="${CFLAGS} -Werror $1"
56: AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])],
57: AC_MSG_RESULT([yes])
58: WARNFLAGS_C="${WARNFLAGS_C} $1",
59: AC_MSG_RESULT([no]))
60: CFLAGS="${old_CFLAGS}"
61: ])
1.1.1.4 root 62: ADD_CC_WARN_IF(-Wcast-qual)
63: ADD_CC_WARN_IF(-Wextra-semi)
64: ADD_CC_WARN_IF(-Wlogical-op)
65: ADD_CC_WARN_IF(-Wmissing-prototypes)
66: ADD_CC_WARN_IF(-Wmissing-variable-declarations)
1.1.1.3 root 67: AC_LANG_POP([C])
68: AC_SUBST([WARNFLAGS_C])
69:
70: # C++ コンパイラのワーニングオプション
71: # (AC_LANG は C++ のまま継続する)
72: AC_LANG_CPLUSPLUS
1.1.1.4 root 73: AC_DEFUN([ADD_CXX_WARN_IF],[
1.1.1.3 root 74: AC_MSG_CHECKING([whether c++ accepts $1])
75: old_CXXFLAGS="${CXXFLAGS}"
76: CXXFLAGS="${CXXFLAGS} -Werror $1"
77: AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])],
78: AC_MSG_RESULT([yes])
79: WARNFLAGS_CXX="${WARNFLAGS_CXX} $1",
80: AC_MSG_RESULT([no]))
81: CXXFLAGS="${old_CXXFLAGS}"
82: ])
1.1.1.4 root 83: ADD_CXX_WARN_IF(-Wcast-qual)
84: ADD_CXX_WARN_IF(-Wextra-semi)
85: ADD_CXX_WARN_IF(-Winconsistent-missing-override)
86: ADD_CXX_WARN_IF(-Winconsistent-missing-destructor-override)
87: ADD_CXX_WARN_IF(-Wlogical-op)
88: ADD_CXX_WARN_IF(-Wmissing-prototypes)
89: ADD_CXX_WARN_IF(-Wmissing-variable-declarations)
90: ADD_CXX_WARN_IF(-Wvla-extension)
1.1.1.3 root 91: AC_SUBST([WARNFLAGS_CXX])
1.1 root 92:
93: # Checks for libraries.
94:
95: # Checks for header files.
96: AC_CHECK_HEADERS([bsd/bsd.h])
97: AC_CHECK_HEADERS([endian.h])
1.1.1.2 root 98: AC_CHECK_HEADERS([histedit.h])
1.1 root 99: AC_CHECK_HEADERS([kqueue/sys/event.h])
1.1.1.3 root 100: AC_CHECK_HEADERS([pthread_np.h])
1.1 root 101: AC_CHECK_HEADERS([sys/endian.h])
102: AC_CHECK_HEADERS([sys/event.h])
103: AC_CHECK_HEADERS([net/bpf.h])
104: AC_CHECK_HEADERS([net/if_tap.h])
105: AC_CHECK_HEADERS([linux/if_tun.h])
106:
107: # Linux で <kqueue/sys/event.h> がなければここで停止したほうがいい
1.1.1.6 root 108: case "${host_os}" in
109: linux*)
110: if test "$ac_cv_header_kqueue_sys_event_h" != "yes"; then
111: AC_MSG_ERROR([*** kqueue is not found.
1.1.1.7 root 112: *** If you use Ubuntu, sudo apt install libkqueue-dev])
1.1.1.6 root 113: fi
114: ;;
115: esac
1.1 root 116:
117: # Checks for typedefs, structures, and compiler characteristics.
118: AC_CHECK_HEADER_STDBOOL
119: #AC_C_INLINE
120: #AC_TYPE_INT16_T
121: #AC_TYPE_INT32_T
122: #AC_TYPE_INT64_T
123: #AC_TYPE_INT8_T
124: #AC_TYPE_SIZE_T
125: #AC_TYPE_UINT16_T
126: #AC_TYPE_UINT32_T
127: #AC_TYPE_UINT64_T
128: #AC_TYPE_UINT8_T
129:
130: # struct kevent のメンバ udata の型が互換性なく違う。
131: # NetBSD では intptr_t(整数) だが、OSX では void* (ポインタ) なので、
132: # 同一ソースコードでは回避できない。
133: # Linux(Ubuntu) はどっちもパスするので後ろの void * のほうが使われる。
134: # まあパスするんならどっちでもいいか。
135: AC_MSG_CHECKING(whether kevent.udata is intptr_t)
136: old_CXXFLAGS="${CXXFLAGS}"
137: CXXFLAGS="${CXXFLAGS} -Wall -Werror"
138: AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
139: [
140: #include "confdefs.h"
1.1.1.3 root 141: #if defined(HAVE_SYS_TYPES_H)
142: #include <sys/types.h>
143: #endif
1.1 root 144: #if defined(HAVE_SYS_EVENT_H)
145: #include <sys/event.h>
146: #endif
147: #if defined(HAVE_KQUEUE_SYS_EVENT_H)
148: #include <kqueue/sys/event.h>
149: #endif
150: ], [
151: struct kevent kev;
152: kev.udata = (intptr_t)0;
153: (void)kev;
154: ])],
155: AC_MSG_RESULT([yes])
156: AC_SUBST([KEVENT_UDATA_T], [intptr_t]),
157: AC_MSG_RESULT([no]))
158: CXXFLAGS="${old_CXXFLAGS}"
159:
160: AC_MSG_CHECKING(whether kevent.udata is void *)
161: old_CXXFLAGS="${CXXFLAGS}"
162: CXXFLAGS="${CXXFLAGS} -Wall -Werror"
163: AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
164: [
165: #include "confdefs.h"
1.1.1.3 root 166: #if defined(HAVE_SYS_TYPES_H)
167: #include <sys/types.h>
168: #endif
1.1 root 169: #if defined(HAVE_SYS_EVENT_H)
170: #include <sys/event.h>
171: #endif
172: #if defined(HAVE_KQUEUE_SYS_EVENT_H)
173: #include <kqueue/sys/event.h>
174: #endif
175: ], [
176: struct kevent kev;
177: kev.udata = (void *)0;
178: (void)kev;
179: ])],
180: AC_MSG_RESULT([yes])
181: AC_SUBST([KEVENT_UDATA_T], ['void *']),
182: AC_MSG_RESULT([no]))
183: CXXFLAGS="${old_CXXFLAGS}"
184:
185: if test -z "$KEVENT_UDATA_T" ; then
186: AC_MSG_ERROR([kevent.udata is unknown type])
187: fi
188:
189: AC_MSG_CHECKING(for __builtin_assume)
190: AC_TRY_COMPILE(,
191: [
192: __builtin_assume(1);
193: ],
194: AC_MSG_RESULT([yes])
195: AC_DEFINE([HAVE___BUILTIN_ASSUME]),
196: AC_MSG_RESULT([no]))
197:
198: AC_MSG_CHECKING(for __builtin_bswap16)
199: AC_TRY_COMPILE(,
200: [
201: return __builtin_bswap16(0);
202: ],
203: AC_MSG_RESULT([yes])
204: AC_DEFINE([HAVE___BUILTIN_BSWAP16]),
205: AC_MSG_RESULT([no]))
206:
207: AC_MSG_CHECKING(for __builtin_bswap32)
208: AC_TRY_COMPILE(,
209: [
210: return __builtin_bswap32(0);
211: ],
212: AC_MSG_RESULT([yes])
213: AC_DEFINE([HAVE___BUILTIN_BSWAP32]),
214: AC_MSG_RESULT([no]))
215:
1.1.1.2 root 216: AC_MSG_CHECKING(for __builtin_bswap64)
217: AC_TRY_COMPILE(,
218: [
219: return __builtin_bswap64(0);
220: ],
221: AC_MSG_RESULT([yes])
222: AC_DEFINE([HAVE___BUILTIN_BSWAP64]),
223: AC_MSG_RESULT([no]))
224:
1.1 root 225: AC_MSG_CHECKING(for __builtin_expect)
226: AC_TRY_COMPILE(,
227: [
228: if (__builtin_expect(1, 1)) return 0;
229: ],
230: AC_MSG_RESULT([yes])
231: AC_DEFINE([HAVE___BUILTIN_EXPECT]),
232: AC_MSG_RESULT([no]))
233:
234: AC_MSG_CHECKING(for __builtin_unreachable)
235: AC_TRY_COMPILE(,
236: [
237: __builtin_unreachable();
238: ],
239: AC_MSG_RESULT([yes])
240: AC_DEFINE([HAVE___BUILTIN_UNREACHABLE]),
241: AC_MSG_RESULT([no]))
242:
243: AC_MSG_CHECKING(for __attribute__((__fallthrough__)))
244: old_CXXFLAGS="${CXXFLAGS}"
245: CXXFLAGS="${CXXFLAGS} -Wall -Werror"
246: AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
247: [], [
248: extern int x;
249: switch (x) {
250: case 0:
251: __attribute__((__fallthrough__));
252: case 1:
253: break;
254: }
255: ])],
256: AC_MSG_RESULT([yes])
257: AC_DEFINE([HAVE___ATTRIBUTE_FALLTHROUGH]),
258: AC_MSG_RESULT([no]))
259: CXXFLAGS="${old_CXXFLAGS}"
260:
261: dnl とりあえず __format__ までしか調べてないので、
262: dnl その中の __printf__ とかまで調べる必要ができたら直すこと。
263: AC_MSG_CHECKING(for __attribute__((__format__)))
264: old_CXXFLAGS="${CXXFLAGS}"
265: CXXFLAGS="${CXXFLAGS} -Wall -Werror"
266: AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
267: [
268: extern int f(const char *f, ...)
269: __attribute__((__format__(__printf__, 1, 2)));
270: ], [
271: ])],
272: AC_MSG_RESULT([yes])
273: AC_DEFINE([HAVE___ATTRIBUTE_FORMAT]),
274: AC_MSG_RESULT([no]))
275: CXXFLAGS="${old_CXXFLAGS}"
276:
277: AC_MSG_CHECKING(for __attribute__((no_sanitize)))
278: old_CXXFLAGS="${CXXFLAGS}"
279: CXXFLAGS="${CXXFLAGS} -Werror"
280: AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
281: [
282: __attribute__((no_sanitize("undefined")))
283: int func() { return 0; }
284: ], [
285: ])],
286: AC_MSG_RESULT([yes])
287: AC_DEFINE([HAVE___ATTRIBUTE_NO_SANITIZE]),
288: AC_MSG_RESULT([no]))
289: CXXFLAGS="${old_CXXFLAGS}"
290:
291:
292: AC_MSG_CHECKING(for __attribute__((__packed__)))
293: old_CXXFLAGS="${CXXFLAGS}"
294: CXXFLAGS="${CXXFLAGS} -Werror"
295: AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
296: [], [
297: struct x { char a; int b; } __attribute__((__packed__));
298: ])],
299: AC_MSG_RESULT([yes])
300: AC_DEFINE([HAVE___ATTRIBUTE_PACKED]),
301: AC_MSG_RESULT([no]))
302: CXXFLAGS="${old_CXXFLAGS}"
303:
304: AC_MSG_CHECKING(for __attribute__((__unused__)))
305: old_CXXFLAGS="${CXXFLAGS}"
306: CXXFLAGS="${CXXFLAGS} -Wunused-variable -Werror"
307: AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
308: [], [
309: int a __attribute__((__unused__));
310: ])],
311: AC_MSG_RESULT([yes])
312: AC_DEFINE([HAVE___ATTRIBUTE_UNUSED]),
313: AC_MSG_RESULT([no]))
314: CXXFLAGS="${old_CXXFLAGS}"
315:
316: # Checks for library functions.
317: #AC_FUNC_MALLOC
318: #AC_FUNC_MMAP
319:
320: AC_MSG_CHECKING(for pthread_setname_np(name))
1.1.1.3 root 321: AC_TRY_COMPILE(
1.1 root 322: [
1.1.1.3 root 323: #include <pthread.h>
324: #if defined(HAVE_PTHREAD_NP_H)
325: #include <pthread_np.h>
326: #endif
327: ], [
1.1 root 328: pthread_setname_np("");
329: ],
330: AC_MSG_RESULT([yes])
1.1.1.3 root 331: AC_DEFINE([HAVE_PTHREAD_SETNAME_NP_name]),
1.1 root 332: AC_MSG_RESULT([no]))
333:
334: AC_MSG_CHECKING(for pthread_setname_np(thread, name))
1.1.1.3 root 335: AC_TRY_COMPILE(
1.1 root 336: [
1.1.1.3 root 337: #include <pthread.h>
338: #if defined(HAVE_PTHREAD_NP_H)
339: #include <pthread_np.h>
340: #endif
341: ], [
1.1 root 342: pthread_setname_np(pthread_self(), "");
343: ],
344: AC_MSG_RESULT([yes])
1.1.1.3 root 345: AC_DEFINE([HAVE_PTHREAD_SETNAME_NP_th_name]),
1.1 root 346: AC_MSG_RESULT([no]))
347:
348: AC_MSG_CHECKING(for pthread_setname_np(thread, name, arg))
1.1.1.3 root 349: AC_TRY_COMPILE(
1.1 root 350: [
1.1.1.3 root 351: #include <pthread.h>
352: #if defined(HAVE_PTHREAD_NP_H)
353: #include <pthread_np.h>
354: #endif
355: ], [
1.1 root 356: pthread_setname_np(pthread_self(), "", (void*)0);
357: ],
358: AC_MSG_RESULT([yes])
1.1.1.3 root 359: AC_DEFINE([HAVE_PTHREAD_SETNAME_NP_th_name_arg]),
360: AC_MSG_RESULT([no]))
361:
362: AC_MSG_CHECKING(for pthread_set_name_np(thread, name))
363: AC_TRY_COMPILE(
364: [
365: #include <pthread.h>
366: #if defined(HAVE_PTHREAD_NP_H)
367: #include <pthread_np.h>
368: #endif
369: ], [
370: pthread_set_name_np(pthread_self(), "");
371: ],
372: AC_MSG_RESULT([yes])
373: AC_DEFINE([HAVE_PTHREAD_SET_NAME_NP_th_name]),
1.1 root 374: AC_MSG_RESULT([no]))
375:
1.1.1.6 root 376: AC_MSG_CHECKING(for iconv const)
377: AC_TRY_COMPILE(
378: [
379: #include <iconv.h>
380: ], [
381: const char **a;
382: iconv(0, a, 0, 0, 0);
383: ],
384: AC_MSG_RESULT([yes])
385: AC_DEFINE([HAVE_ICONV_CONST]),
386: AC_MSG_RESULT([no]))
387:
1.1.1.8 ! root 388: #
! 389: # Network
! 390: #
! 391: AC_MSG_CHECKING(for AF_PACKET)
! 392: AC_TRY_COMPILE(
! 393: [
! 394: #include <sys/socket.h>
! 395: ], [
! 396: AF_PACKET;
! 397: ],
! 398: AC_MSG_RESULT([yes])
! 399: AC_DEFINE([HAVE_HOSTNET_AFPACKET])
! 400: AC_SUBST([HOSTNET_AFPACKET], [yes]),
! 401: AC_MSG_RESULT([no]))
! 402:
! 403: AC_MSG_CHECKING(for tap(4))
1.1.1.6 root 404: case "${host_os}" in
405: linux*)
406: if test x"$ac_cv_header_linux_if_tun_h" = xyes; then
1.1.1.8 ! root 407: netdriver_tap=yes
1.1.1.6 root 408: fi
409: ;;
410: openbsd*)
411: # OpenBSD has no <net/if_tap.h> but supports tap(4).
1.1.1.8 ! root 412: netdriver_tap=yes
1.1.1.6 root 413: ;;
1.1.1.8 ! root 414: *)
1.1.1.6 root 415: if test x"$ac_cv_header_net_if_tap_h" = xyes; then
1.1.1.8 ! root 416: netdriver_tap=yes
1.1.1.6 root 417: fi
1.1.1.8 ! root 418: ;;
! 419: esac
! 420: if test x"$netdriver_tap" = xyes; then
! 421: AC_MSG_RESULT([yes])
! 422: AC_DEFINE([HAVE_HOSTNET_TAP])
! 423: AC_SUBST([HOSTNET_TAP], [yes])
! 424: else
! 425: AC_MSG_RESULT([no])
! 426: fi
! 427:
! 428: AC_MSG_CHECKING(for bpf(4))
! 429: if test x"$ac_cv_header_net_bpf_h" = xyes; then
! 430: AC_MSG_RESULT([yes])
! 431: AC_DEFINE([HAVE_HOSTNET_BPF])
! 432: AC_SUBST([HOSTNET_BPF], [yes])
! 433: else
! 434: AC_MSG_RESULT([no])
1.1 root 435: fi
436:
437: # libbsd on Linux
1.1.1.5 root 438: AC_CHECK_LIB(c, getprogname, ,)
1.1 root 439: AC_CHECK_LIB(bsd, getprogname,
1.1.1.6 root 440: LIBS="${LIBS} -lbsd"
441: )
1.1.1.5 root 442: # なければ停止する
443: AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
444: [
445: #include <stdlib.h>
446: #include "confdefs.h"
447: #if defined(HAVE_BSD_BSD_H)
448: #include <bsd/bsd.h>
449: #endif
450: ], [
451: getprogname()
452: ])],
453: # nothing to do on success
454: , [AC_MSG_ERROR([*** getprogname is not found.
1.1.1.7 root 455: *** If you use Ubuntu, sudo apt install libbsd-dev])
1.1.1.5 root 456: ]
457: )
1.1 root 458:
1.1.1.2 root 459: # libedit (editline)
460: if test x"$ac_cv_header_histedit_h" = xyes; then
1.1.1.6 root 461: LIBS="${LIBS} -ledit -ltermcap"
1.1.1.2 root 462: fi
463:
1.1 root 464: # libkqueue on Linux
465: AC_CHECK_LIB(kqueue, kqueue,
1.1.1.6 root 466: LIBS="${LIBS} -lkqueue"
467: )
1.1 root 468:
1.1.1.5 root 469: AC_CHECK_LIB(z, gzclose,
1.1.1.6 root 470: LIBS="${LIBS} -lz",
1.1.1.5 root 471: [AC_MSG_ERROR([*** zlib is not found.
1.1.1.7 root 472: *** If use use Ubuntu, sudo apt install zlib1g-dev])]
1.1.1.5 root 473: )
474:
1.1 root 475: # wxWidgets
476: AC_MSG_CHECKING(for wx-config)
1.1.1.3 root 477: wxconfig_paths="${WX_CONFIG} wx-config-3.0 wx-config"
1.1 root 478: wxconfig=""
1.1.1.3 root 479: for c in ${wxconfig_paths}; do
1.1 root 480: ver=`$c --version 2>&1 | cut -f 1 -d .`
481: if test "$ver" = "3"; then
482: wxconfig=$c
483: break
484: fi
485: done
486: if test -z "$wxconfig"; then
1.1.1.7 root 487: AC_MSG_ERROR([*** wxWidgets-3.0 not found in ${wxconfig_paths}
488: *** If you use pkgsrc, install x11/wxGTK30.
489: *** If you use Ubuntu, sudo apt install libwxgtk3.0-gtk3-dev])
1.1 root 490: else
491: AC_MSG_RESULT([$wxconfig])
492:
493: AC_MSG_CHECKING(for wxWidgets version)
494: wxversion=`$wxconfig --version`
495: AC_MSG_RESULT([$wxversion])
496:
497: wxcppflags=`$wxconfig --cppflags`
498: wxlibs=`$wxconfig --libs`
499:
1.1.1.6 root 500: case "${host_os}" in
501: netbsd*)
502: # rpath。どうしたもんだかこれ
1.1 root 503: wxlibs=[`echo $wxlibs | sed -e 's/-L\([^ ]*\) /-L\1 -Wl,-R,\1 /'`]
1.1.1.6 root 504: ;;
1.1 root 505:
1.1.1.6 root 506: darwin*)
507: # XXX -framework AudioToolbox が指定されているとリンカがこけるorz
1.1 root 508: wxlibs=[`echo $wxlibs | sed -e 's/-framework AudioToolbox//'`]
1.1.1.6 root 509: ;;
510: esac
1.1 root 511:
512: AC_SUBST([WXWIDGETS_CPPFLAGS], [$wxcppflags])
513: AC_SUBST([WXWIDGETS_LIBS], [$wxlibs])
514: fi
515:
1.1.1.5 root 516: # gettext
517: AC_CHECK_TOOL([MSGFMT], [msgfmt], [:])
518: if test $MSGFMT = [:]; then
519: AC_MSG_ERROR([*** msgfmt not found.
1.1.1.7 root 520: *** If you use pkgsrc, install devel/gettext-tools.
521: *** If you use Ubuntu, sudo apt install gettext])
1.1.1.5 root 522: fi
523:
1.1 root 524: AC_CONFIG_FILES([Makefile.cfg
525: host/Makefile
526: wx/Makefile
527: util/mkcgrom/Makefile
528: util/viewcgrom/Makefile
529: ])
1.1.1.2 root 530: AC_CONFIG_HEADERS([config-nono.h])
1.1 root 531: AC_OUTPUT
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.