|
|
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.3 ! root 17: # C++ のバージョンをチェック
! 18: CXX_STD=-std=c++14
! 19: AC_LANG_PUSH([C++])
! 20: AC_MSG_CHECKING(for ${CXX_STD})
1.1 root 21: old_CXXFLAGS="${CXXFLAGS}"
1.1.1.3 ! root 22: CXXFLAGS="${CXX_STD} ${CXXFLAGS}"
1.1 root 23: AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])],
1.1.1.3 ! root 24: AC_MSG_RESULT([yes]),
! 25: AC_MSG_ERROR("*** C++ compiler '${CXX}' doesn't support ${CXX_STD}."))
1.1 root 26: CXXFLAGS="${old_CXXFLAGS}"
1.1.1.3 ! root 27: CXX="${CXX} ${CXX_STD}"
! 28: AC_LANG_POP([C++])
! 29:
! 30: # C コンパイラのワーニングオプション
! 31: AC_LANG_PUSH([C])
! 32: AC_DEFUN([ADD_CC_FLAG_IF],[
! 33: AC_MSG_CHECKING([whether cc accepts $1])
! 34: old_CFLAGS="${CFLAGS}"
! 35: CFLAGS="${CFLAGS} -Werror $1"
! 36: AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])],
! 37: AC_MSG_RESULT([yes])
! 38: WARNFLAGS_C="${WARNFLAGS_C} $1",
! 39: AC_MSG_RESULT([no]))
! 40: CFLAGS="${old_CFLAGS}"
! 41: ])
! 42: ADD_CC_FLAG_IF(-Wcast-qual)
! 43: ADD_CC_FLAG_IF(-Wdisabled-macro-expansion)
! 44: ADD_CC_FLAG_IF(-Wextra-semi)
! 45: ADD_CC_FLAG_IF(-Wlogical-op)
! 46: ADD_CC_FLAG_IF(-Wmissing-prototypes)
! 47: ADD_CC_FLAG_IF(-Wmissing-variable-declarations)
! 48: AC_LANG_POP([C])
! 49: AC_SUBST([WARNFLAGS_C])
! 50:
! 51: # C++ コンパイラのワーニングオプション
! 52: # (AC_LANG は C++ のまま継続する)
! 53: AC_LANG_CPLUSPLUS
! 54: AC_DEFUN([ADD_CXX_FLAG_IF],[
! 55: AC_MSG_CHECKING([whether c++ accepts $1])
! 56: old_CXXFLAGS="${CXXFLAGS}"
! 57: CXXFLAGS="${CXXFLAGS} -Werror $1"
! 58: AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])],
! 59: AC_MSG_RESULT([yes])
! 60: WARNFLAGS_CXX="${WARNFLAGS_CXX} $1",
! 61: AC_MSG_RESULT([no]))
! 62: CXXFLAGS="${old_CXXFLAGS}"
! 63: ])
! 64: ADD_CXX_FLAG_IF(-Wcast-qual)
! 65: ADD_CXX_FLAG_IF(-Wdisabled-macro-expansion)
! 66: ADD_CXX_FLAG_IF(-Wextra-semi)
! 67: ADD_CXX_FLAG_IF(-Winconsistent-missing-override)
! 68: ADD_CXX_FLAG_IF(-Winconsistent-missing-destructor-override)
! 69: ADD_CXX_FLAG_IF(-Wlogical-op)
! 70: ADD_CXX_FLAG_IF(-Wmissing-prototypes)
! 71: ADD_CXX_FLAG_IF(-Wmissing-variable-declarations)
! 72: ADD_CXX_FLAG_IF(-Wvla-extension)
! 73: AC_SUBST([WARNFLAGS_CXX])
1.1 root 74:
75: # Checks for libraries.
76:
77: # Checks for header files.
78: AC_CHECK_HEADERS([bsd/bsd.h])
79: AC_CHECK_HEADERS([endian.h])
1.1.1.2 root 80: AC_CHECK_HEADERS([histedit.h])
1.1 root 81: AC_CHECK_HEADERS([kqueue/sys/event.h])
1.1.1.3 ! root 82: AC_CHECK_HEADERS([pthread_np.h])
1.1 root 83: AC_CHECK_HEADERS([sys/endian.h])
84: AC_CHECK_HEADERS([sys/event.h])
85: AC_CHECK_HEADERS([net/bpf.h])
86: AC_CHECK_HEADERS([net/if_tap.h])
87: AC_CHECK_HEADERS([linux/if_tun.h])
88:
89: # Linux で <kqueue/sys/event.h> がなければここで停止したほうがいい
90: if test "$ac_cv_header_sys_event_h" != "yes" \
91: -a "$ac_cv_header_kqueue_sys_event_h" != "yes"; then
92: AC_MSG_ERROR([*** kqueue is not found.
93: On Ubuntu, sudo apt install libkqueue-dev])
94: fi
95:
96: # Checks for typedefs, structures, and compiler characteristics.
97: AC_CHECK_HEADER_STDBOOL
98: #AC_C_INLINE
99: #AC_TYPE_INT16_T
100: #AC_TYPE_INT32_T
101: #AC_TYPE_INT64_T
102: #AC_TYPE_INT8_T
103: #AC_TYPE_SIZE_T
104: #AC_TYPE_UINT16_T
105: #AC_TYPE_UINT32_T
106: #AC_TYPE_UINT64_T
107: #AC_TYPE_UINT8_T
108:
109: # struct kevent のメンバ udata の型が互換性なく違う。
110: # NetBSD では intptr_t(整数) だが、OSX では void* (ポインタ) なので、
111: # 同一ソースコードでは回避できない。
112: # Linux(Ubuntu) はどっちもパスするので後ろの void * のほうが使われる。
113: # まあパスするんならどっちでもいいか。
114: AC_MSG_CHECKING(whether kevent.udata is intptr_t)
115: old_CXXFLAGS="${CXXFLAGS}"
116: CXXFLAGS="${CXXFLAGS} -Wall -Werror"
117: AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
118: [
119: #include "confdefs.h"
1.1.1.3 ! root 120: #if defined(HAVE_SYS_TYPES_H)
! 121: #include <sys/types.h>
! 122: #endif
1.1 root 123: #if defined(HAVE_SYS_EVENT_H)
124: #include <sys/event.h>
125: #endif
126: #if defined(HAVE_KQUEUE_SYS_EVENT_H)
127: #include <kqueue/sys/event.h>
128: #endif
129: ], [
130: struct kevent kev;
131: kev.udata = (intptr_t)0;
132: (void)kev;
133: ])],
134: AC_MSG_RESULT([yes])
135: AC_SUBST([KEVENT_UDATA_T], [intptr_t]),
136: AC_MSG_RESULT([no]))
137: CXXFLAGS="${old_CXXFLAGS}"
138:
139: AC_MSG_CHECKING(whether kevent.udata is void *)
140: old_CXXFLAGS="${CXXFLAGS}"
141: CXXFLAGS="${CXXFLAGS} -Wall -Werror"
142: AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
143: [
144: #include "confdefs.h"
1.1.1.3 ! root 145: #if defined(HAVE_SYS_TYPES_H)
! 146: #include <sys/types.h>
! 147: #endif
1.1 root 148: #if defined(HAVE_SYS_EVENT_H)
149: #include <sys/event.h>
150: #endif
151: #if defined(HAVE_KQUEUE_SYS_EVENT_H)
152: #include <kqueue/sys/event.h>
153: #endif
154: ], [
155: struct kevent kev;
156: kev.udata = (void *)0;
157: (void)kev;
158: ])],
159: AC_MSG_RESULT([yes])
160: AC_SUBST([KEVENT_UDATA_T], ['void *']),
161: AC_MSG_RESULT([no]))
162: CXXFLAGS="${old_CXXFLAGS}"
163:
164: if test -z "$KEVENT_UDATA_T" ; then
165: AC_MSG_ERROR([kevent.udata is unknown type])
166: fi
167:
168: AC_MSG_CHECKING(for __builtin_assume)
169: AC_TRY_COMPILE(,
170: [
171: __builtin_assume(1);
172: ],
173: AC_MSG_RESULT([yes])
174: AC_DEFINE([HAVE___BUILTIN_ASSUME]),
175: AC_MSG_RESULT([no]))
176:
177: AC_MSG_CHECKING(for __builtin_bswap16)
178: AC_TRY_COMPILE(,
179: [
180: return __builtin_bswap16(0);
181: ],
182: AC_MSG_RESULT([yes])
183: AC_DEFINE([HAVE___BUILTIN_BSWAP16]),
184: AC_MSG_RESULT([no]))
185:
186: AC_MSG_CHECKING(for __builtin_bswap32)
187: AC_TRY_COMPILE(,
188: [
189: return __builtin_bswap32(0);
190: ],
191: AC_MSG_RESULT([yes])
192: AC_DEFINE([HAVE___BUILTIN_BSWAP32]),
193: AC_MSG_RESULT([no]))
194:
1.1.1.2 root 195: AC_MSG_CHECKING(for __builtin_bswap64)
196: AC_TRY_COMPILE(,
197: [
198: return __builtin_bswap64(0);
199: ],
200: AC_MSG_RESULT([yes])
201: AC_DEFINE([HAVE___BUILTIN_BSWAP64]),
202: AC_MSG_RESULT([no]))
203:
1.1 root 204: AC_MSG_CHECKING(for __builtin_expect)
205: AC_TRY_COMPILE(,
206: [
207: if (__builtin_expect(1, 1)) return 0;
208: ],
209: AC_MSG_RESULT([yes])
210: AC_DEFINE([HAVE___BUILTIN_EXPECT]),
211: AC_MSG_RESULT([no]))
212:
213: AC_MSG_CHECKING(for __builtin_unreachable)
214: AC_TRY_COMPILE(,
215: [
216: __builtin_unreachable();
217: ],
218: AC_MSG_RESULT([yes])
219: AC_DEFINE([HAVE___BUILTIN_UNREACHABLE]),
220: AC_MSG_RESULT([no]))
221:
222: AC_MSG_CHECKING(for __attribute__((__fallthrough__)))
223: old_CXXFLAGS="${CXXFLAGS}"
224: CXXFLAGS="${CXXFLAGS} -Wall -Werror"
225: AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
226: [], [
227: extern int x;
228: switch (x) {
229: case 0:
230: __attribute__((__fallthrough__));
231: case 1:
232: break;
233: }
234: ])],
235: AC_MSG_RESULT([yes])
236: AC_DEFINE([HAVE___ATTRIBUTE_FALLTHROUGH]),
237: AC_MSG_RESULT([no]))
238: CXXFLAGS="${old_CXXFLAGS}"
239:
240: dnl とりあえず __format__ までしか調べてないので、
241: dnl その中の __printf__ とかまで調べる必要ができたら直すこと。
242: AC_MSG_CHECKING(for __attribute__((__format__)))
243: old_CXXFLAGS="${CXXFLAGS}"
244: CXXFLAGS="${CXXFLAGS} -Wall -Werror"
245: AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
246: [
247: extern int f(const char *f, ...)
248: __attribute__((__format__(__printf__, 1, 2)));
249: ], [
250: ])],
251: AC_MSG_RESULT([yes])
252: AC_DEFINE([HAVE___ATTRIBUTE_FORMAT]),
253: AC_MSG_RESULT([no]))
254: CXXFLAGS="${old_CXXFLAGS}"
255:
256: AC_MSG_CHECKING(for __attribute__((no_sanitize)))
257: old_CXXFLAGS="${CXXFLAGS}"
258: CXXFLAGS="${CXXFLAGS} -Werror"
259: AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
260: [
261: __attribute__((no_sanitize("undefined")))
262: int func() { return 0; }
263: ], [
264: ])],
265: AC_MSG_RESULT([yes])
266: AC_DEFINE([HAVE___ATTRIBUTE_NO_SANITIZE]),
267: AC_MSG_RESULT([no]))
268: CXXFLAGS="${old_CXXFLAGS}"
269:
270:
271: AC_MSG_CHECKING(for __attribute__((__packed__)))
272: old_CXXFLAGS="${CXXFLAGS}"
273: CXXFLAGS="${CXXFLAGS} -Werror"
274: AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
275: [], [
276: struct x { char a; int b; } __attribute__((__packed__));
277: ])],
278: AC_MSG_RESULT([yes])
279: AC_DEFINE([HAVE___ATTRIBUTE_PACKED]),
280: AC_MSG_RESULT([no]))
281: CXXFLAGS="${old_CXXFLAGS}"
282:
283: AC_MSG_CHECKING(for __attribute__((__unused__)))
284: old_CXXFLAGS="${CXXFLAGS}"
285: CXXFLAGS="${CXXFLAGS} -Wunused-variable -Werror"
286: AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
287: [], [
288: int a __attribute__((__unused__));
289: ])],
290: AC_MSG_RESULT([yes])
291: AC_DEFINE([HAVE___ATTRIBUTE_UNUSED]),
292: AC_MSG_RESULT([no]))
293: CXXFLAGS="${old_CXXFLAGS}"
294:
295: # Checks for library functions.
296: #AC_FUNC_MALLOC
297: #AC_FUNC_MMAP
298:
299: AC_MSG_CHECKING(for pthread_setname_np(name))
1.1.1.3 ! root 300: AC_TRY_COMPILE(
1.1 root 301: [
1.1.1.3 ! root 302: #include <pthread.h>
! 303: #if defined(HAVE_PTHREAD_NP_H)
! 304: #include <pthread_np.h>
! 305: #endif
! 306: ], [
1.1 root 307: pthread_setname_np("");
308: ],
309: AC_MSG_RESULT([yes])
1.1.1.3 ! root 310: AC_DEFINE([HAVE_PTHREAD_SETNAME_NP_name]),
1.1 root 311: AC_MSG_RESULT([no]))
312:
313: AC_MSG_CHECKING(for pthread_setname_np(thread, name))
1.1.1.3 ! root 314: AC_TRY_COMPILE(
1.1 root 315: [
1.1.1.3 ! root 316: #include <pthread.h>
! 317: #if defined(HAVE_PTHREAD_NP_H)
! 318: #include <pthread_np.h>
! 319: #endif
! 320: ], [
1.1 root 321: pthread_setname_np(pthread_self(), "");
322: ],
323: AC_MSG_RESULT([yes])
1.1.1.3 ! root 324: AC_DEFINE([HAVE_PTHREAD_SETNAME_NP_th_name]),
1.1 root 325: AC_MSG_RESULT([no]))
326:
327: AC_MSG_CHECKING(for pthread_setname_np(thread, name, arg))
1.1.1.3 ! root 328: AC_TRY_COMPILE(
1.1 root 329: [
1.1.1.3 ! root 330: #include <pthread.h>
! 331: #if defined(HAVE_PTHREAD_NP_H)
! 332: #include <pthread_np.h>
! 333: #endif
! 334: ], [
1.1 root 335: pthread_setname_np(pthread_self(), "", (void*)0);
336: ],
337: AC_MSG_RESULT([yes])
1.1.1.3 ! root 338: AC_DEFINE([HAVE_PTHREAD_SETNAME_NP_th_name_arg]),
! 339: AC_MSG_RESULT([no]))
! 340:
! 341: AC_MSG_CHECKING(for pthread_set_name_np(thread, name))
! 342: AC_TRY_COMPILE(
! 343: [
! 344: #include <pthread.h>
! 345: #if defined(HAVE_PTHREAD_NP_H)
! 346: #include <pthread_np.h>
! 347: #endif
! 348: ], [
! 349: pthread_set_name_np(pthread_self(), "");
! 350: ],
! 351: AC_MSG_RESULT([yes])
! 352: AC_DEFINE([HAVE_PTHREAD_SET_NAME_NP_th_name]),
1.1 root 353: AC_MSG_RESULT([no]))
354:
355: # Select host network driver.
356: AC_MSG_CHECKING(for suitable host network driver)
357: if test x"$ac_cv_header_net_if_tap_h" = xyes; then
358: netdriver=tap
359: elif test x"$ac_cv_header_linux_if_tun_h" = xyes; then
360: netdriver=tap
361: elif test x"$ac_cv_header_net_bpf_h" = xyes; then
362: netdriver=bpf
363: else
364: netdriver=none
365: fi
366: AC_MSG_RESULT([$netdriver])
367: AC_SUBST([NETDRIVER], [$netdriver])
368:
369: # libbsd on Linux
370: AC_CHECK_LIB(bsd, getprogname,
371: AC_SUBST([LIBBSD_LIBS], [-lbsd]),
372: )
373:
1.1.1.2 root 374: # libedit (editline)
375: if test x"$ac_cv_header_histedit_h" = xyes; then
376: AC_SUBST([LIBEDIT_LIBS], ["-ledit -ltermcap"])
377: fi
378:
1.1 root 379: # libkqueue on Linux
380: AC_CHECK_LIB(kqueue, kqueue,
381: AC_SUBST([LIBKQUEUE_LIBS], [-lkqueue]),
382: )
383:
384: # wxWidgets
385: AC_MSG_CHECKING(for wx-config)
1.1.1.3 ! root 386: wxconfig_paths="${WX_CONFIG} wx-config-3.0 wx-config"
1.1 root 387: wxconfig=""
1.1.1.3 ! root 388: for c in ${wxconfig_paths}; do
1.1 root 389: ver=`$c --version 2>&1 | cut -f 1 -d .`
390: if test "$ver" = "3"; then
391: wxconfig=$c
392: break
393: fi
394: done
395: if test -z "$wxconfig"; then
1.1.1.3 ! root 396: AC_MSG_ERROR([*** wxWidgets-3.0 not found in ${wxconfig_paths}])
1.1 root 397: else
398: AC_MSG_RESULT([$wxconfig])
399:
400: AC_MSG_CHECKING(for wxWidgets version)
401: wxversion=`$wxconfig --version`
402: AC_MSG_RESULT([$wxversion])
403:
404: wxcppflags=`$wxconfig --cppflags`
405: wxlibs=`$wxconfig --libs`
406:
407: # XXX NetBSD の rpath。どうしたもんだかこれ
408: if test "`uname -s`" = "NetBSD"; then
409: wxlibs=[`echo $wxlibs | sed -e 's/-L\([^ ]*\) /-L\1 -Wl,-R,\1 /'`]
410: fi
411:
412: # XXX OSX の -framework AudioToolbox が指定されているとリンカがこけるorz
413: if test "`uname -s`" = "Darwin"; then
414: wxlibs=[`echo $wxlibs | sed -e 's/-framework AudioToolbox//'`]
415: fi
416:
417: AC_SUBST([WXWIDGETS_CPPFLAGS], [$wxcppflags])
418: AC_SUBST([WXWIDGETS_LIBS], [$wxlibs])
419: fi
420:
421: AC_CONFIG_FILES([Makefile.cfg
422: host/Makefile
423: wx/Makefile
424: util/mkcgrom/Makefile
425: util/viewcgrom/Makefile
426: ])
1.1.1.2 root 427: AC_CONFIG_HEADERS([config-nono.h])
1.1 root 428: AC_OUTPUT
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.