configure.ac (29592B)
1 # Process this file with autoconf to produce a configure script. 2 # 3 # This file is part of GNU libextractor 4 # Copyright (C) 2003-2026 Christian Grothoff 5 # 6 # GNU libextractor is free software; you can redistribute it and/or modify it under the 7 # terms of the GNU General Public License as published by the Free Software 8 # Foundation; either version 3, or (at your option) any later version. 9 # 10 # GNU libextractor is distributed in the hope that it will be useful, but WITHOUT ANY 11 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR 12 # A PARTICULAR PURPOSE. See the GNU General Public License for more details. 13 # 14 # You should have received a copy of the GNU General Public License along with 15 # GNU libextractor; see the file COPYING. If not, If not, see <http://www.gnu.org/license> 16 # 17 # 18 AC_PREREQ([2.72]) 19 AC_INIT([libextractor],[1.19],[bug-libextractor@gnu.org]) 20 AC_CONFIG_AUX_DIR([build-aux]) 21 AC_CONFIG_HEADERS([config.h]) 22 AC_CONFIG_MACRO_DIR([m4]) 23 AC_CANONICAL_TARGET 24 AC_CANONICAL_HOST 25 AC_CANONICAL_TARGET 26 27 LIB_VERSION_CURRENT=4 28 LIB_VERSION_REVISION=10 29 LIB_VERSION_AGE=1 30 AC_SUBST(LIB_VERSION_CURRENT) 31 AC_SUBST(LIB_VERSION_REVISION) 32 AC_SUBST(LIB_VERSION_AGE) 33 34 AM_INIT_AUTOMAKE([silent-rules]) 35 36 # Checks for programs. 37 AC_USE_SYSTEM_EXTENSIONS 38 AC_PROG_AWK 39 AC_PROG_CC 40 AM_PROG_CC_C_O 41 AC_PROG_CPP 42 AC_PROG_CXX 43 AC_CHECK_PROG(HAVE_CXX, $CXX, yes, no) 44 AC_PROG_INSTALL 45 AC_PROG_LN_S 46 AC_PROG_MAKE_SET 47 AC_CANONICAL_HOST 48 LT_INIT 49 # save LIBS, libtool does a AC_SEARCH_LIBS(dlopen, dl), but plugins 50 # need not have -ldl added 51 LT_INIT([disable-static dlopen win32-dll]) 52 AC_SUBST(MKDIR_P) 53 54 AC_CHECK_DECLS([_stati64]) 55 56 AS_CASE(["$target_os"], 57 [*linux-gnu],[ 58 AC_DEFINE(GNU_LINUX,1,[This is a GNU/Linux system]) 59 AC_DEFINE_UNQUOTED(GNU_LINUX,1,[This is a GNU/Linux system]) 60 AM_CONDITIONAL(HAVE_GNU_LD, true) 61 AM_CONDITIONAL(SOMEBSD, false) 62 AM_CONDITIONAL(WINDOWS, false) 63 XTRA_CPPLIBS=-lstdc++ 64 LIBEXT=.so 65 ], 66 [freebsd*],[ 67 AC_DEFINE_UNQUOTED(SOMEBSD,1,[This is a BSD system]) 68 AC_CHECK_LIB(c_r, pthread_create) 69 AM_CONDITIONAL(HAVE_GNU_LD, true) 70 AM_CONDITIONAL(SOMEBSD, true) 71 AM_CONDITIONAL(WINDOWS, false) 72 XTRA_CPPLIBS=-lstdc++ 73 LIBEXT=.so 74 ], 75 [openbsd*],[ 76 AC_DEFINE_UNQUOTED(SOMEBSD,1,[This is a BSD system]) 77 AC_CHECK_LIB(c_r, pthread_create) 78 AM_CONDITIONAL(HAVE_GNU_LD, true) 79 AM_CONDITIONAL(SOMEBSD, true) 80 AM_CONDITIONAL(WINDOWS, false) 81 XTRA_CPPLIBS=-lstdc++ 82 LIBEXT=.so 83 ], 84 [netbsd*],[ 85 AC_DEFINE_UNQUOTED(SOMEBSD,1,[This is a BSD system]) 86 AC_CHECK_LIB(c_r, pthread_create) 87 AM_CONDITIONAL(HAVE_GNU_LD, true) 88 AM_CONDITIONAL(SOMEBSD, true) 89 AM_CONDITIONAL(WINDOWS, false) 90 XTRA_CPPLIBS=-lstdc++ 91 LIBEXT=.so 92 ], 93 [*solaris*],[ 94 AC_DEFINE_UNQUOTED(SOLARIS,1,[This is a Solaris system]) 95 AC_CHECK_LIB(resolv, res_init) 96 XTRA_CPPLIBS=-lstdc++ 97 AM_CONDITIONAL(HAVE_GNU_LD, false) 98 AM_CONDITIONAL(SOMEBSD, false) 99 AM_CONDITIONAL(WINDOWS, false) 100 AM_CFLAGS="-D_POSIX_PTHREAD_SEMANTICS $AM_CFLAGS" 101 LIBEXT=.so 102 ], 103 [darwin*],[ 104 AC_DEFINE_UNQUOTED(DARWIN,1,[This is a Darwin system]) 105 AM_CONDITIONAL(HAVE_GNU_LD, false) 106 AM_CONDITIONAL(SOMEBSD, false) 107 AM_CONDITIONAL(WINDOWS, false) 108 AM_CFLAGS="-fno-common $AM_CFLAGS" 109 LIBEXT=.so 110 ], 111 [cygwin*],[ 112 AC_DEFINE_UNQUOTED(CYGWIN,1,[This is a CYGWIN system]) 113 AM_CONDITIONAL(SOMEBSD, false) 114 AM_CONDITIONAL(HAVE_GNU_LD, false) 115 AM_CONDITIONAL(WINDOWS, false) 116 LIBEXT=.dll 117 ], 118 [mingw*],[ 119 AC_DEFINE_UNQUOTED(MINGW,1,[This is a MinGW system]) 120 AC_DEFINE_UNQUOTED(WINDOWS,1,[This is a Windows system]) 121 AC_CHECK_LIB(intl, gettext) 122 # Sufficiently new Windows XP 123 AM_CFLAGS="-D__MSVCRT_VERSION__=0x0601 $AM_CFLAGS" 124 AM_CPPFLAGS="-DFTRUNCATE_DEFINED=1 $AM_CPPFLAGS" 125 126 AC_MSG_CHECKING(for PlibC) 127 plibc=0 128 AC_ARG_WITH(plibc, 129 [ --with-plibc=PFX Base of PliBC installation], 130 [AC_MSG_RESULT([$with_plibc]) 131 AS_CASE([$with_plibc], 132 [no],[], 133 [yes],[ 134 AC_CHECK_HEADERS([plibc.h], 135 AC_CHECK_LIB([plibc], [plibc_init], 136 plibc=1)) 137 ],[ 138 AM_LDFLAGS="-L$with_plibc/lib $AM_LDFLAGS" 139 AM_CPPFLAGS="-I$with_plibc/include $AM_CPPFLAGS" 140 AC_CHECK_HEADERS([plibc.h], 141 AC_CHECK_LIB([plibc], [plibc_init], 142 EXT_LIB_PATH="-L$with_plibc/lib $EXT_LIB_PATH" 143 plibc=1)) 144 ]) 145 ], 146 [AC_MSG_RESULT([--with-plibc not specified]) 147 AM_LDFLAGS="-L/usr/lib $AM_LDFLAGS" 148 AM_CPPFLAGS="-I/usr/include $AM_CPPFLAGS" 149 AC_CHECK_HEADERS([plibc.h], 150 AC_CHECK_LIB([plibc], [plibc_init], 151 EXT_LIB_PATH="-L$with_plibc/lib $EXT_LIB_PATH" 152 plibc=1))]) 153 154 AS_IF([test $plibc -ne 1], 155 [AC_MSG_ERROR([libextractor requires PlibC])], 156 [LIBS="$LIBS -lplibc"]) 157 158 AM_LDFLAGS="$AM_LDFLAGS -Wl,--export-all-symbols" 159 AM_CONDITIONAL(HAVE_GNU_LD, true) 160 AM_CONDITIONAL(SOMEBSD, false) 161 AM_CONDITIONAL(WINDOWS, true) 162 LIBEXT=.dll 163 ],[ 164 AC_MSG_RESULT(Unrecognised OS $host_os) 165 AC_DEFINE_UNQUOTED(OTHEROS,1,[Some strange OS]) 166 AC_MSG_RESULT(otheros) 167 AC_DEFINE(GNU_LINUX,1,[We hope this is a GNU/Linux-compatible system]) 168 AC_DEFINE_UNQUOTED(GNU_LINUX,1,[We hope this is a GNU/Linux-compatible system]) 169 AM_CONDITIONAL(HAVE_GNU_LD, false) 170 AM_CONDITIONAL(SOMEBSD, false) 171 AM_CONDITIONAL(WINDOWS, false) 172 LIBEXT=.so 173 ] 174 ) 175 176 AM_ICONV 177 178 PKG_PROG_PKG_CONFIG() 179 180 # We define the paths here, because MinGW/GCC expands paths 181 # passed through the command line ("-DLOCALEDIR=..."). This would 182 # lead to hard-coded paths ("C:\mingw\mingw\bin...") that do 183 # not contain the actual installation. 184 AC_DEFINE_DIR([LOCALEDIR], [datarootdir/locale], [gettext catalogs]) 185 186 ISOPFX=`pkg-config --variable=prefix iso-codes` 187 pkg-config --variable=prefix iso-codes 2> /dev/null || ISOPFX=/usr 188 AC_DEFINE_DIR([ISOLOCALEDIR], [ISOPFX/share/locale], [iso-639 catalog]) 189 190 # relative plugin directory 191 rplugindir="libextractor" 192 AC_ARG_WITH(plugindirname, 193 AS_HELP_STRING([--with-plugindirname],[install directory for plugins (always relative to libdir)]), 194 [rplugindir=$withval]) 195 AC_SUBST(RPLUGINDIR, $rplugindir) 196 197 # large file support 198 AC_SYS_LARGEFILE 199 AC_FUNC_FSEEKO 200 201 AM_CONDITIONAL(CYGWIN, test "$build_os" = "cygwin") 202 AM_CONDITIONAL(MINGW, test "$build_os" = "mingw32") 203 204 205 # use '-fno-strict-aliasing', but only if the compiler can take it 206 AS_IF([gcc -fno-strict-aliasing -S -o /dev/null -xc /dev/null >/dev/null 2>&1], 207 [AM_CFLAGS="-fno-strict-aliasing $AM_CFLAGS"]) 208 209 AM_CONDITIONAL(HAVE_CXX, test "x$HAVE_CXX" = "xyes") 210 211 212 # Adam shostack suggests the following for Windows: 213 # -D_FORTIFY_SOURCE=2 -fstack-protector-all 214 AC_ARG_ENABLE(gcc-hardening, 215 [AS_HELP_STRING(--enable-gcc-hardening, enable compiler security checks)], 216 [AS_IF([test x$enableval = xyes], 217 [AM_CFLAGS="$AM_CFLAGS -D_FORTIFY_SOURCE=2 -fstack-protector-all" 218 AM_CFLAGS="$AM_CFLAGS -fwrapv -fPIE -Wstack-protector" 219 AM_CFLAGS="$AM_CFLAGS --param ssp-buffer-size=1" 220 AM_LDFLAGS="$AM_LDFLAGS -pie"])]) 221 222 223 # Linker hardening options 224 # Currently these options are ELF specific - you can't use this with MacOSX 225 AC_ARG_ENABLE(linker-hardening, 226 [AS_HELP_STRING(--enable-linker-hardening, enable linker security fixups)], 227 [AS_IF([x$enableval = xyes], 228 [AM_LDFLAGS="$AM_LDFLAGS -z relro -z now"])]) 229 230 231 # Support for hiding non-public symbols 232 HIDDEN_VISIBILITY_CFLAGS="" 233 AS_CASE(["$host"], 234 [*-*-mingw*],[ 235 # mingw32 we do -fvisibility=hidden and __declspec(dllexport) 236 AC_DEFINE([_EXTRACTOR_EXTERN], [__attribute__((visibility("default"))) __declspec(dllexport) extern], 237 [defines how to decorate public symbols while building]) 238 HIDDEN_VISIBILITY_CFLAGS="-fvisibility=hidden" 239 ],[ 240 # other compilers, check if we can do -fvisibility=hidden 241 AX_CHECK_LINK_FLAG([-fvisibility=hidden], 242 [AX_CHECK_COMPILE_FLAG([-fvisibility=hidden], 243 [AC_DEFINE([_EXTRACTOR_EXTERN], [__attribute__((visibility("default"))) extern], 244 [defines how to decorate public symbols while building]) 245 HIDDEN_VISIBILITY_CFLAGS="-fvisibility=hidden"])]) 246 ]) 247 AC_SUBST(HIDDEN_VISIBILITY_CFLAGS) 248 249 250 251 # Checks for libraries. 252 253 AC_CHECK_HEADERS([langinfo.h]) 254 255 # Check for libltdl header (#2999) 256 ltdl=0 257 AC_MSG_CHECKING(for libltdl) 258 AC_ARG_WITH(ltdl, 259 [ --with-ltdl=PFX base of libltdl installation], 260 [AC_MSG_RESULT([$with_ltdl]) 261 AS_CASE([$with_ltdl], 262 [no],[], 263 [yes],[ 264 AC_CHECK_HEADERS(ltdl.h, 265 AC_CHECK_LIB([ltdl], [lt_dlopenext], 266 ltdl=1)) 267 ],[ 268 OLD_LIBS="$LIBS" 269 LIBS="-L$with_ltdl/lib $LIBS" 270 AM_CPPFLAGS="-I$with_ltdl/include $AM_CPPFLAGS" 271 AC_CHECK_HEADERS(ltdl.h, 272 AC_CHECK_LIB([ltdl], [lt_dlopenext], 273 EXT_LIB_PATH="-L$with_ltdl/lib $EXT_LIB_PATH" 274 ltdl=1)) 275 LIBS="$OLD_LIBS" 276 ]) 277 ], 278 [AC_MSG_RESULT([--with-ltdl not specified]) 279 AC_CHECK_HEADERS(ltdl.h, 280 AC_CHECK_LIB([ltdl], [lt_dlopenext], 281 ltdl=1))]) 282 AS_IF([test x$ltdl = x1], 283 [AC_MSG_RESULT([libltdl found])], 284 [AC_MSG_ERROR([libextractor requires libltdl (from GNU libtool), try installing libltdl-dev])]) 285 286 # check for apparmor 287 AC_CHECK_LIB(apparmor, aa_change_profile, 288 [AC_CHECK_HEADERS([sys/apparmor.h], 289 AM_CONDITIONAL(HAVE_APPARMOR, true) 290 AC_DEFINE(HAVE_APPARMOR,1,[Have apparmor]), 291 AM_CONDITIONAL(HAVE_APPARMOR, false) 292 AC_DEFINE(HAVE_APPARMOR,0,[lacking apparmor]))], 293 AM_CONDITIONAL(HAVE_APPARMOR, false), 294 -lapparmor) 295 296 # FIXME: allow --with-oggvorbis=PFX 297 298 # test if we have vorbisfile 299 # prior versions had ov_open_callbacks in libvorbis, test that, too. 300 AC_CHECK_LIB(vorbisfile, ov_open_callbacks, 301 [AC_CHECK_HEADERS([vorbis/vorbisfile.h], 302 AM_CONDITIONAL(HAVE_VORBISFILE, true) 303 AC_DEFINE(HAVE_VORBISFILE,1,[Have vorbisfile]), 304 AM_CONDITIONAL(HAVE_VORBISFILE, false) 305 AC_DEFINE(HAVE_VORBISFILE,0,[lacking vorbisfile]))], 306 AM_CONDITIONAL(HAVE_VORBISFILE, false), 307 -lvorbis -logg) 308 AC_CHECK_LIB(FLAC, FLAC__stream_decoder_init_stream, 309 [AC_CHECK_HEADERS([FLAC/all.h], 310 AM_CONDITIONAL(HAVE_FLAC, true) 311 AC_DEFINE(HAVE_FLAC,1,[Have flac]), 312 AM_CONDITIONAL(HAVE_FLAC, false))], 313 AM_CONDITIONAL(HAVE_FLAC, false), 314 -logg) 315 # test without -logg to see whether we really need it (libflac can be without) 316 AC_CHECK_LIB(FLAC, FLAC__stream_decoder_init_ogg_stream, 317 AM_CONDITIONAL(HAVE_FLAC, true) 318 AC_DEFINE(HAVE_FLAC,1,[Have flac]) 319 AM_CONDITIONAL(NEED_OGG, false), 320 [AM_CONDITIONAL(NEED_OGG, true)]) 321 AC_CHECK_LIB(vorbisfile, vorbis_comment_query, 322 AM_CONDITIONAL(NEED_VORBIS, false), 323 AM_CONDITIONAL(NEED_VORBIS, true), 324 -logg) 325 326 AC_CHECK_LIB(z, inflate, 327 [AC_CHECK_HEADERS([zlib.h], 328 AM_CONDITIONAL(HAVE_ZLIB, true) 329 AC_DEFINE(HAVE_ZLIB,1,[Have zlib]), 330 AM_CONDITIONAL(HAVE_ZLIB, false))], 331 AM_CONDITIONAL(HAVE_ZLIB, false)) 332 333 AC_CHECK_LIB(bz2, BZ2_bzDecompress, 334 [AC_CHECK_HEADERS([bzlib.h], 335 AM_CONDITIONAL(HAVE_BZ2, true) 336 AC_DEFINE(HAVE_LIBBZ2,1,[Have libbz2]), 337 AM_CONDITIONAL(HAVE_BZ2, false))], 338 AM_CONDITIONAL(HAVE_BZ2, false)) 339 340 AC_CHECK_LIB(rpm, rpmReadPackageFile, 341 [AC_CHECK_HEADERS([rpm/rpmlib.h], 342 AM_CONDITIONAL(HAVE_LIBRPM, true) 343 AC_DEFINE(HAVE_LIBRPM,1,[Have librpm]), 344 AM_CONDITIONAL(HAVE_LIBRPM, false))], 345 AM_CONDITIONAL(HAVE_LIBRPM, false)) 346 347 AC_CHECK_LIB(vlc, libvlc_media_player_play, 348 [AC_CHECK_HEADERS([vlc/vlc.h], 349 AM_CONDITIONAL(HAVE_LIBVLC, true) 350 AC_DEFINE(HAVE_LIBVLC,1,[Have libvlc]), 351 AM_CONDITIONAL(HAVE_LIBVLC, false))], 352 AM_CONDITIONAL(HAVE_LIBVLC, false)) 353 354 AC_CHECK_LIB(mpeg2, mpeg2_init, 355 [AC_CHECK_HEADERS([mpeg2dec/mpeg2.h], 356 AM_CONDITIONAL(HAVE_MPEG2, true) 357 AC_DEFINE(HAVE_MPEG2,1,[Have libmpeg2]), 358 AM_CONDITIONAL(HAVE_MPEG2, false))], 359 AM_CONDITIONAL(HAVE_MPEG2, false)) 360 361 AC_CHECK_LIB(jpeg, jpeg_mem_src, 362 [AC_CHECK_HEADERS([jpeglib.h], 363 AM_CONDITIONAL(HAVE_JPEG, true) 364 AC_DEFINE(HAVE_JPEG,1,[Have libjpeg]), 365 AM_CONDITIONAL(HAVE_JPEG, false))], 366 AM_CONDITIONAL(HAVE_JPEG, false)) 367 368 AC_CHECK_LIB(tiff, TIFFClientOpen, 369 [AC_CHECK_HEADERS([tiffio.h], 370 AM_CONDITIONAL(HAVE_TIFF, true) 371 AC_DEFINE(HAVE_TIFF,1,[Have libtiff]), 372 AM_CONDITIONAL(HAVE_TIFF, false))], 373 AM_CONDITIONAL(HAVE_TIFF, false)) 374 375 AC_CHECK_LIB(archive, archive_read_open, 376 [AC_CHECK_HEADERS([archive.h], 377 AM_CONDITIONAL(HAVE_ARCHIVE, true) 378 AC_DEFINE(HAVE_ARCHIVE,1,[Have libarchive]), 379 AM_CONDITIONAL(HAVE_ARCHIVE, false))], 380 AM_CONDITIONAL(HAVE_ARCHIVE, false)) 381 382 # should experimental code be compiled (code that may not yet compile)? 383 AC_MSG_CHECKING(whether to compile experimental code) 384 AC_ARG_ENABLE([experimental], 385 [AS_HELP_STRING([--enable-experimental], [enable compiling experimental code])], 386 [enable_experimental=${enableval}], 387 [enable_experimental=no]) 388 AC_MSG_RESULT($enable_experimental) 389 AM_CONDITIONAL([HAVE_EXPERIMENTAL], [test "x$enable_experimental" = "xyes"]) 390 391 392 AC_MSG_CHECKING(for ImageFactory::iptcData in -lexiv2) 393 AC_LANG_PUSH(C++) 394 SAVED_AM_LDFLAGS=$AM_LDFLAGS 395 AM_LDFLAGS="$AM_LDFLAGS -lexiv2" 396 AC_LINK_IFELSE( 397 [AC_LANG_PROGRAM([[#include <iostream> 398 #include <exiv2/exif.hpp> 399 #include <exiv2/image.hpp> 400 #include <exiv2/futils.hpp>]], 401 [[Exiv2::Image *foo = NULL; foo->iptcData(); ]])], 402 [AC_MSG_RESULT(yes) 403 AM_CONDITIONAL(HAVE_EXIV2, true) 404 AC_DEFINE(HAVE_EXIV2,1,[Have exifData in libexiv2])], 405 [AC_MSG_RESULT(no) 406 AM_CONDITIONAL(HAVE_EXIV2, false)]) 407 AM_LDFLAGS=$SAVED_AM_LDFLAGS 408 AC_LANG_POP(C++) 409 410 411 # poppler-cpp is poppler's stable C++ binding. 0.73.0 (2019) is 412 # the first release with the non-deprecated time_t date accessors 413 # that the PDF plugin relies on. 414 PKG_CHECK_MODULES([POPPLER], [poppler-cpp >= 0.73.0], 415 [AM_CONDITIONAL(HAVE_POPPLER, true) 416 AC_DEFINE(HAVE_POPPLER, 1, [Have libpoppler-cpp])], 417 [AM_CONDITIONAL(HAVE_POPPLER, false)]) 418 419 420 AC_MSG_CHECKING(for DGifOpen -lgif) 421 SAVED_AM_LDFLAGS=$AM_LDFLAGS 422 AC_CHECK_LIB(gif, DGifOpen, 423 [AC_CHECK_HEADERS([gif_lib.h], 424 AM_CONDITIONAL(HAVE_GIF, true) 425 AC_DEFINE(HAVE_GIF,1,[Have libgif]), 426 AM_CONDITIONAL(HAVE_GIF, false))], 427 AM_CONDITIONAL(HAVE_GIF, false)) 428 429 AC_MSG_CHECKING(for magic_open -lmagic) 430 SAVED_AM_LDFLAGS=$AM_LDFLAGS 431 have_magic=no 432 AC_CHECK_LIB(magic, magic_open, 433 [AC_CHECK_HEADERS([magic.h], 434 [AM_CONDITIONAL(HAVE_MAGIC, true) 435 have_magic=yes], 436 AM_CONDITIONAL(HAVE_MAGIC, false))], 437 AM_CONDITIONAL(HAVE_MAGIC, false)) 438 439 # tidyNodeGetValue was already available in 5.0.0, released in 2015. 440 maybe_tidy=1 441 PKG_CHECK_MODULES([TIDY], [tidy >= 5.0.0], 442 [AC_DEFINE(HAVE_TIDY, 1, [Have tidy]) 443 AM_CONDITIONAL(HAVE_TIDY, true)], 444 [maybe_tidy=0]) 445 CFLAGS="$CFLAGS $TIDY_CFLAGS" 446 LIBS="$LIBS $TIDY_LIBS" 447 448 AC_CHECK_HEADERS([tidy.h],, 449 AC_CHECK_HEADERS([tidy/tidy.h],,[maybe_tidy=0])) 450 451 AM_CONDITIONAL(HAVE_TIDY, test "x$maybe_tidy" = "x1") 452 453 # should 'make check' run tests? 454 AC_MSG_CHECKING(whether to run tests) 455 AC_ARG_ENABLE([testruns], 456 [AS_HELP_STRING([--disable-testruns], [disable running tests on make check (default is YES)])], 457 [enable_tests_run=${enableval}], 458 [enable_tests_run=yes]) 459 AC_MSG_RESULT($enable_test_run) 460 AM_CONDITIONAL([ENABLE_TEST_RUN], [test "x$enable_tests_run" = "xyes"]) 461 462 AC_HEADER_DIRENT 463 AC_HEADER_STDBOOL 464 AC_CHECK_HEADERS([iconv.h fcntl.h netinet/in.h stdlib.h string.h unistd.h libintl.h limits.h stddef.h zlib.h]) 465 466 # Checks for typedefs, structures, and compiler characteristics. 467 AC_C_INLINE 468 AC_TYPE_SIZE_T 469 AC_TYPE_PID_T 470 GNUPG_CHECK_ENDIAN 471 472 # Checks for library functions. 473 AC_FUNC_MEMCMP 474 AC_FUNC_VPRINTF 475 AC_FUNC_MMAP 476 AC_FUNC_STAT 477 AC_FUNC_ERROR_AT_LINE 478 AC_SEARCH_LIBS(dlopen, dl) 479 AC_SEARCH_LIBS(shm_open, rt) 480 AC_CHECK_FUNCS([mkstemp strndup munmap strcasecmp strdup strncasecmp memmove memset strtoul floor getcwd pow setenv sqrt strchr strcspn strrchr strnlen strndup ftruncate shm_open shm_unlink lseek64 secure_getenv issetugid]) 481 482 483 # is kind of tedious, but simple and straightforward 484 sockets=no 485 AC_MSG_CHECKING(for sockets) 486 AC_LANG_PUSH(C) 487 SAVED_LIBS="$LIBS" 488 SOCKET_LIBS= 489 AC_LINK_IFELSE( 490 [ 491 AC_LANG_PROGRAM( 492 [[#include <sys/socket.h>]], 493 [[int s = socket (AF_INET, SOCK_STREAM, 6);]] 494 ) 495 ], 496 [ 497 sockets=yes 498 ], 499 [ 500 LIBS="$SAVED_LIBS -lsocket" 501 AC_LINK_IFELSE( 502 [ 503 AC_LANG_PROGRAM( 504 [[#include <sys/socket.h>]], 505 [[int s = socket (AF_INET, SOCK_STREAM, 6);]] 506 ) 507 ], 508 [ 509 sockets=yes 510 SOCKET_LIBS="-lsocket" 511 ], 512 [ 513 AC_LINK_IFELSE( 514 [ 515 AC_LANG_PROGRAM( 516 [[#include <winsock2.h>]], 517 [[int s = socket (AF_INET, SOCK_STREAM, 6);]] 518 ) 519 ], 520 [ 521 sockets=yes 522 ], 523 [ 524 LIBS="$SAVED_LIBS -lws2_32" 525 AC_LINK_IFELSE( 526 [ 527 AC_LANG_PROGRAM( 528 [[#include <winsock2.h>]], 529 [[int s = socket (AF_INET, SOCK_STREAM, 6);]] 530 ) 531 ], 532 [ 533 sockets=yes 534 SOCKET_LIBS="-lws2_32" 535 ], 536 [ 537 sockets=no 538 ] 539 ) 540 ] 541 ) 542 ] 543 ) 544 ] 545 ) 546 LIBS="$SAVED_LIBS $SOCKET_LIBS" 547 AC_LANG_POP(C) 548 AC_MSG_RESULT([$sockets]) 549 AS_IF([test "x$sockets" = "xno"], 550 [AC_MSG_ERROR([libextractor requires some kind of socket library])]) 551 AC_SUBST([SOCKET_LIBS],[$SOCKET_LIBS]) 552 553 LE_LIB_LIBS=$LIBS 554 LIBS=$LIBSOLD 555 556 AM_GNU_GETTEXT_VERSION([0.23.1]) 557 AM_GNU_GETTEXT([external]) 558 559 # check for GNU LD 560 AC_LIB_PROG_LD_GNU 561 562 # check for glib >= 2.0.0 563 AC_MSG_CHECKING(for glib) 564 AM_PATH_GLIB_2_0(2.0.0, 565 without_glib=false, 566 without_glib=true) 567 AC_MSG_CHECKING([whether glib is disabled]) 568 AC_ARG_ENABLE(glib, 569 [AS_HELP_STRING([--disable-glib],[disable glib support])], 570 [case "$enableval" in 571 no) AC_MSG_RESULT(disabled) 572 without_glib=true 573 ;; 574 *) AC_MSG_RESULT(allowed) 575 ;; 576 esac], 577 AC_MSG_RESULT(allowed)) 578 579 AS_IF([test x$without_glib != xtrue], 580 [AS_IF([test $with_gnu_ld = yes], 581 [# We need both GNU LD and GLIB here! 582 AM_CONDITIONAL(HAVE_GLIB,true) 583 AC_DEFINE(HAVE_GLIB, 1, [Have glib])], 584 [# We may have GLIB, but without GNU LD we must not use it! 585 AM_CONDITIONAL(HAVE_GLIB,false) 586 AC_DEFINE(HAVE_GLIB, 0, [Have glib, but not GNU LD])])], 587 [AM_CONDITIONAL(HAVE_GLIB,false) 588 AC_DEFINE(HAVE_GLIB, 0, [Have glib])]) 589 590 # smf requires glib.h 591 CFLAGS_OLD="$CFLAGS" 592 CPPFLAGS_OLD="$CPPFLAGS" 593 CFLAGS="$AM_CFLAGS $GLIB_CFLAGS" 594 CPPFLAGS="$AM_CPPFLAGS $GLIB_CFLAGS" 595 596 AC_CHECK_LIB(smf, smf_load_from_memory, 597 [AC_CHECK_HEADERS([smf.h], 598 AM_CONDITIONAL(HAVE_SMF, true) 599 AC_DEFINE(HAVE_MPEG2,1,[Have libsmf]), 600 AM_CONDITIONAL(HAVE_SMF, false))], 601 AM_CONDITIONAL(HAVE_SMF, false)) 602 603 # check for gdk-pixbuf >= 2.4 604 AC_MSG_CHECKING(for gdk-pixbuf) 605 PKG_CHECK_MODULES([GDK_PIXBUF], [gdk-pixbuf-2.0 >= 2.4], [have_gdk_pixbuf=yes], [have_gdk_pixbuf=no]) 606 607 AM_CONDITIONAL(HAVE_GDK_PIXBUF, test x$have_gdk_pixbuf != xno) 608 AS_IF([test $have_gdk_pixbuf != no], 609 [have_gdk_pixbuf=1], 610 [have_gdk_pixbuf=0 611 AC_MSG_NOTICE([Cannot find Gdk-pixbuf: Is pkg-config in path?])]) 612 AC_DEFINE_UNQUOTED([HAVE_GDK_PIXBUF], [$have_gdk_pixbuf], [We have Gdk-pixbuf]) 613 614 CFLAGS="$CFLAGS $GDK_PIXBUF_CFLAGS" 615 CPPFLAGS="$CPPFLAGS $GDK_PIXBUF_CFLAGS" 616 LIBS="$LIBS $GDK_PIXBUF_LIBS" 617 618 619 AC_ARG_WITH([gstreamer], AS_HELP_STRING([--with-gstreamer], [Build with the GStreamer plugin]), [], [with_gstreamer=yes]) 620 621 have_gstreamer=no 622 have_gstreamer_pbutils=no 623 have_gstreamer_tag=no 624 have_gstreamer_app=no 625 AS_IF([test "x$with_gstreamer" = "xyes"], [ 626 PKG_CHECK_MODULES([GSTREAMER], [gstreamer-1.0 >= 0.11.93], [have_gstreamer=yes], [have_gstreamer=no]) 627 PKG_CHECK_MODULES([GSTREAMER_PBUTILS], [gstreamer-pbutils-1.0 >= 0.11.93], [have_gstreamer_pbutils=yes], [have_gstreamer_pbutils=no]) 628 PKG_CHECK_MODULES([GSTREAMER_TAG], [gstreamer-tag-1.0 >= 0.11.93], [have_gstreamer_tag=yes], [have_gstreamer_tag=no]) 629 PKG_CHECK_MODULES([GSTREAMER_APP], [gstreamer-app-1.0 >= 0.11.93], [have_gstreamer_app=yes], [have_gstreamer_app=no]) 630 ]) 631 632 AM_CONDITIONAL(HAVE_GSTREAMER, test x$have_gstreamer = xyes -a x$have_gstreamer_pbutils = xyes -a x$have_gstreamer_tag = xyes -a x$have_gstreamer_app = xyes -a ! x$without_glib = xtrue) 633 634 # The video thumbnailer and the audio preview plugin need more of 635 # GStreamer than the metadata plugin does: gstreamer-video-1.0 for 636 # gst_video_convert_sample() and gstreamer-controller-1.0 for the fade. 637 # 1.8 (2016) is the first release that ships opusenc in -base. 638 have_gstreamer_video=no 639 have_gstreamer_controller=no 640 AS_IF([test "x$with_gstreamer" = "xyes"], [ 641 PKG_CHECK_MODULES([GSTREAMER_VIDEO], [gstreamer-video-1.0 >= 1.8], [have_gstreamer_video=yes], [have_gstreamer_video=no]) 642 PKG_CHECK_MODULES([GSTREAMER_CONTROLLER], [gstreamer-controller-1.0 >= 1.8], [have_gstreamer_controller=yes], [have_gstreamer_controller=no]) 643 ]) 644 gstreamer_media=no 645 AS_IF([test "x$have_gstreamer" = "xyes" -a "x$have_gstreamer_app" = "xyes" -a "x$have_gstreamer_video" = "xyes" -a "x$have_gstreamer_controller" = "xyes" -a "x$have_magic" = "xyes" -a ! "x$without_glib" = "xtrue"], 646 [gstreamer_media=yes]) 647 AM_CONDITIONAL(HAVE_GSTREAMER_MEDIA, test "x$gstreamer_media" = "xyes") 648 649 # FFmpeg-based video thumbnailer and audio preview plugin. Note the 650 # version floor: FFmpeg 5.1 is the first release with the AVChannelLayout 651 # API, and supporting anything older would mean re-introducing the 652 # per-version compatibility code that got the predecessors of these two 653 # plugins deleted in 2021. 654 AC_ARG_WITH([ffmpeg], 655 AS_HELP_STRING([--without-ffmpeg], [do not build the FFmpeg-based plugins]), 656 [], [with_ffmpeg=yes]) 657 have_ffmpeg=no 658 have_swresample=no 659 AS_IF([test "x$with_ffmpeg" = "xyes"], [ 660 PKG_CHECK_MODULES([FFMPEG], 661 [libavformat >= 59.27 libavcodec >= 59.37 libavutil >= 57.28 libswscale >= 6.7], 662 [have_ffmpeg=yes], [have_ffmpeg=no]) 663 PKG_CHECK_MODULES([FFMPEG_SWR], [libswresample >= 4.7], [have_swresample=yes], [have_swresample=no]) 664 ]) 665 ffmpeg_video=no 666 AS_IF([test "x$have_ffmpeg" = "xyes" -a "x$have_magic" = "xyes"], 667 [ffmpeg_video=yes]) 668 AM_CONDITIONAL(HAVE_FFMPEG, test "x$ffmpeg_video" = "xyes") 669 ffmpeg_audio=no 670 AS_IF([test "x$ffmpeg_video" = "xyes" -a "x$have_swresample" = "xyes"], 671 [ffmpeg_audio=yes]) 672 AM_CONDITIONAL(HAVE_FFMPEG_AUDIO, test "x$ffmpeg_audio" = "xyes") 673 674 ABI_GSF 675 676 AM_CONDITIONAL(HAVE_GSF, test "x$have_gsf" = "xtrue") 677 678 # produce new line 679 echo "" 680 AC_CHECK_LIB(gsf-1, gsf_init, AC_DEFINE(HAVE_GSF_INIT,1,[gsf_init supported])) 681 AC_CHECK_LIB(gsf-1, gsf_doc_meta_data_read_from_msole, AC_DEFINE(HAVE_GSF_DOC_META_DATA_READ_FROM_MSOLE,1,[gsf_doc_meta_data_read_from_msole supported])) 682 683 684 CFLAGS="$CFLAGS_OLD" 685 CPPFLAGS="$CPPFLAGS_OLD" 686 687 688 # Fuzzing harnesses (src/fuzz). They are only meaningful in a build with 689 # sanitizers, and they call functions that are hidden in the shared 690 # objects, so they need the static archives. 691 AC_MSG_CHECKING([whether to build the fuzzing harnesses]) 692 AC_ARG_ENABLE([fuzzing], 693 [AS_HELP_STRING([--enable-fuzzing], 694 [build the in-process fuzzing harnesses in src/fuzz and run them as ] 695 [part of "make check"; requires a static build of the library and is ] 696 [only really useful together with a sanitizer build [no]])], 697 [], [enable_fuzzing="no"]) 698 AS_IF([test "x$enable_fuzzing" = "xyes"], 699 [AS_IF([test "x$enable_static" = "xno"], 700 [AC_MSG_RESULT([no]) 701 AC_MSG_ERROR([--enable-fuzzing requires --enable-static])], 702 [AC_MSG_RESULT([yes])])], 703 [enable_fuzzing="no" 704 AC_MSG_RESULT([no])]) 705 AM_CONDITIONAL([ENABLE_FUZZING], [test "x$enable_fuzzing" = "xyes"]) 706 707 LE_INTLINCL="" 708 LE_LIBINTL="$LTLIBINTL" 709 AC_ARG_ENABLE(framework, [ --enable-framework enable Mac OS X framework build helpers],enable_framework_build=$enableval) 710 AM_CONDITIONAL(WANT_FRAMEWORK, test x$enable_framework_build = xyes) 711 AS_IF([test x$enable_framework_build = xyes], 712 [AC_DEFINE([FRAMEWORK_BUILD], 1, [Build a Mac OS X Framework]) 713 LE_INTLINCL='-I$(top_srcdir)/src/intlemu' 714 LE_LIBINTL='$(top_builddir)/src/intlemu/libintlemu.la -framework CoreFoundation' 715 AC_LIB_APPENDTOVAR([AM_CPPFLAGS], [$LE_INTLINCL]) 716 ]) 717 718 LE_LIB_LDFLAGS="-export-dynamic -no-undefined" 719 LE_PLUGIN_LDFLAGS="-export-dynamic -avoid-version -module -no-undefined" 720 721 722 # TODO insert a proper check here 723 AC_CACHE_CHECK([whether -export-symbols-regex works], 724 gn_cv_export_symbols_regex_works, 725 [AS_CASE(["$host_os"], 726 [mingw*],[gn_cv_export_symbols_regex_works=no], 727 [gn_cv_export_symbols_regex_works=yes]) 728 ]) 729 AS_IF([test "x$gn_cv_export_symbols_regex_works" = "xyes"], 730 [LE_LIB_LDFLAGS="$LE_LIB_LDFLAGS -export-symbols-regex \"(EXTRACTOR|pl)_@<:@a-zA-Z0-9_@:>@*\"" 731 LE_PLUGIN_LDFLAGS="$LE_PLUGIN_LDFLAGS -export-symbols-regex \"(EXTRACTOR|pl)_@<:@a-zA-Z0-9_@:>@*_.......\"" 732 ]) 733 734 # restore LIBS 735 LIBS=$LIBSOLD 736 737 AC_SUBST(LE_LIB_LDFLAGS) 738 AC_SUBST(LE_PLUGIN_LDFLAGS) 739 AC_SUBST(LE_INTLINCL) 740 AC_SUBST(LE_LIBINTL) 741 AC_SUBST(LE_LIB_LIBS) 742 743 AC_SUBST(QT_CPPFLAGS) 744 AC_SUBST(QT_LDFLAGS) 745 AC_SUBST(XTRA_CPPLIBS) 746 AC_SUBST(LIBEXT) 747 748 PACKAGE_VERSION_NOALPHA=`echo $PACKAGE_VERSION | sed "s/@<:@A-Za-z@:>@*//g;"` 749 AC_SUBST(PACKAGE_VERSION_NOALPHA) 750 751 # gcov compilation 752 AC_MSG_CHECKING(whether to compile with support for code coverage analysis) 753 AC_ARG_ENABLE([coverage], 754 AS_HELP_STRING([--enable-coverage], 755 [compile the library with code coverage support]), 756 [use_gcov=${enableval}], 757 [use_gcov=no]) 758 AC_MSG_RESULT($use_gcov) 759 AM_CONDITIONAL([USE_COVERAGE], [test "x$use_gcov" = "xyes"]) 760 761 762 763 AC_CONFIG_FILES([Makefile 764 po/Makefile.in 765 m4/Makefile 766 contrib/macosx/Info.plist 767 contrib/macosx/Pkg-Info.plist 768 doc/Makefile 769 src/Makefile 770 src/include/Makefile 771 src/intlemu/Makefile 772 src/common/Makefile 773 src/main/Makefile 774 src/plugins/Makefile 775 src/fuzz/Makefile 776 ]) 777 778 AX_CREATE_PKGCONFIG_INFO([libextractor.pc],,[-lextractor],[Metadata extraction library],,) 779 780 AC_OUTPUT 781 782 AS_IF([test "x$HAVE_ZLIB_TRUE" = "x#"], 783 [AC_MSG_NOTICE([NOTICE: zlib not found, zlib support disabled])]) 784 785 AS_IF([test "x$HAVE_BZ2_TRUE" = "x#"], 786 [AC_MSG_NOTICE([NOTICE: libbz2 not found, bz2 support disabled])]) 787 788 AS_IF([test "x$HAVE_EXIV2_TRUE" = "x#"], 789 [AC_MSG_NOTICE([NOTICE: libexiv2 not found, exiv2 disabled])]) 790 791 AS_IF([test "x$HAVE_POPPLER_TRUE" = "x#"], 792 [AC_MSG_NOTICE([NOTICE: libpoppler-cpp not found, PDF support disabled])]) 793 794 AS_IF([test "x$HAVE_TIFF_TRUE" = "x#"], 795 [AC_MSG_NOTICE([NOTICE: libtiff not found, tiff disabled])]) 796 797 AS_IF([test "x$HAVE_JPEG_TRUE" = "x#"], 798 [AC_MSG_NOTICE([NOTICE: libjpeg not found, jpeg disabled])]) 799 800 AS_IF([test "x$HAVE_GIF_TRUE" = "x#"], 801 [AC_MSG_NOTICE([NOTICE: libgif not found, gif disabled])]) 802 803 AS_IF([test "x$have_gsf" != "xtrue"], 804 [AC_MSG_NOTICE([NOTICE: libgsf not found, no OLE2 (MS Office) support])]) 805 806 AS_IF([test "x$have_gdk_pixbuf" = "x0"], 807 [AC_MSG_NOTICE([NOTICE: libgdk-pixbuf not found, gtk thumbnail support disabled])]) 808 809 AS_IF([test "x$HAVE_VORBISFILE_TRUE" = "x#"], 810 [AC_MSG_NOTICE([NOTICE: libvorbis not found, vorbis support disabled])]) 811 812 AS_IF([test "x$HAVE_FLAC_TRUE" = "x#"], 813 [AC_MSG_NOTICE([NOTICE: libflac not found, flac support disabled])]) 814 815 AS_IF([test "x$HAVE_SMF_TRUE" = "x#"], 816 [AC_MSG_NOTICE([NOTICE: libsmf not found, midi support disabled])]) 817 818 AS_IF([test "x$HAVE_MPEG2_TRUE" = "x#"], 819 [AC_MSG_NOTICE([NOTICE: libmpeg2 not found, mpeg2 support disabled])]) 820 821 AS_IF([test "x$HAVE_VLC_TRUE" = "x#"], 822 [AC_MSG_NOTICE([NOTICE: libvlc not found, libvlc support disabled])]) 823 824 AS_IF([test "x$HAVE_RPM_TRUE" = "x#"], 825 [AC_MSG_NOTICE([NOTICE: librpm not found, rpm support disabled])]) 826 827 AS_IF([test "x$HAVE_CXX" != "xyes"], 828 [AC_MSG_NOTICE([NOTICE: no C++ compiler found (not compiling plugins that require C++)])]) 829 830 AS_IF([test x$have_gstreamer = xyes -a x$have_gstreamer_pbutils = xyes -a x$have_gstreamer_tag = xyes -a x$have_gstreamer_app = xyes -a ! x$without_glib = xtrue], 831 [AS_IF([test x$enable_experimental = xyes], 832 [AC_MSG_NOTICE([NOTICE: gstreamer enabled])])], 833 [AC_MSG_NOTICE([NOTICE: gstreamer not found, gstreamer support disabled])]) 834 835 AS_IF([test "x$gstreamer_media" = "xyes"], 836 [AC_MSG_NOTICE([NOTICE: gstreamer video thumbnail and audio preview plugins enabled])], 837 [AC_MSG_NOTICE([NOTICE: gstreamer-video/-controller/-app or libmagic missing, gstreamer thumbnail and preview plugins disabled])]) 838 839 AS_IF([test "x$ffmpeg_video" = "xyes"], 840 [AC_MSG_NOTICE([NOTICE: FFmpeg video thumbnail plugin enabled])], 841 [AC_MSG_NOTICE([NOTICE: FFmpeg >= 5.1 or libmagic not found, FFmpeg thumbnail plugin disabled])]) 842 843 AS_IF([test "x$ffmpeg_audio" = "xyes"], 844 [AC_MSG_NOTICE([NOTICE: FFmpeg opus audio preview plugin enabled])], 845 [AC_MSG_NOTICE([NOTICE: libswresample not found, FFmpeg opus audio preview plugin disabled])]) 846 847 AS_IF([test "x$HAVE_APPARMOR_TRUE" = "x#"], 848 [AC_MSG_NOTICE([NOTICE: libapparmor not found, apparmor support disabled])])