--- nono/configure.ac 2026/04/29 17:05:11 1.1.1.11 +++ nono/configure.ac 2026/04/29 17:05:56 1.1.1.20 @@ -52,11 +52,15 @@ 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_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])) + WARNFLAGS_C="${WARNFLAGS_C} $1" + ], [ + AC_MSG_RESULT([no]) + ]) CFLAGS="${old_CFLAGS}" ]) ADD_CC_WARN_IF(-Wcast-qual) @@ -69,6 +73,8 @@ 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]) @@ -79,17 +85,22 @@ 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_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])) + WARNFLAGS_CXX="${WARNFLAGS_CXX} $1" + ], [ + AC_MSG_RESULT([no]) + ]) CXXFLAGS="${old_CXXFLAGS}" ]) ADD_CXX_WARN_IF(-Wcast-qual) ADD_CXX_WARN_IF(-Wextra-semi) -ADD_CXX_WARN_IF(-Winconsistent-missing-override) +ADD_CXX_WARN_IF(-Wimplicit-fallthrough) 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) @@ -98,19 +109,95 @@ 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) +# gcc14 が C++14 に対しても C++20 のエラーを出そうとする。は?? +ADD_CXX_WARN_IF(-Wno-template-id-cdtor) +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([alsa/asoundlib.h]) 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([sndio.h]) +AC_CHECK_HEADERS([sys/audioio.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]) @@ -142,6 +229,55 @@ AC_CHECK_HEADER_STDBOOL #AC_TYPE_UINT64_T #AC_TYPE_UINT8_T +AC_MSG_CHECKING(for cpuset_t) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #if defined(HAVE_SCHED_H) + #include + #endif + #if defined(HAVE_SYS_CPUSET_H) + #include + #endif + ]], [[ + cpuset_t set; + ]])], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_CPUSET_T) + ], [ + AC_MSG_RESULT(no) + ]) + +AC_MSG_CHECKING(for cpuset_t *) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #if defined(HAVE_SCHED_H) + #include + #endif + #if defined(HAVE_SYS_CPUSET_H) + #include + #endif + ]], [[ + cpuset_t *set; + ]])], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_CPUSET_T_P) + ], [ + 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) + ]) + + +# __builtin + AC_MSG_CHECKING(for __builtin_assume) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[ @@ -153,6 +289,39 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], 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_bitreverse16) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], + [[ + return __builtin_bitreverse16(1); + ]])], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE___BUILTIN_BITREVERSE16) + ], [ + AC_MSG_RESULT(no) + ]) + +AC_MSG_CHECKING(for __builtin_bitreverse32) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], + [[ + return __builtin_bitreverse32(1); + ]])], [ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE___BUILTIN_BITREVERSE32) + ], [ + AC_MSG_RESULT(no) + ]) + AC_MSG_CHECKING(for __builtin_bswap16) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[ @@ -196,6 +365,28 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], 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_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[ __builtin_unreachable(); @@ -437,6 +628,216 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ AC_MSG_RESULT([no]) ]) +dnl HTOBE16(x) は x = htobe16(x) するもので、htobe16() とは別物。 +dnl ところが autoconf は小文字を大文字にした変数名を作る文化なので +dnl こっちは INPLACE_HTOBE16 とかにしておく。 +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 + ], [ + uint16_t x = 0; + HTOBE16(x); + ])], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_INPLACE_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 @@ -529,19 +930,22 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ AC_MSG_RESULT(no) ]) -AC_MSG_CHECKING(for iconv const) +AC_MSG_CHECKING(for pthread_setaffinity_np) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ - #include + #include + #if defined(HAVE_PTHREAD_NP_H) + #include + #endif ]], [[ - const char **a; - iconv(0, a, 0, 0, 0); + pthread_setaffinity_np(pthread_self(), 0, NULL); ]])], [ AC_MSG_RESULT(yes) - AC_DEFINE(HAVE_ICONV_CONST) + AC_DEFINE(HAVE_PTHREAD_SETAFFINITY_NP) ], [ AC_MSG_RESULT(no) ]) + # # Network # @@ -554,8 +958,10 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ AC_MSG_RESULT(yes) AC_DEFINE(HAVE_HOSTNET_AFPACKET) AC_SUBST(HOSTNET_AFPACKET, yes) + netdriver_afpacket=yes ], [ AC_MSG_RESULT(no) + netdriver_afpacket=no ]) AC_MSG_CHECKING(for tap(4)) @@ -588,10 +994,73 @@ if test x"$ac_cv_header_net_bpf_h" = xye AC_MSG_RESULT([yes]) AC_DEFINE([HAVE_HOSTNET_BPF]) AC_SUBST([HOSTNET_BPF], [yes]) + netdriver_bpf=yes else AC_MSG_RESULT([no]) + netdriver_bpf=no fi +# +# Other libraries +# + +dnl # MY_CHECK_LIB($1=name, $2=libs, $3=include, $4=src) +dnl # name は変数名に付けるライブラリ名 ("libslirp" とか "libiconv" とか) +dnl # libs はライブラリ引数 ("-lslirp" とか) +dnl # include, src は検出用のヘッダとソース片。 +dnl # ただし src は実行可能で害のないものを指定すること。 +dnl # PATHS からライブラリを探してそのパスとかをセットする。 +dnl # has_${name}= +dnl # $CPPFLAGS_${name}=... +dnl # $LIBS_${name}=... +AC_DEFUN([MY_CHECK_LIB], [ + AC_MSG_CHECKING([for $1]) + old_CPPFLAGS=${CPPFLAGS} + old_LIBS=${LIBS} + for path in ${PATHS}; do + case ${path} in + none) + LIBS="$2" + ;; + *) + CPPFLAGS="-I${path}/include" + LIBS="-L${path}/lib $2" + ;; + esac + AC_LINK_IFELSE([AC_LANG_PROGRAM([$3], [$4])], [ + has_$1=yes + + dnl リンクできれば -Wl,-R が必要か調べる。 + AC_RUN_IFELSE([AC_LANG_SOURCE([[ + $3 + int main() { + $4; + return 0; + } + ]])], [ + dnl 実行できれば追加しなくていい。 + ], [ + LIBS="-L${path}/lib -Wl,-R,${path}/lib $2" + ]) + + break + ], [ + has_$1=no + ]) + done + if test x"${has_$1}" = x"yes"; then + AC_MSG_RESULT([yes]) + CPPFLAGS_$1=${CPPFLAGS} + LIBS_$1=${LIBS} + else + AC_MSG_RESULT([no]) + fi + CPPFLAGS=${old_CPPFLAGS} + LIBS=${old_LIBS} +]) + +PATHS="none /usr/pkg /usr/local" + # libbsd on Linux AC_CHECK_LIB(c, getprogname, ,) AC_CHECK_LIB(bsd, getprogname, @@ -615,11 +1084,6 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM( ] ) -# libedit (editline) -if test x"$ac_cv_header_histedit_h" = xyes; then - LIBS="${LIBS} -ledit -ltermcap" -fi - # libkqueue on Linux AC_CHECK_LIB(kqueue, kqueue, LIBS="${LIBS} -lkqueue" @@ -631,6 +1095,100 @@ AC_CHECK_LIB(z, gzclose, *** If use use Ubuntu, sudo apt install zlib1g-dev])] ) +# libslirp +AC_ARG_WITH([libslirp], + [AS_HELP_STRING([--without-libslirp], + [disable usermode network (using SLIRP)])], + [], + [with_libslirp=yes]) + +AS_IF([test "x$with_libslirp" != "xno"], [ + MY_CHECK_LIB([libslirp], [-lslirp], [ + #include + ], [ + slirp_version_string(); + ]) + if test x"${has_libslirp}" = x"yes"; then + AC_DEFINE([HAVE_HOSTNET_SLIRP]) + AC_SUBST([HOSTNET_SLIRP], [yes]) + AC_SUBST([CPPFLAGS_SLIRP], [${CPPFLAGS_libslirp}]) + AC_SUBST([LIBS_SLIRP], [${LIBS_libslirp}]) + else + AC_MSG_ERROR([*** libslirp is not found. +*** If use use pkgsrc, install net/libslirp. +*** If you use Ubuntu, sudo apt install libslirp-dev. +*** Or specify --without-libslirp (it disables hostnet-driver=usermode).]) + fi +], [ + AC_SUBST([HOSTNET_SLIRP], [no]) +]) + +# ALSA +case "${host_os}" in + linux*) + default_alsa=yes + ;; + *) + default_alsa=no + ;; +esac +AC_ARG_WITH([alsa], + [AS_HELP_STRING([--with-alsa], + [enable ALSA support (default:yes on Linux, otherwise no)])], + [with_alsa=${withval}], + [with_alsa=${default_alsa}]) +sounddriver_alsa=no +if test x"${with_alsa}" = xyes; then + AC_CHECK_LIB(asound, snd_pcm_open, + [has_asound=yes], + [has_asound=no]) + if test x"${ac_cv_header_alsa_asoundlib_h}" = xyes -a \ + x"${ac_cv_lib_asound_snd_pcm_open}" = xyes; then + AC_DEFINE([HAVE_HOSTSOUND_ALSA]) + AC_SUBST([HOSTSOUND_ALSA], [yes]) + LIBS_SOUND="${LIBS_SOUND} -lasound" + sounddriver_alsa=yes + else + AC_MSG_ERROR([*** or libasound not found. +*** If you use Ubuntu, sudo apt install libasound2-dev. +*** Or specify --without-alsa (it disables hostsound-driver=alsa).]) + fi +fi + +# NetBSD audio +if test x"${ac_cv_header_sys_audioio_h}" = xyes; then + AC_MSG_CHECKING(for AUDIO_GETINFO) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ + #include + #include + #include + ], [ + struct audio_info info; + AUDIO_INITINFO(&info); + ioctl(0, AUDIO_GETINFO, &info); + ])], [ + AC_MSG_RESULT([yes]) + AC_DEFINE([HAVE_HOSTSOUND_NETBSD]) + AC_SUBST([HOSTSOUND_NETBSD], [yes]) + sounddriver_netbsd=yes + ], [ + AC_MSG_RESULT([no]) + sounddriver_netbsd=no + ]) +fi + +# OpenBSD sndio +if test x"${ac_cv_header_sndio_h}" = xyes; then + AC_DEFINE([HAVE_HOSTSOUND_SNDIO]) + AC_SUBST([HOSTSOUND_SNDIO], [yes]) + LIBS_SOUND="${LIBS_SOUND} -lsndio" + sounddriver_sndio=yes +else + sounddriver_sndio=no +fi + +AC_SUBST([LIBS_SOUND], [${LIBS_SOUND}]) + # wxWidgets AC_ARG_WITH([gui], [AS_HELP_STRING([--without-gui], [disable GUI support])], @@ -639,7 +1197,7 @@ AC_ARG_WITH([gui], AS_IF([test "x$with_gui" != xno], [ AC_MSG_CHECKING(for wx-config) - wxconfig_paths="${WX_CONFIG} wx-config-3.0 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 .` @@ -649,8 +1207,8 @@ AS_IF([test "x$with_gui" != xno], [ fi done if test -z "$wxconfig"; then - AC_MSG_ERROR([*** wxWidgets-3.0 not found in ${wxconfig_paths} -*** If you use pkgsrc, install x11/wxGTK30. + 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]) @@ -658,25 +1216,44 @@ AS_IF([test "x$with_gui" != xno], [ 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 + dnl -Wl,-R が必要か調べる。 + AC_MSG_CHECKING([whether wx-config requires -Wl,-R]) + old_CPPFLAGS="${CPPFLAGS}" + old_LIBS="${LIBS}" + CPPFLAGS="${CPPFLAGS} ${wxcppflags}" + LIBS="${LIBS} ${wxlibs}" + AC_RUN_IFELSE([AC_LANG_SOURCE([[ + #include + int main() { + wxInitializer init; + return !init; + } + ]])], [ + dnl 実行できれば追加しなくていい。 + AC_MSG_RESULT([no]) + ], [ + AC_MSG_RESULT([yes]) + wxlibs=[`echo $wxlibs | sed -e 's/-L\([^ ]*\) /-L\1 -Wl,-R,\1 /'`] + ]) + CPPFLAGS="${old_CPPFLAGS}" + LIBS="${old_LIBS}" + AC_SUBST([WITH_GUI], [yes]) - AC_SUBST([WXWIDGETS_CPPFLAGS], [$wxcppflags]) - AC_SUBST([WXWIDGETS_LIBS], [$wxlibs]) + AC_SUBST([CPPFLAGS_WXWIDGETS], [$wxcppflags]) + AC_SUBST([LIBS_WXWIDGETS], [$wxlibs]) fi # gettext @@ -690,11 +1267,62 @@ AS_IF([test "x$with_gui" != xno], [ AC_SUBST([WITH_GUI], [no]) ]) -AC_CONFIG_FILES([Makefile.cfg - host/Makefile - wx/Makefile - util/mkcgrom/Makefile - util/viewcgrom/Makefile +# iconv は util/ でのみ必要。 +MY_CHECK_LIB([libiconv], [-liconv], [ + #include +], [ + iconv_open("", ""); ]) +AC_SUBST([CPPFLAGS_ICONV], [${CPPFLAGS_libiconv}]) +AC_SUBST([LIBS_ICONV], [${LIBS_libiconv}]) + +if test x"${has_libiconv}" = x"yes"; then + AC_MSG_CHECKING(whether iconv needs const) + old_CPPFLAGS="${CPPFLAGS}" + CPPFLAGS="${CPPFLAGS} ${CPPFLAGS_libiconv} -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 + +AC_CONFIG_FILES([Makefile.cfg]) AC_CONFIG_HEADERS([config-nono.h]) AC_OUTPUT + +# サマリを表示 +echo "" +echo "Configuration summary:" +echo -n "HostNet supports: " +if test x"$netdriver_afpacket" = xyes; then + echo -n " afpacket" +fi +if test x"$netdriver_bpf" = xyes; then + echo -n " bpf" +fi +if test x"$has_libslirp" = xyes; then + echo -n " slirp" +fi +if test x"$netdriver_tap" = xyes; then + echo -n " tap" +fi +echo "" +echo -n "HostSound supports: " +if test x"$sounddriver_alsa" = xyes; then + echo -n " alsa" +fi +if test x"$sounddriver_netbsd" = xyes; then + echo -n " netbsd" +fi +if test x"$sounddriver_sndio" = xyes; then + echo -n " sndio" +fi +echo ""