diff options
author | Jay Berkenbilt <ejb@ql.org> | 2022-03-05 14:24:51 +0100 |
---|---|---|
committer | Jay Berkenbilt <jberkenbilt@users.noreply.github.com> | 2022-03-19 00:53:18 +0100 |
commit | b8aff90997116a84350018f88f1eabdaa368d11b (patch) | |
tree | 5ee781b03d3ffa81bfdd813e91f6324a75b266e6 /CMakeLists.txt | |
parent | 105862da3ea72c6763c26038d2e02cf243eb0798 (diff) | |
download | qpdf-b8aff90997116a84350018f88f1eabdaa368d11b.tar.zst |
Add cmake configuration files
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r-- | CMakeLists.txt | 328 |
1 files changed, 328 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..d3284626 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,328 @@ +# manual/installation.rst mentions the minimum cmake version. +cmake_minimum_required(VERSION 3.16) + +# make_dist expects the version line to be on a line by itself after +# the project line. +project(qpdf + VERSION 10.6.3 + LANGUAGES C CXX) + +# Enable correct rpath handling for MacOSX +cmake_policy(SET CMP0042 NEW) +# Honor CMAKE_REQUIRED_LIBRARIES when checking for include files +cmake_policy(SET CMP0075 NEW) + +# *** OPTIONS *** + +# Keep all options here. It's easier to see the interdependencies this +# way than spreading them throughout the files. +# +# ***** Keep manual/installation.rst (_build-options) up to date. ***** + +include(CMakeDependentOption) + +# CMAKE_DEPENDENT_OPTION( +# OPTION "Description" default-value-if-visible +# "when-visible" value-if-not-visible) + +# Don't write tests based on MAINTAINER_MODE or CI_MODE. Instead, use +# them as the basis for dependent options. + +option(MAINTAINER_MODE "Set options for developing qpdf" OFF) +CMAKE_DEPENDENT_OPTION( + CI_MODE "Set options for running in CI" OFF + "NOT MAINTAINER_MODE" OFF) +CMAKE_DEPENDENT_OPTION( + WERROR "Treat compiler warnings as errors" OFF + "NOT MAINTAINER_MODE; NOT CI_MODE" ON) +CMAKE_DEPENDENT_OPTION( + GENERATE_AUTO_JOB "Automatically regenerate job files" OFF + "NOT MAINTAINER_MODE" ON) +CMAKE_DEPENDENT_OPTION( + SHOW_FAILED_TEST_OUTPUT "Show qtest output on failure" OFF + "NOT CI_MODE" ON) + +# To allow building doc to be disabled in maintainer mode, handle the +# condition manually rather than using a dependent option. +if(MAINTAINER_MODE) + set(default_BUILD_DOC ON) +else() + set(default_BUILD_DOC OFF) +endif() +option(BUILD_DOC "Build documentation" ${default_BUILD_DOC}) +# The values of BUILD_DOC_HTML and BUILD_DOC_PDF are ignored without +# BUILD_DOC, so setting them to ON when not visible forces them to be +# on in MAINTAINER_MODE and is harmless if BUILD_DOC is off. +CMAKE_DEPENDENT_OPTION( + BUILD_DOC_HTML "Build HTML documentation" + ON "BUILD_DOC;NOT MAINTAINER_MODE" ON) +CMAKE_DEPENDENT_OPTION( + BUILD_DOC_PDF "Build PDF documentation" + ON "BUILD_DOC;NOT MAINTAINER_MODE" ON) +CMAKE_DEPENDENT_OPTION( + BUILD_DOC_DIST "Create distribution of manual" ON + "BUILD_DOC_PDF;BUILD_DOC_HTML" OFF) + +option(BUILD_SHARED_LIBS "Build qpdf shared libraries" ON) +option(BUILD_STATIC_LIBS "Build qpdf static libraries" ON) +option(QTEST_COLOR "Whether qtest's output should be in color" ON) +option(USE_INSECURE_RANDOM "Use insecure random numbers" OFF) +option(SKIP_OS_SECURE_RANDOM + "Suppress use of OS-provided secure random numbers" OFF) +CMAKE_DEPENDENT_OPTION( + AVOID_WINDOWS_HANDLE "Avoid use of HANDLE in Windows" OFF + "WIN32" OFF) + +option(OSS_FUZZ "Specific build configuration for the oss-fuzz project" OFF) + +option(USE_IMPLICIT_CRYPTO "Enable any available external crypto provider" ON) +CMAKE_DEPENDENT_OPTION( + ALLOW_CRYPTO_NATIVE "Allow native crypto as as fallback" ON + "USE_IMPLICIT_CRYPTO" OFF) +CMAKE_DEPENDENT_OPTION( + REQUIRE_CRYPTO_NATIVE "Require native crypto provider" OFF + "NOT MAINTAINER_MODE; NOT CI_MODE" ON) +option(REQUIRE_CRYPTO_OPENSSL "Require openssl crypto" OFF) +option(REQUIRE_CRYPTO_GNUTLS "Require gnutls crypto" OFF) +set(DEFAULT_CRYPTO CACHE STRING "") +option(DEFAULT_CRYPTO + "Specify default crypto; otherwise chosen automatically" "") + +# INSTALL_MANUAL is not dependent on building docs. When creating some +# distributions, we build the doc in one run, copy doc-dist in, and +# install it elsewhere. +option(INSTALL_MANUAL "Install documentation" OFF) + +option(INSTALL_PKGCONFIG "Install pkgconfig file" ON) +option(INSTALL_CMAKE_PACKAGE "Install cmake package files" ON) +option(INSTALL_EXAMPLES "Install example files" ON) + +# *** END OPTIONS *** + +if(NOT (BUILD_STATIC_LIBS OR BUILD_SHARED_LIBS)) + message( + FATAL_ERROR "At least one of static or shared libraries must be built") +endif() + +add_compile_definitions($<$<COMPILE_LANGUAGE:CXX>:POINTERHOLDER_TRANSITION=2>) + +enable_testing() +set(RUN_QTEST perl ${qpdf_SOURCE_DIR}/run-qtest) + +if(WIN32) + find_program(COPY_COMMAND NAMES cp copy) + if(COPY_COMMAND STREQUAL "COPY_COMMAND-NOTFOUND") + set(COPY_COMMAND "copy") + endif() +else() + set(COPY_COMMAND "cp") +endif() + +# For a long time, qpdf used libtool's version system. We are no +# longer doing that, but to avoid potential conflict with older +# versions, continue to have the shared library symlink point to a +# file whose version shares minor and patch with the project version +# and major with the SOVERSION. Starting with the transition to cmake, +# increment SOVERSION every time we increment the project major +# version. This works because qpdf uses semantic versioning. qpdf 10.x +# was libqpdf28, so start from there. +math(EXPR qpdf_SOVERSION "${PROJECT_VERSION_MAJOR} + 18") +set(qpdf_LIBVERSION ${qpdf_SOVERSION}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}) + +if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}) + message(FATAL_ERROR " +Please build with cmake in a subdirectory, e.g. + mkdir build + cmake .. + cmake --build . +Please remove CMakeCache.txt and the CMakeFiles directories.") +endif() + +set(CMAKE_CXX_STANDARD 14) +set(CMAKE_CXX_EXTENSIONS OFF) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_C_VISIBILITY_PRESET hidden) +set(CMAKE_CXX_VISIBILITY_PRESET hidden) + +set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/cmake") + +if(WIN32 AND NOT SKIP_OS_SECURE_RANDOM) + list(APPEND CMAKE_REQUIRED_LIBRARIES Advapi32) +endif() + +include(CheckCXXSourceCompiles) +function(check_atomic) + foreach(I 0 1) + if(I) + set(CMAKE_REQUIRED_LIBRARIES atomic) + endif() + check_cxx_source_compiles( + "#include <atomic> +int main() { + static std::atomic<int> a{0}; + a = a.fetch_add(1); + return 0; +}" + ATOMIC_WORKED${I}) + if(ATOMIC_WORKED0) + return() + endif() + endforeach() + if(ATOMIC_WORKED1) + list(APPEND CMAKE_REQUIRED_LIBRARIES atomic) + endif() +endfunction() +check_atomic() + +set(WINDOWS_WMAIN_COMPILE "") +set(WINDOWS_WMAIN_LINK "") +if(WIN32) + function(check_wmain) + foreach(I 0 1) + if(NOT WINDOWS_WMAIN_COMPILE) + if(I) + set(CMAKE_REQUIRED_LINK_OPTIONS -municode) + endif() + check_cxx_source_compiles( + "#include <windows.h> +#include <string.h> +#include <stdio.h> +extern \"C\" +int wmain(int argc, wchar_t* argv[]) +{ + size_t x = wcslen(argv[0]); + return 0; +} +" + WMAIN_WORKED${I}) + endif() + endforeach() + if(WMAIN_WORKED1 OR WMAIN_WORKED1) + set(WINDOWS_WMAIN_COMPILE -DWINDOWS_WMAIN PARENT_SCOPE) + if(WMAIN_WORKED1 AND NOT WMAIN_WORKED0) + set(WINDOWS_WMAIN_LINK -municode PARENT_SCOPE) + endif() + endif() + endfunction() + check_wmain() +endif() + +if(MSVC) + list(APPEND CMAKE_REQUIRED_LINK_OPTIONS -link setargv.obj) + list(APPEND WINDOWS_WMAIN_LINK -link wsetargv.obj) +endif() + +include(GNUInstallDirs) + +# Compiler flags +# +# **NOTE** -- each flag must have its own cache variable. + +include(qpdfCheckFlag) +if(WERROR) + if(MSVC) + add_compile_options(/WX) + else() + qpdf_maybe_add_flag(C -Werror flag_werror) + endif() +endif() + +if(MSVC) + # /Gy combines identical functions -- useful with C++ templates + add_compile_options(/Gy) + add_compile_options(/W3) # warning level 3 +else() + qpdf_maybe_add_flag(C -Wall flag_wall) + qpdf_maybe_add_flag(C -Wconversion flag_conversion) + qpdf_maybe_add_flag(C -Wsign-conversion flag_sign-conversion) + qpdf_maybe_add_flag(C -Wshadow=local flag_shadow_local) + qpdf_maybe_add_flag(CXX -Wold-style-cast flag_old-style-cast) +endif() + +# We don't include the jpeg library's include path in the PUBLIC +# interface for libqpdf since only Pl_DCT.hh requires it. This is +# documented. Some examples and tests use it though so we have to +# define it. CMakeLists.txt for libqpdf sets the value for +# JPEG_INCLUDE which can be selectively added to include paths other +# tools. +set(JPEG_INCLUDE) + +if(${CMAKE_SIZEOF_VOID_P} EQUAL 8) + set(WORDSIZE 64) +else() + set(WORDSIZE 32) +endif() +if(MSVC) + set(CPACK_SYSTEM_NAME "msvc${WORDSIZE}") +elseif(MINGW) + set(CPACK_SYSTEM_NAME "mingw${WORDSIZE}") +endif() +set(CPACK_RESOURCE_FILE_LICENSE "${qpdf_SOURCE_DIR}/LICENSE.txt") +set(CPACK_PACKAGE_HOMEPAGE_URL "https://qpdf.sourceforge.io/") +set(CPACK_NSIS_MUI_ICON "${qpdf_SOURCE_DIR}/logo/qpdf.ico") + +include(CPack) + +# Install components -- documented in _installation in +# manual/installation.rst. +set(COMPONENT_DEV "dev") +set(COMPONENT_LIB "lib") # runtime library +set(COMPONENT_CLI "cli") +set(COMPONENT_DOC "doc") +set(COMPONENT_EXAMPLES "examples") # example sources + +if(WIN32) + include(InstallRequiredSystemLibraries) +endif() + +# add_subdirectory order affects test order +add_subdirectory(include) +add_subdirectory(libqpdf) +add_subdirectory(qpdf) +add_subdirectory(libtests) +add_subdirectory(examples) +add_subdirectory(zlib-flate) +add_subdirectory(manual) +add_subdirectory(fuzz) + +# We don't need to show everything -- just the things that we really +# need to be sure are right or that are turned on or off with complex +# logic. +get_property(MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) +message(STATUS "") +message(STATUS "*** Summary ***") +message(STATUS " qpdf version: ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}") +if(MULTI_CONFIG) + message(STATUS " build type: specify --config at build time") +elseif(CMAKE_BUILD_TYPE) + message(STATUS " build type: ${CMAKE_BUILD_TYPE}") +endif() +message(STATUS " build shared libraries: ${BUILD_SHARED_LIBS}") +message(STATUS " build static libraries: ${BUILD_STATIC_LIBS}") +message(STATUS " build manual: ${BUILD_DOC}") +message(STATUS " compiler warnings are errors: ${WERROR}") +message(STATUS " system: ${CPACK_SYSTEM_NAME}") +message(STATUS "") +message(STATUS "*** Options Summary ***") +foreach(PROP + COMPILE_OPTIONS INTERFACE_COMPILE_OPTIONS + COMPILE_DEFINITIONS INTERFACE_COMPILE_DEFINITIONS + INCLUDE_DIRECTORIES INTERFACE_INCLUDE_DIRECTORIES + INTERFACE_SYSTEM_INCLUDE_DIRECTORIES + LINK_OPTIONS INTERFACE_LINK_OPTIONS + LINK_LIBRARIES INTERFACE_LINK_LIBRARIES + LINK_DIRECTORIES INTERFACE_LINK_DIRECTORIES) + get_target_property(VAL libqpdf ${PROP}) + if(NOT (VAL STREQUAL "VAL-NOTFOUND")) + message(STATUS " ${PROP}: ${VAL}") + endif() +endforeach() +if(APPLE) + message(STATUS " CMAKE_OSX_SYSROOT: ${CMAKE_OSX_SYSROOT}") +endif() +message(STATUS "") +message(STATUS "See above for crypto summary.") +message(STATUS "") +if(NOT (MULTI_CONFIG OR CMAKE_BUILD_TYPE)) + message(WARNING " CMAKE_BUILD_TYPE is not set; using default settings") +endif() |