1#
2# sayaka
3# Copyright (C) 2021 isaki@NetBSD.org
4#
5
6AC_PREREQ([2.69])
7AC_INIT([sayaka], [3.5], [])
8AC_CONFIG_SRCDIR([src/sayaka.cpp])
9AC_CONFIG_AUX_DIR([scripts])
10
11# Checks for programs.
12AC_PROG_CXX
13
14# OS
15AC_CANONICAL_HOST
16AC_SUBST([host_cpu])
17
18# C++ のバージョンをチェック
19CXX_STD=-std=c++17
20AC_LANG_PUSH([C++])
21AC_MSG_CHECKING(for ${CXX_STD})
22old_CXXFLAGS="${CXXFLAGS}"
23CXXFLAGS="${CXX_STD} ${CXXFLAGS}"
24AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])],
25	AC_MSG_RESULT([yes]),
26	AC_MSG_ERROR("*** C++ compiler '${CXX}' doesn't support ${CXX_STD}."))
27CXXFLAGS="${old_CXXFLAGS}"
28CXX="${CXX} ${CXX_STD}"
29AC_LANG_POP([C++])
30
31# Checks for header files.
32AC_CHECK_HEADERS([bsd/bsd.h])
33AC_CHECK_HEADERS([endian.h])
34AC_CHECK_HEADERS([sys/endian.h])
35AC_CHECK_HEADERS([sys/ttycom.h])
36
37# Ubuntu 20.04 の <sys/sysctl.h> は AC_CHECK_HEADERS() では yes になるけど
38# #warning が入ってて実際には使えない
39AC_MSG_CHECKING([for sys/sysctl.h])
40old_CPPFLAGS="${CPPFLAGS}"
41CPPFLAGS="${CPPFLAGS} -Wcpp -Werror"
42AC_TRY_COMPILE(
43	[
44		#include <sys/sysctl.h>
45	],[],
46	AC_MSG_RESULT([yes])
47		AC_DEFINE([HAVE_SYS_SYSCTL_H]),
48	AC_MSG_RESULT([no]))
49CPPFLAGS="${old_CPPFLAGS}"
50
51
52# Checks for typedefs, structures, and compiler characteristics.
53
54AC_MSG_CHECKING(for __builtin_bswap16)
55AC_TRY_COMPILE(,
56	[
57		return __builtin_bswap16(0);
58	],
59	AC_MSG_RESULT([yes])
60		AC_DEFINE([HAVE___BUILTIN_BSWAP16]),
61	AC_MSG_RESULT([no]))
62
63AC_MSG_CHECKING(for __builtin_bswap32)
64AC_TRY_COMPILE(,
65	[
66		return __builtin_bswap32(0);
67	],
68	AC_MSG_RESULT([yes])
69		AC_DEFINE([HAVE___BUILTIN_BSWAP32]),
70	AC_MSG_RESULT([no]))
71
72AC_MSG_CHECKING(for __builtin_bswap64)
73AC_TRY_COMPILE(,
74	[
75		return __builtin_bswap64(0);
76	],
77	AC_MSG_RESULT([yes])
78		AC_DEFINE([HAVE___BUILTIN_BSWAP64]),
79	AC_MSG_RESULT([no]))
80
81AC_MSG_CHECKING(for __builtin_expect)
82AC_TRY_COMPILE(,
83	[
84		if (__builtin_expect(1, 1)) return 0;
85	],
86	AC_MSG_RESULT([yes])
87		AC_DEFINE([HAVE___BUILTIN_EXPECT]),
88	AC_MSG_RESULT([no]))
89
90AC_MSG_CHECKING(for __attribute__((__format__)))
91old_CPPFLAGS="${CPPFLAGS}"
92CPPFLAGS="${CPPFLAGS} -Wall -Werror"
93AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
94	[
95		extern int f(const char *f, ...)
96			__attribute__((__format__(__printf__, 1, 2)));
97	], [
98	])],
99	AC_MSG_RESULT([yes])
100		AC_DEFINE([HAVE___ATTRIBUTE_FORMAT]),
101	AC_MSG_RESULT([no]))
102CPPFLAGS="${old_CPPFLAGS}"
103
104
105
106# Checks for library functions.
107
108AC_SEARCH_LIBS(iconv, iconv,
109	AC_DEFINE([HAVE_ICONV]),
110)
111
112AC_MSG_CHECKING(whether iconv needs const)
113old_CPPFLAGS="${CPPFLAGS}"
114CPPFLAGS="${CPPFLAGS} -Werror"
115AC_TRY_COMPILE(
116	[
117		#include <iconv.h>
118	], [
119		const char **a;
120		iconv(0, a, 0, 0, 0);
121	],
122	AC_MSG_RESULT([yes])
123		AC_DEFINE([HAVE_ICONV_CONST]),
124	AC_MSG_RESULT([no]))
125CPPFLAGS="${old_CPPFLAGS}"
126
127# libbsd on Linux
128AC_SEARCH_LIBS(getprogname, bsd, has_getprogname=yes, has_getprogname=no)
129if test "x${has_getprogname}" = "xno"; then
130	AC_MSG_ERROR([*** getprogname is not found.
131	On Ubuntu, sudo apt install libbsd-dev])
132fi
133#AC_CHECK_LIB(c, getprogname, ,)
134#AC_CHECK_LIB(bsd, getprogname,
135#	LIBS="${LIBS} -lbsd"
136#)
137# なければ停止する
138#AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
139#	[
140#		#include <stdlib.h>
141#		#include "confdefs.h"
142#		#if defined(HAVE_BSD_BSD_H)
143#		#include <bsd/bsd.h>
144#		#endif
145#	], [
146#		getprogname()
147#	])],
148#	# nothing to do on success
149#	, [AC_MSG_ERROR([*** getprogname is not found.
150#	On Ubuntu, sudo apt install libbsd-dev])
151#	]
152#)
153
154if test -z "${PKG_CONFIG}"; then
155	PKG_CONFIG=pkg-config
156fi
157${PKG_CONFIG} --version 2>&1 > /dev/null
158if test $? \!= 0 ; then
159	AC_MSG_ERROR([*** pkg-config (or \$PKG_CONFIG) not found])
160fi
161
162PKGS="libjpeg libpng"
163for p in ${PKGS}; do
164	AC_MSG_CHECKING([for ${p}])
165
166	if ${PKG_CONFIG} --exists ${p}; then
167		AC_MSG_RESULT([yes])
168		H=`${PKG_CONFIG} --cflags ${p}`
169		L=`${PKG_CONFIG} --libs ${p}`
170
171		CPPFLAGS="${CPPFLAGS} ${H}"
172		LIBS="${LIBS} ${L}"
173	else
174		AC_MSG_RESULT([no])
175		AC_MSG_ERROR([*** pkg-config cannot find ${p}])
176	fi
177done
178
179# Find mbedtls
180PATHS="/usr/pkg /usr/local"
181
182# libmbedtls と libmbedcrypto を同時に探す
183AC_MSG_CHECKING([for mbedtls])
184old_LIBS=${LIBS}
185LIBS="${LIBS} -lmbedtls -lmbedcrypto"
186AC_LINK_IFELSE([AC_LANG_PROGRAM(
187	[
188		#include <mbedtls/net_sockets.h>
189		#include <mbedtls/entropy.h>
190	], [
191		mbedtls_net_context net;
192		mbedtls_entropy_context e;
193		mbedtls_net_init(&net);
194		mbedtls_entropy_init(&e);
195	])], has_mbedtls=yes, has_mbedtls=no
196)
197if test "x${has_mbedtls}" = "xyes"; then
198	AC_MSG_RESULT([yes])
199else
200	LIBS=${old_LIBS}
201
202	# Try PATHS
203	old_CPPFLAGS=${CPPFLAGS}
204	for p in ${PATHS}; do
205		CPPFLAGS="${CPPFLAGS} -I${p}/include"
206		case "${host_os}" in
207		 netbsd*)
208			LIBS="${LIBS} -Wl,-R,${p}/lib"
209			;;
210		esac
211		LIBS="${LIBS} -L${p}/lib -lmbedtls -lmbedcrypto"
212
213		AC_LINK_IFELSE([AC_LANG_PROGRAM(
214			[
215				#include <mbedtls/net_sockets.h>
216				#include <mbedtls/entropy.h>
217			], [
218				mbedtls_net_context net;
219				mbedtls_entropy_context e;
220				mbedtls_net_init(&net);
221				mbedtls_entropy_init(&e);
222			])], has_mbedtls=yes, has_mbedtls=no
223		)
224		if test "x${has_mbedtls}" = "xyes"; then
225			AC_MSG_RESULT([${p}])
226			break
227		else
228			CPPFLAGS=${old_CPPFLAGS}
229			LIBS=${old_LIBS}
230		fi
231	done
232fi
233if test "x${has_mbedtls}" = "xno"; then
234	AC_MSG_RESULT([no])
235	AC_MSG_ERROR([*** mbedtls not found.
236	On Ubuntu, sudo apt install libmbedtls-dev])
237fi
238
239# Check mbedtls version. need >= 2.9.0(?)
240AC_CHECK_LIB(mbedtls, mbedtls_net_poll,
241	has_mbedtls_net_poll=yes,
242	has_mbedtls_net_poll=no)
243if test "x${has_mbedtls_net_poll}" = "xno"; then
244	AC_MSG_ERROR([*** mbedtls doesn't have mbedtls_net_poll().
245	Please update your mbedtls to >= 2.9.0(?).])
246fi
247
248AC_CONFIG_HEADERS([config.h])
249AC_CONFIG_FILES([Makefile.cfg])
250AC_OUTPUT
251