|
|
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 root 388: # Select host network driver.
389: AC_MSG_CHECKING(for suitable host network driver)
1.1.1.6 root 390: case "${host_os}" in
391: linux*)
392: if test x"$ac_cv_header_linux_if_tun_h" = xyes; then
393: netdriver=tap
394: fi
395: ;;
396: openbsd*)
397: # OpenBSD has no <net/if_tap.h> but supports tap(4).
1.1 root 398: netdriver=tap
1.1.1.6 root 399: ;;
400: esac
401: if test -z "$netdriver"; then
402: if test x"$ac_cv_header_net_if_tap_h" = xyes; then
403: netdriver=tap
404: elif test x"$ac_cv_header_net_bpf_h" = xyes; then
405: netdriver=bpf
406: else
407: netdriver=none
408: fi
1.1 root 409: fi
410: AC_MSG_RESULT([$netdriver])
411: AC_SUBST([NETDRIVER], [$netdriver])
412:
413: # libbsd on Linux
1.1.1.5 root 414: AC_CHECK_LIB(c, getprogname, ,)
1.1 root 415: AC_CHECK_LIB(bsd, getprogname,
1.1.1.6 root 416: LIBS="${LIBS} -lbsd"
417: )
1.1.1.5 root 418: # なければ停止する
419: AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
420: [
421: #include <stdlib.h>
422: #include "confdefs.h"
423: #if defined(HAVE_BSD_BSD_H)
424: #include <bsd/bsd.h>
425: #endif
426: ], [
427: getprogname()
428: ])],
429: # nothing to do on success
430: , [AC_MSG_ERROR([*** getprogname is not found.
1.1.1.7 ! root 431: *** If you use Ubuntu, sudo apt install libbsd-dev])
1.1.1.5 root 432: ]
433: )
1.1 root 434:
1.1.1.2 root 435: # libedit (editline)
436: if test x"$ac_cv_header_histedit_h" = xyes; then
1.1.1.6 root 437: LIBS="${LIBS} -ledit -ltermcap"
1.1.1.2 root 438: fi
439:
1.1 root 440: # libkqueue on Linux
441: AC_CHECK_LIB(kqueue, kqueue,
1.1.1.6 root 442: LIBS="${LIBS} -lkqueue"
443: )
1.1 root 444:
1.1.1.5 root 445: AC_CHECK_LIB(z, gzclose,
1.1.1.6 root 446: LIBS="${LIBS} -lz",
1.1.1.5 root 447: [AC_MSG_ERROR([*** zlib is not found.
1.1.1.7 ! root 448: *** If use use Ubuntu, sudo apt install zlib1g-dev])]
1.1.1.5 root 449: )
450:
1.1 root 451: # wxWidgets
452: AC_MSG_CHECKING(for wx-config)
1.1.1.3 root 453: wxconfig_paths="${WX_CONFIG} wx-config-3.0 wx-config"
1.1 root 454: wxconfig=""
1.1.1.3 root 455: for c in ${wxconfig_paths}; do
1.1 root 456: ver=`$c --version 2>&1 | cut -f 1 -d .`
457: if test "$ver" = "3"; then
458: wxconfig=$c
459: break
460: fi
461: done
462: if test -z "$wxconfig"; then
1.1.1.7 ! root 463: AC_MSG_ERROR([*** wxWidgets-3.0 not found in ${wxconfig_paths}
! 464: *** If you use pkgsrc, install x11/wxGTK30.
! 465: *** If you use Ubuntu, sudo apt install libwxgtk3.0-gtk3-dev])
1.1 root 466: else
467: AC_MSG_RESULT([$wxconfig])
468:
469: AC_MSG_CHECKING(for wxWidgets version)
470: wxversion=`$wxconfig --version`
471: AC_MSG_RESULT([$wxversion])
472:
473: wxcppflags=`$wxconfig --cppflags`
474: wxlibs=`$wxconfig --libs`
475:
1.1.1.6 root 476: case "${host_os}" in
477: netbsd*)
478: # rpath。どうしたもんだかこれ
1.1 root 479: wxlibs=[`echo $wxlibs | sed -e 's/-L\([^ ]*\) /-L\1 -Wl,-R,\1 /'`]
1.1.1.6 root 480: ;;
1.1 root 481:
1.1.1.6 root 482: darwin*)
483: # XXX -framework AudioToolbox が指定されているとリンカがこけるorz
1.1 root 484: wxlibs=[`echo $wxlibs | sed -e 's/-framework AudioToolbox//'`]
1.1.1.6 root 485: ;;
486: esac
1.1 root 487:
488: AC_SUBST([WXWIDGETS_CPPFLAGS], [$wxcppflags])
489: AC_SUBST([WXWIDGETS_LIBS], [$wxlibs])
490: fi
491:
1.1.1.5 root 492: # gettext
493: AC_CHECK_TOOL([MSGFMT], [msgfmt], [:])
494: if test $MSGFMT = [:]; then
495: AC_MSG_ERROR([*** msgfmt not found.
1.1.1.7 ! root 496: *** If you use pkgsrc, install devel/gettext-tools.
! 497: *** If you use Ubuntu, sudo apt install gettext])
1.1.1.5 root 498: fi
499:
1.1 root 500: AC_CONFIG_FILES([Makefile.cfg
501: host/Makefile
502: wx/Makefile
503: util/mkcgrom/Makefile
504: util/viewcgrom/Makefile
505: ])
1.1.1.2 root 506: AC_CONFIG_HEADERS([config-nono.h])
1.1 root 507: AC_OUTPUT
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.