1dnl Process this file with autoconf to produce a configure script.
2dnl This config.in requires autoconf 2.5 or greater.
3
4AC_PREREQ([2.68])
5AC_INIT([qpdf],[10.5.0])
6
7AC_CONFIG_MACRO_DIR([m4])
8AC_CONFIG_FILES([autoconf.mk])
9AC_CONFIG_FILES([libqpdf.pc])
10AC_CONFIG_FILES([libqpdf.map])
11AC_CONFIG_HEADERS([libqpdf/qpdf/qpdf-config.h])
12
13AC_ARG_ENABLE(check-autofiles,
14   AS_HELP_STRING([--enable-check-autofiles],
15		  [if specified, verify checksums on automatically generated files (default=yes); package maintainers may want to disable this]),
16   [if test "$enableval" = "no"; then
17      CHECK_AUTOFILES=0
18    else
19      CHECK_AUTOFILES=1
20    fi],
21   [CHECK_AUTOFILES=1])
22
23# Check to see if automatically generated files are outdated and if we
24# can update them.
25AC_CHECK_PROG(AUTOCONF,autoconf,1,0)
26AC_CHECK_PROG(AUTOHEADER,autoheader,1,0)
27AC_CHECK_PROG(ACLOCAL,aclocal,1,0)
28AC_CHECK_PROG(SHA256SUM,sha256sum,1,0)
29if test "$CHECK_AUTOFILES$AUTOCONF$AUTOHEADER$ACLOCAL$SHA256SUM" = "11111"; then
30   if ! sha256sum -c autofiles.sums; then
31       AC_MSG_ERROR(autofiles are outdated; rerun autogen.sh)
32   fi
33fi
34
35AC_PROG_CC
36AC_PROG_CC_C99
37AC_PROG_CXX
38AX_CXX_COMPILE_STDCXX([14], [noext], [mandatory])
39AC_HEADER_STDC
40LT_INIT([win32-dll])
41
42# * If any interfaces have been removed or changed, or if any private
43#   member variables or virtual functions have been added to any
44#   class, we are not binary compatible. Increment LT_CURRENT, and set
45#   LT_AGE and LT_REVISION to 0.
46#
47# * Otherwise, if any interfaces have been added since the last public
48#   release, then increment LT_CURRENT and LT_AGE, and set LT_REVISION
49#   to 0.
50#
51# * Otherwise, increment LT_REVISION
52
53# LT = libtool
54LT_CURRENT=33
55LT_AGE=5
56LT_REVISION=0
57AC_SUBST(LT_CURRENT)
58AC_SUBST(LT_REVISION)
59AC_SUBST(LT_AGE)
60LT_SONAME=$(expr $LT_CURRENT - $LT_AGE)
61AC_SUBST(LT_SONAME)
62
63AC_MSG_CHECKING(for whether to use -rpath)
64AC_ARG_ENABLE(rpath,
65   AS_HELP_STRING([--enable-rpath],
66                  [whether to pass -rpath to the linker when building libraries]),
67   [if test "$enableval" = "yes"; then
68      qpdf_USE_RPATH=1;
69    else
70      qpdf_USE_RPATH=0;
71    fi], [qpdf_USE_RPATH=1])
72if test "$qpdf_USE_RPATH" = "1"; then
73   AC_MSG_RESULT(yes)
74   RPATH='-rpath $(libdir)'
75else
76   AC_MSG_RESULT(no)
77fi
78AC_SUBST(RPATH)
79
80AC_MSG_CHECKING(for -fvisibility=hidden)
81try_flags=-fvisibility=hidden
82oCXXFLAGS=$CXXFLAGS
83CXXFLAGS="$CXXFLAGS $try_flags"
84AC_LANG_PUSH([C++])
85AC_LINK_IFELSE([AC_LANG_PROGRAM(
86    [[class X
87{
88  public:
89    __attribute__ ((visibility ("default")))
90    X() {}
91    __attribute__ ((visibility ("default")))
92    void f() {}
93};
94   ]],[[X x; x.f();]])],
95   [qpdf_VISIBILITY_HIDDEN=1],
96   [qpdf_VISIBILITY_HIDDEN=0])
97AC_LANG_POP
98if test "$qpdf_VISIBILITY_HIDDEN" = "0"; then
99   AC_MSG_RESULT(no)
100   CXXFLAGS=$oCXXFLAGS
101else
102   AC_MSG_RESULT(yes)
103   CFLAGS="$CFLAGS $try_flags"
104fi
105
106AC_MSG_CHECKING(whether to use insecure random numbers)
107AC_ARG_ENABLE(insecure-random,
108   AS_HELP_STRING([--enable-insecure-random],
109                  [whether to use stdlib's random number generator (default is no)]),
110   [if test "$enableval" = "yes"; then
111      qpdf_INSECURE_RANDOM=1;
112    else
113      qpdf_INSECURE_RANDOM=0;
114    fi], [qpdf_INSECURE_RANDOM=0])
115if test "$qpdf_INSECURE_RANDOM" = "1"; then
116   AC_MSG_RESULT(yes)
117   AC_DEFINE([USE_INSECURE_RANDOM], [1], [Whether to use insecure random numbers])
118else
119   AC_MSG_RESULT(no)
120fi
121
122AC_MSG_CHECKING(whether to use OS-provided secure random numbers)
123AC_ARG_ENABLE(os-secure-random,
124   AS_HELP_STRING([--enable-os-secure-random],
125                  [whether to try to use OS-provided secure random numbers (default is yes)]),
126   [if test "$enableval" = "yes"; then
127      qpdf_OS_SECURE_RANDOM=1;
128    else
129      qpdf_OS_SECURE_RANDOM=0;
130    fi], [qpdf_OS_SECURE_RANDOM=1])
131if test "$qpdf_OS_SECURE_RANDOM" = "1"; then
132   AC_MSG_RESULT(yes)
133else
134   AC_MSG_RESULT(no)
135   AC_DEFINE([SKIP_OS_SECURE_RANDOM], [1], [Whether to suppress use of OS-provided secure random numbers])
136fi
137
138AX_RANDOM_DEVICE
139
140AC_MSG_CHECKING(whether to avoid Windows HANDLE type)
141AC_ARG_ENABLE(avoid-windows-handle,
142   AS_HELP_STRING([--enable-avoid-windows-handle],
143                  [whether to avoid use of HANDLE, useful for some embedded Windows builds (default is no)]),
144   [if test "$enableval" = "yes"; then
145      qpdf_AVOID_HANDLE=1;
146    else
147      qpdf_AVOID_HANDLE=0;
148    fi], [qpdf_AVOID_HANDLE=0])
149if test "$qpdf_AVOID_HANDLE" = "1"; then
150   AC_MSG_RESULT(yes)
151   AC_DEFINE([AVOID_WINDOWS_HANDLE], [1], [Whether to avoid use of HANDLE in Windows])
152else
153   AC_MSG_RESULT(no)
154fi
155
156USE_EXTERNAL_LIBS=0
157AC_MSG_CHECKING(for whether to use external libraries distribution)
158AC_ARG_ENABLE(external-libs,
159   AS_HELP_STRING([--enable-external-libs],
160		  [whether to use external libraries distribution]),
161   [if test "$enableval" = "yes"; then
162      USE_EXTERNAL_LIBS=1;
163    else
164      USE_EXTERNAL_LIBS=0;
165    fi], [BUILD_INTERNAL_LIBS=0])
166if test "$BUILD_INTERNAL_LIBS" = "0"; then
167   AC_MSG_RESULT(no)
168else
169   AC_MSG_RESULT(yes)
170fi
171
172AC_CHECK_SIZEOF([size_t])
173if test "$ac_cv_sizeof_size_t" = "4"; then
174   IS_32BIT=1
175   WINDOWS_WORDSIZE=32
176else
177   IS_32BIT=0
178   WINDOWS_WORDSIZE=64
179fi
180AC_SUBST(IS_32BIT)
181AC_SUBST(WINDOWS_WORDSIZE)
182
183PKG_PROG_PKG_CONFIG
184if test "$BUILD_INTERNAL_LIBS" = "0"; then
185    if test "$PKG_CONFIG" != ""; then
186       PKG_CHECK_MODULES([pc_zlib], [zlib],
187         [CFLAGS="$CFLAGS $pc_zlib_CFLAGS"
188          CXXFLAGS="$CXXFLAGS $pc_zlib_CFLAGS $pc_zlib_CXXFLAGS"
189          LIBS="$LIBS $pc_zlib_LIBS"
190         ], [:])
191       PKG_CHECK_MODULES([pc_libjpeg], [libjpeg],
192         [CFLAGS="$CFLAGS $pc_libjpeg_CFLAGS"
193          CXXFLAGS="$CXXFLAGS $pc_libjpeg_CFLAGS $pc_libjpeg_CXXFLAGS"
194          LIBS="$LIBS $pc_libjpeg_LIBS"
195         ],[:])
196    fi
197    if test "$pc_zlib_LIBS" = ""; then
198        AC_CHECK_HEADER(zlib.h,,[MISSING_ZLIB_H=1; MISSING_ANY=1])
199        AC_SEARCH_LIBS(deflate,z zlib,,[MISSING_ZLIB=1; MISSING_ANY=1])
200    fi
201    if test "$pc_libjpeg_LIBS" = ""; then
202        AC_CHECK_HEADER(jpeglib.h,,[MISSING_JPEG_H=1; MISSING_ANY=1])
203        AC_SEARCH_LIBS(jpeg_destroy,jpeg,,[MISSING_JPEG=1; MISSING_ANY=1])
204    fi
205    if test "$LIBS" != ""; then
206        nLIBS=""
207        for x in $LIBS; do
208            if echo $x | grep -q '^-L'; then
209                LDFLAGS="$LDFLAGS $x"
210            else
211                nLIBS="$nLIBS $x"
212            fi
213            LIBS=$nLIBS
214        done
215    fi
216fi
217
218qpdf_USE_WMAIN=0
219AC_LANG_PUSH([C++])
220AC_SUBST(WINDOWS_WMAIN_COMPILE)
221AC_SUBST(WINDOWS_WMAIN_LINK)
222for i in 0 1; do
223  if test "$qpdf_USE_WMAIN" = "0"; then
224    oLDFLAGS="$LDFLAGS"
225    if test "$i" = "1"; then
226      nLDFLAGS="-municode"
227      LDFLAGS="$LDFLAGS $nLDFLAGS"
228      msg="checking for wmain with $nLDFLAGS"
229    else
230      nLDFLAGS=
231      msg="checking for wmain"
232    fi
233    AC_MSG_CHECKING($msg)
234    AC_LINK_IFELSE([AC_LANG_SOURCE(
235      [[#include <windows.h>
236       #include <string.h>
237       #include <stdio.h>
238       extern "C"
239       int wmain(int argc, wchar_t* argv[])
240       {
241           size_t x = wcslen(argv[0]);
242           return 0;
243       }
244       ]])],
245       [qpdf_USE_WMAIN=1],
246       [qpdf_USE_WMAIN=0])
247    LDFLAGS="$oLDFLAGS"
248    if test "$qpdf_USE_WMAIN" = "1"; then
249      AC_MSG_RESULT(yes)
250      WINDOWS_WMAIN_COMPILE="-DWINDOWS_WMAIN $nLDFLAGS"
251      WINDOWS_WMAIN_LINK="$nLDFLAGS"
252    else
253      AC_MSG_RESULT(no)
254    fi
255  fi
256done
257AC_LANG_POP
258
259AC_LANG_PUSH([C++])
260AC_MSG_CHECKING(whether to use -latomic)
261dnl On some platforms with some versions of gcc, you have to link with
262dnl -latomic in order for std::atomic to work. Passing --as-needed
263dnl prevents unnecessary linking with -latomic.
264oLDFLAGS="$LDFLAGS"
265LDFLAGS="$LDFLAGS -Wl,--as-needed -latomic"
266AC_LINK_IFELSE([AC_LANG_SOURCE(
267  [[#include <atomic>
268    int main()
269    {
270        static std::atomic<int> a{0};
271        a = a.fetch_add(1);
272        return 0;
273    }
274   ]])],
275   [qpdf_USE_ATOMIC=1],
276   [qpdf_USE_ATOMIC=0])
277if test "$qpdf_USE_ATOMIC" = "1"; then
278  AC_MSG_RESULT(yes)
279else
280  AC_MSG_RESULT(no)
281  LDFLAGS="$oLDFLAGS"
282fi
283AC_LANG_POP
284
285if test "x$qpdf_OS_SECURE_RANDOM" = "x1"; then
286  OLIBS=$LIBS
287  LIBS="$LIBS Advapi32.lib"
288  AC_MSG_CHECKING(for Advapi32 library)
289  AC_LINK_IFELSE([AC_LANG_PROGRAM(
290    [[#pragma comment(lib, "crypt32.lib")
291     #include <windows.h>
292     #include <wincrypt.h>
293     HCRYPTPROV cp;]],
294     [CryptAcquireContext(&cp, NULL, NULL, PROV_RSA_FULL, 0);]
295     )],
296     [AC_MSG_RESULT(yes)
297      LIBS="$OLIBS -lAdvapi32"],
298     [AC_MSG_RESULT(no)
299      LIBS=$OLIBS])
300fi
301
302QPDF_LARGE_FILE_TEST_PATH=
303AC_SUBST(QPDF_LARGE_FILE_TEST_PATH)
304AC_ARG_WITH(large-file-test-path,
305   AS_HELP_STRING([--with-large-file-test-path=path],
306		  [To enable testing of files > 4GB, give the path to a directory with at least 11 GB free.  The test suite will write temporary files to this directory.  Alternatively, just set the QPDF_LARGE_FILE_TEST_PATH environment variable to the path before running the test suite.]),
307   [QPDF_LARGE_FILE_TEST_PATH=$withval],
308   [QPDF_LARGE_FILE_TEST_PATH=])
309
310AC_SYS_LARGEFILE
311AC_FUNC_FSEEKO
312AC_CHECK_FUNCS([fseeko64 random localtime_r])
313
314# Check if LD supports linker scripts, and define conditional
315# HAVE_LD_VERSION_SCRIPT if so.  This functionality is currently
316# constrained to compilers using GNU ld on ELF systems or systems
317# which provide an adequate emulation thereof.
318AC_ARG_ENABLE([ld-version-script],
319  AS_HELP_STRING([--enable-ld-version-script],
320    [enable linker version script (default is enabled)]),
321    [have_ld_version_script=$enableval], [have_ld_version_script=yes])
322if test "$have_ld_version_script" != no; then
323  AC_MSG_CHECKING([if LD -Wl,--version-script works])
324  save_LDFLAGS="$LDFLAGS"
325  LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map"
326  cat > conftest.map <<EOF
327VERS_1 {
328        global: sym;
329};
330
331VERS_2 {
332        global: sym;
333} VERS_1;
334EOF
335  AC_LINK_IFELSE([AC_LANG_PROGRAM([], [])],
336                 [have_ld_version_script=yes], [have_ld_version_script=no])
337  rm -f conftest.map
338  LDFLAGS="$save_LDFLAGS"
339  AC_MSG_RESULT($have_ld_version_script)
340fi
341if test "$have_ld_version_script" = "yes"; then
342  HAVE_LD_VERSION_SCRIPT=1
343else
344  HAVE_LD_VERSION_SCRIPT=0
345fi
346AC_SUBST(HAVE_LD_VERSION_SCRIPT)
347
348make_okay=0
349for make_prog in make gmake; do
350  this_make_okay=0
351  AC_MSG_CHECKING(for gnu make >= 3.81 ($make_prog))
352  if $make_prog --version >/dev/null 2>&1; then
353    v=`$make_prog --version | grep 'GNU Make' | sed -e 's/.*Make //'`
354    maj=`echo $v | cut -d. -f 1`
355    min=`echo $v | cut -d. -f 2`
356    if test $maj -gt 3 -o '(' $maj -eq 3 -a $min -ge 81 ')'; then
357       this_make_okay=1
358       make_okay=1
359    fi
360  fi
361  if test "$this_make_okay" = "1"; then
362    AC_MSG_RESULT(yes)
363  else
364    AC_MSG_RESULT(no)
365  fi
366done
367
368if test "$make_okay" = "0"; then
369  dnl Don't set MISSING_ANY=1 -- maybe user calls make something else
370  MISSING_MAKE_381=1
371  ISSUE_WARNINGS=1
372fi
373
374AC_SUBST(GENDEPS)
375GENDEPS=0
376AC_MSG_CHECKING(for whether $CC supports -MD -MF x.dep -MP)
377oCFLAGS=$CFLAGS
378rm -f x.dep
379CFLAGS="$CFLAGS -MD -MF x.dep -MP"
380AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
381                    [[#include <stdio.h>]], [[FILE* a = stdout]]
382                  )],
383                  [qpdf_DEPFLAGS=yes],
384                  [qpdf_DEPFLAGS=no])
385CFLAGS=$oCFLAGS
386if test "$qpdf_DEPFLAGS" = "yes"; then
387   if ! grep stdio.h x.dep >/dev/null 2>&1; then
388      qpdf_DEPFLAGS=no
389   fi
390fi
391rm -f x.dep
392if test "$qpdf_DEPFLAGS" = "yes"; then
393   AC_MSG_RESULT(yes)
394   GENDEPS=1
395else
396   AC_MSG_RESULT(no)
397fi
398
399AC_MSG_CHECKING(which build rules to use)
400AC_SUBST(BUILDRULES)
401AC_ARG_WITH(buildrules,
402   AS_HELP_STRING([--with-buildrules=rules],
403		  [which build rules to use; see README.md]),
404   [BUILDRULES=$withval],
405   [BUILDRULES=libtool])
406AC_MSG_RESULT($BUILDRULES)
407
408AC_SUBST(WFLAGS)
409AC_SUBST(CXXWFLAGS)
410qpdf_USE_EXTRA_WARNINGS=0
411if test "$BUILDRULES" = "msvc"; then
412   dnl /w14996 makes warning 4996 a level 1 warning.  This warning
413   dnl reports on functions that Microsoft considers unsafe or
414   dnl deprecated.  Removing these warnings helps people who want to
415   dnl write applications based on qpdf that can be Windows 8
416   dnl certified.
417   try_flags="-w14996"
418else
419   try_flags="-Wall"
420fi
421AC_MSG_CHECKING(for whether $CC supports $try_flags)
422oCFLAGS=$CFLAGS
423CFLAGS="$CFLAGS $try_flags"
424AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[int a = 1; int b = a; a = b;]])],
425                  [qpdf_USE_EXTRA_WARNINGS=1],[qpdf_USE_EXTRA_WARNINGS=0])
426CFLAGS=$oCFLAGS
427if test "$qpdf_USE_EXTRA_WARNINGS" = "1"; then
428   AC_MSG_RESULT(yes)
429   WFLAGS="$try_flags"
430else
431   AC_MSG_RESULT(no)
432fi
433if test "$BUILDRULES" != "msvc"; then
434   qpdf_USE_EXTRA_WARNINGS=0
435   try_flags="-Wold-style-cast"
436   AC_MSG_CHECKING(for whether $CXX supports $try_flags)
437   oCXXFLAGS=$CXXFLAGS
438   CXXFLAGS="$CXXFLAGS $try_flags"
439   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[int a = 1; int b = a; a = b;]])],
440                     [qpdf_USE_EXTRA_WARNINGS=1],[qpdf_USE_EXTRA_WARNINGS=0])
441   CXXFLAGS=$oCXXFLAGS
442   if test "$qpdf_USE_EXTRA_WARNINGS" = "1"; then
443      AC_MSG_RESULT(yes)
444      CXXWFLAGS="$try_flags"
445   else
446      AC_MSG_RESULT(no)
447   fi
448fi
449
450if test "$BUILDRULES" = "msvc"; then
451   try_flags=-FS
452   AC_MSG_CHECKING(for whether $CC supports $try_flags)
453   oCFLAGS=$CFLAGS
454   CFLAGS="$CFLAGS $try_flags"
455   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[int a = 1; int b = a; a = b;]])],
456                     [qpdf_USE_FS=1],[qpdf_USE_FS=0])
457   if test "$qpdf_USE_FS" = "1"; then
458      AC_MSG_RESULT(yes)
459      CXXFLAGS="$CXXFLAGS $try_flags"
460   else
461      AC_MSG_RESULT(no)
462      CFLAGS=$oCFLAGS
463   fi
464fi
465
466if test "$BUILDRULES" = "msvc"; then
467   try_flags="-WX"
468else
469   try_flags="-Werror"
470fi
471AC_MSG_CHECKING(for whether to use $try_flags)
472AC_ARG_ENABLE(werror,
473   AS_HELP_STRING([--enable-werror],
474                  [whether to treat warnings as errors (default is no)]),
475   [if test "$enableval" = "yes"; then
476      qpdf_USE_WERROR=1;
477    else
478      qpdf_USE_WERROR=0;
479    fi], [qpdf_USE_WERROR=0])
480if test "$qpdf_USE_WERROR" = "1"; then
481   AC_MSG_RESULT(yes)
482   WFLAGS="$WFLAGS $try_flags"
483else
484   AC_MSG_RESULT(no)
485fi
486
487if test "$BUILDRULES" = "msvc"; then
488   try_flags="-W3"
489else
490   try_flags="-Wconversion -Wsign-conversion"
491fi
492oCFLAGS=$CFLAGS
493CFLAGS="$CFLAGS $try_flags"
494AC_MSG_CHECKING(for whether to use $try_flags)
495AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[int a = 1; int b = a; a = b;]])],
496                  [qpdf_INT_WARNINGS=1],[qpdf_INT_WARNINGS=0])
497if test "$qpdf_INT_WARNINGS" = "1"; then
498   AC_MSG_RESULT(yes)
499   CXXFLAGS="$CXXFLAGS $try_flags"
500else
501   AC_MSG_RESULT(no)
502   CFLAGS=$oCFLAGS
503fi
504
505if test "$BUILDRULES" != "msvc"; then
506   try_flags="-Wshadow=local"
507   oCFLAGS=$CFLAGS
508   CFLAGS="$CFLAGS $try_flags -Werror"
509   AC_MSG_CHECKING(for whether to use $try_flags)
510   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[int a = 1; int b = a; a = b;]])],
511                     [qpdf_SHADOW_WARNINGS=1],[qpdf_SHADOW_WARNINGS=0])
512   if test "$qpdf_SHADOW_WARNINGS" = "1"; then
513      AC_MSG_RESULT(yes)
514      CFLAGS="$oCFLAGS $try_flags"
515      CXXFLAGS="$CXXFLAGS $try_flags"
516   else
517      AC_MSG_RESULT(no)
518      CFLAGS=$oCFLAGS
519   fi
520fi
521
522AC_MSG_CHECKING(for tm_gmtoff in struct tm)
523AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
524      #include <time.h>
525   ]],[[
526      struct tm tm;
527      tm.tm_gmtoff = 1;
528   ]])], [qpdf_TM_GMTOFF=1], [qpdf_TM_GMTOFF=0])
529if test "$qpdf_TM_GMTOFF" = "1"; then
530   AC_MSG_RESULT(yes)
531   AC_DEFINE([HAVE_TM_GMTOFF], [1], [Whether struct tm has tm_gmtoff])
532else
533   AC_MSG_RESULT(no)
534fi
535
536AC_MSG_CHECKING(for extern long timezone)
537AC_LINK_IFELSE([AC_LANG_PROGRAM([[
538      #include <time.h>
539      #include <stdio.h>
540   ]],[[
541      tzset();
542      printf("%ld\n", timezone);
543   ]])], [qpdf_EXTERN_LONG_TIMEZONE=1], [qpdf_EXTERN_LONG_TIMEZONE=0])
544if test "$qpdf_EXTERN_LONG_TIMEZONE" = "1"; then
545   AC_MSG_RESULT(yes)
546   AC_DEFINE([HAVE_EXTERN_LONG_TIMEZONE], [1], [Whether extern long timezone is available])
547else
548   AC_MSG_RESULT(no)
549fi
550
551LL_FMT=""
552oCFLAGS=$CFLAGS
553CFLAGS="$WFLAGS $CFLAGS"
554for fmt in "%lld" "%I64d" "%I64lld"; do
555  if test "$LL_FMT" = ""; then
556    AC_MSG_CHECKING(printf format for long long: $fmt)
557    AC_RUN_IFELSE([AC_LANG_PROGRAM(
558     [[
559        #define _CRT_SECURE_NO_WARNINGS
560        #include <stdio.h>
561        #include <string.h>
562     ]],
563     [[
564        long long int a = 123456789012345ll;
565        char s[30];
566        sprintf(s, "]$fmt[", a);
567        return (strcmp(s, "123456789012345") == 0) ? 0 : 1
568     ]]
569     )],
570     [LL_FMT=$fmt],[],[LL_FMT="%lld"])
571    if test "$LL_FMT" != ""; then
572       AC_MSG_RESULT(yes)
573    else
574       AC_MSG_RESULT(no)
575    fi
576  fi
577done
578CFLAGS=$oCFLAGS
579if test "LL_FMT" = ""; then
580  LL_FMT="%lld%"
581fi
582AC_DEFINE_UNQUOTED([LL_FMT], ["$LL_FMT"], [printf format for long long])
583
584AC_SUBST(WINDOWS_WMAIN_XLINK_FLAGS)
585AC_SUBST(WINDOWS_MAIN_XLINK_FLAGS)
586if test "$BUILDRULES" = "msvc"; then
587  WINDOWS_WMAIN_XLINK_FLAGS="-link wsetargv.obj"
588  WINDOWS_MAIN_XLINK_FLAGS="-link setargv.obj"
589fi
590
591dnl BEGIN CRYPTO
592
593dnl By default, we build in support for every crypto provider that we
594dnl can. If implicit crypto is disabled, we don't build support for
595dnl any crypto that is not explicitly enabled. Test for various crypto
596dnl providers in increasing order of priority. The last one found
597dnl becomes the default unless a default is explicitly specified.
598
599AC_MSG_CHECKING(for whether to use implicit crypto)
600AC_ARG_ENABLE(implicit-crypto,
601   AS_HELP_STRING([--enable-implicit-crypto],
602		  [whether to enable available crypto providers that are not explicitly requested; true by default]),
603   [if test "$enableval" = "yes"; then
604      IMPLICIT_CRYPTO=1
605    else
606      IMPLICIT_CRYPTO=0
607    fi],
608   [IMPLICIT_CRYPTO=1])
609if test "$IMPLICIT_CRYPTO" = "1"; then
610   AC_MSG_RESULT(yes)
611else
612   AC_MSG_RESULT(no)
613fi
614
615dnl Native crypto is always available unless explicitly disabled.
616
617AC_SUBST(USE_CRYPTO_NATIVE)
618AC_ARG_ENABLE(crypto-native,
619   AS_HELP_STRING([--enable-crypto-native],
620                  [whether to include support for native crypto provider]),
621   [if test "$enableval" = "yes"; then
622      USE_CRYPTO_NATIVE=1
623    else
624      USE_CRYPTO_NATIVE=0
625    fi],
626   [USE_CRYPTO_NATIVE=$IMPLICIT_CRYPTO])
627if test "$USE_CRYPTO_NATIVE" = "1"; then
628  AC_DEFINE([USE_CRYPTO_NATIVE], 1, [Whether to use the native crypto provider])
629  DEFAULT_CRYPTO=native
630fi
631
632dnl If the openssl/BoringSSL provider is explicitly requested, require openssl.
633dnl If the openssl provider is not explicitly disabled, enable it if
634dnl openssl is available. If the openssl provider is explicitly
635dnl disabled, do not link with openssl even if present.
636
637if test "$USE_EXTERNAL_LIBS" = "1"; then
638  OPENSSL_FOUND=1
639else
640  PKG_CHECK_MODULES([pc_openssl], [openssl >= 1.1.0],
641                    [OPENSSL_FOUND=1], [OPENSSL_FOUND=0])
642fi
643
644dnl Override pkg-config if headers and libraries are present.
645AS_IF([test "$OPENSSL_FOUND" = "0"],
646      [AC_CHECK_HEADER(
647       [openssl/evp.h],
648       [AC_SEARCH_LIBS(EVP_MD_CTX_new,crypto,[OPENSSL_FOUND=1])])
649      ])
650
651IMPLICIT_OPENSSL=0
652USE_CRYPTO_OPENSSL=0
653AC_SUBST(USE_CRYPTO_OPENSSL)
654AC_ARG_ENABLE(crypto-openssl,
655   AS_HELP_STRING([--enable-crypto-openssl],
656                  [whether to include support for the openssl crypto provider]),
657   [if test "$enableval" = "yes"; then
658      USE_CRYPTO_OPENSSL=1
659    else
660      USE_CRYPTO_OPENSSL=0
661    fi],
662   [IMPLICIT_OPENSSL=$IMPLICIT_CRYPTO])
663
664if test "$IMPLICIT_OPENSSL" = "1"; then
665  USE_CRYPTO_OPENSSL=$OPENSSL_FOUND
666  if test "$USE_CRYPTO_OPENSSL" = "1"; then
667    AC_MSG_NOTICE(enabling openssl crypto provider since openssl is available)
668  else
669    AC_MSG_NOTICE(not enabling openssl crypto provider since openssl was not found)
670  fi
671fi
672
673if test "$USE_CRYPTO_OPENSSL" = "1" -a "$OPENSSL_FOUND" = "0"; then
674  AC_MSG_ERROR(unable to use requested openssl crypto provider without openssl)
675fi
676
677if test "$USE_CRYPTO_OPENSSL" = "1"; then
678  CFLAGS="$CFLAGS $pc_openssl_CFLAGS"
679  CXXFLAGS="$CXXFLAGS $pc_openssl_CFLAGS $pc_openssl_CXXFLAGS"
680  LIBS="$LIBS $pc_openssl_LIBS"
681  AC_DEFINE([USE_CRYPTO_OPENSSL], 1, [Whether to use the openssl crypto provider])
682  DEFAULT_CRYPTO=openssl
683elif test "$OPENSSL_FOUND" = "1"; then
684  AC_MSG_NOTICE(not linking with openssl even though it is available)
685fi
686
687dnl If the gnutls provider is explicitly requested, require gnutls. If
688dnl the gnutls provider is not explicitly disabled, enable it if
689dnl gnutls is available. If the gnutls provider is explicitly
690dnl disabled, do not link with gnutls even if present.
691
692PKG_CHECK_MODULES([pc_gnutls], [gnutls], [GNUTLS_FOUND=1], [GNUTLS_FOUND=0])
693if test "$GNUTLS_FOUND" = "0"; then
694  AC_CHECK_HEADER(gnutls/gnutls.h,[GNUTLS_FOUND=1],[GNUTLS_FOUND=0])
695  AC_SEARCH_LIBS(gnutls_hash_init,gnutls,[GNUTLS_FOUND=1],[GNUTLS_FOUND=0])
696fi
697
698IMPLICIT_GNUTLS=0
699USE_CRYPTO_GNUTLS=0
700AC_SUBST(USE_CRYPTO_GNUTLS)
701AC_ARG_ENABLE(crypto-gnutls,
702   AS_HELP_STRING([--enable-crypto-gnutls],
703                  [whether to include support for gnutls crypto provider]),
704   [if test "$enableval" = "yes"; then
705      USE_CRYPTO_GNUTLS=1
706    else
707      USE_CRYPTO_GNUTLS=0
708    fi],
709   [IMPLICIT_GNUTLS=$IMPLICIT_CRYPTO])
710
711if test "$IMPLICIT_GNUTLS" = "1"; then
712  USE_CRYPTO_GNUTLS=$GNUTLS_FOUND
713  if test "$USE_CRYPTO_GNUTLS" = "1"; then
714    AC_MSG_NOTICE(enabling gnutls crypto provider since gnutls is available)
715  else
716    AC_MSG_NOTICE(not enabling gnutls crypto provider since gnutls was not found)
717  fi
718fi
719
720if test "$USE_CRYPTO_GNUTLS" = "1" -a "$GNUTLS_FOUND" = "0"; then
721  AC_MSG_ERROR(unable to use requested gnutls crypto provider without gnutls)
722fi
723
724if test "$USE_CRYPTO_GNUTLS" = "1"; then
725  CFLAGS="$CFLAGS $pc_gnutls_CFLAGS"
726  CXXFLAGS="$CXXFLAGS $pc_gnutls_CFLAGS $pc_gnutls_CXXFLAGS"
727  LIBS="$LIBS $pc_gnutls_LIBS"
728  AC_DEFINE([USE_CRYPTO_GNUTLS], 1, [Whether to use the gnutls crypto provider])
729  DEFAULT_CRYPTO=gnutls
730elif test "$GNUTLS_FOUND" = "1"; then
731  AC_MSG_NOTICE(not linking with gnutls even though it is available)
732fi
733
734dnl Allow the default crypto provider to be specified explicitly.
735
736AC_MSG_CHECKING(which crypto to use by default)
737AC_SUBST(DEFAULT_CRYPTO)
738AC_ARG_WITH(default-crypto,
739   AS_HELP_STRING([--with-default-crypto=provider],
740		  [which crypto provider to use by default; see README.md]),
741   [DEFAULT_CRYPTO=$withval],
742   [])
743AC_MSG_RESULT($DEFAULT_CRYPTO)
744AC_DEFINE_UNQUOTED([DEFAULT_CRYPTO], "$DEFAULT_CRYPTO", [Default crypto provider])
745
746dnl Make sure the default crypto provider is actually being built.
747
748bad_crypto=0
749case "$DEFAULT_CRYPTO" in
750  "native")
751    if test "$USE_CRYPTO_NATIVE" != "1"; then
752      bad_crypto=1
753    fi
754  ;;
755  "openssl")
756    if test "$USE_CRYPTO_OPENSSL" != "1"; then
757      bad_crypto=1
758    fi
759  ;;
760  "gnutls")
761    if test "$USE_CRYPTO_GNUTLS" != "1"; then
762      bad_crypto=1
763    fi
764  ;;
765  *)
766    bad_crypto=1
767  ;;
768esac
769if test "$bad_crypto" = "1"; then
770  AC_MSG_ERROR(Unsupported default crypto: $DEFAULT_CRYPTO)
771fi
772
773dnl END CRYPTO
774
775AC_SUBST(QPDF_SKIP_TEST_COMPARE_IMAGES)
776AC_ARG_ENABLE(test-compare-images,
777   AS_HELP_STRING([--enable-test-compare-images],
778		  [whether to compare images in test suite; disabled by default, enabling requires ghostscript and tiffcmp to be available]),
779   [if test "$enableval" = "no"; then
780      QPDF_SKIP_TEST_COMPARE_IMAGES=1
781    else
782      QPDF_SKIP_TEST_COMPARE_IMAGES=0
783    fi],
784   [QPDF_SKIP_TEST_COMPARE_IMAGES=1])
785
786AC_SUBST(SHOW_FAILED_TEST_OUTPUT)
787AC_ARG_ENABLE(show-failed-test-output,
788   AS_HELP_STRING([--enable-show-failed-test-output],
789		  [if specified, write failed test output to the console; useful for building on build servers where you can't easily open the test output files]),
790   [if test "$enableval" = "no"; then
791      SHOW_FAILED_TEST_OUTPUT=0
792    else
793      SHOW_FAILED_TEST_OUTPUT=1
794    fi],
795   [SHOW_FAILED_TEST_OUTPUT=0])
796
797AC_CHECK_PROG(LATEX,latex,latex,[])
798AC_CHECK_PROG(PDFLATEX,pdflatex,pdflatex,[])
799AC_CHECK_PROG(LATEXMK,latexmk,latexmk,[])
800AC_CHECK_PROG(SPHINX,sphinx-build,sphinx-build,[])
801
802AC_ARG_ENABLE(doc-maintenance,
803   AS_HELP_STRING([--enable-doc-maintenance],
804		  [if set, enables all documentation options]),
805   [if test "$enableval" = "yes"; then
806      doc_default=1;
807    else
808      doc_default=0;
809    fi],
810   [doc_default=0])
811
812BUILD_HTML=0
813AC_SUBST(BUILD_HTML)
814AC_ARG_ENABLE(html-doc,
815   AS_HELP_STRING([--enable-html-doc],
816		  [whether to build HTML documents]),
817   [if test "$enableval" = "yes"; then
818      BUILD_HTML=1;
819    else
820      BUILD_HTML=0;
821    fi],
822   [BUILD_HTML=$doc_default])
823BUILD_PDF=0
824AC_SUBST(BUILD_PDF)
825AC_ARG_ENABLE(pdf-doc,
826   AS_HELP_STRING([--enable-pdf-doc],
827		  [whether to build PDF documents]),
828   [if test "$enableval" = "yes"; then
829      BUILD_PDF=1;
830    else
831      BUILD_PDF=0;
832    fi],
833   [BUILD_PDF=$doc_default])
834
835AC_SUBST(OSS_FUZZ)
836AC_ARG_ENABLE(oss-fuzz,
837   AS_HELP_STRING([--enable-oss-fuzz],
838		  [if set, build static fuzzers for oss-fuzz]),
839   [if test "$enableval" = "yes"; then
840      OSS_FUZZ=1;
841    else
842      OSS_FUZZ=0;
843    fi],
844   [OSS_FUZZ=0])
845
846if test "$BUILD_HTML" = "1"; then
847   if test "$SPHINX" = ""; then
848      MISSING_SPHINX=1
849      MISSING_ANY=1
850   fi
851fi
852if test "$BUILD_PDF" = "1"; then
853   if test "$SPHINX" = ""; then
854      MISSING_SPHINX=1
855      MISSING_ANY=1
856   fi
857   if test "$LATEX" = ""; then
858      MISSING_LATEX=1
859      MISSING_ANY=1
860   fi
861   if test "$LATEXMK" = ""; then
862      MISSING_LATEXMK=1
863      MISSING_ANY=1
864   fi
865   if test "$PDFLATEX" = ""; then
866      MISSING_PDFLATEX=1
867      MISSING_ANY=1
868   fi
869fi
870
871if test "$MISSING_ANY" = "1"; then
872  ISSUE_WARNINGS=1
873fi
874if test "$ISSUE_WARNINGS" = "1"; then
875  echo ""
876  echo ""
877fi
878
879if test "$MISSING_MAKE_381" = "1"; then
880  AC_MSG_WARN(gnu make >= 3.81 is required)
881fi
882
883if test "$MISSING_ZLIB_H" = "1"; then
884  AC_MSG_WARN(unable to find required header zlib.h)
885fi
886
887if test "$MISSING_ZLIB" = "1"; then
888  AC_MSG_WARN(unable to find required library z (or zlib))
889fi
890
891if test "$MISSING_JPEG_H" = "1"; then
892  AC_MSG_WARN(unable to find required header jpeglib.h)
893fi
894
895if test "$MISSING_JPEG" = "1"; then
896  AC_MSG_WARN(unable to find required library jpeg)
897fi
898
899if test "$MISSING_LATEX" = "1"; then
900  AC_MSG_WARN(latex is required to build PDF documentation)
901fi
902
903if test "$MISSING_LATEXMK" = "1"; then
904  AC_MSG_WARN(latexmk is required to build PDF documentation)
905fi
906
907if test "$MISSING_PDFLATEX" = "1"; then
908  AC_MSG_WARN(pdflatex is required to build PDF documentation)
909fi
910
911if test "$MISSING_SPHINX" = "1"; then
912  AC_MSG_WARN(sphinx-build is required to build documentation)
913fi
914
915if test "$ISSUE_WARNINGS" = "1"; then
916  echo ""
917  echo ""
918fi
919
920if test "$MISSING_ANY" = "1"; then
921  AC_MSG_ERROR(some required prerequisites were not found)
922fi
923
924# Do this last so it doesn't interfere with other tests.
925if test "$USE_EXTERNAL_LIBS" = "1"; then
926   # Don't actually check for the presence of this -- we document that
927   # the user can run this and then edit autoconf.mk if they have too
928   # much trouble getting it to work with a different compiler.
929   CPPFLAGS="$CPPFLAGS -Iexternal-libs/include"
930   LDFLAGS="$LDFLAGS -Lexternal-libs/lib-$BUILDRULES$WINDOWS_WORDSIZE"
931   LIBS="$LIBS -lz -ljpeg -lssl -lcrypto -lmsvcrt -lws2_32 -lshell32 -ladvapi32 -lgdi32 -luser32 -lcrypt32"
932fi
933
934AC_OUTPUT
935