|
| 1 | +cmake_minimum_required(VERSION 3.12 FATAL_ERROR) |
| 2 | +cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}) |
| 3 | +project(lttoolbox |
| 4 | + VERSION 3.7.12 |
| 5 | + LANGUAGES CXX C |
| 6 | + ) |
| 7 | +set(VERSION ${PROJECT_VERSION}) |
| 8 | +set(VERSION_ABI 3) |
| 9 | +set(PACKAGE_NAME ${PROJECT_NAME}) |
| 10 | +set(PACKAGE_BUGREPORT "[email protected]") |
| 11 | + |
| 12 | +add_definitions("-DPACKAGE_VERSION=\"${PROJECT_VERSION}\"") |
| 13 | + |
| 14 | +set(MASTER_PROJECT OFF) |
| 15 | +if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) |
| 16 | + set(MASTER_PROJECT ON) |
| 17 | +endif () |
| 18 | + |
| 19 | +# Release or Debug |
| 20 | +if(MASTER_PROJECT AND NOT CMAKE_BUILD_TYPE) |
| 21 | + set(CMAKE_BUILD_TYPE "Release") |
| 22 | +endif() |
| 23 | + |
| 24 | +set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) |
| 25 | +set(CMAKE_POSITION_INDEPENDENT_CODE ON) |
| 26 | +set(CMAKE_MACOSX_RPATH ON) |
| 27 | + |
| 28 | +include(GNUInstallDirs) |
| 29 | + |
| 30 | +option(BUILD_SHARED_LIBS "Set to OFF to use static library" ON) |
| 31 | +option(BUILD_TESTING "Set to OFF to disable tests" ON) |
| 32 | +option(ENABLE_PYTHON_BINDINGS "Set to ON to build the Python wrapper" OFF) |
| 33 | + |
| 34 | +if(MSVC) |
| 35 | + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8 /std:c++latest /Zc:__cplusplus /permissive- /W4 /MP") |
| 36 | + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /O2") |
| 37 | + set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG") |
| 38 | + set(CMAKE_C_FLAGS ${CMAKE_CXX_FLAGS}) |
| 39 | + set(CMAKE_C_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE}) |
| 40 | +else() |
| 41 | + set(_FLAGS_COMMON "-Wall -Wextra -Wno-missing-field-initializers -Wno-deprecated -Wno-unused-parameter -fPIC") |
| 42 | + |
| 43 | + include(CheckCCompilerFlag) |
| 44 | + include(CheckCXXCompilerFlag) |
| 45 | + |
| 46 | + foreach(flag "-Wno-unused-result" "-flto") |
| 47 | + string(REGEX REPLACE "[^A-Za-z0-9]" "-" _flag ${flag}) |
| 48 | + CHECK_CXX_COMPILER_FLAG(${flag} COMPILER_SUPPORTS_${_flag}) |
| 49 | + if(COMPILER_SUPPORTS_${_flag}) |
| 50 | + set(_FLAGS_COMMON "${_FLAGS_COMMON} ${flag}") |
| 51 | + endif() |
| 52 | + endforeach() |
| 53 | + if(COMPILER_SUPPORTS_flto) |
| 54 | + set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -flto") |
| 55 | + endif() |
| 56 | + |
| 57 | + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_FLAGS_COMMON} -fvisibility-inlines-hidden") |
| 58 | + |
| 59 | + # Enable latest possible C standard |
| 60 | + foreach(flag "-std=c2x" "-std=c11" "-std=c1x" "-std=c99") |
| 61 | + string(REGEX REPLACE "[^a-z0-9]" "-" _flag ${flag}) |
| 62 | + CHECK_C_COMPILER_FLAG(${flag} COMPILER_SUPPORTS_${_flag}) |
| 63 | + if(COMPILER_SUPPORTS_${_flag}) |
| 64 | + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}") |
| 65 | + break() |
| 66 | + endif() |
| 67 | + endforeach() |
| 68 | + |
| 69 | + # Require latest possible C++ standard |
| 70 | + foreach(flag "-std=c++23" "-std=c++2b" "-std=c++20" "-std=c++2a" "-std=c++17") |
| 71 | + string(REGEX REPLACE "[^a-z0-9]" "-" _flag ${flag}) |
| 72 | + CHECK_CXX_COMPILER_FLAG(${flag} COMPILER_SUPPORTS_${_flag}) |
| 73 | + if(COMPILER_SUPPORTS_${_flag}) |
| 74 | + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}") |
| 75 | + set(_ENABLED_CXX ${flag}) |
| 76 | + break() |
| 77 | + endif() |
| 78 | + endforeach() |
| 79 | + if(NOT _ENABLED_CXX) |
| 80 | + message(FATAL_ERROR "Could not enable at least C++17 - upgrade your compiler") |
| 81 | + endif() |
| 82 | + |
| 83 | + # Generate pkg-config file |
| 84 | + set(prefix ${CMAKE_INSTALL_PREFIX}) |
| 85 | + set(exec_prefix "\${prefix}") |
| 86 | + set(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}") |
| 87 | + set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}") |
| 88 | + configure_file(lttoolbox.pc.in lttoolbox.pc @ONLY) |
| 89 | + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/lttoolbox.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig/") |
| 90 | +endif() |
| 91 | + |
| 92 | +try_compile(SIZET_NOT_CSTDINT ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/lttoolbox/check-cstdint.cc) |
| 93 | +if(SIZET_NOT_CSTDINT) |
| 94 | + add_definitions(-DSIZET_NOT_CSTDINT) |
| 95 | +endif() |
| 96 | + |
| 97 | +find_package(LibXml2 REQUIRED) |
| 98 | +include_directories(${LIBXML2_INCLUDE_DIR}) |
| 99 | + |
| 100 | +if(WIN32) |
| 101 | + add_definitions(-D_SECURE_SCL=0 -D_ITERATOR_DEBUG_LEVEL=0 -D_CRT_SECURE_NO_DEPRECATE -DWIN32_LEAN_AND_MEAN -DVC_EXTRALEAN -DNOMINMAX) |
| 102 | + add_definitions(-DSTDC_HEADERS -DREGEX_MALLOC) |
| 103 | + include_directories("lttoolbox/win32") |
| 104 | +else() |
| 105 | + add_definitions(-D_POSIX_C_SOURCE=200112 -D_GNU_SOURCE) |
| 106 | +endif() |
| 107 | + |
| 108 | +if(NOT APPLE) |
| 109 | + find_package(Threads REQUIRED) |
| 110 | +endif() |
| 111 | + |
| 112 | +# Unlocked I/O functions |
| 113 | +include(CheckSymbolExists) |
| 114 | +set(CMAKE_REQUIRED_DEFINITIONS -D_POSIX_C_SOURCE=200112 -D_GNU_SOURCE) |
| 115 | +foreach(func fread_unlocked fwrite_unlocked fgetc_unlocked fputc_unlocked fputs_unlocked fmemopen) |
| 116 | + string(TOUPPER ${func} _uc) |
| 117 | + CHECK_SYMBOL_EXISTS(${func} "stdio.h" HAVE_DECL_${_uc}) |
| 118 | + if(HAVE_DECL_${_uc}) |
| 119 | + add_definitions(-DHAVE_DECL_${_uc}) |
| 120 | + endif() |
| 121 | +endforeach() |
| 122 | +unset(CMAKE_REQUIRED_DEFINITIONS) |
| 123 | + |
| 124 | +# getopt |
| 125 | +find_path(GETOPT_INCLUDE getopt.h) |
| 126 | +include_directories(${GETOPT_INCLUDE}) |
| 127 | +if(VCPKG_TOOLCHAIN) |
| 128 | + find_library(GETOPT_LIB NAMES getopt REQUIRED) |
| 129 | + add_definitions(-DHAVE_GETOPT_LONG) |
| 130 | +else() |
| 131 | + set(GETOPT_LIB) |
| 132 | + CHECK_SYMBOL_EXISTS(getopt_long "getopt.h" HAVE_DECL_GETOPT_LONG) |
| 133 | + if(HAVE_DECL_GETOPT_LONG) |
| 134 | + add_definitions(-DHAVE_GETOPT_LONG) |
| 135 | + endif() |
| 136 | +endif() |
| 137 | + |
| 138 | +# ICU |
| 139 | +find_package(ICU COMPONENTS i18n io uc REQUIRED) |
| 140 | + |
| 141 | +# utf8cpp / utfcpp |
| 142 | +find_path(UTFCPP_INCLUDE_DIRS utf8.h PATH_SUFFIXES utf8cpp utfcpp utf8 REQUIRED) |
| 143 | +include_directories(${UTFCPP_INCLUDE_DIRS}) |
| 144 | + |
| 145 | +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) |
| 146 | + |
| 147 | +if(BUILD_TESTING) |
| 148 | + enable_testing() |
| 149 | + find_package(Python 3.8 REQUIRED) |
| 150 | + set(PYTHON_EXECUTABLE ${Python_EXECUTABLE}) |
| 151 | + set(ENV{CTEST_OUTPUT_ON_FAILURE} 1) |
| 152 | + set(CMAKE_CTEST_ARGUMENTS "-VV") |
| 153 | +endif() |
| 154 | + |
| 155 | +add_subdirectory(lttoolbox) |
| 156 | + |
| 157 | +if(ENABLE_PYTHON_BINDINGS) |
| 158 | + add_subdirectory(python) |
| 159 | +endif() |
0 commit comments