|
|
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)
10:
11: # Checks for programs.
12: AC_PROG_CXX
13: AC_PROG_CC
1.1.1.3 root 14: AC_PROG_INSTALL
1.1 root 15: AC_C_BIGENDIAN
16:
1.1.1.4 ! root 17: # コンパイラをチェック。今のところ clang/gcc のみ。
! 18: # (autoconf がやってる gcc かどうかのチェックは clang を検出できず使えない)
! 19: AC_MSG_CHECKING(for compiler)
! 20: if test -n "`${CC} -v 2>&1 | grep clang`" ; then
! 21: AC_MSG_RESULT([clang])
! 22: COMPILER=CLANG
! 23: elif test -n "`${CC} -v 2>&1 | grep GCC`"; then
! 24: AC_MSG_RESULT([gcc])
! 25: COMPILER=GCC
! 26: else
! 27: AC_MSG_RESULT([unknown])
! 28: COMPILER=
! 29: fi
! 30: AC_SUBST([COMPILER])
! 31:
! 32: # アーキテクチャのチェック。
! 33: AC_MSG_CHECKING(for architecture)
! 34: ARCH=`${CC} -v 2>&1 | awk '/Target:/ {print \$2}' | sed -e 's/-.*//'`
! 35: AC_MSG_RESULT([${ARCH}])
! 36: AC_SUBST([ARCH])
! 37:
1.1.1.3 root 38: # C++ のバージョンをチェック
39: CXX_STD=-std=c++14
40: AC_LANG_PUSH([C++])
41: AC_MSG_CHECKING(for ${CXX_STD})
1.1 root 42: old_CXXFLAGS="${CXXFLAGS}"
1.1.1.3 root 43: CXXFLAGS="${CXX_STD} ${CXXFLAGS}"
1.1 root 44: AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])],
1.1.1.3 root 45: AC_MSG_RESULT([yes]),
46: AC_MSG_ERROR("*** C++ compiler '${CXX}' doesn't support ${CXX_STD}."))
1.1 root 47: CXXFLAGS="${old_CXXFLAGS}"
1.1.1.3 root 48: CXX="${CXX} ${CXX_STD}"
49: AC_LANG_POP([C++])
50:
51: # C コンパイラのワーニングオプション
52: AC_LANG_PUSH([C])
1.1.1.4 ! root 53: AC_DEFUN([ADD_CC_WARN_IF],[
1.1.1.3 root 54: AC_MSG_CHECKING([whether cc accepts $1])
55: old_CFLAGS="${CFLAGS}"
56: CFLAGS="${CFLAGS} -Werror $1"
57: AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])],
58: AC_MSG_RESULT([yes])
59: WARNFLAGS_C="${WARNFLAGS_C} $1",
60: AC_MSG_RESULT([no]))
61: CFLAGS="${old_CFLAGS}"
62: ])
1.1.1.4 ! root 63: ADD_CC_WARN_IF(-Wcast-qual)
! 64: ADD_CC_WARN_IF(-Wdisabled-macro-expansion)
! 65: ADD_CC_WARN_IF(-Wextra-semi)
! 66: ADD_CC_WARN_IF(-Wlogical-op)
! 67: ADD_CC_WARN_IF(-Wmissing-prototypes)
! 68: ADD_CC_WARN_IF(-Wmissing-variable-declarations)
1.1.1.3 root 69: AC_LANG_POP([C])
70: AC_SUBST([WARNFLAGS_C])
71:
72: # C++ コンパイラのワーニングオプション
73: # (AC_LANG は C++ のまま継続する)
74: AC_LANG_CPLUSPLUS
1.1.1.4 ! root 75: AC_DEFUN([ADD_CXX_WARN_IF],[
1.1.1.3 root 76: AC_MSG_CHECKING([whether c++ accepts $1])
77: old_CXXFLAGS="${CXXFLAGS}"
78: CXXFLAGS="${CXXFLAGS} -Werror $1"
79: AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])],
80: AC_MSG_RESULT([yes])
81: WARNFLAGS_CXX="${WARNFLAGS_CXX} $1",
82: AC_MSG_RESULT([no]))
83: CXXFLAGS="${old_CXXFLAGS}"
84: ])
1.1.1.4 ! root 85: ADD_CXX_WARN_IF(-Wcast-qual)
! 86: ADD_CXX_WARN_IF(-Wdisabled-macro-expansion)
! 87: ADD_CXX_WARN_IF(-Wextra-semi)
! 88: ADD_CXX_WARN_IF(-Winconsistent-missing-override)
! 89: ADD_CXX_WARN_IF(-Winconsistent-missing-destructor-override)
! 90: ADD_CXX_WARN_IF(-Wlogical-op)
! 91: ADD_CXX_WARN_IF(-Wmissing-prototypes)
! 92: ADD_CXX_WARN_IF(-Wmissing-variable-declarations)
! 93: ADD_CXX_WARN_IF(-Wvla-extension)
1.1.1.3 root 94: AC_SUBST([WARNFLAGS_CXX])
1.1 root 95:
96: # Checks for libraries.
97:
98: # Checks for header files.
99: AC_CHECK_HEADERS([bsd/bsd.h])
100: AC_CHECK_HEADERS([endian.h])
1.1.1.2 root 101: AC_CHECK_HEADERS([histedit.h])
1.1 root 102: AC_CHECK_HEADERS([kqueue/sys/event.h])
1.1.1.3 root 103: AC_CHECK_HEADERS([pthread_np.h])
1.1 root 104: AC_CHECK_HEADERS([sys/endian.h])
105: AC_CHECK_HEADERS([sys/event.h])
106: AC_CHECK_HEADERS([net/bpf.h])
107: AC_CHECK_HEADERS([net/if_tap.h])
108: AC_CHECK_HEADERS([linux/if_tun.h])
109:
110: # Linux で <kqueue/sys/event.h> がなければここで停止したほうがいい
111: if test "$ac_cv_header_sys_event_h" != "yes" \
112: -a "$ac_cv_header_kqueue_sys_event_h" != "yes"; then
113: AC_MSG_ERROR([*** kqueue is not found.
114: On Ubuntu, sudo apt install libkqueue-dev])
115: fi
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:
376: # Select host network driver.
377: AC_MSG_CHECKING(for suitable host network driver)
378: if test x"$ac_cv_header_net_if_tap_h" = xyes; then
379: netdriver=tap
380: elif test x"$ac_cv_header_linux_if_tun_h" = xyes; then
381: netdriver=tap
382: elif test x"$ac_cv_header_net_bpf_h" = xyes; then
383: netdriver=bpf
384: else
385: netdriver=none
386: fi
387: AC_MSG_RESULT([$netdriver])
388: AC_SUBST([NETDRIVER], [$netdriver])
389:
390: # libbsd on Linux
391: AC_CHECK_LIB(bsd, getprogname,
392: AC_SUBST([LIBBSD_LIBS], [-lbsd]),
393: )
394:
1.1.1.2 root 395: # libedit (editline)
396: if test x"$ac_cv_header_histedit_h" = xyes; then
397: AC_SUBST([LIBEDIT_LIBS], ["-ledit -ltermcap"])
398: fi
399:
1.1 root 400: # libkqueue on Linux
401: AC_CHECK_LIB(kqueue, kqueue,
402: AC_SUBST([LIBKQUEUE_LIBS], [-lkqueue]),
403: )
404:
405: # wxWidgets
406: AC_MSG_CHECKING(for wx-config)
1.1.1.3 root 407: wxconfig_paths="${WX_CONFIG} wx-config-3.0 wx-config"
1.1 root 408: wxconfig=""
1.1.1.3 root 409: for c in ${wxconfig_paths}; do
1.1 root 410: ver=`$c --version 2>&1 | cut -f 1 -d .`
411: if test "$ver" = "3"; then
412: wxconfig=$c
413: break
414: fi
415: done
416: if test -z "$wxconfig"; then
1.1.1.3 root 417: AC_MSG_ERROR([*** wxWidgets-3.0 not found in ${wxconfig_paths}])
1.1 root 418: else
419: AC_MSG_RESULT([$wxconfig])
420:
421: AC_MSG_CHECKING(for wxWidgets version)
422: wxversion=`$wxconfig --version`
423: AC_MSG_RESULT([$wxversion])
424:
425: wxcppflags=`$wxconfig --cppflags`
426: wxlibs=`$wxconfig --libs`
427:
428: # XXX NetBSD の rpath。どうしたもんだかこれ
429: if test "`uname -s`" = "NetBSD"; then
430: wxlibs=[`echo $wxlibs | sed -e 's/-L\([^ ]*\) /-L\1 -Wl,-R,\1 /'`]
431: fi
432:
433: # XXX OSX の -framework AudioToolbox が指定されているとリンカがこけるorz
434: if test "`uname -s`" = "Darwin"; then
435: wxlibs=[`echo $wxlibs | sed -e 's/-framework AudioToolbox//'`]
436: fi
437:
438: AC_SUBST([WXWIDGETS_CPPFLAGS], [$wxcppflags])
439: AC_SUBST([WXWIDGETS_LIBS], [$wxlibs])
440: fi
441:
442: AC_CONFIG_FILES([Makefile.cfg
443: host/Makefile
444: wx/Makefile
445: util/mkcgrom/Makefile
446: util/viewcgrom/Makefile
447: ])
1.1.1.2 root 448: AC_CONFIG_HEADERS([config-nono.h])
1.1 root 449: AC_OUTPUT
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.