CMakeLists.txt 27.5 KB
Newer Older
1
2
cmake_minimum_required(VERSION 3.10.0 FATAL_ERROR)

3
4
5
6
7
8
project(poppler)

set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules)

include(PopplerDefaults)
include(PopplerMacros)
9
10
11
12
13
14
15
16
17
18
19
# Ensure that the user-provided C_FLAGS are used for try_compile() calls.
# This is needed since PopplerMacros.cmake clears CMAKE_C_FLAGS and if
# CMAKE_TRY_COMPILE_CONFIGURATION is empty CMake only uses the flags
# specified in CMAKE_C_FLAGS (https://gitlab.kitware.com/cmake/cmake/-/issues/22414
# and https://gitlab.kitware.com/cmake/cmake/-/issues/19512).
# We therefore have to explicitly set CMAKE_TRY_COMPILE_CONFIGURATION until we
# depend on a CMake release that includes a fix for those issues.
# This is set after including PopplerMacros since that sets the default
# CMAKE_BUILD_TYPE and also sets _CMAKE_BUILD_TYPE_UPPER.
set(CMAKE_TRY_COMPILE_CONFIGURATION "${_CMAKE_BUILD_TYPE_UPPER}")

20
21
include(MacroOptionalFindPackage)
find_package(PkgConfig)
22
23
24
25
26
27
28
if (WIN32)
  message("-- Using win32 threads")
else()
  set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
  set(THREADS_PREFER_PTHREAD_FLAG TRUE)
  find_package(Threads)
endif()
29
30
include(TestBigEndian)
test_big_endian(WORDS_BIGENDIAN)
31
32
include(CheckFileOffsetBits)
CHECK_FILE_OFFSET_BITS()
33

Albert Astals Cid's avatar
Albert Astals Cid committed
34
include(GenerateExportHeader)
35
36
include(GNUInstallDirs)

37
38
set(ENABLE_FUZZER FALSE)

39
40
41
find_package (ECM 1.6.0 QUIET NO_MODULE)
if (ECM_FOUND)
    include("${ECM_MODULE_DIR}/ECMEnableSanitizers.cmake")
42
43
44
45

    if(ECM_ENABLE_SANITIZERS MATCHES fuzzer)
        set(ENABLE_FUZZER TRUE)
    endif()
46
47
endif()

Albert Astals Cid's avatar
Albert Astals Cid committed
48
49
set(POPPLER_MAJOR_VERSION "22")
set(POPPLER_MINOR_VERSION_STRING "01")
Albert Astals Cid's avatar
20.08.0    
Albert Astals Cid committed
50
51
52
# We want the string version to have 08 but the integer version can't have a leading 0 since otherwise it's considered octal
# So strip a leading 0 if found in POPPLER_MINOR_VERSION_STRING and store the result in POPPLER_MINOR_VERSION
string(REGEX REPLACE "^0?(.+)$" "\\1" POPPLER_MINOR_VERSION "${POPPLER_MINOR_VERSION_STRING}")
Albert Astals Cid's avatar
Albert Astals Cid committed
53
set(POPPLER_MICRO_VERSION "0")
Albert Astals Cid's avatar
20.08.0    
Albert Astals Cid committed
54
set(POPPLER_VERSION "${POPPLER_MAJOR_VERSION}.${POPPLER_MINOR_VERSION_STRING}.${POPPLER_MICRO_VERSION}")
55

56
57
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
58
set(CMAKE_CXX_EXTENSIONS OFF)
59
60
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_EXTENSIONS OFF)
61
set(CMAKE_LINK_DEPENDS_NO_SHARED TRUE)
Albert Astals Cid's avatar
Albert Astals Cid committed
62
63
64
65
set(CMAKE_C_VISIBILITY_PRESET hidden)
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
set(CMAKE_VISIBILITY_INLINES_HIDDEN 1)

Albert Astals Cid's avatar
Albert Astals Cid committed
66

67
# command line switches
68
option(ENABLE_UNSTABLE_API_ABI_HEADERS "Install API/ABI unstable xpdf headers." OFF)
69
70
option(BUILD_GTK_TESTS "Whether to compile the GTK+ test programs." ON)
option(BUILD_QT5_TESTS "Whether to compile the Qt5 test programs." ON)
Albert Astals Cid's avatar
Albert Astals Cid committed
71
option(BUILD_QT6_TESTS "Whether to compile the Qt6 test programs." ON)
72
option(BUILD_CPP_TESTS "Whether to compile the CPP test programs." ON)
73
option(BUILD_MANUAL_TESTS "Whether to compile manual test programs." ON)
74
option(ENABLE_BOOST "Use boost (for Splash backend performance)." ON)
75
option(ENABLE_UTILS "Compile poppler command line utils." ON)
76
option(ENABLE_CPP "Compile poppler cpp wrapper." ON)
77
option(ENABLE_GLIB "Compile poppler glib wrapper." ON)
78
option(ENABLE_GOBJECT_INTROSPECTION "Whether to generate GObject introspection." ON)
79
option(ENABLE_GTK_DOC "Whether to generate glib API documentation." OFF)
80
option(ENABLE_QT5 "Compile poppler qt5 wrapper." ON)
Albert Astals Cid's avatar
Albert Astals Cid committed
81
option(ENABLE_QT6 "Compile poppler qt6 wrapper." ON)
82
set(ENABLE_LIBOPENJPEG "openjpeg2" CACHE STRING "Use libopenjpeg for JPX streams. Possible values: openjpeg2, unmaintained, none. 'unmaintained' gives you the internal unmaintained decoder. Use at your own risk. 'none' compiles no JPX decoder at all. Default: openjpeg2")
83
set(ENABLE_CMS "lcms2" CACHE STRING "Use color management system. Possible values: lcms2, none. 'none' disables color management system.")
84
set(ENABLE_DCTDECODER "libjpeg" CACHE STRING "Use libjpeg for DCT streams. Possible values: libjpeg, unmaintained, none. will use libjpeg if available or fail if not. 'unmaintained' gives you the internal unmaintained decoder. Use at your own risk. 'none' compiles no DCT decoder at all. Default: libjpeg")
85
option(ENABLE_LIBCURL "Build libcurl based HTTP support." ON)
86
87
option(ENABLE_ZLIB "Build with zlib." ON)
option(ENABLE_ZLIB_UNCOMPRESS "Use zlib to uncompress flate streams (not totally safe)." OFF)
88
option(USE_FLOAT "Use single precision arithmetic in the Splash backend" OFF)
89
option(BUILD_SHARED_LIBS "Build poppler as a shared library" ON)
90
option(RUN_GPERF_IF_PRESENT "Run gperf if it is found" ON)
91
if(WIN32)
92
  option(ENABLE_RELOCATABLE "Do not hardcode the poppler library location (on Windows)." ON)
93
else()
94
  set(ENABLE_RELOCATABLE OFF)
95
endif()
96
option(EXTRA_WARN "Enable extra compile warnings" OFF)
97

98
99
set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)

100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
set(TESTDATADIR "${CMAKE_SOURCE_DIR}/../test" CACHE STRING "Specify test data dir.")
if(NOT (EXISTS ${TESTDATADIR} AND EXISTS ${TESTDATADIR}/test-poppler.c))
  message(WARNING "
 No test data found in $testdatadir.
 You will not be able to run 'make test' successfully.

 The test data is not included in the source packages
 and is also not part of the main git repository. Instead,
 you can checkout the test data from its own git
 repository with:

   git clone git://git.freedesktop.org/git/poppler/test

 You should checkout the test data as a sibling of your
 poppler source folder or specify the location of your
 checkout with -DTESTDATADIR=/path/to/checkoutdir/test.
  ")
endif()

119
120
if(WIN32)
  set(_default_fontconfiguration "win32")
121
elseif(ANDROID)
122
  # on android we don't have fontconfig and we don't want windows-specific code
123
  set(_default_fontconfiguration "generic")
124
else()
125
  set(_default_fontconfiguration "fontconfig")
126
endif()
127
set(FONT_CONFIGURATION "${_default_fontconfiguration}" CACHE STRING "The font configuration backend (win32|generic|fontconfig).")
128
string(TOLOWER "${FONT_CONFIGURATION}" font_configuration)
129
130
set(WITH_FONTCONFIGURATION_WIN32 OFF)
set(WITH_FONTCONFIGURATION_FONTCONFIG OFF)
131
132
133
134
if(font_configuration STREQUAL "win32")
  set(WITH_FONTCONFIGURATION_WIN32 ON)
elseif(font_configuration STREQUAL "fontconfig")
  set(WITH_FONTCONFIGURATION_FONTCONFIG ON)
135
136
elseif(font_configuration STREQUAL "generic")
  message(STATUS "no fontconfig or win32 specific code")
137
else()
138
  message(FATAL_ERROR "Invalid font configuration setting: ${FONT_CONFIGURATION}")
139
endif()
140

141
142
143
144
145
# Enable these unconditionally.
set(OPI_SUPPORT ON)
set(TEXTOUT_WORD_LIST ON)

# setting the minimum required versions for some components
146
set(CAIRO_VERSION "1.10.0")
147
148
149
set(GLIB_REQUIRED "2.56")
set(GTK_REQUIRED "3.22")
set(GDK_PIXBUF_REQUIRED "2.36")
150
151

find_package(Freetype REQUIRED)
152
153
if(WITH_FONTCONFIGURATION_FONTCONFIG)
  find_package(Fontconfig REQUIRED)
154
endif()
155
macro_optional_find_package(JPEG)
Albert Astals Cid's avatar
Albert Astals Cid committed
156
macro_optional_find_package(PNG)
157
macro_optional_find_package(TIFF)
André Guerreiro's avatar
André Guerreiro committed
158
macro_optional_find_package(NSS3)
159
160
161
162
if(ENABLE_DCTDECODER STREQUAL "libjpeg")
  if(JPEG_FOUND)
    set(ENABLE_LIBJPEG ${JPEG_FOUND})
  else()
163
164
165
166
167
    message(STATUS "Could NOT find libjpeg.")
    message(FATAL_ERROR "Install libjpeg before trying to build poppler. You can \
also decide to use the internal unmaintained DCT decoder or none at all.\n\
Possible options are: -DENABLE_DCTDECODER=libjpeg, -DENABLE_DCTDECODER=none, \
-DENABLE_DCTDECODER=unmaintained")
168
169
170
171
172
173
174
175
176
177
178
  endif()
  set(HAVE_DCT_DECODER ON)
elseif(ENABLE_DCTDECODER STREQUAL "unmaintained")
  set(ENABLE_LIBJPEG OFF)
  set(HAVE_DCT_DECODER ON)
elseif(ENABLE_DCTDECODER STREQUAL "none")
  set(ENABLE_LIBJPEG OFF)
  set(HAVE_DCT_DECODER OFF)
else()
  message(FATAL_ERROR "Invalid ENABLE_DCTDECODER value.")
endif()
179
180

if (ENABLE_QT5)
181
  find_package(Qt5Core 5.9)  # Update QT_DISABLE_DEPRECATED_BEFORE in qt5/CMakeLists.txt when increasing this
182
183
184
185
186
187
188
189
  find_package(Qt5Gui)
  find_package(Qt5Xml)
  find_package(Qt5Widgets)
  find_package(Qt5Test)
  if (NOT (Qt5Core_FOUND AND Qt5Gui_FOUND AND Qt5Xml_FOUND AND Qt5Widgets_FOUND AND Qt5Test_FOUND))
    message("-- Package Qt5Core or Qt5Gui or Qt5Xml or Qt5Widgets or Qt5Test not found")
    set(ENABLE_QT5 OFF)
  endif()
190
endif()
191

Albert Astals Cid's avatar
Albert Astals Cid committed
192
if (ENABLE_QT6)
Albert Astals Cid's avatar
Albert Astals Cid committed
193
  SET(QT_NO_CREATE_VERSIONLESS_TARGETS ON)
Albert Astals Cid's avatar
Albert Astals Cid committed
194
  find_package(Qt6 6.1 COMPONENTS Core Gui Widgets Test QUIET)
195
196
  if (NOT (Qt6Core_FOUND AND Qt6Gui_FOUND AND Qt6Widgets_FOUND AND Qt6Test_FOUND))
    message("-- Package Qt6Core or Qt6Gui or Qt6Widgets or Qt6Test not found")
Albert Astals Cid's avatar
Albert Astals Cid committed
197
198
199
200
    set(ENABLE_QT6 OFF)
  endif()
endif()

201
# Check for Cairo rendering backend
202
macro_optional_find_package(Cairo ${CAIRO_VERSION})
203

204
205
206
207
208
find_package(Boost 1.58.0)
if(Boost_FOUND)
  set(USE_BOOST_HEADERS ON)
elseif(ENABLE_BOOST)
  message(FATAL_ERROR "-- Boost recommended for Splash. Use ENABLE_BOOST=OFF to skip.")
209
210
endif()

211
if(CAIRO_FOUND)
Albert Astals Cid's avatar
Albert Astals Cid committed
212
  set(HAVE_CAIRO ${CAIRO_FOUND})
213
214
  set(CAIRO_FEATURE "#define POPPLER_HAS_CAIRO 1")
  set(CAIRO_REQ "cairo")
215
216
  set(POPPLER_GLIB_DISABLE_DEPRECATED "")
  set(POPPLER_GLIB_DISABLE_SINGLE_INCLUDES "")
217
218
219
220
221
222
223
  if(ENABLE_GLIB)
    macro_optional_find_package(GLIB)
    if(NOT GLIB_FOUND)
      set(ENABLE_GLIB OFF)
    endif()
  endif()
  if(ENABLE_GLIB)
224
225
226
227
228
    if(ENABLE_GOBJECT_INTROSPECTION)
      # Check for introspection
      macro_optional_find_package(GObjectIntrospection 0.9.12)
      set(HAVE_INTROSPECTION ${INTROSPECTION_FOUND})
    endif()
229
230
    set(POPPLER_GLIB_DISABLE_DEPRECATED "${POPPLER_GLIB_DISABLE_DEPRECATED} -DG_DISABLE_DEPRECATED")
    set(POPPLER_GLIB_DISABLE_SINGLE_INCLUDES "${POPPLER_GLIB_DISABLE_SINGLE_INCLUDES} -DG_DISABLE_SINGLE_INCLUDES")
231
    macro_optional_find_package(GTK)
232
233
  endif()
else()
234
  set(CAIRO_FEATURE "#undef POPPLER_HAS_CAIRO")
235
  set(ENABLE_GLIB OFF)
236
endif()
237
238
239

# GTK API docs require both the gtk-doc package & python3 support
if(ENABLE_GTK_DOC)
240
  # Stop the build & raise an error if the package is missing
241
242
  find_package(GtkDoc)
  if(NOT GtkDoc_FOUND)
243
    message(FATAL_ERROR "Install the gtk-doc package to generate GTK API documentation, or set ENABLE_GTK_DOC to Off.")
244
  endif()
245
  # NOTE: The FindPythonInterp module is deprecated, but the newer FindPython3 module requires CMake >=3.12
246
  find_package(PythonInterp 3)
247
248
249
  # Also bail out with an error if Python3 is missing
  if(NOT PYTHONINTERP_FOUND)
    message(FATAL_ERROR "Install python3 in order to generate GTK API documentation, or set ENABLE_GTK_DOC to Off.")
250
251
252
  endif()
endif()

253
254
255
256
if(ENABLE_CPP)
  macro_optional_find_package(Iconv)
  set(ENABLE_CPP ${ICONV_FOUND})
  set(HAVE_ICONV ${ICONV_FOUND})
257
endif()
258
259
260
if(ENABLE_ZLIB)
  find_package(ZLIB)
  set(ENABLE_ZLIB ${ZLIB_FOUND})
261
endif()
262
263
264
if(ENABLE_ZLIB_UNCOMPRESS AND NOT ENABLE_ZLIB)
  message("Warning: ENABLE_ZLIB_UNCOMPRESS requires ENABLE_ZLIB")
  set(ENABLE_ZLIB_UNCOMPRESS FALSE)
265
endif()
266
set(WITH_OPENJPEG FALSE)
267
if(ENABLE_LIBOPENJPEG STREQUAL "openjpeg2")
268
269
  find_package(OpenJPEG)
  set(WITH_OPENJPEG ${OpenJPEG_FOUND})
270
  if(NOT OpenJPEG_FOUND OR OPENJPEG_MAJOR_VERSION VERSION_LESS 2)
271
272
273
274
275
    message(STATUS "Could NOT find openjpeg2.")
    message(FATAL_ERROR "Install libopenjpeg2 before trying to build poppler. You \
can also decide to use the internal unmaintained JPX decoder or none at all.\n\
Possible options are: -DENABLE_LIBOPENJPEG=openjpeg2, -DENABLE_LIBOPENJPEG=none, \
-DENABLE_LIBOPENJPEG=unmaintained,")
276
277
278
279
280
281
282
283
284
285
  endif()
  set(HAVE_JPX_DECODER ON)
elseif(ENABLE_LIBOPENJPEG STREQUAL "unmaintained")
  set(WITH_OPENJPEG OFF)
  set(HAVE_JPX_DECODER ON)
elseif(ENABLE_LIBOPENJPEG STREQUAL "none")
  set(WITH_OPENJPEG OFF)
  set(HAVE_JPX_DECODER OFF)
else()
  message(FATAL_ERROR "Invalid ENABLE_LIBOPENJPEG value: ${ENABLE_LIBOPENJPEG}")
Adrian Johnson's avatar
Adrian Johnson committed
286
endif()
287
set(ENABLE_LIBOPENJPEG "${WITH_OPENJPEG}")
288
if(ENABLE_CMS STREQUAL "lcms2")
289
290
  find_package(LCMS2)
  set(USE_CMS ${LCMS2_FOUND})
291
292
elseif(NOT ENABLE_CMS STREQUAL "none")
  message(FATAL_ERROR "Invalid ENABLE_CMS value: ${ENABLE_CMS}")
293
endif()
Hib Eris's avatar
Hib Eris committed
294
295
if(ENABLE_LIBCURL)
  find_package(CURL)
296
  if(CURL_FOUND)
297
    include_directories(SYSTEM ${CURL_INCLUDE_DIR})
298
299
300
301
    set(POPPLER_HAS_CURL_SUPPORT ON)
  else()
    set(ENABLE_LIBCURL OFF)
  endif()
302
endif()
303

304
305
306
if(MINGW)
  # Use mingw's ansi stdio extensions
  add_definitions(-D__USE_MINGW_ANSI_STDIO=1)
307
endif()
308
309
if(FONTCONFIG_FOUND)
  add_definitions(${FONTCONFIG_DEFINITIONS})
310
  include_directories(SYSTEM ${FONTCONFIG_INCLUDE_DIR})
311
endif()
312
313
314
315
if(WITH_FONTCONFIGURATION_WIN32)
  if(MINGW)
    # Set the minimum required Internet Explorer version to 5.0
    add_definitions(-D_WIN32_IE=0x0500)
316
317
  endif()
endif()
318
319
320
321
322
323
324
include_directories(
  ${CMAKE_CURRENT_SOURCE_DIR}
  ${CMAKE_CURRENT_SOURCE_DIR}/fofi
  ${CMAKE_CURRENT_SOURCE_DIR}/goo
  ${CMAKE_CURRENT_SOURCE_DIR}/poppler
  ${CMAKE_CURRENT_BINARY_DIR}
  ${CMAKE_CURRENT_BINARY_DIR}/poppler
325
  SYSTEM
326
  ${FREETYPE_INCLUDE_DIRS}
327
328
)

André Guerreiro's avatar
André Guerreiro committed
329
330
if (NSS3_FOUND)
  set(ENABLE_NSS3 ON)
331
endif()
332
if(JPEG_FOUND)
333
  include_directories(SYSTEM ${JPEG_INCLUDE_DIR})
334
endif()
Albert Astals Cid's avatar
Albert Astals Cid committed
335
336
if(PNG_FOUND)
  set(ENABLE_LIBPNG ON)
337
endif()
338
339
if(TIFF_FOUND)
  set(ENABLE_LIBTIFF ON)
340
endif()
341
if(OpenJPEG_FOUND)
342
  include_directories(SYSTEM ${OPENJPEG_INCLUDE_DIRS})
Adrian Johnson's avatar
Adrian Johnson committed
343
endif()
Pino Toscano's avatar
Pino Toscano committed
344
if(LCMS2_FOUND)
345
  include_directories(SYSTEM ${LCMS2_INCLUDE_DIR})
346
endif()
347

348
349
350
351
352
353
354
355
356
357
# Recent versions of poppler-data install a .pc file.
# Use it to determine the encoding data path, if available.
# Default to the same prefix otherwise.
pkg_check_modules(POPPLER_DATA poppler-data)
if(POPPLER_DATA_FOUND)
  execute_process(COMMAND "${PKG_CONFIG_EXECUTABLE}" --variable=poppler_datadir poppler-data
                  RESULT_VARIABLE _result_var
                  OUTPUT_VARIABLE _output_var OUTPUT_STRIP_TRAILING_WHITESPACE)
  if(_result_var STREQUAL "0" AND NOT _output_var STREQUAL "")
    set(POPPLER_DATADIR "${_output_var}")
358
359
  endif()
endif()
360
361
if(NOT DEFINED POPPLER_DATADIR)
  set(POPPLER_DATADIR "${CMAKE_INSTALL_PREFIX}/share/poppler")
362
endif()
363

364
if(EXTRA_WARN)
365
  set(CMAKE_C_FLAGS "-Wall ${CMAKE_C_FLAGS}")
366
367
  set(CMAKE_CXX_FLAGS "${DEFAULT_COMPILE_WARNINGS_EXTRA} ${CMAKE_CXX_FLAGS}")
else()
368
  set(CMAKE_C_FLAGS "-Wall ${CMAKE_C_FLAGS}")
369
  set(CMAKE_CXX_FLAGS "${DEFAULT_COMPILE_WARNINGS} ${CMAKE_CXX_FLAGS}")
370
endif()
371
372
373

include(ConfigureChecks.cmake)
configure_file(config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
374
configure_file(poppler/poppler-config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/poppler/poppler-config.h)
375

376
377
find_program(GPERF gperf)

378
set(poppler_SRCS
Greg Knight's avatar
Greg Knight committed
379
  goo/gbase64.cc
Greg Knight's avatar
Greg Knight committed
380
  goo/gbasename.cc
381
382
383
  goo/gfile.cc
  goo/GooTimer.cc
  goo/GooString.cc
384
  goo/NetPBMWriter.cc
385
  goo/PNGWriter.cc
386
  goo/TiffWriter.cc
Albert Astals Cid's avatar
Albert Astals Cid committed
387
  goo/JpegWriter.cc
388
  goo/ImgWriter.cc
389
  goo/gstrtod.cc
390
  goo/grandom.cc
391
  goo/glibc.cc
Adrian Johnson's avatar
Adrian Johnson committed
392
  goo/glibc_strtok_r.cc
393
394
395
396
397
  fofi/FoFiBase.cc
  fofi/FoFiEncodings.cc
  fofi/FoFiTrueType.cc
  fofi/FoFiType1.cc
  fofi/FoFiType1C.cc
398
  fofi/FoFiIdentifier.cc
399
  poppler/Annot.cc
400
  poppler/AnnotStampImageHelper.cc
401
  poppler/Array.cc
Hib Eris's avatar
Hib Eris committed
402
  poppler/CachedFile.cc
403
404
405
  poppler/Catalog.cc
  poppler/CharCodeToUnicode.cc
  poppler/CMap.cc
406
  poppler/DateInfo.cc
407
408
409
  poppler/Decrypt.cc
  poppler/Dict.cc
  poppler/Error.cc
410
  poppler/FDPDFDocBuilder.cc
411
  poppler/FILECacheLoader.cc
412
  poppler/FileSpec.cc
413
414
415
416
417
418
419
420
  poppler/FontEncodingTables.cc
  poppler/Form.cc
  poppler/FontInfo.cc
  poppler/Function.cc
  poppler/Gfx.cc
  poppler/GfxFont.cc
  poppler/GfxState.cc
  poppler/GlobalParams.cc
Hib Eris's avatar
Hib Eris committed
421
  poppler/Hints.cc
Georgiy Sgibnev's avatar
Georgiy Sgibnev committed
422
  poppler/ImageEmbeddingUtils.cc
423
424
  poppler/JArithmeticDecoder.cc
  poppler/JBIG2Stream.cc
425
  poppler/JSInfo.cc
426
427
  poppler/Lexer.cc
  poppler/Link.cc
Hib Eris's avatar
Hib Eris committed
428
  poppler/Linearization.cc
429
  poppler/LocalPDFDocBuilder.cc
Albert Astals Cid's avatar
Albert Astals Cid committed
430
  poppler/MarkedContentOutputDev.cc
431
432
  poppler/NameToCharCode.cc
  poppler/Object.cc
433
  poppler/OptionalContent.cc
434
435
436
437
438
439
  poppler/Outline.cc
  poppler/OutputDev.cc
  poppler/Page.cc
  poppler/PageTransition.cc
  poppler/Parser.cc
  poppler/PDFDoc.cc
440
  poppler/PDFDocBuilder.cc
441
  poppler/PDFDocEncoding.cc
Hib Eris's avatar
Hib Eris committed
442
  poppler/PDFDocFactory.cc
443
444
445
  poppler/ProfileData.cc
  poppler/PreScanOutputDev.cc
  poppler/PSTokenizer.cc
446
  poppler/SignatureInfo.cc
447
  poppler/Stream.cc
Albert Astals Cid's avatar
Albert Astals Cid committed
448
449
  poppler/StructTreeRoot.cc
  poppler/StructElement.cc
450
  poppler/UnicodeMap.cc
451
  poppler/UnicodeMapFuncs.cc
452
  poppler/UnicodeTypeTable.cc
453
  poppler/UTF.cc
454
455
456
457
458
459
  poppler/XRef.cc
  poppler/PSOutputDev.cc
  poppler/TextOutputDev.cc
  poppler/PageLabelInfo.cc
  poppler/SecurityHandler.cc
  poppler/Sound.cc
460
  poppler/ViewerPreferences.cc
Hugo Mercier's avatar
Hugo Mercier committed
461
  poppler/Movie.cc
462
  poppler/Rendition.cc
463
  poppler/CertificateInfo.cc
sgerwk's avatar
sgerwk committed
464
  poppler/BBoxOutputDev.cc
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
  poppler/SplashOutputDev.cc
  splash/Splash.cc
  splash/SplashBitmap.cc
  splash/SplashClip.cc
  splash/SplashFTFont.cc
  splash/SplashFTFontEngine.cc
  splash/SplashFTFontFile.cc
  splash/SplashFont.cc
  splash/SplashFontEngine.cc
  splash/SplashFontFile.cc
  splash/SplashFontFileID.cc
  splash/SplashPath.cc
  splash/SplashPattern.cc
  splash/SplashScreen.cc
  splash/SplashState.cc
  splash/SplashXPath.cc
  splash/SplashXPathScanner.cc
482
)
483
484
485
set(poppler_LIBS ${FREETYPE_LIBRARIES})
if(FONTCONFIG_FOUND)
  set(poppler_LIBS ${poppler_LIBS} ${FONTCONFIG_LIBRARIES})
486
endif()
André Guerreiro's avatar
André Guerreiro committed
487

488
489
490
491
492
if(JPEG_FOUND)
  set(poppler_SRCS ${poppler_SRCS}
    poppler/DCTStream.cc
  )
  set(poppler_LIBS ${poppler_LIBS} ${JPEG_LIBRARIES})
493
endif()
494
495
if(ENABLE_ZLIB)
  set(poppler_SRCS ${poppler_SRCS}
496
    poppler/FlateEncoder.cc
497
  )
498
  set(poppler_LIBS ${poppler_LIBS} ZLIB::ZLIB)
499
endif()
500
501
502
503
if(ENABLE_ZLIB_UNCOMPRESS)
  set(poppler_SRCS ${poppler_SRCS}
    poppler/FlateStream.cc
  )
504
endif()
Hib Eris's avatar
Hib Eris committed
505
506
507
if(ENABLE_LIBCURL)
  set(poppler_SRCS ${poppler_SRCS}
    poppler/CurlCachedFile.cc
Hib Eris's avatar
Hib Eris committed
508
    poppler/CurlPDFDocBuilder.cc
Hib Eris's avatar
Hib Eris committed
509
  )
510
511
512
513
514
  if(${CMAKE_VERSION} VERSION_LESS "3.12.0")
    set(poppler_LIBS ${poppler_LIBS} ${CURL_LIBRARIES})
  else()
    set(poppler_LIBS ${poppler_LIBS} CURL::libcurl)
  endif()
515
endif()
André Guerreiro's avatar
André Guerreiro committed
516
517
518
519
if (ENABLE_NSS3)
  set(poppler_SRCS ${poppler_SRCS}
    poppler/SignatureHandler.cc
  )
520
  set(poppler_LIBS ${poppler_LIBS} PkgConfig::NSS3)
521
endif()
522
if (OpenJPEG_FOUND)
523
524
525
  set(poppler_SRCS ${poppler_SRCS}
    poppler/JPEG2000Stream.cc
  )
526
  set(poppler_LIBS ${poppler_LIBS} openjp2)
Adrian Johnson's avatar
Adrian Johnson committed
527
else ()
528
529
530
  set(poppler_SRCS ${poppler_SRCS}
    poppler/JPXStream.cc
  )
Adrian Johnson's avatar
Adrian Johnson committed
531
endif()
532
if(USE_CMS)
533
  set(poppler_LIBS ${poppler_LIBS} ${LCMS2_LIBRARIES})
534
endif()
535
if(WIN32)
536
537
  # use clean APIs
  add_definitions(-DWIN32_LEAN_AND_MEAN)
538
539
  # gdi32 is needed under win32
  set(poppler_LIBS ${poppler_LIBS} gdi32)
540
endif()
541
if(PNG_FOUND)
542
  set(poppler_LIBS ${poppler_LIBS} PNG::PNG)
543
endif()
544
if(TIFF_FOUND)
545
  set(poppler_LIBS ${poppler_LIBS} TIFF::TIFF)
546
endif()
547
548
549
if(Boost_FOUND)
  set(poppler_LIBS ${poppler_LIBS} Boost::boost)
endif()
550

551
552
553
554
555
if (GPERF AND RUN_GPERF_IF_PRESENT)
    macro(ADD_GPERF_FILE input)
        add_custom_command(OUTPUT poppler/${input}.c
                       COMMAND gperf poppler/${input}.gperf > ${CMAKE_CURRENT_BINARY_DIR}/poppler/${input}.c
                       COMMAND gperf poppler/${input}.gperf > ${CMAKE_CURRENT_SOURCE_DIR}/poppler/${input}.pregenerated.c
Albert Astals Cid's avatar
Albert Astals Cid committed
556
                       COMMAND clang-format -i ${CMAKE_CURRENT_SOURCE_DIR}/poppler/${input}.pregenerated.c || true
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
                       DEPENDS poppler/${input}.gperf
                       WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})

        set(poppler_SRCS ${poppler_SRCS}
            poppler/${input}.c
        )
    endmacro()
else()
    macro(ADD_GPERF_FILE input)
        set(poppler_SRCS ${poppler_SRCS}
            poppler/${input}.pregenerated.c
        )
    endmacro()
endif()

ADD_GPERF_FILE(CourierWidths)
ADD_GPERF_FILE(CourierBoldWidths)
ADD_GPERF_FILE(CourierBoldObliqueWidths)
ADD_GPERF_FILE(CourierObliqueWidths)
ADD_GPERF_FILE(HelveticaWidths)
ADD_GPERF_FILE(HelveticaBoldWidths)
ADD_GPERF_FILE(HelveticaBoldObliqueWidths)
ADD_GPERF_FILE(HelveticaObliqueWidths)
ADD_GPERF_FILE(SymbolWidths)
ADD_GPERF_FILE(TimesBoldWidths)
ADD_GPERF_FILE(TimesBoldItalicWidths)
ADD_GPERF_FILE(TimesItalicWidths)
ADD_GPERF_FILE(TimesRomanWidths)
ADD_GPERF_FILE(ZapfDingbatsWidths)

587
if(MSVC)
588
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
589
add_library(poppler STATIC ${poppler_SRCS})
590
else()
591
add_library(poppler ${poppler_SRCS})
592
endif()
Albert Astals Cid's avatar
Albert Astals Cid committed
593
generate_export_header(poppler BASE_NAME poppler-private EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/poppler_private_export.h")
Albert Astals Cid's avatar
Albert Astals Cid committed
594
set_target_properties(poppler PROPERTIES VERSION 117.0.0 SOVERSION 117)
595
if(MINGW AND BUILD_SHARED_LIBS)
596
597
598
    get_target_property(POPPLER_SOVERSION poppler SOVERSION)
    set_target_properties(poppler PROPERTIES SUFFIX "-${POPPLER_SOVERSION}${CMAKE_SHARED_LIBRARY_SUFFIX}")
endif()
599
target_link_libraries(poppler LINK_PRIVATE ${poppler_LIBS})
600
601
602
if(CMAKE_USE_PTHREADS_INIT)
   target_link_libraries(poppler LINK_PRIVATE Threads::Threads)
endif()
603
install(TARGETS poppler RUNTIME DESTINATION bin LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
604

605
if(ENABLE_UNSTABLE_API_ABI_HEADERS)
606
607
  install(FILES
    poppler/Annot.h
608
    poppler/AnnotStampImageHelper.h
609
    poppler/Array.h
Hib Eris's avatar
Hib Eris committed
610
    poppler/CachedFile.h
611
612
613
    poppler/Catalog.h
    poppler/CharCodeToUnicode.h
    poppler/CMap.h
614
    poppler/DateInfo.h
615
616
617
    poppler/Decrypt.h
    poppler/Dict.h
    poppler/Error.h
618
    poppler/FDPDFDocBuilder.h
619
    poppler/FILECacheLoader.h
620
    poppler/FileSpec.h
621
622
623
624
625
626
627
    poppler/FontEncodingTables.h
    poppler/FontInfo.h
    poppler/Form.h
    poppler/Function.h
    poppler/Gfx.h
    poppler/GfxFont.h
    poppler/GfxState.h
628
    poppler/GfxState_helpers.h
629
    poppler/GlobalParams.h
Hib Eris's avatar
Hib Eris committed
630
    poppler/Hints.h
631
632
    poppler/JArithmeticDecoder.h
    poppler/JBIG2Stream.h
633
    poppler/JSInfo.h
634
635
    poppler/Lexer.h
    poppler/Link.h
Hib Eris's avatar
Hib Eris committed
636
    poppler/Linearization.h
637
    poppler/LocalPDFDocBuilder.h
Albert Astals Cid's avatar
Albert Astals Cid committed
638
    poppler/MarkedContentOutputDev.h
639
    poppler/Movie.h
640
641
    poppler/NameToCharCode.h
    poppler/Object.h
642
    poppler/OptionalContent.h
643
644
645
646
647
648
    poppler/Outline.h
    poppler/OutputDev.h
    poppler/Page.h
    poppler/PageTransition.h
    poppler/Parser.h
    poppler/PDFDoc.h
Hib Eris's avatar
Hib Eris committed
649
    poppler/PDFDocBuilder.h
650
    poppler/PDFDocEncoding.h
Hib Eris's avatar
Hib Eris committed
651
    poppler/PDFDocFactory.h
Albert Astals Cid's avatar
Albert Astals Cid committed
652
    poppler/PopplerCache.h
653
654
655
    poppler/ProfileData.h
    poppler/PreScanOutputDev.h
    poppler/PSTokenizer.h
656
    poppler/Rendition.h
657
    poppler/CertificateInfo.h
658
659
    poppler/Stream-CCITT.h
    poppler/Stream.h
Albert Astals Cid's avatar
Albert Astals Cid committed
660
661
    poppler/StructElement.h
    poppler/StructTreeRoot.h
662
    poppler/UnicodeMap.h
663
    poppler/UnicodeMapFuncs.h
664
665
666
667
668
    poppler/UnicodeMapTables.h
    poppler/UnicodeTypeTable.h
    poppler/UnicodeCClassTables.h
    poppler/UnicodeCompTables.h
    poppler/UnicodeDecompTables.h
669
    poppler/ViewerPreferences.h
670
671
672
673
674
675
676
    poppler/XRef.h
    poppler/CharTypes.h
    poppler/ErrorCodes.h
    poppler/NameToUnicodeTable.h
    poppler/PSOutputDev.h
    poppler/TextOutputDev.h
    poppler/SecurityHandler.h
sgerwk's avatar
sgerwk committed
677
    poppler/BBoxOutputDev.h
678
    poppler/UTF.h
679
    poppler/Sound.h
Albert Astals Cid's avatar
Albert Astals Cid committed
680
    ${CMAKE_CURRENT_BINARY_DIR}/poppler_private_export.h
681
    ${CMAKE_CURRENT_BINARY_DIR}/poppler/poppler-config.h
682
    poppler/SplashOutputDev.h
683
    DESTINATION include/poppler)
684
685
686
687
  install(FILES
    goo/GooTimer.h
    goo/GooString.h
    goo/gmem.h
688
    goo/gdir.h
689
    goo/gfile.h
Maciej Mrozowski's avatar
Maciej Mrozowski committed
690
    goo/ImgWriter.h
Jakub Wilk's avatar
Jakub Wilk committed
691
    goo/GooCheckedOps.h
692
    goo/GooLikely.h
693
    goo/gstrtod.h
694
    goo/grandom.h
695
    DESTINATION include/poppler/goo)
Maciej Mrozowski's avatar
Maciej Mrozowski committed
696
697
698
699
  if(PNG_FOUND)
    install(FILES
      goo/PNGWriter.h
      DESTINATION include/poppler/goo)
700
  endif()
701
702
703
704
  if(TIFF_FOUND)
    install(FILES
      goo/TiffWriter.h
      DESTINATION include/poppler/goo)
705
  endif()
706
707
708
709
  if(JPEG_FOUND)
    install(FILES
      goo/JpegWriter.h
      DESTINATION include/poppler/goo)
710
  endif()
711
712
713
714
715
716
  install(FILES
    fofi/FoFiBase.h
    fofi/FoFiEncodings.h
    fofi/FoFiTrueType.h
    fofi/FoFiType1.h
    fofi/FoFiType1C.h
717
    fofi/FoFiIdentifier.h
718
    DESTINATION include/poppler/fofi)
Hib Eris's avatar
Hib Eris committed
719
720
721
  if(ENABLE_LIBCURL)
    install(FILES
      poppler/CurlCachedFile.h
Hib Eris's avatar
Hib Eris committed
722
      poppler/CurlPDFDocBuilder.h
Hib Eris's avatar
Hib Eris committed
723
      DESTINATION include/poppler)
724
  endif()
725
  if(OpenJPEG_FOUND)
Adrian Johnson's avatar
Adrian Johnson committed
726
727
728
729
    install(FILES
      poppler/JPEG2000Stream.h
      DESTINATION include/poppler)
  else()
730
731
732
    install(FILES
      poppler/JPXStream.h
      DESTINATION include/poppler)
Adrian Johnson's avatar
Adrian Johnson committed
733
  endif()
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
  install(FILES
    splash/Splash.h
    splash/SplashBitmap.h
    splash/SplashClip.h
    splash/SplashErrorCodes.h
    splash/SplashFTFont.h
    splash/SplashFTFontEngine.h
    splash/SplashFTFontFile.h
    splash/SplashFont.h
    splash/SplashFontEngine.h
    splash/SplashFontFile.h
    splash/SplashFontFileID.h
    splash/SplashGlyphBitmap.h
    splash/SplashMath.h
    splash/SplashPath.h
    splash/SplashPattern.h
    splash/SplashScreen.h
    splash/SplashState.h
    splash/SplashTypes.h
    splash/SplashXPath.h
    splash/SplashXPathScanner.h
    DESTINATION include/poppler/splash)
756
757
758
759
760
761
762
  if(CAIRO_FOUND)
    install(FILES
      poppler/CairoFontEngine.h
      poppler/CairoOutputDev.h
      poppler/CairoRescaleBox.h
      DESTINATION include/poppler)
  endif()
763
endif()
764
765
766
767


if(ENABLE_UTILS)
  add_subdirectory(utils)
768
endif()
769
if(ENABLE_GLIB)
770
  add_subdirectory(glib)
771
endif()
772
773
774
if (BUILD_MANUAL_TESTS)
  add_subdirectory(test)
endif()
775
if(ENABLE_QT5)
Albert Astals Cid's avatar
Albert Astals Cid committed
776
  add_subdirectory(qt5)
777
endif()
Albert Astals Cid's avatar
Albert Astals Cid committed
778
779
780
if(ENABLE_QT6)
  add_subdirectory(qt6)
endif()
781
782
if(ENABLE_CPP)
  add_subdirectory(cpp)
783
endif()
784

785
786
787
# Configure "Requires" field & install .pc files for packagers
set(PC_REQUIRES "")
set(PC_REQUIRES_PRIVATE "Requires.private: poppler = ${POPPLER_VERSION}")
788

789
790
791
792
793
if(PKG_CONFIG_EXECUTABLE)
  poppler_create_install_pkgconfig(poppler.pc ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
  if(ENABLE_QT5)
    poppler_create_install_pkgconfig(poppler-qt5.pc ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
  endif()
794
795
796
  if(ENABLE_QT6)
    poppler_create_install_pkgconfig(poppler-qt6.pc ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
  endif()
797
798
799
800
801
802
803
804
  if(ENABLE_GLIB)
    poppler_create_install_pkgconfig(poppler-glib.pc ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
  endif()
  if(ENABLE_CPP)
    poppler_create_install_pkgconfig(poppler-cpp.pc ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
  endif()
else()
  MESSAGE(STATUS ".pc files will not be installed becasue of missing 'pkg-config'!")
805
endif()
806

807
# Summarize build options & display warnings for user
808
message("Building Poppler with support for:")
809
show_end_message("font configuration" ${font_configuration})
810
show_end_message_yesno("use boost (Splash)" ENABLE_BOOST)
811
show_end_message_yesno("cairo output" CAIRO_FOUND)
812
show_end_message_yesno("qt5 wrapper" ENABLE_QT5)
Albert Astals Cid's avatar
Albert Astals Cid committed
813
show_end_message_yesno("qt6 wrapper" ENABLE_QT6)
814
show_end_message_yesno("glib wrapper" ENABLE_GLIB)
815
show_end_message_yesno("  introspection" INTROSPECTION_FOUND)
816
show_end_message_yesno("  gtk-doc" ENABLE_GTK_DOC)
817
818
819
show_end_message_yesno("cpp wrapper" ENABLE_CPP)
show_end_message_yesno("use libjpeg" ENABLE_LIBJPEG)
show_end_message_yesno("use libpng" ENABLE_LIBPNG)
820
show_end_message_yesno("use libtiff" ENABLE_LIBTIFF)
821
822
show_end_message_yesno("use zlib compress" ENABLE_ZLIB)
show_end_message_yesno("use zlib uncompress" ENABLE_ZLIB_UNCOMPRESS)
André Guerreiro's avatar
André Guerreiro committed
823
show_end_message_yesno("use nss3" ENABLE_NSS3)
Hib Eris's avatar
Hib Eris committed
824
show_end_message_yesno("use curl" ENABLE_LIBCURL)
825
show_end_message_yesno("use libopenjpeg2" WITH_OPENJPEG)
826
show_end_message_yesno("use lcms2" USE_CMS)
827
show_end_message_yesno("command line utils" ENABLE_UTILS)
828
show_end_message_yesno("fuzz target" ENABLE_FUZZER)
829
show_end_message("test data dir" ${TESTDATADIR})
830

831
if(NOT ENABLE_LIBJPEG AND HAVE_DCT_DECODER)
832
  message("Warning: Using libjpeg is recommended. The internal DCT decoder is unmaintained.")
833
834
835
836
837
endif()

if(NOT HAVE_DCT_DECODER)
  message("Warning: You're not compiling any DCT decoder. Some files will fail to display properly.")
endif()
838

839
if(ENABLE_ZLIB_UNCOMPRESS)
840
  message("Warning: Using zlib is not totally safe")
841
endif()
842

843
if(NOT WITH_OPENJPEG AND HAVE_JPX_DECODER)
844
  message("Warning: Using libopenjpeg2 is recommended. The internal JPX decoder is unmaintained.")
845
846
847
848
849
endif()

if(NOT HAVE_JPX_DECODER)
  message("Warning: You're not compiling any JPX decoder. Some files will fail to display properly.")
endif()
850

851
if(NOT ENABLE_BOOST)
852
853
854
  message("Warning: Use of boost is recommended for better performance.")
endif()

855
856
857
858
859
set(ARCHIVE_NAME ${CMAKE_PROJECT_NAME}-${POPPLER_VERSION})
add_custom_target(dist
    COMMAND
        COMMAND git log --stat | fmt --split-only > ${CMAKE_BINARY_DIR}/ChangeLog
        COMMAND git archive --prefix=${ARCHIVE_NAME}/ HEAD > ${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar
860
861
        COMMAND tar -C ${CMAKE_BINARY_DIR} -rf ${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar ChangeLog --transform='s,,${ARCHIVE_NAME}/,' --owner root:0 --group root:0
        COMMAND tar -C ${CMAKE_BINARY_DIR} -rf ${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar glib/reference/html --transform='s,,${ARCHIVE_NAME}/,' --owner root:0 --group root:0
862
863
        COMMAND xz -9 ${CMAKE_BINARY_DIR}/${ARCHIVE_NAME}.tar
    WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})