1 dnl Process this file with autoconf 2.69 or later to produce
2 dnl a configure script.
4 AC_INIT(config/config.h.in)
5 AC_CONFIG_HEADERS(config/config.h)
7 AC_PREFIX_PROGRAM(nasm)
9 dnl Save initial CFLAGS, to see if -g -O2 came from configure or not
10 pa_init_cflags="$CFLAGS"
12 dnl This prevents us from running Wine and thinking we are not
13 dnl cross-compiling when in fact we are; running Wine here is at
14 dnl the best very slow and doesn't buy us a single thing at all.
18 dnl Checks for programs and enable necessary CC extensions
19 AC_USE_SYSTEM_EXTENSIONS
27 dnl If the user did not specify a CFLAGS default, change default -O2
28 dnl to either -O3 (normal) or -O0 (for debugging)
29 PA_ARG_DISABLED([optimization],
30 [compile without optimization (-O0) to help debugging],
31 [pa_optimize=-O0], [pa_optimize=-O3])
33 dnl Compile and link with dwarf debug
35 [disable optimization and compile with extra debug information for GDB debugger],
37 PA_ADD_CFLAGS([-ggdb3])
40 AS_IF([test x"$pa_init_cflags" = x],
41 [CFLAGS=`echo "$CFLAGS" | sed -e "s/-O2/$pa_optimize/"`])
43 AS_IF([test x"$pa_optimize" = "x-O0"],
44 [PA_ADD_CFLAGS([-fno-omit-frame-pointer])])
47 PA_ARG_ENABLED([panic-abort],
48 [call abort() on panic to trap in the debugger],
49 [AC_DEFINE(ABORT_ON_PANIC)])
50 AH_TEMPLATE(ABORT_ON_PANIC,
51 [Define to 1 to call abort() on panics (internal errors), for debugging.])
53 dnl Check for library extension
56 dnl Checks for typedefs, structures, and compiler characteristics.
61 AC_C_BIGENDIAN(AC_DEFINE(WORDS_BIGENDIAN),AC_DEFINE(WORDS_LITTLEENDIAN),,)
62 AH_TEMPLATE(WORDS_BIGENDIAN,
63 [Define to 1 if your processor stores words with the most significant
64 byte first (like Motorola and SPARC, unlike Intel and VAX).])
65 AH_TEMPLATE(WORDS_LITTLEENDIAN,
66 [Define to 1 if your processor stores words with the least significant
67 byte first (like Intel and VAX, unlike Motorola and SPARC).])
69 dnl Force gcc and gcc-compatible compilers treat signed integers
71 PA_ADD_CFLAGS([-fwrapv])
73 dnl Some environments abuse __STRICT_ANSI__ to disable some
74 dnl function declarations
75 PA_ADD_CFLAGS([-U__STRICT_ANSI__])
77 dnl Don't put things in common if we can avoid it. We don't want to
78 dnl assume all compilers support common, and this will help find those
79 dnl problems. This also works around an OSX linker problem.
80 PA_ADD_CFLAGS([-fno-common])
82 dnl Look for programs...
83 AC_CHECK_PROGS(NROFF, nroff, false)
84 AC_CHECK_PROGS(ASCIIDOC, asciidoc, false)
85 AC_CHECK_PROGS(XMLTO, xmlto, false)
87 dnl Check for progs needed for manpage generation
88 AS_IF([test $ASCIIDOC = false],
89 [AC_MSG_WARN([No asciidoc package found])]
91 AS_IF([test $XMLTO = false],
92 [AC_MSG_WARN([No xmlto package found])]
95 dnl Check for host compiler tools
97 AC_CHECK_TOOL(RANLIB, ranlib, :)
98 AC_CHECK_TOOL(STRIP, strip)
100 dnl Checks for header files.
102 AC_CHECK_HEADERS(inttypes.h)
103 AC_CHECK_HEADERS(strings.h)
105 AC_CHECK_HEADERS(stdnoreturn.h)
106 AC_CHECK_HEADERS(io.h)
107 AC_CHECK_HEADERS(fcntl.h)
108 AC_CHECK_HEADERS(unistd.h)
109 AC_CHECK_HEADERS(sys/mman.h)
110 AC_CHECK_HEADERS(sys/types.h)
111 AC_CHECK_HEADERS(sys/stat.h)
113 dnl Checks for library functions.
114 AC_CHECK_FUNCS(strcasecmp stricmp)
115 AC_CHECK_FUNCS(strncasecmp strnicmp)
116 AC_CHECK_FUNCS(strsep)
117 AC_CHECK_FUNCS(strnlen)
118 AC_CHECK_FUNCS(strrchrnul)
120 AC_CHECK_FUNCS(getuid)
121 AC_CHECK_FUNCS(getgid)
123 AC_CHECK_FUNCS(realpath)
124 AC_CHECK_FUNCS(canonicalize_file_name)
125 AC_CHECK_FUNCS(_fullpath)
126 AC_CHECK_FUNCS(pathconf)
129 AC_CHECK_FUNCS([_fseeki64])
130 AC_CHECK_FUNCS([ftruncate _chsize _chsize_s])
131 AC_CHECK_FUNCS([fileno _fileno])
133 AC_CHECK_FUNCS(_filelengthi64)
135 AC_CHECK_FUNCS(getpagesize)
136 AC_CHECK_FUNCS(sysconf)
138 AC_CHECK_FUNCS([access _access faccessat])
140 PA_HAVE_FUNC(__builtin_expect, (1,1))
142 dnl ilog2() building blocks
143 PA_ADD_HEADERS(intrin.h)
144 PA_HAVE_FUNC(__builtin_clz, (0U))
145 PA_HAVE_FUNC(__builtin_clzl, (0UL))
146 PA_HAVE_FUNC(__builtin_clzll, (0ULL))
147 PA_HAVE_FUNC(_BitScanReverse, (0))
148 PA_HAVE_FUNC(_BitScanReverse64, (0))
150 dnl Functions for which we have replacements available in stdlib/
151 AC_CHECK_FUNCS([vsnprintf _vsnprintf])
152 AC_CHECK_FUNCS([snprintf _snprintf])
153 AC_CHECK_FUNCS([strlcpy])
154 AC_CHECK_FUNCS([strrchrnul])
156 dnl These types are POSIX-specific, and Windows does it differently...
157 AC_CHECK_TYPES([struct _stati64])
158 AC_CHECK_TYPES([struct stat])
159 AC_CHECK_FUNCS([stat _stati64])
160 AC_CHECK_FUNCS([fstat _fstati64])
162 dnl Check for functions that might not be declared in the headers for
163 dnl various idiotic reasons (mostly because of library authors
164 dnl abusing the meaning of __STRICT_ANSI__)
165 AC_CHECK_DECLS(strcasecmp)
166 AC_CHECK_DECLS(stricmp)
167 AC_CHECK_DECLS(strncasecmp)
168 AC_CHECK_DECLS(strnicmp)
169 AC_CHECK_DECLS(strsep)
170 AC_CHECK_DECLS(strlcpy)
171 AC_CHECK_DECLS(strnlen)
172 AC_CHECK_DECLS(strrchrnul)
174 dnl Check for missing types
177 dnl Documentation: should we generate an uncompressed PDF? It is
178 dnl about twice as big, but it can be externally compressed (e.g. with xz)
179 dnl and becomes significantly smaller than the original.
180 PA_ARG_DISABLED([pdf-compression],
181 [generate an uncompressed documentation PDF],
182 [PDFOPT='-nocompress'])
186 dnl Look for byte-swapping support...
188 PA_ADD_HEADERS(endian.h sys/endian.h machine/endian.h)
189 PA_HAVE_FUNC(cpu_to_le16, (0))
190 PA_HAVE_FUNC(cpu_to_le32, (0))
191 PA_HAVE_FUNC(cpu_to_le64, (0))
192 PA_HAVE_FUNC(__cpu_to_le16, (0))
193 PA_HAVE_FUNC(__cpu_to_le32, (0))
194 PA_HAVE_FUNC(__cpu_to_le64, (0))
195 PA_HAVE_FUNC(htole16, (0))
196 PA_HAVE_FUNC(htole32, (0))
197 PA_HAVE_FUNC(htole64, (0))
198 PA_HAVE_FUNC(__bswap_16, (0))
199 PA_HAVE_FUNC(__bswap_32, (0))
200 PA_HAVE_FUNC(__bswap_64, (0))
201 PA_HAVE_FUNC(__builtin_bswap16, (0))
202 PA_HAVE_FUNC(__builtin_bswap32, (0))
203 PA_HAVE_FUNC(__builtin_bswap64, (0))
204 PA_HAVE_FUNC(_byteswap_ushort, (0))
205 PA_HAVE_FUNC(_byteswap_ulong, (0))
206 PA_HAVE_FUNC(_byteswap_uint64, (0))
209 dnl Check for __builtin_constant_p()
211 PA_HAVE_FUNC(__builtin_constant_p, (0))
214 dnl Check for supported gcc attributes; some compilers (e.g. Sun CC)
215 dnl support these, but don't define __GNUC__ as they don't support
216 dnl some other features of gcc.
218 PA_ADD_CFLAGS([-Werror=attributes])
219 PA_FUNC_ATTRIBUTE(noreturn)
220 PA_FUNC_ATTRIBUTE(returns_nonnull)
221 PA_FUNC_ATTRIBUTE(malloc)
222 PA_FUNC_ATTRIBUTE(alloc_size, (1))
223 PA_FUNC_ATTRIBUTE(sentinel,,, [const char *, ...], ["a","b",NULL])
224 PA_FUNC_ATTRIBUTE(format, [(printf,1,2)], int, [const char *, ...], ["%d",1])
225 PA_FUNC_ATTRIBUTE(const)
226 PA_FUNC_ATTRIBUTE(pure)
227 PA_FUNC_ATTRIBUTE(cold)
228 PA_FUNC_ATTRIBUTE_ERROR
231 dnl support function sections (if available)
233 PA_ARG_ENABLED([sections],
234 [compile with function/data section support],
235 [PA_ADD_CLDFLAGS([-ffunction-sections])
236 PA_ADD_CLDFLAGS([-fdata-sections])
237 PA_ADD_CLDFLAGS([-Wl,--gc-sections])],
243 PA_ARG_ENABLED([lto],
244 [compile with gcc-style link time optimization],
245 [PA_ADD_CLDFLAGS([-flto])
246 dnl Note: we use _PROG rather than _TOOL since we are prepending the full
247 dnl CC name which ought to already contain the host triplet if needed
248 ccbase=`echo "$CC" | awk '{ print $1; }'`
249 AC_CHECK_PROGS(CC_AR, [${ccbase}-ar], [$ac_cv_prog_AR])
251 AC_CHECK_PROGS(CC_RANLIB, [${ccbase}-ranlib], [$ac_cv_prog_RANLIB])
252 RANLIB="$CC_RANLIB"], [])
255 dnl support sanitizers (if available)
257 PA_ARG_ENABLED([sanitizer],
258 [compile with sanitizers enabled],
259 [PA_ADD_CFLAGS([-fno-omit-frame-pointer])
260 PA_ADD_CLDFLAGS([-fsanitize=address])
261 PA_ADD_CLDFLAGS([-fsanitize=undefined])])
264 dnl Don't make symbols visible, there is no point and it just
265 dnl makes the code slower.
267 PA_ADD_CLDFLAGS([-fvisibility=hidden])
269 dnl If we have gcc, add appropriate code cleanliness options
271 PA_ADD_CFLAGS([-Wall])
272 PA_ADD_CFLAGS([-pedantic])
273 dnl LLVM doesn't error out on invalid -W options unless this option is
274 dnl specified first. Enable this so this script can actually discover
275 dnl which -W options are possible for this compiler.
276 PA_ADD_CFLAGS([-Werror=unknown-warning-option])
277 dnl Suppress format warning on Windows targets due to their <inttypes.h>
278 PA_ADD_CFLAGS([-Wpedantic-ms-format],[-Wno-pedantic-ms-format])
279 PA_ADD_CFLAGS([-Wc90-c99-compat])
280 PA_ADD_CFLAGS([-Wlong-long],[-Wno-long-long])
281 dnl This is needed because we intentionally expect strncpy() to fill
282 dnl in a zero-padded (not zero-terminated) buffer in several backends
283 PA_ADD_CFLAGS([-Wstringop-truncation],[-Wno-stringop-truncation])
284 dnl This is needed because we assume 2's-completement signed arithmetic;
285 dnl on compilers with gcc-like command line syntax we pass the -fwrapv
286 dnl option for exactly that reason.
287 PA_ADD_CFLAGS([-Wshift-negative-value],[-Wno-shift-negative-value])
289 dnl PA_ADD_CFLAGS([-Wwrite-strings])
290 PA_ARG_ENABLED([werror],
291 [compile with -Werror to error out on any warning],
292 [PA_ADD_CFLAGS([-Werror])],
293 [PA_ADD_CFLAGS([-Werror=implicit])
294 PA_ADD_CFLAGS([-Werror=missing-braces])
295 PA_ADD_CFLAGS([-Werror=return-type])
296 PA_ADD_CFLAGS([-Werror=trigraphs])
297 PA_ADD_CFLAGS([-Werror=pointer-arith])
298 PA_ADD_CFLAGS([-Werror=strict-prototypes])
299 PA_ADD_CFLAGS([-Werror=missing-prototypes])
300 PA_ADD_CFLAGS([-Werror=missing-declarations])
301 PA_ADD_CFLAGS([-Werror=comment])
302 PA_ADD_CFLAGS([-Werror=vla])]
306 dnl On some versions of gcc, -Werror=missing-prototypes causes problems
307 dnl with C99-style external inlines. Test this *after* adding the -Werror
310 PA_CHECK_BAD_STDC_INLINE
315 PA_ARG_ENABLED([ccache], [compile with ccache], [CC="ccache $CC"], [])
317 AC_OUTPUT_COMMANDS([mkdir -p config nasmlib nsis output stdlib x86 asm disasm rdoff macros common])
318 AC_OUTPUT(Makefile doc/Makefile)