--- nono/configure.ac 2026/04/29 17:04:33 1.1.1.3 +++ nono/configure.ac 2026/04/29 17:05:26 1.1.1.15 @@ -4,15 +4,34 @@ # Licensed under nono-license.txt # -AC_PREREQ([2.69]) -AC_INIT([nono], [0.0], []) +AC_PREREQ([2.71]) +AC_INIT([nono],[0.0],[]) AC_CONFIG_SRCDIR(wx/wxapp.cpp) +AC_CONFIG_AUX_DIR([scripts]) # Checks for programs. AC_PROG_CXX AC_PROG_CC AC_PROG_INSTALL -AC_C_BIGENDIAN + +# OS +AC_CANONICAL_HOST +AC_SUBST([host_cpu]) + +# コンパイラをチェック。今のところ clang/gcc のみ。 +# (autoconf がやってる gcc かどうかのチェックは clang を検出できず使えない) +AC_MSG_CHECKING(for compiler) +if test -n "`${CC} -v 2>&1 | grep clang`" ; then + AC_MSG_RESULT([clang]) + COMPILER=CLANG +elif test -n "`${CC} -v 2>&1 | grep GCC`"; then + AC_MSG_RESULT([gcc]) + COMPILER=GCC +else + AC_MSG_RESULT([unknown]) + COMPILER= +fi +AC_SUBST([COMPILER]) # C++ のバージョンをチェック CXX_STD=-std=c++14 @@ -29,69 +48,159 @@ AC_LANG_POP([C++]) # C コンパイラのワーニングオプション AC_LANG_PUSH([C]) -AC_DEFUN([ADD_CC_FLAG_IF],[ +AC_DEFUN([ADD_CC_WARN_IF],[ AC_MSG_CHECKING([whether cc accepts $1]) old_CFLAGS="${CFLAGS}" CFLAGS="${CFLAGS} -Werror $1" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], AC_MSG_RESULT([yes]) + eval `echo cc_has$1=yes | sed -e 's/-/_/g'` WARNFLAGS_C="${WARNFLAGS_C} $1", AC_MSG_RESULT([no])) CFLAGS="${old_CFLAGS}" ]) -ADD_CC_FLAG_IF(-Wcast-qual) -ADD_CC_FLAG_IF(-Wdisabled-macro-expansion) -ADD_CC_FLAG_IF(-Wextra-semi) -ADD_CC_FLAG_IF(-Wlogical-op) -ADD_CC_FLAG_IF(-Wmissing-prototypes) -ADD_CC_FLAG_IF(-Wmissing-variable-declarations) +ADD_CC_WARN_IF(-Wcast-qual) +ADD_CC_WARN_IF(-Wextra-semi) +ADD_CC_WARN_IF(-Wlogical-op) +ADD_CC_WARN_IF(-Wmissing-prototypes) +ADD_CC_WARN_IF(-Wmissing-variable-declarations) +# -Wshadow-local があればそっちを使う(gcc>=7)、なければ -Wshadow (clang) +ADD_CC_WARN_IF(-Wshadow-local) +if test x"${cc_has_Wshadow_local}" != xyes; then + ADD_CC_WARN_IF(-Wshadow) +fi +ADD_CC_WARN_IF(-Wstring-conversion) +ADD_CC_WARN_IF(-Wtype-limits) AC_LANG_POP([C]) AC_SUBST([WARNFLAGS_C]) # C++ コンパイラのワーニングオプション # (AC_LANG は C++ のまま継続する) -AC_LANG_CPLUSPLUS -AC_DEFUN([ADD_CXX_FLAG_IF],[ +AC_LANG([C++]) +AC_DEFUN([ADD_CXX_WARN_IF],[ AC_MSG_CHECKING([whether c++ accepts $1]) old_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="${CXXFLAGS} -Werror $1" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], AC_MSG_RESULT([yes]) + eval `echo cxx_has$1=yes | sed -e 's/-/_/g'` WARNFLAGS_CXX="${WARNFLAGS_CXX} $1", AC_MSG_RESULT([no])) CXXFLAGS="${old_CXXFLAGS}" ]) -ADD_CXX_FLAG_IF(-Wcast-qual) -ADD_CXX_FLAG_IF(-Wdisabled-macro-expansion) -ADD_CXX_FLAG_IF(-Wextra-semi) -ADD_CXX_FLAG_IF(-Winconsistent-missing-override) -ADD_CXX_FLAG_IF(-Winconsistent-missing-destructor-override) -ADD_CXX_FLAG_IF(-Wlogical-op) -ADD_CXX_FLAG_IF(-Wmissing-prototypes) -ADD_CXX_FLAG_IF(-Wmissing-variable-declarations) -ADD_CXX_FLAG_IF(-Wvla-extension) +ADD_CXX_WARN_IF(-Wcast-qual) +ADD_CXX_WARN_IF(-Wextra-semi) +ADD_CXX_WARN_IF(-Winconsistent-missing-destructor-override) +ADD_CXX_WARN_IF(-Winconsistent-missing-override) +ADD_CXX_WARN_IF(-Wlogical-op) +ADD_CXX_WARN_IF(-Wmissing-prototypes) +ADD_CXX_WARN_IF(-Wmissing-variable-declarations) +# -Wshadow-local があればそっちを使う(gcc>=7)、なければ -Wshadow (clang) +ADD_CXX_WARN_IF(-Wshadow-local) +if test x"${cxx_has_Wshadow_local}" != xyes; then + ADD_CXX_WARN_IF(-Wshadow) +fi +ADD_CXX_WARN_IF(-Wstring-conversion) +ADD_CXX_WARN_IF(-Wsuggest-destructor-override) +ADD_CXX_WARN_IF(-Wsuggest-override) +ADD_CXX_WARN_IF(-Wtype-limits) +ADD_CXX_WARN_IF(-Wvla-extension) AC_SUBST([WARNFLAGS_CXX]) +# コンパイラが AVX2 をサポートしているか。 +AC_ARG_ENABLE([avx2], + [AS_HELP_STRING([--disable-avx2], [disable avx2 support])], + [], + [enable_avx2=yes]) + +AS_IF([test x"${enable_avx2}" != x"no"], [ + AC_MSG_CHECKING(whether the compiler supports AVX2) + if test x"${host_cpu}" = x"x86_64"; then + if test x"${host_cpu}" = x"${build_cpu}"; then + old_CXXFLAGS="${CXXFLAGS}" + CXXFLAGS="${CXXFLAGS} -mavx2" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ + #include + ], [ + #if !defined(__AVX2__) + #error __AVX2__ is not defined by the compiler. + #endif + __m256i v; + ])], [ + have_avx2=yes + ]) + CXXFLAGS="${old_CXXFLAGS}" + fi + fi + if test x"${have_avx2}" = x"yes"; then + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_AVX2]) + AC_SUBST(HOST_HAS_AVX2, yes) + else + AC_MSG_RESULT([no]) + fi +], [ +]) + +# コンパイラが NEON をサポートしているか。 +AC_ARG_ENABLE([neon], + [AS_HELP_STRING([--disable-neon], [disable NEON support])], + [], + [enable_neon=yes]) + +AS_IF([test x"${enable_neon}" != x"no"], [ + AC_MSG_CHECKING(whether the compiler supports NEON) + if test x"${host_cpu}" = x"aarch64"; then + if test x"${host_cpu}" = x"${build_cpu}"; then + old_CXXFLAGS="${CXXFLAGS}" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ + #include + ], [ + uint8x16_t v; + ])], [ + have_neon=yes + ]) + CXXFLAGS="${old_CXXFLAGS}" + fi + fi + if test x"${have_neon}" = x"yes"; then + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_NEON]) + AC_SUBST(HOST_HAS_NEON, yes) + else + AC_MSG_RESULT([no]) + fi +], [ +]) + # Checks for libraries. # Checks for header files. AC_CHECK_HEADERS([bsd/bsd.h]) +AC_CHECK_HEADERS([bsd/stdio.h]) +AC_CHECK_HEADERS([byteswap.h]) AC_CHECK_HEADERS([endian.h]) -AC_CHECK_HEADERS([histedit.h]) AC_CHECK_HEADERS([kqueue/sys/event.h]) AC_CHECK_HEADERS([pthread_np.h]) +AC_CHECK_HEADERS([sched.h]) +AC_CHECK_HEADERS([sys/cpuset.h]) AC_CHECK_HEADERS([sys/endian.h]) AC_CHECK_HEADERS([sys/event.h]) AC_CHECK_HEADERS([net/bpf.h]) AC_CHECK_HEADERS([net/if_tap.h]) AC_CHECK_HEADERS([linux/if_tun.h]) +AC_CHECK_HEADERS([libkern/OSByteOrder.h]) +AC_CHECK_HEADERS([machine/endian.h]) # Linux で がなければここで停止したほうがいい -if test "$ac_cv_header_sys_event_h" != "yes" \ - -a "$ac_cv_header_kqueue_sys_event_h" != "yes"; then - AC_MSG_ERROR([*** kqueue is not found. - On Ubuntu, sudo apt install libkqueue-dev]) -fi +case "${host_os}" in + linux*) + if test "$ac_cv_header_kqueue_sys_event_h" != "yes"; then + AC_MSG_ERROR([*** kqueue is not found. +*** If you use Ubuntu, sudo apt install libkqueue-dev]) + fi + ;; +esac # Checks for typedefs, structures, and compiler characteristics. AC_CHECK_HEADER_STDBOOL @@ -106,124 +215,157 @@ AC_CHECK_HEADER_STDBOOL #AC_TYPE_UINT64_T #AC_TYPE_UINT8_T -# struct kevent のメンバ udata の型が互換性なく違う。 -# NetBSD では intptr_t(整数) だが、OSX では void* (ポインタ) なので、 -# 同一ソースコードでは回避できない。 -# Linux(Ubuntu) はどっちもパスするので後ろの void * のほうが使われる。 -# まあパスするんならどっちでもいいか。 -AC_MSG_CHECKING(whether kevent.udata is intptr_t) -old_CXXFLAGS="${CXXFLAGS}" -CXXFLAGS="${CXXFLAGS} -Wall -Werror" -AC_COMPILE_IFELSE([AC_LANG_PROGRAM( - [ - #include "confdefs.h" - #if defined(HAVE_SYS_TYPES_H) - #include +AC_MSG_CHECKING(for cpuset_t) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #if defined(HAVE_SCHED_H) + #include #endif - #if defined(HAVE_SYS_EVENT_H) - #include - #endif - #if defined(HAVE_KQUEUE_SYS_EVENT_H) - #include + #if defined(HAVE_SYS_CPUSET_H) + #include #endif + ]], [[ + cpuset_t set; + ]])], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_CPUSET_T) ], [ - struct kevent kev; - kev.udata = (intptr_t)0; - (void)kev; - ])], - AC_MSG_RESULT([yes]) - AC_SUBST([KEVENT_UDATA_T], [intptr_t]), - AC_MSG_RESULT([no])) -CXXFLAGS="${old_CXXFLAGS}" + AC_MSG_RESULT(no) + ]) -AC_MSG_CHECKING(whether kevent.udata is void *) -old_CXXFLAGS="${CXXFLAGS}" -CXXFLAGS="${CXXFLAGS} -Wall -Werror" -AC_COMPILE_IFELSE([AC_LANG_PROGRAM( - [ - #include "confdefs.h" - #if defined(HAVE_SYS_TYPES_H) - #include +AC_MSG_CHECKING(for cpuset_t *) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #if defined(HAVE_SCHED_H) + #include #endif - #if defined(HAVE_SYS_EVENT_H) - #include - #endif - #if defined(HAVE_KQUEUE_SYS_EVENT_H) - #include + #if defined(HAVE_SYS_CPUSET_H) + #include #endif + ]], [[ + cpuset_t *set; + ]])], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_CPUSET_T_P) ], [ - struct kevent kev; - kev.udata = (void *)0; - (void)kev; - ])], - AC_MSG_RESULT([yes]) - AC_SUBST([KEVENT_UDATA_T], ['void *']), - AC_MSG_RESULT([no])) -CXXFLAGS="${old_CXXFLAGS}" + AC_MSG_RESULT(no) + ]) + +AC_MSG_CHECKING(for cpu_set_t) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + ]], [[ + cpu_set_t set; + ]])], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_CPU_SET_T) + ], [ + AC_MSG_RESULT(no) + ]) -if test -z "$KEVENT_UDATA_T" ; then - AC_MSG_ERROR([kevent.udata is unknown type]) -fi + +# __builtin AC_MSG_CHECKING(for __builtin_assume) -AC_TRY_COMPILE(, - [ +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], + [[ __builtin_assume(1); - ], - AC_MSG_RESULT([yes]) - AC_DEFINE([HAVE___BUILTIN_ASSUME]), - AC_MSG_RESULT([no])) + ]])], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE___BUILTIN_ASSUME) + ], [ + AC_MSG_RESULT(no) + ]) + +AC_MSG_CHECKING(for __builtin_bitreverse8) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], + [[ + return __builtin_bitreverse8(1); + ]])], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE___BUILTIN_BITREVERSE8) + ], [ + AC_MSG_RESULT(no) + ]) AC_MSG_CHECKING(for __builtin_bswap16) -AC_TRY_COMPILE(, - [ +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], + [[ return __builtin_bswap16(0); - ], - AC_MSG_RESULT([yes]) - AC_DEFINE([HAVE___BUILTIN_BSWAP16]), - AC_MSG_RESULT([no])) + ]])], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE___BUILTIN_BSWAP16) + ], [ + AC_MSG_RESULT(no) + ]) AC_MSG_CHECKING(for __builtin_bswap32) -AC_TRY_COMPILE(, - [ +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], + [[ return __builtin_bswap32(0); - ], - AC_MSG_RESULT([yes]) - AC_DEFINE([HAVE___BUILTIN_BSWAP32]), - AC_MSG_RESULT([no])) + ]])], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE___BUILTIN_BSWAP32) + ], [ + AC_MSG_RESULT(no) + ]) AC_MSG_CHECKING(for __builtin_bswap64) -AC_TRY_COMPILE(, - [ +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], + [[ return __builtin_bswap64(0); - ], - AC_MSG_RESULT([yes]) - AC_DEFINE([HAVE___BUILTIN_BSWAP64]), - AC_MSG_RESULT([no])) + ]])], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE___BUILTIN_BSWAP64) + ], [ + AC_MSG_RESULT(no) + ]) AC_MSG_CHECKING(for __builtin_expect) -AC_TRY_COMPILE(, - [ +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[ if (__builtin_expect(1, 1)) return 0; - ], - AC_MSG_RESULT([yes]) - AC_DEFINE([HAVE___BUILTIN_EXPECT]), - AC_MSG_RESULT([no])) + ]])], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE___BUILTIN_EXPECT) + ], [ + AC_MSG_RESULT(no) + ]) + +AC_MSG_CHECKING(for __builtin_rotateleft32) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], + [[ + return __builtin_rotateleft32(1, 1); + ]])], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE___BUILTIN_ROTATELEFT32) + ], [ + AC_MSG_RESULT(no) + ]) + +AC_MSG_CHECKING(for __builtin_rotateright32) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], + [[ + return __builtin_rotateright32(1, 1); + ]])], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE___BUILTIN_ROTATERIGHT32) + ], [ + AC_MSG_RESULT(no) + ]) AC_MSG_CHECKING(for __builtin_unreachable) -AC_TRY_COMPILE(, - [ +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[ __builtin_unreachable(); - ], - AC_MSG_RESULT([yes]) - AC_DEFINE([HAVE___BUILTIN_UNREACHABLE]), - AC_MSG_RESULT([no])) + ]])], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE___BUILTIN_UNREACHABLE) + ], [ + AC_MSG_RESULT(no) + ]) AC_MSG_CHECKING(for __attribute__((__fallthrough__))) old_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="${CXXFLAGS} -Wall -Werror" -AC_COMPILE_IFELSE([AC_LANG_PROGRAM( - [], [ +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], + [ extern int x; switch (x) { case 0: @@ -231,10 +373,12 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM( case 1: break; } - ])], - AC_MSG_RESULT([yes]) - AC_DEFINE([HAVE___ATTRIBUTE_FALLTHROUGH]), - AC_MSG_RESULT([no])) + ])], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE___ATTRIBUTE_FALLTHROUGH]) + ], [ + AC_MSG_RESULT([no]) + ]) CXXFLAGS="${old_CXXFLAGS}" dnl とりあえず __format__ までしか調べてないので、 @@ -246,11 +390,12 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM( [ extern int f(const char *f, ...) __attribute__((__format__(__printf__, 1, 2))); + ], [])], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE___ATTRIBUTE_FORMAT]) ], [ - ])], - AC_MSG_RESULT([yes]) - AC_DEFINE([HAVE___ATTRIBUTE_FORMAT]), - AC_MSG_RESULT([no])) + AC_MSG_RESULT([no]) + ]) CXXFLAGS="${old_CXXFLAGS}" AC_MSG_CHECKING(for __attribute__((no_sanitize))) @@ -260,168 +405,712 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM( [ __attribute__((no_sanitize("undefined"))) int func() { return 0; } + ], [])], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE___ATTRIBUTE_NO_SANITIZE]) ], [ - ])], - AC_MSG_RESULT([yes]) - AC_DEFINE([HAVE___ATTRIBUTE_NO_SANITIZE]), - AC_MSG_RESULT([no])) + AC_MSG_RESULT([no]) + ]) CXXFLAGS="${old_CXXFLAGS}" AC_MSG_CHECKING(for __attribute__((__packed__))) old_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="${CXXFLAGS} -Werror" -AC_COMPILE_IFELSE([AC_LANG_PROGRAM( - [], [ +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], + [ struct x { char a; int b; } __attribute__((__packed__)); - ])], - AC_MSG_RESULT([yes]) - AC_DEFINE([HAVE___ATTRIBUTE_PACKED]), - AC_MSG_RESULT([no])) + ])], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE___ATTRIBUTE_PACKED]) + ], [ + AC_MSG_RESULT([no]) + ]) CXXFLAGS="${old_CXXFLAGS}" AC_MSG_CHECKING(for __attribute__((__unused__))) old_CXXFLAGS="${CXXFLAGS}" CXXFLAGS="${CXXFLAGS} -Wunused-variable -Werror" -AC_COMPILE_IFELSE([AC_LANG_PROGRAM( - [], [ +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], + [ int a __attribute__((__unused__)); - ])], - AC_MSG_RESULT([yes]) - AC_DEFINE([HAVE___ATTRIBUTE_UNUSED]), - AC_MSG_RESULT([no])) + ])], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE___ATTRIBUTE_UNUSED]) + ], [ + AC_MSG_RESULT([no]) + ]) CXXFLAGS="${old_CXXFLAGS}" # Checks for library functions. #AC_FUNC_MALLOC #AC_FUNC_MMAP -AC_MSG_CHECKING(for pthread_setname_np(name)) -AC_TRY_COMPILE( - [ +AC_MSG_CHECKING(for bswap16) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ + #if defined(HAVE_SYS_ENDIAN_H) + #include + #endif + ], [ + bswap16(0); + ])], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_BSWAP16]) + ], [ + AC_MSG_RESULT([no]) + ]) + +AC_MSG_CHECKING(for bswap32) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ + #if defined(HAVE_SYS_ENDIAN_H) + #include + #endif + ], [ + bswap32(0); + ])], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_BSWAP32]) + ], [ + AC_MSG_RESULT([no]) + ]) + +AC_MSG_CHECKING(for bswap64) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ + #if defined(HAVE_SYS_ENDIAN_H) + #include + #endif + ], [ + bswap64(0); + ])], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_BSWAP64]) + ], [ + AC_MSG_RESULT([no]) + ]) + +AC_MSG_CHECKING(for bswap_16) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ + #if defined(HAVE_BYTESWAP_H) + #include + #endif + ], [ + bswap_16(0); + ])], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_BSWAP_16]) + ], [ + AC_MSG_RESULT([no]) + ]) + +AC_MSG_CHECKING(for bswap_32) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ + #if defined(HAVE_BYTESWAP_H) + #include + #endif + ], [ + bswap_32(0); + ])], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_BSWAP_32]) + ], [ + AC_MSG_RESULT([no]) + ]) + +AC_MSG_CHECKING(for bswap_64) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ + #if defined(HAVE_BYTESWAP_H) + #include + #endif + ], [ + bswap_64(0); + ])], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_BSWAP_64]) + ], [ + AC_MSG_RESULT([no]) + ]) + +AC_MSG_CHECKING(for swap16) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ + #if defined(HAVE_SYS_ENDIAN_H) + #include + #endif + ], [ + swap16(0); + ])], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_SWAP16]) + ], [ + AC_MSG_RESULT([no]) + ]) + +AC_MSG_CHECKING(for swap32) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ + #if defined(HAVE_SYS_ENDIAN_H) + #include + #endif + ], [ + swap32(0); + ])], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_SWAP32]) + ], [ + AC_MSG_RESULT([no]) + ]) + +AC_MSG_CHECKING(for swap64) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ + #if defined(HAVE_SYS_ENDIAN_H) + #include + #endif + ], [ + swap64(0); + ])], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_SWAP64]) + ], [ + AC_MSG_RESULT([no]) + ]) + +AC_MSG_CHECKING(for htobe16) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ + #if defined(HAVE_ENDIAN_H) + #include + #endif + #if defined(HAVE_SYS_ENDIAN_H) + #include + #endif + #if defined(HAVE_MACHINE_ENDIAN_H) + #include + #endif + ], [ + htobe16(0); + ])], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_HTOBE16]) + ], [ + AC_MSG_RESULT([no]) + ]) + +AC_MSG_CHECKING(for CPU_COUNT) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ + #if defined(HAVE_SCHED_H) + #include + #endif + #if defined(HAVE_SYS_CPUSET_H) + #include + #endif + ], [ + #if defined(HAVE_CPUSET_T) + cpuset_t set; + #elif defined(HAVE_CPU_SET_T) + cpu_set_t set; + #endif + CPU_COUNT(&set); + ])], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_CPU_COUNT]) + ], [ + AC_MSG_RESULT([no]) + ]) + +AC_MSG_CHECKING(for CPU_ISSET) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ + #if defined(HAVE_SCHED_H) + #include + #endif + #if defined(HAVE_SYS_CPUSET_H) + #include + #endif + ], [ + #if defined(HAVE_CPUSET_T) + cpuset_t set; + #elif defined(HAVE_CPU_SET_T) + cpu_set_t set; + #endif + CPU_ISSET(0, &set); + ])], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_CPU_ISSET]) + ], [ + AC_MSG_RESULT([no]) + ]) + +AC_MSG_CHECKING(for CPU_SET) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ + #if defined(HAVE_SCHED_H) + #include + #endif + #if defined(HAVE_SYS_CPUSET_H) + #include + #endif + ], [ + #if defined(HAVE_CPUSET_T) + cpuset_t set; + #elif defined(HAVE_CPU_SET_T) + cpu_set_t set; + #endif + CPU_SET(0, &set); + ])], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_CPU_SET]) + ], [ + AC_MSG_RESULT([no]) + ]) + +AC_MSG_CHECKING(for CPU_ZERO) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ + #if defined(HAVE_SCHED_H) + #include + #endif + #if defined(HAVE_SYS_CPUSET_H) + #include + #endif + ], [ + #if defined(HAVE_CPUSET_T) + cpuset_t set; + #elif defined(HAVE_CPU_SET_T) + cpu_set_t set; + #endif + CPU_ZERO(&set); + ])], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_CPU_ZERO]) + ], [ + AC_MSG_RESULT([no]) + ]) + +AC_MSG_CHECKING(for cpuset_create) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ + #include + ], [ + cpuset_create(); + ])], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_CPUSET_CREATE]) + ], [ + AC_MSG_RESULT([no]) + ]) + +AC_MSG_CHECKING(for cpuset_isset) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ + #include + ], [ + cpuset_isset(0, NULL); + ])], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_CPUSET_ISSET]) + ], [ + AC_MSG_RESULT([no]) + ]) + +AC_MSG_CHECKING(for cpuset_set) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ + #include + ], [ + cpuset_set(0, NULL); + ])], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_CPUSET_SET]) + ], [ + AC_MSG_RESULT([no]) + ]) + +AC_MSG_CHECKING(for cpuset_size) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ + #include + ], [ + cpuset_size(NULL); + ])], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_CPUSET_SIZE]) + ], [ + AC_MSG_RESULT([no]) + ]) + +AC_MSG_CHECKING(for statfs) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ + #include + ], [ + struct statfs buf; + statfs("", &buf); + ])], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_STATFS]) + have_statxxfs=statfs + ], [ + AC_MSG_RESULT([no]) + ]) + +AC_MSG_CHECKING(for statvfs) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ + #include + ], [ + struct statvfs buf; + statvfs("", &buf); + ])], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_STATVFS]) + have_statxxfs=statvfs + ], [ + AC_MSG_RESULT([no]) + ]) + +if test -z "${have_statxxfs}"; then + AC_MSG_FAILURE([*** No statfs() nor statvfs() found]) +fi + +AC_CHECK_MEMBER([struct stat.st_mtimespec], [ + AC_DEFINE([HAVE_STAT_ST_TIMESPEC]) + ], [], [ + #include + ]) + +AC_MSG_CHECKING(for timegm) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ + #include + ], [ + timegm(NULL); + ])], [ + AC_MSG_RESULT([yes]) + ], [ + AC_MSG_RESULT([no]) + AC_MSG_FAILURE([*** No timegm() found]) + ]) + +AC_MSG_CHECKING(for pthread_getname_np) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include #if defined(HAVE_PTHREAD_NP_H) #include #endif + ]], [[ + char name[32]; + pthread_getname_np(pthread_self(), name, sizeof(name)); + ]])], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_PTHREAD_GETNAME_NP) ], [ + AC_MSG_RESULT(no) + ]) + +AC_MSG_CHECKING(for pthread_get_name_np) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #if defined(HAVE_PTHREAD_NP_H) + #include + #endif + ]], [[ + char name[32]; + pthread_get_name_np(pthread_self(), name, sizeof(name)); + ]])], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_PTHREAD_GET_NAME_NP) + ], [ + AC_MSG_RESULT(no) + ]) + +AC_MSG_CHECKING(for pthread_setname_np(name)) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #if defined(HAVE_PTHREAD_NP_H) + #include + #endif + ]], [[ pthread_setname_np(""); - ], - AC_MSG_RESULT([yes]) - AC_DEFINE([HAVE_PTHREAD_SETNAME_NP_name]), - AC_MSG_RESULT([no])) + ]])], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_PTHREAD_SETNAME_NP_name) + ], [ + AC_MSG_RESULT(no) + ]) AC_MSG_CHECKING(for pthread_setname_np(thread, name)) -AC_TRY_COMPILE( - [ +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include #if defined(HAVE_PTHREAD_NP_H) #include #endif - ], [ + ]], [[ pthread_setname_np(pthread_self(), ""); - ], - AC_MSG_RESULT([yes]) - AC_DEFINE([HAVE_PTHREAD_SETNAME_NP_th_name]), - AC_MSG_RESULT([no])) + ]])], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_PTHREAD_SETNAME_NP_th_name) + ], [ + AC_MSG_RESULT(no) + ]) AC_MSG_CHECKING(for pthread_setname_np(thread, name, arg)) -AC_TRY_COMPILE( - [ +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include #if defined(HAVE_PTHREAD_NP_H) #include #endif - ], [ + ]], [[ pthread_setname_np(pthread_self(), "", (void*)0); - ], - AC_MSG_RESULT([yes]) - AC_DEFINE([HAVE_PTHREAD_SETNAME_NP_th_name_arg]), - AC_MSG_RESULT([no])) + ]])], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_PTHREAD_SETNAME_NP_th_name_arg) + ], [ + AC_MSG_RESULT(no) + ]) AC_MSG_CHECKING(for pthread_set_name_np(thread, name)) -AC_TRY_COMPILE( - [ +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ #include #if defined(HAVE_PTHREAD_NP_H) #include #endif - ], [ + ]], [[ pthread_set_name_np(pthread_self(), ""); - ], + ]])],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_PTHREAD_SET_NAME_NP_th_name) + ], [ + AC_MSG_RESULT(no) + ]) + +AC_MSG_CHECKING(for pthread_setaffinity_np) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #if defined(HAVE_PTHREAD_NP_H) + #include + #endif + ]], [[ + pthread_setaffinity_np(pthread_self(), 0, NULL); + ]])], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_PTHREAD_SETAFFINITY_NP) + ], [ + AC_MSG_RESULT(no) + ]) + + +# +# Network +# +AC_MSG_CHECKING(for AF_PACKET) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + ]], [[ + AF_PACKET; + ]])], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_HOSTNET_AFPACKET) + AC_SUBST(HOSTNET_AFPACKET, yes) + ], [ + AC_MSG_RESULT(no) + ]) + +AC_MSG_CHECKING(for tap(4)) +case "${host_os}" in + linux*) + if test x"$ac_cv_header_linux_if_tun_h" = xyes; then + netdriver_tap=yes + fi + ;; + openbsd*) + # OpenBSD has no but supports tap(4). + netdriver_tap=yes + ;; + *) + if test x"$ac_cv_header_net_if_tap_h" = xyes; then + netdriver_tap=yes + fi + ;; +esac +if test x"$netdriver_tap" = xyes; then AC_MSG_RESULT([yes]) - AC_DEFINE([HAVE_PTHREAD_SET_NAME_NP_th_name]), - AC_MSG_RESULT([no])) + AC_DEFINE([HAVE_HOSTNET_TAP]) + AC_SUBST([HOSTNET_TAP], [yes]) +else + AC_MSG_RESULT([no]) +fi -# Select host network driver. -AC_MSG_CHECKING(for suitable host network driver) -if test x"$ac_cv_header_net_if_tap_h" = xyes; then - netdriver=tap -elif test x"$ac_cv_header_linux_if_tun_h" = xyes; then - netdriver=tap -elif test x"$ac_cv_header_net_bpf_h" = xyes; then - netdriver=bpf +AC_MSG_CHECKING(for bpf(4)) +if test x"$ac_cv_header_net_bpf_h" = xyes; then + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_HOSTNET_BPF]) + AC_SUBST([HOSTNET_BPF], [yes]) else - netdriver=none + AC_MSG_RESULT([no]) fi -AC_MSG_RESULT([$netdriver]) -AC_SUBST([NETDRIVER], [$netdriver]) + +# +# Other libraries +# + +# CHECK_LIB($1=name, $2=libs, $3=include, $4=src) +AC_DEFUN([CHECK_LIB], [ + AC_MSG_CHECKING([for $1]) + for path in ${PATHS}; do + old_CPPFLAGS=${CPPFLAGS} + old_LIBS=${LIBS} + case ${path} in + none) + LIBS="${LIBS} $2" + ;; + *) + CPPFLAGS="${CPPFLAGS} -I${path}/include" + LIBS="${LIBS} -L${path}/lib $2" + ;; + esac + AC_LINK_IFELSE([AC_LANG_PROGRAM([$3], [$4])], [ + has_$1=yes + break + ], [ + has_$1=no + ]) + CPPFLAGS=${old_CPPFLAGS} + LIBS=${old_LIBS} + done + if test x"${has_$1}" = x"yes"; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi +]) + +PATHS="none /usr/pkg /usr/local" # libbsd on Linux +AC_CHECK_LIB(c, getprogname, ,) AC_CHECK_LIB(bsd, getprogname, - AC_SUBST([LIBBSD_LIBS], [-lbsd]), - ) - -# libedit (editline) -if test x"$ac_cv_header_histedit_h" = xyes; then - AC_SUBST([LIBEDIT_LIBS], ["-ledit -ltermcap"]) -fi + LIBS="${LIBS} -lbsd" +) +# なければ停止する +AC_COMPILE_IFELSE([AC_LANG_PROGRAM( + [ + #include + #include "confdefs.h" + #if defined(HAVE_BSD_BSD_H) + #include + #endif + ], [ + getprogname() + ])], [ + # nothing to do on success + ], [ + AC_MSG_ERROR([*** getprogname is not found. +*** If you use Ubuntu, sudo apt install libbsd-dev]) + ] +) # libkqueue on Linux AC_CHECK_LIB(kqueue, kqueue, - AC_SUBST([LIBKQUEUE_LIBS], [-lkqueue]), - ) + LIBS="${LIBS} -lkqueue" +) + +AC_CHECK_LIB(z, gzclose, + LIBS="${LIBS} -lz", + [AC_MSG_ERROR([*** zlib is not found. +*** If use use Ubuntu, sudo apt install zlib1g-dev])] +) # wxWidgets -AC_MSG_CHECKING(for wx-config) -wxconfig_paths="${WX_CONFIG} wx-config-3.0 wx-config" -wxconfig="" -for c in ${wxconfig_paths}; do - ver=`$c --version 2>&1 | cut -f 1 -d .` - if test "$ver" = "3"; then - wxconfig=$c - break +AC_ARG_WITH([gui], + [AS_HELP_STRING([--without-gui], [disable GUI support])], + [], + [with_gui=yes]) + +AS_IF([test "x$with_gui" != xno], [ + AC_MSG_CHECKING(for wx-config) + wxconfig_paths="${WX_CONFIG} wx-config-3.2 wx-config-3.0 wx-config" + wxconfig="" + for c in ${wxconfig_paths}; do + ver=`$c --version 2>&1 | cut -f 1 -d .` + if test "$ver" = "3"; then + wxconfig=$c + break + fi + done + if test -z "$wxconfig"; then + AC_MSG_ERROR([*** wxWidgets-3.2 nor -3.0 not found in ${wxconfig_paths} +*** If you use pkgsrc, install x11/wxGTK32. +*** If you use Ubuntu, sudo apt install libwxgtk3.0-gtk3-dev]) + else + AC_MSG_RESULT([$wxconfig]) + + AC_MSG_CHECKING(for wxWidgets version) + wxversion=`$wxconfig --version` + AC_MSG_RESULT([$wxversion]) + wxmajorminor=`echo $wxversion | awk -F . '{print $1 $2}'` + AC_SUBST([WX_MAJORMINOR], [${wxmajorminor}]) + + wxcppflags=`$wxconfig --cppflags` + wxlibs=`$wxconfig --libs` + + case "${host_os}" in + netbsd*) + # rpath。どうしたもんだかこれ + wxlibs=[`echo $wxlibs | sed -e 's/-L\([^ ]*\) /-L\1 -Wl,-R,\1 /'`] + ;; + + darwin*) + # XXX -framework AudioToolbox が指定されているとリンカがこけるorz + wxlibs=[`echo $wxlibs | sed -e 's/-framework AudioToolbox//'`] + ;; + esac + + AC_SUBST([WITH_GUI], [yes]) + AC_SUBST([WXWIDGETS_CPPFLAGS], [$wxcppflags]) + AC_SUBST([WXWIDGETS_LIBS], [$wxlibs]) fi -done -if test -z "$wxconfig"; then - AC_MSG_ERROR([*** wxWidgets-3.0 not found in ${wxconfig_paths}]) -else - AC_MSG_RESULT([$wxconfig]) - AC_MSG_CHECKING(for wxWidgets version) - wxversion=`$wxconfig --version` - AC_MSG_RESULT([$wxversion]) - - wxcppflags=`$wxconfig --cppflags` - wxlibs=`$wxconfig --libs` - - # XXX NetBSD の rpath。どうしたもんだかこれ - if test "`uname -s`" = "NetBSD"; then - wxlibs=[`echo $wxlibs | sed -e 's/-L\([^ ]*\) /-L\1 -Wl,-R,\1 /'`] + # gettext + AC_CHECK_TOOL([MSGFMT], [msgfmt], [:]) + if test $MSGFMT = [:]; then + AC_MSG_ERROR([*** msgfmt not found. +*** If you use pkgsrc, install devel/gettext-tools. +*** If you use Ubuntu, sudo apt install gettext]) fi +], [ + AC_SUBST([WITH_GUI], [no]) +]) - # XXX OSX の -framework AudioToolbox が指定されているとリンカがこけるorz - if test "`uname -s`" = "Darwin"; then - wxlibs=[`echo $wxlibs | sed -e 's/-framework AudioToolbox//'`] - fi +# nono 本体のチェックはここまで。 +nono_CPPFLAGS=${CPPFLAGS} +nono_LIBS=${LIBS} +AC_SUBST([NONO_CPPFLAGS], [${nono_CPPFLAGS}]) +AC_SUBST([NONO_LIBS], [${nono_LIBS}]) + +# iconv は util/ でのみ必要。 +CPPFLAGS= +LIBS= +CHECK_LIB([libiconv], [-liconv], [ + #include +], [ + iconv_open("", ""); +]) - AC_SUBST([WXWIDGETS_CPPFLAGS], [$wxcppflags]) - AC_SUBST([WXWIDGETS_LIBS], [$wxlibs]) +if test x"${has_libiconv}" = x"yes"; then + AC_MSG_CHECKING(whether iconv needs const) + old_CPPFLAGS="${CPPFLAGS}" + CPPFLAGS="${CPPFLAGS} -Werror" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + ]], [[ + const char **a; + iconv(0, a, 0, 0, 0); + ]])], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_ICONV_CONST) + ], [ + AC_MSG_RESULT(no) + ]) + CPPFLAGS="${old_CPPFLAGS}" fi +iconv_CPPFLAGS=${CPPFLAGS} +iconv_LIBS=${LIBS} +AC_SUBST([ICONV_CPPFLAGS], [${iconv_CPPFLAGS}]) +AC_SUBST([ICONV_LIBS], [${iconv_LIBS}]) + AC_CONFIG_FILES([Makefile.cfg host/Makefile wx/Makefile util/mkcgrom/Makefile + util/ttfext/Makefile util/viewcgrom/Makefile ]) AC_CONFIG_HEADERS([config-nono.h])