Warning, /libraries/perceptualcolor/src/CMakeLists.txt is written in an unsupported language. File is not indexed.
0001 # SPDX-FileCopyrightText: Lukas Sommer <sommerluk@gmail.com>
0002 # SPDX-License-Identifier: BSD-2-Clause OR MIT
0003
0004
0005
0006
0007
0008 ################# Version number #################
0009 # Substitutes all occurrences of @MAJOR_VERSION@… and similar declarations
0010 # in the source code file by the actual value in CMake:
0011 configure_file(
0012 # Input:
0013 version.in.hpp
0014 # Output:
0015 ${CMAKE_CURRENT_BINARY_DIR}/generated/version.h
0016 )
0017 # TODO Also configure rpm.spec and Doxygen files with this version information.
0018
0019
0020
0021
0022
0023 ################# Setup source code #################
0024 # Set the sources for our library
0025 set(library_SRC
0026 absolutecolor.cpp
0027 abstractdiagram.cpp
0028 asyncimageproviderbase.cpp
0029 asyncimagerendercallback.cpp
0030 asyncimagerenderthread.cpp
0031 chromahuediagram.cpp
0032 chromahueimageparameters.cpp
0033 chromalightnessdiagram.cpp
0034 chromalightnessimageparameters.cpp
0035 colordialog.cpp
0036 colorpatch.cpp
0037 colorwheel.cpp
0038 colorwheelimage.cpp
0039 extendeddoublevalidator.cpp
0040 genericcolor.cpp
0041 gradientimageparameters.cpp
0042 gradientslider.cpp
0043 helper.cpp
0044 helperconversion.cpp
0045 helpermath.cpp
0046 initializelibraryresources.cpp
0047 initializetranslation.cpp
0048 interlacingpass.cpp
0049 iohandlerfactory.cpp
0050 languagechangeeventfilter.cpp
0051 lchadouble.cpp
0052 lchdouble.cpp
0053 multispinbox.cpp
0054 multispinboxsection.cpp
0055 perceptualsettings.cpp
0056 polarpointf.cpp
0057 rgbcolor.cpp
0058 rgbcolorspace.cpp
0059 rgbcolorspacefactory.cpp
0060 screencolorpicker.cpp
0061 settingbase.cpp
0062 settings.cpp
0063 settranslation.cpp
0064 staticasserts.cpp
0065 swatchbook.cpp
0066 version.cpp
0067 wheelcolorpicker.cpp
0068 )
0069 qt_add_resources(
0070 library_SRC # existing source list
0071 resources.qrc # File with list of Qt resource to be added
0072 # NOTE Starting with Qt6, it will no longer be necessary to have a
0073 # .qrc file, but the list of files can be passed in the very same
0074 # qt_add_resources() command.
0075 )
0076 # NOTE Keep the following list synchronized
0077 # between scripts/static-codecheck.sh and src/CMakeLists.txt
0078 set(lib_PUBLICHEADERS
0079 abstractdiagram.h
0080 chromahuediagram.h
0081 colordialog.h
0082 colorpatch.h
0083 colorwheel.h
0084 constpropagatinguniquepointer.h
0085 gradientslider.h
0086 importexport.h
0087 lchadouble.h
0088 lchdouble.h
0089 multispinbox.h
0090 multispinboxsection.h
0091 rgbcolorspacefactory.h
0092 settranslation.h
0093 wheelcolorpicker.h
0094 ${CMAKE_CURRENT_BINARY_DIR}/generated/version.h
0095 )
0096 # TODO Also explicitly list all private headers to get more stable CMake
0097 # and make sure these files pop up in IDEs.
0098
0099
0100
0101
0102
0103 ################# Translation #################
0104 get_filename_component(absolute_poqm_directory "../poqm" ABSOLUTE)
0105 file(
0106 # TODO Is it possible to get rid of GLOB_RECURSE?
0107 GLOB_RECURSE po_file_list # Name of the output variable.
0108 LIST_DIRECTORIES FALSE
0109 # CMake will add logic to the main build system check target to
0110 # rerun the flagged GLOB commands at build time:
0111 CONFIGURE_DEPENDS
0112 # Examples of recursive globing include:
0113 # /dir/*.py - match all python files in /dir and subdirectories(!)
0114 "${absolute_poqm_directory}/*/perceptualcolor-0_qt.po"
0115 )
0116 # Generate a .qrc file (list of .qm files to include) and the targets
0117 # that will produce the individual .qm files.
0118 set(qrc_file "${CMAKE_CURRENT_BINARY_DIR}/resourcelist.qrc")
0119 file(
0120 WRITE
0121 # Filename:
0122 ${qrc_file}
0123 # Content to write:
0124 "<!DOCTYPE RCC>\n"
0125 "<RCC version=\"1.0\">\n"
0126 " <qresource prefix=\"PerceptualColor/i18n\">\n")
0127 include(ECMPoQmTools)
0128 foreach(po_file_original ${po_file_list})
0129 get_filename_component(po_dir ${po_file_original} DIRECTORY)
0130 get_filename_component(lang ${po_dir} NAME)
0131 # NOTE ECMPoQmTools provides also ecm_install_po_files_as_qm to
0132 # conveniently generate and install qm files as individual files,
0133 # and ecm_create_qm_loader to conveniently load the translations
0134 # automatically. However, currently we compile the translation
0135 # into the library binary itself. First, this avoids that
0136 # translations can ever be lost. Second, ecm_create_qm_loader does
0137 # not work on static libraries. So ecm_process_po_files_as_qm is a
0138 # safer choice. However, its API documentation does not explain in
0139 # which destination folder the generated qm files will be stored.
0140 # Indeed, the destination folder has changed in the past:
0141 # https://invent.kde.org/frameworks/extra-cmake-modules/-/merge_requests/351
0142 # Therefore, we use our own copy of ECMPoQmTools (located at
0143 # cmake/Modules) to make sure we get a defined behaviour.
0144 ecm_process_po_files_as_qm(
0145 ${lang}
0146 ALL # Add this target to the ALL target.
0147 PO_FILES ${po_file_original})
0148 # The attributes threshold="100" compress-algo="none" will prevent these
0149 # files from being compressed. This is because there were discussions
0150 # that QTranslator does not load compressed resourced, but only
0151 # uncompressed resources (https://forum.qt.io/post/368666). As the
0152 # translations are not big anyway, we try to prevent problems and
0153 # disable the compression.
0154 file(
0155 APPEND ${qrc_file}
0156 " <file "
0157 "threshold=\"100\" "
0158 "compress-algo=\"none\" "
0159 "alias=\"localization.${lang}.qm\">"
0160 "ECMPoQm/${lang}/perceptualcolor-0_qt.qm"
0161 "</file>\n")
0162 endforeach()
0163 file(
0164 APPEND
0165 # File to which append some content:
0166 ${qrc_file}
0167 # Content to append:
0168 " </qresource>\n"
0169 "</RCC>\n")
0170 # Add all resources from the .qrt file to our C++ sources
0171 # so they will get compiled in.
0172 qt_add_resources(
0173 library_SRC # existing source list
0174 ${qrc_file} # File with list of Qt resource to be added
0175 # NOTE Starting with Qt6, it will no longer be necessary to have a
0176 # .qrc file, but the list of files can be passed in the very same
0177 # qt_add_resources() command. Problem: The attributes
0178 # threshold="100" compress-algo="none" (see explication above)
0179 # cannot be specified than.
0180 )
0181
0182
0183
0184
0185
0186 ################# Build library #################
0187 # For the library name, we follow the KDE policy:
0188 # https://community.kde.org/Policies/New_KDE_Library_API_Policy#Library_Naming
0189 set(LIBRARY_NAME "perceptualcolor-${MAJOR_VERSION}")
0190 # Add library. If it will build as STATIC or as SHARED library is not
0191 # hardcoded, so add_library() it use BUILD_SHARED_LIBS to decide.
0192 add_library(${LIBRARY_NAME})
0193 # The headers have to be added here explicitly because otherwise Qt’s MOC
0194 # would not find them because they are not in the same directory as the
0195 # corresponding .cpp files
0196 #
0197 # target_sources should normally always use PRIVATE. Details:
0198 # crascit.com/2016/01/31/enhanced-source-file-handling-with-target_sources
0199 target_sources(
0200 ${LIBRARY_NAME}
0201 PRIVATE
0202 ${library_SRC}
0203 ${lib_PUBLICHEADERS})
0204 # Setting the symbol visibility:
0205 if(BUILD_SHARED_LIBS)
0206 target_compile_definitions(
0207 ${LIBRARY_NAME}
0208 PRIVATE PERCEPTUALCOLORLIB_BUILD_DYNAMIC_LIBRARY)
0209 else()
0210 target_compile_definitions(
0211 ${LIBRARY_NAME}
0212 PUBLIC PERCEPTUALCOLORLIB_STATIC)
0213 endif()
0214 set_target_properties(
0215 ${LIBRARY_NAME} PROPERTIES
0216 # By default, on Windows all symbols are hidden except those that are
0217 # explicitly marked for export using the "__declspec(dllexport)"
0218 # or "__declspec(dllimport)" keywords in the code. On Unix-based systems,
0219 # however, all symbols are exported by default unless they are explicitly
0220 # marked as hidden. To achieve the same behavior as on Windows, set
0221 # the "CXX_VISIBILITY_PRESET" property to "hidden" in CMake to hide all
0222 # symbols by default, unless they are explicitly marked for export using
0223 # compiler-specific attributes.
0224 CXX_VISIBILITY_PRESET "hidden"
0225 VISIBILITY_INLINES_HIDDEN TRUE
0226 VERSION "${FULL_VERSION}"
0227 SOVERSION "${MAJOR_VERSION}"
0228 PUBLIC_HEADER "${lib_PUBLICHEADERS}")
0229 target_include_directories(
0230 ${LIBRARY_NAME}
0231 PUBLIC
0232 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/>
0233 $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/generated/>
0234 $<INSTALL_INTERFACE:include/${LIBRARY_NAME}/>
0235 PRIVATE
0236 "${CMAKE_CURRENT_SOURCE_DIR}/"
0237 "${LCMS2_INCLUDE_DIRS}")
0238 # target_link_libraries, despite its name, does not only mean “link”, but
0239 # actually rather “use”. It uses transitive dependencies:
0240 # - If only our source files #include headers of the external library: PRIVATE
0241 # - If only our header files #include headers of the external library: INTERFACE
0242 # - If both (our source files AND our header files) #include headers of external
0243 # library: PUBLIC
0244 # Than, CMake will make sure that targets that depend on our library will
0245 # get the correct and necessary include directories and linking options
0246 # automatically.
0247 # For details, see https://cmake.org/pipermail/cmake/2016-May/063400.html
0248 target_link_libraries(
0249 ${LIBRARY_NAME}
0250 # TODO We could remove the Qt::Concurrent (only) if we were absolutely sure
0251 # that we will not need it in the future either. Otherwise, it’s better
0252 # to keep it, for future binary compatibility.
0253 PUBLIC
0254 Qt::Core Qt::Gui Qt::Widgets Qt::DBus Qt::Concurrent Qt::Svg
0255 PRIVATE
0256 ${LCMS2_LIBRARIES})
0257 install(
0258 DIRECTORY
0259 DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${LIBRARY_NAME}")
0260 install(
0261 # On Linux, both STAIC and SHARED libraries go to the default library
0262 # directory. And in RPM, SHARED libraries are part of a normal package,
0263 # while STATIC libraries go to “%package devel”.
0264 TARGETS ${LIBRARY_NAME}
0265 EXPORT "${LIBRARY_NAME}"
0266 PUBLIC_HEADER DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${LIBRARY_NAME}")
0267 install(EXPORT ${LIBRARY_NAME}
0268 FILE ${LIBRARY_NAME}.cmake
0269 NAMESPACE "PerceptualColor::"
0270 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${LIBRARY_NAME}
0271 )
0272 include(CMakePackageConfigHelpers)
0273 write_basic_package_version_file(
0274 "${CMAKE_CURRENT_BINARY_DIR}/generated/${LIBRARY_NAME}-config-version.cmake"
0275 VERSION "${FULL_VERSION}"
0276 COMPATIBILITY AnyNewerVersion
0277 )
0278 configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in
0279 "${CMAKE_CURRENT_BINARY_DIR}/generated/${LIBRARY_NAME}-config.cmake"
0280 INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${LIBRARY_NAME}
0281 )
0282 install(
0283 FILES
0284 "${CMAKE_CURRENT_BINARY_DIR}/generated/${LIBRARY_NAME}-config.cmake"
0285 "${CMAKE_CURRENT_BINARY_DIR}/generated/${LIBRARY_NAME}-config-version.cmake"
0286 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${LIBRARY_NAME}
0287 )
0288
0289
0290
0291
0292
0293 ################# Build internal library #################
0294 # The following library is like the normal library, with the
0295 # following difference: It exports all symbols (also private ones), and it
0296 # does not install. This is used for the unit testing, because exporting all
0297 # symbols is necessary for whitebox testing, which we actually do during
0298 # unit testing.
0299 # (This makes every cpp file to compile twice, which makes the build time
0300 # longer. It might be possible to avoid this by creating an OBJECT collection
0301 # with add_library(object_collection OBJECT 1.cpp 2.cpp …) to avoid double
0302 # compiling, but the resulting library has a bigger file size. Therefore,
0303 # this is not a good option.)
0304 set(INTERNAL_LIBRARY_NAME "perceptualcolorinternal-${MAJOR_VERSION}")
0305 # Add library. If it will build as STATIC or as SHARED library is not
0306 # hardcoded, so add_library() it use BUILD_SHARED_LIBS to decide.
0307 add_library(${INTERNAL_LIBRARY_NAME})
0308 # target_sources should normally always use PRIVATE. Details:
0309 # crascit.com/2016/01/31/enhanced-source-file-handling-with-target_sources
0310 target_sources(
0311 ${INTERNAL_LIBRARY_NAME}
0312 PRIVATE
0313 ${library_SRC}
0314 ${lib_PUBLICHEADERS}
0315 # Add code that is currently not used, but that should be kept working
0316 # for possible use in the future.
0317 csscolor.cpp)
0318 target_compile_definitions(
0319 ${INTERNAL_LIBRARY_NAME}
0320 PRIVATE PERCEPTUALCOLORINTERNAL)
0321 if(BUILD_SHARED_LIBS)
0322 target_compile_definitions(
0323 ${INTERNAL_LIBRARY_NAME}
0324 PRIVATE PERCEPTUALCOLORLIB_BUILD_DYNAMIC_LIBRARY)
0325 else()
0326 target_compile_definitions(
0327 ${INTERNAL_LIBRARY_NAME}
0328 PUBLIC PERCEPTUALCOLORLIB_STATIC)
0329 endif()
0330 set_target_properties(
0331 ${INTERNAL_LIBRARY_NAME} PROPERTIES
0332 # We want all symbols to be publicly available. On Unix-based systems, this
0333 # is the default behavior, and no additional configuration is required.
0334 CXX_VISIBILITY_PRESET "default"
0335 VISIBILITY_INLINES_HIDDEN FALSE
0336 VERSION "${FULL_VERSION}"
0337 SOVERSION "${MAJOR_VERSION}")
0338 if(WIN32)
0339 set_target_properties(${INTERNAL_LIBRARY_NAME} PROPERTIES
0340 # However, on Windows, all symbols are hidden by default
0341 # except for those that are explicitly marked for export using
0342 # "__declspec(dllexport)" or "__declspec(dllimport)" keywords.
0343 # To achieve a similar behavior on Window as on Unix-based systems,
0344 # CMake provides the "WINDOWS_EXPORT_ALL_SYMBOLS" property, which
0345 # can be set to "TRUE" to automatically generate the necessary
0346 # export symbols for all classes and functions on Windows. However,
0347 # please note that this option does not work for global variables.
0348 # Note that this is incompatible with INTERPROCEDURAL_OPTIMIZATION.
0349 # See also https://stackoverflow.com/q/225432/5706738
0350 WINDOWS_EXPORT_ALL_SYMBOLS TRUE
0351 # WINDOWS_EXPORT_ALL_SYMBOLS is incompatible with the /GL option
0352 # for IPO/LTO (whole program optimization) on MSVC. And maybe also
0353 # with IPO/LTO on MinGW?
0354 INTERPROCEDURAL_OPTIMIZATION OFF)
0355 endif()
0356 # The automatic export of otherwise private symbols on MSVC
0357 # shared libraries via CMake's WINDOWS_EXPORT_ALL_SYMBOLS property
0358 # does not work well for Qt meta objects, resulting in non-functional
0359 # signals. Since some unit tests require signals, it is good to give
0360 # linker feedback in targets linking against this library (therefore PUBLIC).
0361 if(MSVC AND BUILD_SHARED_LIBS)
0362 target_link_options(${INTERNAL_LIBRARY_NAME} PUBLIC "/VERBOSE")
0363 endif()
0364 if(WIN32 AND "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
0365 # NOTE --export-all-symbols is necessary when using the GNU compiler
0366 # on Windows (MinGW), but is refused when using the GNU compiler on Linux.
0367 # NOTE Options like -rdynamic (for the compiler) or --export-dynamic
0368 # (directly for the GNU linker) respectively --export_dynamic (directly
0369 # for the Clang linker) only affect executables. --export-all-symbols
0370 # however affects also libraries.
0371 target_link_options(${INTERNAL_LIBRARY_NAME}
0372 # "-Wl," passes the following option to the linker.
0373 PRIVATE "-Wl,--export-all-symbols")
0374 endif()
0375 target_include_directories(
0376 ${INTERNAL_LIBRARY_NAME}
0377 PUBLIC
0378 $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
0379 $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/generated/>
0380 # No $<INSTALL_INTERFACE:xxx> because this target is only meant to
0381 # be build as part of this project, and not by external projects.
0382 # NOTE It's necessary for LittleCMS to be marked as PUBLIC for the
0383 # internal build since users of the internal build have full access
0384 # to internal headers. These headers may include LittleCMS, and without
0385 # public access, users wouldn't be able to use the library as intended.
0386 ${LCMS2_INCLUDE_DIRS})
0387 target_link_libraries(
0388 ${INTERNAL_LIBRARY_NAME}
0389 # TODO We could remove the Qt::Concurrent (only) if we were absolutely sure
0390 # that we will not need it in the future either. Otherwise, it’s better
0391 # to keep it, for future binary compatibility.
0392 # NOTE It's necessary for LittleCMS to be marked as PUBLIC for the
0393 # internal build since users of the internal build have full access
0394 # to internal headers. These headers may include LittleCMS, and without
0395 # public access, users wouldn't be able to use the library as intended.
0396 PUBLIC
0397 Qt::Core Qt::Gui Qt::Widgets Qt::DBus Qt::Concurrent Qt::Svg
0398 ${LCMS2_LIBRARIES}
0399 )