498 lines
20 KiB
CMake
498 lines
20 KiB
CMake
cmake_minimum_required(VERSION 3.18)
|
|
|
|
cmake_policy(SET CMP0011 NEW)
|
|
cmake_policy(SET CMP0025 NEW)
|
|
cmake_policy(SET CMP0048 NEW)
|
|
cmake_policy(SET CMP0067 NEW)
|
|
|
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules/")
|
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/")
|
|
|
|
### Add defaults for cmake
|
|
# These defaults need to be included before the project() call.
|
|
include(DefineCMakeDefaults)
|
|
|
|
If(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
|
|
message(FATAL_ERROR "In-source builds are not permitted. Make a separate folder for building:\nmkdir build; cd build; cmake ..\nBefore that, remove the files already created:\nrm -rf CMakeCache.txt CMakeFiles")
|
|
endif(CMAKE_SOURCE_DIR STREQUAL CMAKE_BINARY_DIR)
|
|
|
|
if(DEFINED PROJECT_VERSION)
|
|
project(darktable VERSION ${PROJECT_VERSION} LANGUAGES CXX C)
|
|
else()
|
|
# Actual version string will be generated from git later
|
|
project(darktable VERSION 0 LANGUAGES CXX C)
|
|
endif()
|
|
|
|
# Allow forcing the C/CPP compiler that is actually used during the compilation
|
|
# to something other than what is used by the cmake run. This is useful when
|
|
# the compiler for some reason breaks the initial cmake checks but works fine
|
|
# for actually compiling darktable. This allows building darktable using
|
|
# afl-clang-fast achieving a >4x speedup in fuzzing.
|
|
IF(DEFINED DT_FORCE_C_COMPILER)
|
|
set(CMAKE_C_COMPILER ${DT_FORCE_C_COMPILER})
|
|
endif()
|
|
IF(DEFINED DT_FORCE_CXX_COMPILER)
|
|
set(CMAKE_CXX_COMPILER ${DT_FORCE_CXX_COMPILER})
|
|
endif()
|
|
|
|
include(DefineOptions.cmake)
|
|
|
|
# Include GNUInstallDirs, which sets sensible defaults for install directories.
|
|
# See https://cmake.org/cmake/help/v3.0/module/GNUInstallDirs.html for further information.
|
|
# These values can be easily overridden if required.
|
|
# Some defaults are set for OpenBSD as well (info and man pages).
|
|
|
|
include(GNUInstallDirs)
|
|
include(FeatureSummary)
|
|
|
|
# resolve symbolic links into real path?
|
|
get_filename_component(CMAKE_INSTALL_BINDIR_ABS "${CMAKE_INSTALL_FULL_BINDIR}" REALPATH "${CMAKE_INSTALL_PREFIX}")
|
|
# get relative paths specific to the system
|
|
file(RELATIVE_PATH REL_BIN_TO_LIBDIR ${CMAKE_INSTALL_FULL_BINDIR} "${CMAKE_INSTALL_FULL_LIBDIR}/darktable")
|
|
file(RELATIVE_PATH REL_BIN_TO_SHAREDIR ${CMAKE_INSTALL_FULL_BINDIR} "${CMAKE_INSTALL_FULL_DATADIR}")
|
|
file(RELATIVE_PATH REL_BIN_TO_LOCALEDIR ${CMAKE_INSTALL_FULL_BINDIR} "${CMAKE_INSTALL_FULL_LOCALEDIR}")
|
|
set(REL_BIN_TO_DATADIR "${REL_BIN_TO_SHAREDIR}/darktable")
|
|
set(DARKTABLE_BINDIR "${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}")
|
|
set(DARKTABLE_LIBDIR "${DARKTABLE_BINDIR}/${REL_BIN_TO_LIBDIR}")
|
|
set(DARKTABLE_SHAREDIR "${DARKTABLE_BINDIR}/${REL_BIN_TO_SHAREDIR}")
|
|
set(DARKTABLE_DATADIR "${DARKTABLE_BINDIR}/${REL_BIN_TO_DATADIR}") # DATAROOTDIR == DATADIR # darktablerc, themes, icons, ... Cannot use ${CMAKE_BINDIR}/data because not everything resides there. Like icons (pixmaps)
|
|
set(DARKTABLE_LOCALEDIR "${DARKTABLE_BINDIR}/${REL_BIN_TO_LOCALEDIR}")
|
|
|
|
# https://medium.com/@alasher/colored-c-compiler-output-with-ninja-clang-gcc-10bfe7f2b949
|
|
if(${FORCE_COLORED_OUTPUT})
|
|
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
|
add_compile_options(-fdiagnostics-color=always)
|
|
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
|
|
add_compile_options(-fcolor-diagnostics)
|
|
endif()
|
|
endif()
|
|
|
|
# Whether to use relative paths for the build RPATH
|
|
if (APPLE)
|
|
set(CMAKE_MACOSX_RPATH ON)
|
|
set(RPATH_ORIGIN @loader_path)
|
|
else()
|
|
set(RPATH_ORIGIN $ORIGIN)
|
|
endif()
|
|
|
|
if (USE_OPENMP)
|
|
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR
|
|
CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang")
|
|
|
|
# Clang has an option to specify the OpenMP standard to use. Specify it.
|
|
# FIXME: Implement this in FindOpenMP.cmake
|
|
set(OPENMP_VERSION_SPECIFIER "-fopenmp-version=51")
|
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OPENMP_VERSION_SPECIFIER}")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OPENMP_VERSION_SPECIFIER}")
|
|
endif()
|
|
|
|
find_package(OpenMP 4.5 REQUIRED)
|
|
endif()
|
|
|
|
# Check for base threading library
|
|
set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
|
|
find_package(Threads REQUIRED)
|
|
|
|
# Fail if returned library is not pthread
|
|
if (NOT CMAKE_USE_PTHREADS_INIT)
|
|
message(FATAL_ERROR "POSIX threads: not found")
|
|
endif()
|
|
|
|
include(ConfigureChecks.cmake)
|
|
|
|
include(CheckCCompilerFlag)
|
|
|
|
# Check if this is source package build
|
|
if(NOT EXISTS ${CMAKE_SOURCE_DIR}/.git)
|
|
set(SOURCE_PACKAGE 1)
|
|
else()
|
|
set(SOURCE_PACKAGE 0)
|
|
endif()
|
|
|
|
if(NOT CMAKE_SYSTEM_PROCESSOR MATCHES "(x86_64)|(AMD64|amd64)|(X86|x86)|(^i.86$)")
|
|
set(BUILD_SSE2_CODEPATHS OFF)
|
|
endif()
|
|
|
|
if(BUILD_SSE2_CODEPATHS)
|
|
CHECK_C_COMPILER_FLAG("-msse2" _MSSE2)
|
|
if(NOT _MSSE2)
|
|
MESSAGE(WARNING "Building of SSE2-optimized codepaths is enabled, but the compiler does not understand -msse2.")
|
|
set(BUILD_SSE2_CODEPATHS OFF)
|
|
endif()
|
|
endif()
|
|
|
|
MESSAGE(STATUS "Building SSE2-optimized codepaths: ${BUILD_SSE2_CODEPATHS}")
|
|
|
|
#
|
|
# Set platform defaults...
|
|
#
|
|
if(APPLE)
|
|
message("-- Mac OS X build detected, setting default features")
|
|
find_program(HOMEBREW_EXISTS "brew")
|
|
if(HOMEBREW_EXISTS)
|
|
execute_process(COMMAND brew --prefix OUTPUT_VARIABLE HOMEBREW_PREFIX)
|
|
string(STRIP "${HOMEBREW_PREFIX}" HOMEBREW_PREFIX)
|
|
message("-- Homebrew detected, setting CMAKE_PREFIX_PATH to ${HOMEBREW_PREFIX}")
|
|
LIST(APPEND CMAKE_PREFIX_PATH ${HOMEBREW_PREFIX})
|
|
# Explicitly add llvm and icu4c to prefix path
|
|
LIST(APPEND CMAKE_PREFIX_PATH ${HOMEBREW_PREFIX}/opt/llvm)
|
|
LIST(APPEND CMAKE_PREFIX_PATH ${HOMEBREW_PREFIX}/opt/icu4c)
|
|
else()
|
|
message("-- Setting CMAKE_PREFIX_PATH to prefer MacPorts and/or user-installed libraries over system ones")
|
|
LIST(APPEND CMAKE_PREFIX_PATH /opt/local /usr/local)
|
|
endif()
|
|
set(CMAKE_FIND_FRAMEWORK "LAST")
|
|
# except libstdc++ (only one linked via -l flag, not full path)
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/lib")
|
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -L/usr/lib")
|
|
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -L/usr/lib")
|
|
|
|
if(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL "arm64" AND CMAKE_C_COMPILER_ID STREQUAL "AppleClang" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 15)
|
|
# request classic linker for Xcode 15 for Apple Silicon Macs
|
|
message("-- Xcode >= 15 on arm64 detected, requesting classic linker")
|
|
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -ld_classic")
|
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -ld_classic")
|
|
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -ld_classic")
|
|
endif()
|
|
|
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_DARWIN_C_SOURCE")
|
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_DARWIN_C_SOURCE")
|
|
add_definitions("-DOS_OBJECT_USE_OBJC=0")
|
|
endif(APPLE)
|
|
|
|
include(compiler-versions)
|
|
|
|
if(WIN32)
|
|
message("-- Win32 build detected, setting default features")
|
|
set(USE_COLORD OFF)
|
|
set(USE_KWALLET OFF)
|
|
set(BUILD_CMSTEST OFF)
|
|
set(BUILD_PRINT OFF)
|
|
set(TESTBUILD_OPENCL_PROGRAMS OFF)
|
|
if(BUILD_MSYS2_INSTALL)
|
|
add_definitions(-DMSYS2_INSTALL)
|
|
endif()
|
|
endif(WIN32)
|
|
|
|
|
|
#
|
|
# Set package version
|
|
#
|
|
file(MAKE_DIRECTORY "${DARKTABLE_BINDIR}/") # the bin/ subdirectory won't exist yet
|
|
|
|
# adds custom command to generate header containing version info.
|
|
# takes 1 optional parameter - version override.
|
|
function(generate_version_gen_c)
|
|
if(ARGC EQUAL 2)
|
|
# if a version override was specified, use it
|
|
set(_VERSION "${ARGV0}")
|
|
set(_TYPE "${ARGV1}")
|
|
else()
|
|
# else, the tool will autodetect the version
|
|
set(_VERSION "")
|
|
set(_TYPE "git checkout")
|
|
endif()
|
|
|
|
add_custom_target(
|
|
create_version_gen ALL
|
|
COMMAND sh ${CMAKE_SOURCE_DIR}/tools/create_version_c.sh ${DARKTABLE_BINDIR}/version_gen.c ${_VERSION}
|
|
DEPENDS ${CMAKE_SOURCE_DIR}/tools/create_version_c.sh
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
COMMENT "Updating version string (${_TYPE})"
|
|
VERBATIM # else might break when export-subst was needed but did not happen
|
|
)
|
|
endfunction(generate_version_gen_c)
|
|
|
|
if(DEFINED PROJECT_VERSION AND PROJECT_VERSION VERSION_GREATER 0)
|
|
#project version is defined by -D on the cmake command line
|
|
# only use that value, do not update it at make time
|
|
generate_version_gen_c(${PROJECT_VERSION} "version override")
|
|
else(DEFINED PROJECT_VERSION AND PROJECT_VERSION VERSION_GREATER 0)
|
|
if(NOT SOURCE_PACKAGE) # i.e., a git checkout
|
|
# this part is setting the corresponding CMake variable which gets used for example when creating a source package
|
|
execute_process(
|
|
COMMAND sh ${CMAKE_SOURCE_DIR}/tools/get_git_version_string.sh OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
OUTPUT_VARIABLE PROJECT_VERSION
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR})
|
|
# FIXME: PROJECT_VERSION will not be updated automatically, until you rerun cmake
|
|
generate_version_gen_c()
|
|
else(NOT SOURCE_PACKAGE)
|
|
if(NOT EXISTS ${CMAKE_SOURCE_DIR}/src/version_gen.c)
|
|
# should be expanded by git archive due to export-subst in .gitattributes
|
|
set(PROJECT_VERSION "archive-$Format:%H$")
|
|
# but was it expanded?
|
|
if(PROJECT_VERSION MATCHES Format)
|
|
set(PROJECT_VERSION "unknown-version")
|
|
endif(PROJECT_VERSION MATCHES Format)
|
|
generate_version_gen_c(${PROJECT_VERSION} "source package")
|
|
else(NOT EXISTS ${CMAKE_SOURCE_DIR}/src/version_gen.c)
|
|
# no need to create version_gen.c if it's already shipped. that is for example the case with our release tarballs
|
|
execute_process(
|
|
COMMAND sh ${CMAKE_SOURCE_DIR}/tools/parse_version_c.sh ${CMAKE_SOURCE_DIR}/src/version_gen.c OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
OUTPUT_VARIABLE PROJECT_VERSION
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
)
|
|
# FIXME: (irrelevant) PROJECT_VERSION will not be updated automatically, until you rerun cmake
|
|
# but generate_version target expects it to be in build dir, so we need to copy it
|
|
add_custom_target(
|
|
create_version_gen ALL
|
|
COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_SOURCE_DIR}/src/version_gen.c ${DARKTABLE_BINDIR}/version_gen.c
|
|
DEPENDS ${CMAKE_SOURCE_DIR}/src/version_gen.c
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
COMMENT "Updating version string (source package) - ${PROJECT_VERSION}"
|
|
)
|
|
endif(NOT EXISTS ${CMAKE_SOURCE_DIR}/src/version_gen.c)
|
|
endif(NOT SOURCE_PACKAGE)
|
|
endif(DEFINED PROJECT_VERSION AND PROJECT_VERSION VERSION_GREATER 0)
|
|
|
|
# needed to make sure that version string is actually updated.
|
|
add_custom_command(
|
|
OUTPUT ${DARKTABLE_BINDIR}/version_gen.c
|
|
COMMAND ${CMAKE_COMMAND} -E echo
|
|
DEPENDS create_version_gen
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
)
|
|
|
|
# WARNING: no target should reference version_gen.c directly. instead, they should add_dependencies(yourtarget generate_version)
|
|
add_custom_target(
|
|
generate_version ALL
|
|
DEPENDS ${DARKTABLE_BINDIR}/version_gen.c
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
)
|
|
|
|
# Add a sensible build type default and warning because empty means no optimization and no debug info.
|
|
if(NOT CMAKE_BUILD_TYPE)
|
|
message("WARNING: CMAKE_BUILD_TYPE is not defined!\n Defaulting to CMAKE_BUILD_TYPE=RelWithDebInfo. Use ccmake to set a proper value.")
|
|
SET(CMAKE_BUILD_TYPE RelWithDebInfo CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel." FORCE)
|
|
endif(NOT CMAKE_BUILD_TYPE)
|
|
|
|
if(CMAKE_BUILD_TYPE MATCHES "^[Dd][Ee][Bb][Uu][Gg]$" AND SOURCE_PACKAGE)
|
|
message(FATAL_ERROR "ERROR: Debug build type most likely isn't what you want, use RelWithDebInfo instead. If you're absolutely sure that this is what you want then just comment out this line.")
|
|
endif()
|
|
|
|
include(compiler-warnings)
|
|
include(windows-macros)
|
|
|
|
# we need some external programs for building darktable
|
|
message(STATUS "Looking for external programs")
|
|
|
|
# we need perl for introspection
|
|
find_program(perl_BIN perl REQUIRED)
|
|
message(STATUS "Found perl")
|
|
|
|
# we need intltool-merge for org.darktable.darktable.desktop
|
|
find_program(intltool_merge_BIN intltool-merge REQUIRED)
|
|
message(STATUS "Found intltool-merge")
|
|
|
|
# we need desktop-file-validate to check org.darktable.darktable.desktop
|
|
find_program(desktop_file_validate_BIN desktop-file-validate)
|
|
if(${desktop_file_validate_BIN} STREQUAL "desktop_file_validate_BIN-NOTFOUND")
|
|
message(STATUS "Missing desktop-file-validate, problems in org.darktable.darktable.desktop might go unnoticed")
|
|
set(VALIDATE_DESKTOP_FILE 0)
|
|
else(${desktop_file_validate_BIN} STREQUAL "desktop_file_validate_BIN-NOTFOUND")
|
|
message(STATUS "Found desktop-file-validate")
|
|
set(VALIDATE_DESKTOP_FILE 1)
|
|
endif(${desktop_file_validate_BIN} STREQUAL "desktop_file_validate_BIN-NOTFOUND")
|
|
|
|
# we need appstream-util to check darktable.appdata.xml
|
|
if(VALIDATE_APPDATA_FILE)
|
|
find_program(appstream_util_BIN appstream-util)
|
|
if(${appstream_util_BIN} STREQUAL "appstream_util_BIN-NOTFOUND")
|
|
message(STATUS "Missing appstream-util, problems in darktable.appdata.xml might go unnoticed")
|
|
set(VALIDATE_APPDATA_FILE OFF)
|
|
else(${appstream_util_BIN} STREQUAL "appstream_util_BIN-NOTFOUND")
|
|
message(STATUS "Found appstream-util")
|
|
endif(${appstream_util_BIN} STREQUAL "appstream_util_BIN-NOTFOUND")
|
|
endif(VALIDATE_APPDATA_FILE)
|
|
|
|
if(TESTBUILD_OPENCL_PROGRAMS)
|
|
set(TESTBUILD_OPENCL_PROGRAMS OFF)
|
|
|
|
find_package(LLVM CONFIG)
|
|
|
|
if(LLVM_FOUND)
|
|
if(${LLVM_VERSION} VERSION_LESS 7)
|
|
set(LLVM_FOUND FALSE)
|
|
endif()
|
|
endif()
|
|
|
|
if (LLVM_FOUND)
|
|
message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
|
|
|
|
find_program(CLANG_OPENCL_COMPILER
|
|
NAMES clang-${LLVM_VERSION_MAJOR}.${LLVM_VERSION_MINOR} clang-${LLVM_PACKAGE_VERSION} clang${LLVM_VERSION_MAJOR}${LLVM_VERSION_MINOR} clang-${LLVM_VERSION_MAJOR} clang${LLVM_VERSION_MAJOR}
|
|
)
|
|
|
|
if (NOT ${CLANG_OPENCL_COMPILER} STREQUAL "CLANG_OPENCL_COMPILER-NOTFOUND")
|
|
message(STATUS "Found clang compiler - ${CLANG_OPENCL_COMPILER}")
|
|
|
|
find_path(CLANG_OPENCL_INCLUDE_DIR opencl-c.h
|
|
HINTS ${LLVM_INSTALL_PREFIX}/lib/clang ${LLVM_INSTALL_PREFIX}/lib64/clang
|
|
PATH_SUFFIXES include ${LLVM_PACKAGE_VERSION}/include ${LLVM_VERSION_MAJOR}/include
|
|
NO_DEFAULT_PATH
|
|
)
|
|
|
|
if (NOT ${CLANG_OPENCL_INCLUDE_DIR} STREQUAL "CLANG_OPENCL_INCLUDE_DIR-NOTFOUND")
|
|
message(STATUS "Found clang opencl-c.h header in ${CLANG_OPENCL_INCLUDE_DIR}")
|
|
set(TESTBUILD_OPENCL_PROGRAMS ON)
|
|
else()
|
|
message(WARNING "Could not find clang opencl-c.h header include dir")
|
|
message(WARNING "Test-compilation of OpenCL programs can not be done.")
|
|
endif()
|
|
else()
|
|
message(WARNING "Could not find appropriate clang compiler")
|
|
message(WARNING "Test-compilation of OpenCL programs can not be done.")
|
|
endif()
|
|
else()
|
|
message(WARNING "Could not find LLVM 7 or above")
|
|
message(WARNING "Test-compilation of OpenCL programs can not be done.")
|
|
endif()
|
|
endif()
|
|
|
|
if(USE_OPENCL AND TESTBUILD_OPENCL_PROGRAMS)
|
|
message(STATUS "Will be able to test-compile OpenCL programs. Nice.")
|
|
elseif(USE_OPENCL)
|
|
message(STATUS "Test-compilation of OpenCL programs is disabled.")
|
|
endif()
|
|
|
|
# we need jsonschema to check noiseprofiles.json
|
|
find_program(jsonschema_BIN jsonschema)
|
|
if(${jsonschema_BIN} STREQUAL "jsonschema_BIN-NOTFOUND")
|
|
message(STATUS "Missing jsonschema, problems in noiseprofiles.json might go unnoticed")
|
|
set(VALIDATE_JSON 0)
|
|
else(${jsonschema_BIN} STREQUAL "jsonschema_BIN-NOTFOUND")
|
|
message(STATUS "Found jsonschema")
|
|
set(VALIDATE_JSON 1)
|
|
endif(${jsonschema_BIN} STREQUAL "jsonschema_BIN-NOTFOUND")
|
|
|
|
# we need an XSLT interpreter to generate preferences_gen.h and darktablerc
|
|
find_program(Xsltproc_BIN xsltproc)
|
|
if(${Xsltproc_BIN} STREQUAL "Xsltproc_BIN-NOTFOUND")
|
|
message(STATUS "Missing xsltproc")
|
|
find_program(Saxon_BIN saxon-xslt)
|
|
if(${Saxon_BIN} STREQUAL "Saxon_BIN-NOTFOUND")
|
|
message(STATUS "Missing saxon-xslt")
|
|
message(FATAL_ERROR "No XSLT interpreter found")
|
|
else(${Saxon_BIN} STREQUAL "Saxon_BIN-NOTFOUND")
|
|
message(STATUS "Found saxon-xslt")
|
|
endif(${Saxon_BIN} STREQUAL "Saxon_BIN-NOTFOUND")
|
|
else(${Xsltproc_BIN} STREQUAL "Xsltproc_BIN-NOTFOUND")
|
|
message(STATUS "Found xsltproc")
|
|
endif(${Xsltproc_BIN} STREQUAL "Xsltproc_BIN-NOTFOUND")
|
|
|
|
# do we have xmllint?
|
|
if(USE_XMLLINT)
|
|
find_program(Xmllint_BIN xmllint)
|
|
if(${Xmllint_BIN} STREQUAL "Xmllint_BIN-NOTFOUND")
|
|
message(STATUS "Missing xmllint")
|
|
set(USE_XMLLINT OFF)
|
|
else(${Xmllint_BIN} STREQUAL "Xmllint_BIN-NOTFOUND")
|
|
message(STATUS "Found xmllint")
|
|
endif(${Xmllint_BIN} STREQUAL "Xmllint_BIN-NOTFOUND")
|
|
endif(USE_XMLLINT)
|
|
|
|
# done with looking for programs
|
|
message(STATUS "All external programs found")
|
|
|
|
# The path can be modified by setting CMAKE_INSTALL_LOCALEDIR
|
|
find_package(Gettext REQUIRED)
|
|
if(GETTEXT_MSGFMT_EXECUTABLE)
|
|
add_subdirectory(po)
|
|
else()
|
|
message(FATAL_ERROR "ERROR: Cannot find msgfmt to convert .po file")
|
|
endif()
|
|
|
|
# needed to generate file "preferences_gen.h" accordingly
|
|
if(USE_OPENCL)
|
|
SET(HAVE_OPENCL 1)
|
|
else()
|
|
SET(HAVE_OPENCL 0)
|
|
endif(USE_OPENCL)
|
|
|
|
if(NOT SOURCE_PACKAGE AND NOT (CMAKE_VERSION VERSION_LESS 3.3) AND DEFINED ENV{_DO_IWYU})
|
|
find_program(iwyu_path NAMES include-what-you-use iwyu)
|
|
|
|
if(iwyu_path)
|
|
set(DT_CMAKE_INCLUDE_WHAT_YOU_USE ${iwyu_path} -Xiwyu --mapping_file=${CMAKE_SOURCE_DIR}/iwyu.imp -Xiwyu --prefix_header_includes=add)
|
|
endif()
|
|
|
|
find_program(iwyu_tool_path NAMES iwyu_tool.py)
|
|
if (iwyu_tool_path)
|
|
add_custom_command(
|
|
OUTPUT "${CMAKE_BINARY_DIR}/iwyu.log"
|
|
COMMAND "${iwyu_tool_path}" -v -p "${CMAKE_BINARY_DIR}"
|
|
-- --mapping_file=${CMAKE_SOURCE_DIR}/iwyu.imp
|
|
--prefix_header_includes=add 2>
|
|
"${CMAKE_BINARY_DIR}/iwyu.log"
|
|
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
|
|
COMMENT "Running include-what-you-use tool"
|
|
VERBATIM
|
|
)
|
|
add_custom_target(iwyu
|
|
DEPENDS "${CMAKE_BINARY_DIR}/iwyu.log"
|
|
VERBATIM
|
|
)
|
|
endif()
|
|
|
|
find_program(fix_includes_path NAMES fix_includes.py)
|
|
if (fix_includes_path)
|
|
add_custom_target(iwyu_fix
|
|
COMMAND "${fix_includes_path}" --noblank_lines --comments
|
|
--nosafe_headers < "${CMAKE_BINARY_DIR}/iwyu.log" || true
|
|
COMMAND ${CMAKE_COMMAND} -E remove "${CMAKE_BINARY_DIR}/iwyu.log"
|
|
DEPENDS "${CMAKE_BINARY_DIR}/iwyu.log"
|
|
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
|
|
COMMENT "Running include-what-you-use fix_includes tool"
|
|
VERBATIM
|
|
)
|
|
endif()
|
|
endif()
|
|
|
|
if(BUILD_TESTING)
|
|
find_package(cmocka 1.1.0 CONFIG REQUIRED)
|
|
include(AddCMockaTest)
|
|
include(AddCMockaMockTest)
|
|
include_directories(${CMOCKA_INCLUDE_DIR} include)
|
|
endif(BUILD_TESTING)
|
|
|
|
# we need some specific functions:
|
|
if(NOT WIN32)
|
|
if(CMAKE_SYSTEM MATCHES "SunOS.*")
|
|
add_definitions("-D_XOPEN_SOURCE=600")
|
|
else()
|
|
add_definitions("-D_XOPEN_SOURCE=700")
|
|
endif(CMAKE_SYSTEM MATCHES "SunOS.*")
|
|
else()
|
|
add_definitions("-D_USE_MATH_DEFINES")
|
|
endif()
|
|
|
|
# Set default component name - that way external modules like RawSpeed will install their
|
|
# materials under the default component and not under 'Unspecified'
|
|
set(CMAKE_INSTALL_DEFAULT_COMPONENT_NAME DTApplication)
|
|
|
|
# lets continue into build directories
|
|
include(data/supported_extensions.cmake) # this file needs to be included first as it gets amended in bin/
|
|
add_subdirectory(src "${DARKTABLE_BINDIR}") # directory needs to be there before data directory so that the correct CSS file gets installed
|
|
add_subdirectory(data "${DARKTABLE_DATADIR}")
|
|
add_subdirectory(doc)
|
|
add_subdirectory(tools "${DARKTABLE_DATADIR}/tools")
|
|
|
|
# This contains fixup_bundle
|
|
# And adding a separate subderectory as a last one will make sure
|
|
# that fixup_bundle will run _after_ all files has been installed
|
|
add_subdirectory(packaging)
|
|
|
|
include(cmake/darktable-packaging.cmake)
|
|
|
|
# uninstall target
|
|
configure_file(
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
|
|
@ONLY)
|
|
|
|
add_custom_target(uninstall
|
|
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)
|
|
|
|
feature_summary(WHAT ALL)
|