b0e5ffdfac9dd232babab99ec5e34a38125e492d
[com/asn1c.git] / configure.ac
1 AC_INIT([asn1c],[0.9.29],[vlm@lionet.info])
2
3 AC_CONFIG_AUX_DIR(config)
4 AC_CONFIG_HEADER([config.h])
5 AM_INIT_AUTOMAKE([foreign])
6 AC_CONFIG_MACRO_DIR([m4])
7
8 dnl Checks for programs.
9 AC_PROG_CC
10 AC_PROG_CPP
11 AC_PROG_INSTALL
12 AC_PROG_LN_S
13 AC_PROG_MAKE_SET
14 AC_PROG_YACC
15 AM_PROG_LEX
16 dnl locate ar using standard macro (old automake 1.11 does not know about AM_PROG_AR)
17 m4_ifdef([AM_PROG_AR],
18          [AM_PROG_AR],
19          [AC_PATH_PROG(AR, ar, ar, $PATH:/usr/ucb:/usr/ccs/bin)])
20
21 AC_PROG_CXX
22 CXXFLAGS="-std=c++11"
23
24 LT_INIT
25
26 dnl If you need to see the details, just run make V=1.
27 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
28
29 case "$host_os" in
30 cygwin)
31         case "$target" in
32         *mingw*)
33                 CC="$CC -mno-cygwin"
34         esac
35         ;;
36 esac
37
38 AC_ARG_ENABLE([ASN_DEBUG],
39   [AS_HELP_STRING([--enable-ASN_DEBUG],
40                   [produce debug log during `make check` testing])],
41   [enable_asn_debug=$enableval], [enable_asn_debug=no])
42   AS_IF([test x$enable_asn_debug != xno], [
43       TESTSUITE_CFLAGS="-DASN_EMIT_DEBUG"
44       SKELETONS_CFLAGS="-DASN_EMIT_DEBUG"
45   ])
46
47 AX_CHECK_COMPILE_FLAG([-Wall], [CFLAGS="$CFLAGS -Wall"])
48 AX_CHECK_COMPILE_FLAG([-Wcast-qual], [CFLAGS="$CFLAGS -Wcast-qual"])
49 AX_CHECK_COMPILE_FLAG([-Wchar-subscripts],
50       [CFLAGS="$CFLAGS -Wchar-subscripts"])
51 AX_CHECK_COMPILE_FLAG([-Wmissing-prototypes],
52       [CFLAGS="$CFLAGS -Wmissing-prototypes"])
53 AX_CHECK_COMPILE_FLAG([-Wmissing-declarations],
54       [CFLAGS="$CFLAGS -Wmissing-declarations"])
55
56 dnl There are legitimate uses for these features, disable warnings/errors.
57 AX_CHECK_COMPILE_FLAG([-Wno-error=attributes],
58       [CFLAGS="$CFLAGS -Wno-error=attributes"])
59 AX_CHECK_COMPILE_FLAG([-Wno-error=cast-align],
60       [CFLAGS="$CFLAGS -Wno-error=cast-align"])
61 AX_CHECK_COMPILE_FLAG([-Wno-error=visibility],
62       [CFLAGS="$CFLAGS -Wno-error=visibility"])
63 AX_CHECK_COMPILE_FLAG([-Wno-error=parentheses-equality],
64       [CFLAGS="$CFLAGS -Wno-error=parentheses-equality"])
65 AX_CHECK_COMPILE_FLAG([-std=gnu99],
66       [CFLAGS="$CFLAGS -std=gnu99"
67        TESTSUITE_CFLAGS="${TESTSUITE_CFLAGS} -std=gnu99"])
68 AX_CHECK_COMPILE_FLAG([-Wno-error=unused-variable],
69       [TESTSUITE_CFLAGS="${TESTSUITE_CFLAGS} -Wno-error=unused-variable"])
70
71 dnl Lower the optimization level in tests to aid debugging.
72 dnl AX_CHECK_COMPILE_FLAG([-O1],
73 dnl    [TESTSUITE_CFLAGS="${TESTSUITE_CFLAGS} -O1"])
74 dnl AX_CHECK_COMPILE_FLAG([-fno-inline],
75 dnl     [TESTSUITE_CFLAGS="${TESTSUITE_CFLAGS} -fno-inline"])
76
77 AX_CODE_COVERAGE
78 AS_IF([test x$enable_code_coverage != xno], [
79         CFLAGS="$CFLAGS $CODE_COVERAGE_CFLAGS"
80         # The CODE_COVERAGE_CPPFLAGS contains -DNDEBUG flag
81         # which removes assert(...) macros from code coverage and improves the
82         # branches score. But when it is defined it results in few
83         # unsed-but-set-variable warnings that are treated as errors in the travis-ci
84         # build because these variables are only used inside assert macros.
85         # error: variable ‘ret’ set but not used [-Werror=unused-but-set-variable]
86         #CPPFLAGS="$CPPFLAGS $CODE_COVERAGE_CPPFLAGS"
87         CXXFLAGS="$CXXFLAGS $CODE_COVERAGE_CXXFLAGS"
88         AC_SEARCH_LIBS(gcov_open, gcov, [LDFLAGS="$LDFLAGS $CODE_COVERAGE_LDFLAGS"])
89 ])
90
91 dnl Skeletons should be very compatible with most of the compilers, hence
92 dnl very strict backward compatibility flags.
93 SKELETONS_CFLAGS="${ADD_CFLAGS} ${SKELETONS_CFLAGS}"
94 AX_CHECK_COMPILE_FLAG([-std=c89],
95     [SKELETONS_CFLAGS="$SKELETONS_CFLAGS -std=c89"])
96 AX_CHECK_COMPILE_FLAG([-Wpedantic],
97     [SKELETONS_CFLAGS="$SKELETONS_CFLAGS -Wpedantic"],
98     [
99         dnl When -Wpedantic is not supported try the -pedantic instead. (gcc-4.7)
100         dnl See https://gcc.gnu.org/gcc-4.8/changes.html
101         AX_CHECK_COMPILE_FLAG([-pedantic],
102             [SKELETONS_CFLAGS="$SKELETONS_CFLAGS -pedantic"], [], [-Werror])
103     ],
104     [-Werror]) #clang 3.0 prints warning when the flag is not supported
105
106 AC_ARG_ENABLE(Werror,
107   [AS_HELP_STRING([--enable-Werror],
108                   [abort compilation after any C compiler warning])],
109   [enable_werror=$enableval], [enable_werror=no])
110   AS_IF([test x$enable_werror != xno], [
111       ADD_CFLAGS="${ADD_CFLAGS} -Werror -W -Wall -Wpointer-arith"
112       SKELETONS_CFLAGS="${SKELETONS_CFLAGS} -Werror -W -Wall -Wpointer-arith"
113       AX_CHECK_COMPILE_FLAG([-Wgnu],
114         [SKELETONS_CFLAGS="${SKELETONS_CFLAGS} -Wgnu"])
115   ])
116
117 AX_CHECK_COMPILE_FLAG([-Wno-long-long],
118         [SKELETONS_CFLAGS="${SKELETONS_CFLAGS} -Wno-long-long"])
119
120 AC_ARG_ENABLE(test-Werror,
121   [AS_HELP_STRING([--enable-test-Werror],
122                   [abort compiling tests after any C compiler warning])],
123   [enable_test_werror=$enableval], [enable_test_werror=no])
124   AS_IF([test x$enable_test_werror != xno], [
125       TESTSUITE_CFLAGS="${TESTSUITE_CFLAGS} -Werror -W -Wpointer-arith"
126   ])
127
128 dnl If requested and -m32 is available to create 32-bit code,
129 dnl treat it like a special case to be checked.
130 AC_ARG_ENABLE([test-32bit],
131     [AS_HELP_STRING([--enable-test-32bit],
132     [enable tests for 32-bit compatibility])],
133     [enable_test_32bit=$enableval], [enable_test_32bit=no])
134 AS_IF([test "x$enable_test_32bit" != xno], [
135     AX_CHECK_COMPILE_FLAG([-m32], [CFLAGS_M32="-m32 -DEXPLICIT_32BIT"],
136       [
137         CFLAGS_M32=""
138         AC_MSG_FAILURE([--enable-test-32bit=$enable_test_32bit is requested but not supported by the _AC_LANG compiler])
139       ])
140 ])
141 AC_SUBST(CFLAGS_M32)
142 AM_CONDITIONAL([EXPLICIT_M32], [test "x${CFLAGS_M32}" != "x"])
143
144 SANITIZER_CFLAGS=""
145
146 dnl Enable Undefined Behavior Sanitizer, if supported.
147 AC_ARG_ENABLE([test-ubsan],
148     [AS_HELP_STRING([--disable-test-ubsan],
149         [disable Undefined Behavior Sanitizer for tests])],
150     [disable_test_ubsan=$enableval], [disable_test_ubsan=maybe])
151 AS_IF([test "x$disable_test_ubsan" != xno], [
152     AX_CHECK_COMPILE_AND_LINK_FLAG([-fsanitize=undefined],
153       [SANITIZER_CFLAGS="${SANITIZER_CFLAGS} -fsanitize=undefined"],
154       [
155         AS_IF([test "x$disable_test_ubsan" != xmaybe], [
156             AC_MSG_FAILURE(
157 [--disable-test-ubsan=$disable_test_ubsan is not supported on a target system.
158 https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html#how-to-build])])
159       ],
160       [],
161       [AC_LANG_PROGRAM([void test(int *);void test(int *n) { *n = 0; }])]
162     )
163     AX_CHECK_COMPILE_FLAG([-fno-sanitize-recover=undefined],
164       [SANITIZER_CFLAGS="${SANITIZER_CFLAGS} -fno-sanitize-recover=undefined"])
165
166     dnl Unsigned integer overflow is enabled separately.
167     AX_CHECK_COMPILE_AND_LINK_FLAG([-fsanitize=unsigned-integer-overflow],
168       [SANITIZER_CFLAGS="${SANITIZER_CFLAGS} -fsanitize=unsigned-integer-overflow"], [], [], [AC_LANG_PROGRAM([int test(unsigned); int test(unsigned n) { return n + 1; }])])
169     AX_CHECK_COMPILE_FLAG([-fno-sanitize-recover=unsigned-integer-overflow],
170       [SANITIZER_CFLAGS="${SANITIZER_CFLAGS} -fno-sanitize-recover=unsigned-integer-overflow"])
171
172     dnl Nullability is enabled separately.
173     AX_CHECK_COMPILE_AND_LINK_FLAG([-fsanitize=nullability],
174       [SANITIZER_CFLAGS="${SANITIZER_CFLAGS} -fsanitize=nullability"])
175     AX_CHECK_COMPILE_FLAG([-fno-sanitize-recover=nullability],
176       [SANITIZER_CFLAGS="${SANITIZER_CFLAGS} -fno-sanitize-recover=nullability"])
177
178     dnl Keep error messages nice. Also consider:
179     dnl export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
180     dnl export UBSAN_OPTIONS=print_stacktrace=1
181     AX_CHECK_COMPILE_FLAG([-fno-omit-frame-pointer],
182           [SANITIZER_CFLAGS="${SANITIZER_CFLAGS} -fno-omit-frame-pointer"])
183 ])
184
185 dnl Enable Address Sanitizer, if supported by gcc (4.8+) or clang.
186 dnl http://clang.llvm.org/docs/AddressSanitizer.html
187 ASAN_ENV_FLAGS=""
188 AC_ARG_ENABLE([test-asan],
189     [AS_HELP_STRING([--disable-test-asan],
190         [disable Address Sanitizer for tests])],
191     [disable_test_asan=$enableval], [disable_test_asan=maybe])
192 AS_IF([test "x$disable_test_asan" != xno], [
193     AX_CHECK_COMPILE_AND_LINK_FLAG([-fsanitize=address],
194       [SANITIZER_CFLAGS="${SANITIZER_CFLAGS} -fsanitize=address"],
195       [
196         AS_IF([test "x$disable_test_asan" != xmaybe], [
197             AC_MSG_FAILURE(
198 [--disable-test-asan=$disable_test_asan is not supported on a target system.
199 Check out https://clang.llvm.org/docs/AddressSanitizer.html#how-to-build])])
200       ])
201
202     dnl Address sanitizer sometimes is equipped with the leak sanitizer.
203     dnl If address sanitizer is not equipped with a leak sanitizer,
204     dnl invoking programs with ASAN_OPTIONS=detect_leaks=1 will break them.
205     ASAN_OPTIONS="detect_leaks=1"
206     export ASAN_OPTIONS
207     save_cflags="${CFLAGS}"
208     CFLAGS="${CFLAGS} ${SANITIZER_CFLAGS}"
209     AC_RUN_IFELSE([AC_LANG_PROGRAM()], [
210         ASAN_ENV_FLAGS="${ASAN_ENV_FLAGS} ASAN_OPTIONS=detect_leaks=1"
211     ])
212     CFLAGS="${save_cflags}"
213     unset ASAN_OPTIONS
214
215     dnl Keep error messages nice. Also consider:
216     dnl export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer
217     dnl export ASAN_OPTIONS=symbolize=1
218     AX_CHECK_COMPILE_FLAG([-fno-omit-frame-pointer],
219           [SANITIZER_CFLAGS="${SANITIZER_CFLAGS} -fno-omit-frame-pointer"])
220 ])
221
222 dnl Enable LibFuzzer, if supported.
223 LIBFUZZER_CFLAGS=""
224 AC_ARG_ENABLE([test-fuzzer],
225     [AS_HELP_STRING([--enable-test-fuzzer],
226         [enable LLVM LibFuzzer for randomized testing])],
227     [enable_test_fuzzer=$enableval], [enable_test_fuzzer=no])
228 AS_IF([test "x$enable_test_fuzzer" != xno], [
229     AX_CHECK_COMPILE_AND_LINK_FLAG([-fsanitize=fuzzer],
230     [LIBFUZZER_CFLAGS="-fsanitize=fuzzer -DENABLE_LIBFUZZER"],
231     [AC_MSG_FAILURE(
232 [--enable-test-fuzzer=$enable_test_fuzzer is not supported on a target system.
233 Check out http://llvm.org/docs/LibFuzzer.html])],
234     [],
235     [AC_LANG_SOURCE([[
236     #include <sys/types.h>
237     int LLVMFuzzerTestOneInput(const unsigned char *Data, size_t Size);
238     int LLVMFuzzerTestOneInput(const unsigned char *Data, size_t Size) {
239         (void)Data;
240         (void)Size;
241         return 0;
242     }
243     ]])])
244 ])
245
246 TESTSUITE_CFLAGS="${TESTSUITE_CFLAGS} ${SANITIZER_CFLAGS}"
247 SKELETONS_CFLAGS="${SKELETONS_CFLAGS} ${SANITIZER_CFLAGS}"
248
249 AC_SUBST(ADD_CFLAGS)
250 AC_SUBST(LIBFUZZER_CFLAGS)
251 AC_SUBST(SANITIZER_CFLAGS)
252 AC_SUBST(TESTSUITE_CFLAGS)
253 AC_SUBST(SKELETONS_CFLAGS)
254 AC_SUBST(ASAN_ENV_FLAGS)
255
256 dnl Checks for header files.
257 AC_HEADER_STDC
258 AC_CHECK_HEADERS(sys/param.h)
259
260 dnl Checks for typedefs, structures, and compiler characteristics.
261 AC_C_BIGENDIAN
262 AC_TYPE_OFF_T
263 AC_TYPE_SIZE_T
264 AC_STRUCT_TM
265 AC_CHECK_TYPE([__int128],
266     [AC_DEFINE(HAVE_128_BIT_INT, 1, [Have 128-bit integer])])
267 AC_CHECK_TYPE(intmax_t, int64_t)
268
269 dnl Test if we should test features that depend on 64-bitness.
270 AC_CHECK_SIZEOF([void *])
271 AM_CONDITIONAL([TEST_64BIT], [test "$ac_cv_sizeof_void_p" -eq 8])
272
273 dnl For mingw
274 AC_SEARCH_LIBS(getopt, iberty)
275
276 AC_CHECK_FUNCS(strtoimax strtoll)
277 AC_CHECK_FUNCS(mergesort)
278 AC_CHECK_FUNCS(mkstemps)
279 AC_CHECK_FUNCS(timegm)
280 AC_CHECK_DECLS(strcasecmp)
281 AC_CHECK_DECLS(vasprintf)
282 AC_TRY_LINK_FUNC([symlink],[AC_DEFINE([HAVE_SYMLINK], 1, [Define to 1 if you have the symlink function.])])
283
284 dnl Use pandoc to generate manual pages.
285 AC_PATH_PROG([PANDOC], pandoc)
286 AM_CONDITIONAL([HAVE_PANDOC], [test -n "$PANDOC"])
287
288 AC_CONFIG_FILES([\
289 tests/tests-c-compiler/check-src/Makefile   \
290 tests/tests-asn1c-compiler/Makefile         \
291 tests/tests-asn1c-smoke/Makefile            \
292 tests/tests-randomized/Makefile             \
293 tests/tests-c-compiler/Makefile             \
294 tests/tests-skeletons/Makefile              \
295 libasn1compiler/Makefile                    \
296 libasn1common/Makefile                      \
297 libasn1parser/Makefile                      \
298 libasn1print/Makefile                       \
299 libasn1fix/Makefile                         \
300 doc/docsrc/Makefile                         \
301 skeletons/Makefile                          \
302 examples/Makefile                           \
303 doc/man/Makefile                            \
304 tests/Makefile                              \
305 asn1c/Makefile                              \
306 doc/Makefile                                \
307 Makefile                                    \
308 ])
309 AC_OUTPUT
310