cmake_minimum_required(VERSION 3.4) cmake_policy(SET CMP0025 NEW) project(hdrmerge) if(WIN32) if(NOT(ALGLIB_ROOT)) message(FATAL_ERROR "When building on Windows, you need to download 'alglib' source and define its root directory in ALGLIB_ROOT !") else() message(STATUS "ALGLIB_ROOT = ${ALGLIB_ROOT}") endif() endif() if(APPLE) if(NOT(ALGLIB_ROOT)) message(FATAL_ERROR "Passage of ALGLIB_ROOT to cmake failed. Download alglib and define its root directory in ALGLIB_ROOT") else() message(STATUS "ALGLIB_ROOT = ${ALGLIB_ROOT}") endif() endif() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wno-unknown-pragmas") set(PLATFORM "") # Required and optional packages set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH}" "${PROJECT_SOURCE_DIR}/cmake") # Find includes in corresponding build directories set(CMAKE_INCLUDE_CURRENT_DIR ON) # Instruct CMake to run moc automatically when needed. set(CMAKE_AUTOMOC ON) # Generate resources automatically set(CMAKE_AUTORCC ON) find_package(Qt5 5.6 REQUIRED Core Widgets) #include(${QT_USE_FILE}) add_definitions(${QT_DEFINITIONS}) find_package(LibRaw REQUIRED) find_package(Exiv2 REQUIRED) find_package(ZLIB REQUIRED) find_package(OpenMP) # Commented-out as it doesn't link #find_package(Boost 1.46 COMPONENTS unit_test_framework) if(WIN32) set(ALGLIB_INCLUDES ${ALGLIB_ROOT}/src) else() find_package(Alglib REQUIRED) endif() include_directories( "${LibRaw_INCLUDE_DIR}" "${EXIV2_INCLUDE_DIR}" "${ZLIB_INCLUDE_DIRS}" "${ALGLIB_INCLUDES}" ) if(NOT(CMAKE_BUILD_TYPE)) set(CMAKE_BUILD_TYPE Release) endif() if(CMAKE_BUILD_TYPE STREQUAL "Release") if(OPENMP_FOUND) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") endif() if(CMAKE_COMPILER_IS_GNUCC) set(STRIP -s) endif() endif() # The version number. set(HDRMERGE_VERSION_MAJOR 0) set(HDRMERGE_VERSION_MINOR 5) set(HDRMERGE_VERSION_REV 0) set(HDRMERGE_VERSION ${HDRMERGE_VERSION_MAJOR}.${HDRMERGE_VERSION_MINOR}.${HDRMERGE_VERSION_REV}) # configure a header file to pass some of the CMake settings to the source code configure_file( "${PROJECT_SOURCE_DIR}/src/config.h.in" "${PROJECT_BINARY_DIR}/config.h" ) # add the binary tree to the search path for include files so that we will find config.h include_directories("${PROJECT_BINARY_DIR}") set(PLATFORM_SOURCES "") if(WIN32) # This is required by libraw.h set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWIN32 -DLIBRAW_NODLL") set(PLATFORM WIN32) configure_file( "${PROJECT_SOURCE_DIR}/data/winres.rc" "${PROJECT_BINARY_DIR}/winres.rc" ) set(PLATFORM_SOURCES "${PROJECT_BINARY_DIR}/winres.rc") elseif(APPLE) set(PLATFORM MACOSX_BUNDLE) set(MACOSX_BUNDLE_ICON_FILE "icon") set(MACOSX_BUNDLE_GUI_IDENTIFIER "org.hdrmerge") set(MACOSX_BUNDLE_LONG_VERSION_STRING "HDRMerge for macOS v${HDRMERGE_VERSION}") set(MACOSX_BUNDLE_BUNDLE_NAME "HDRMerge") set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${HDRMERGE_VERSION}") set(MACOSX_BUNDLE_BUNDLE_VERSION "${HDRMERGE_VERSION}") set(MACOSX_BUNDLE_INFO_COPYRIGHT "Copyright 2018 Javier Celaya") set(PLATFORM_SOURCES "data/images/icon.icns") endif() # Sources and headers set(hdrmerge_sources src/Image.cpp src/ImageStack.cpp src/Bitmap.cpp src/RawParameters.cpp src/EditableMask.cpp src/DngFloatWriter.cpp src/TiffDirectory.cpp src/BoxBlur.cpp src/ExifTransfer.cpp src/ImageIO.cpp ) set(hdrmerge_gui_sources src/AboutDialog.cpp src/MainWindow.cpp src/PreviewWidget.cpp src/DraggableScrollArea.cpp src/DngPropertiesDialog.cpp src/LoadOptionsDialog.cpp src/FileSystem.cpp ) set(hdrmerge_qobject_headers src/MainWindow.hpp src/PreviewWidget.hpp src/LoadOptionsDialog.hpp src/DraggableScrollArea.hpp src/DngPropertiesDialog.hpp src/AboutDialog.hpp src/FileSystem.hpp ) set(hdrmerge_translations data/hdrmerge_es.ts ) if(WIN32) set(alglib_sources ${ALGLIB_ROOT}/src/alglibinternal.cpp ${ALGLIB_ROOT}/src/alglibmisc.cpp ${ALGLIB_ROOT}/src/ap.cpp ${ALGLIB_ROOT}/src/dataanalysis.cpp ${ALGLIB_ROOT}/src/diffequations.cpp ${ALGLIB_ROOT}/src/fasttransforms.cpp ${ALGLIB_ROOT}/src/integration.cpp ${ALGLIB_ROOT}/src/interpolation.cpp ${ALGLIB_ROOT}/src/linalg.cpp ${ALGLIB_ROOT}/src/optimization.cpp ${ALGLIB_ROOT}/src/solvers.cpp ${ALGLIB_ROOT}/src/specialfunctions.cpp ${ALGLIB_ROOT}/src/statistics.cpp ) endif() if(APPLE) set(alglib_sources ${ALGLIB_ROOT}/src/alglibinternal.cpp ${ALGLIB_ROOT}/src/alglibmisc.cpp ${ALGLIB_ROOT}/src/ap.cpp ${ALGLIB_ROOT}/src/dataanalysis.cpp ${ALGLIB_ROOT}/src/diffequations.cpp ${ALGLIB_ROOT}/src/fasttransforms.cpp ${ALGLIB_ROOT}/src/integration.cpp ${ALGLIB_ROOT}/src/interpolation.cpp ${ALGLIB_ROOT}/src/linalg.cpp ${ALGLIB_ROOT}/src/optimization.cpp ${ALGLIB_ROOT}/src/solvers.cpp ${ALGLIB_ROOT}/src/specialfunctions.cpp ${ALGLIB_ROOT}/src/statistics.cpp ) endif() # Libs set(hdrmerge_libs "${LibRaw_r_LIBRARIES}" "${EXIV2_LIBRARY}" "${ZLIB_LIBRARIES}" ) if(WIN32) get_filename_component(LIB_PATH "${EXIV2_LIBRARY}" PATH) find_library(EXPAT_LIBRARY libexpat.a "${LIB_PATH}") find_library(ICONV_LIBRARY libiconv.a "${LIB_PATH}") find_library(GETTEXT_LIBRARY libintl.a "${LIB_PATH}") set(hdrmerge_libs ${hdrmerge_libs} "${EXPAT_LIBRARY}" "${GETTEXT_LIBRARY}" "${ICONV_LIBRARY}" psapi wsock32 imm32 winmm ) remove_definitions(-DQT_DLL) else() set(hdrmerge_libs "${hdrmerge_libs}" "${ALGLIB_LIBRARIES}" ) endif() #QT4_ADD_TRANSLATION(hdrmerge_qm ${hdrmerge_translations}) # Generate the XML version of hdrmerge_qm foreach(file ${hdrmerge_qm}) get_filename_component(basename ${file} NAME) set(HDRMERGE_QM_XML "${HDRMERGE_QM_XML} ${basename}") endforeach() configure_file( "${PROJECT_SOURCE_DIR}/data/translations.qrc.in" "${PROJECT_BINARY_DIR}/translations.qrc" ) if(WIN32) add_library(alglib-objects OBJECT ${alglib_sources}) endif() if(APPLE) add_library(alglib-objects OBJECT ${alglib_sources}) endif() if(WIN32) add_executable(hdrmerge ${PLATFORM} src/main.cpp src/Launcher.cpp data/resources.qrc ${hdrmerge_translations} ${hdrmerge_sources} ${hdrmerge_gui_sources} ${hdrmerge_moc} $ "${PLATFORM_SOURCES}" ) elseif(APPLE) add_executable(hdrmerge ${PLATFORM} src/main.cpp src/Launcher.cpp data/resources.qrc $ ${hdrmerge_translations} ${hdrmerge_sources} ${hdrmerge_gui_sources} ${hdrmerge_moc} "${PLATFORM_SOURCES}" ) else() add_executable(hdrmerge ${PLATFORM} src/main.cpp src/Launcher.cpp data/resources.qrc ${hdrmerge_translations} ${hdrmerge_sources} ${hdrmerge_gui_sources} ${hdrmerge_moc} "${PLATFORM_SOURCES}" ) endif() target_link_libraries(hdrmerge ${STRIP} ${hdrmerge_libs} Qt5::Widgets) if(WIN32) # Compile a target without GUI, for the .com executable add_executable(hdrmerge-nogui src/main.cpp src/Launcher.cpp data/resources.qrc ${hdrmerge_translations} ${hdrmerge_sources} ${hdrmerge_moc} $ "${PLATFORM_SOURCES}" ) # WARNING: ImageIO class need QImage which need Qt5::Widgets # Launcher.cpp need QApplication which need Qt5::Widgets target_link_libraries(hdrmerge-nogui ${STRIP} ${hdrmerge_libs} Qt5::Widgets Qt5::Core) set_target_properties(hdrmerge-nogui PROPERTIES COMPILE_DEFINITIONS "NO_GUI") # Create the installer with makensis find_program(MAKENSIS_EXECUTABLE makensis.exe PATH_SUFFIXES "NSIS/Bin") if(MAKENSIS_EXECUTABLE) message(STATUS "NSIS found") set(SETUP_PROG hdrmerge-setup${WIN_ARCH}-${HDRMERGE_VERSION}.exe) string(REPLACE "/" "\\" PROJ_SRC_DIR "${PROJECT_SOURCE_DIR}") message(STATUS "PROJ_SRC_DIR = ${PROJ_SRC_DIR}") # ASSUMING YOU'RE USING EXIV2 BUNDLED WITH MSYS2 find_program(MINGW_LIB_DIR exiv2.exe) if(MINGW_LIB_DIR) get_filename_component(MINGW_LIB_DIR "${MINGW_LIB_DIR}" PATH) string(REPLACE "/" "\\" MINGW_LIB_DIR "${MINGW_LIB_DIR}") message(STATUS "MINGW_LIB_DIR = ${MINGW_LIB_DIR}") set(QT5_PLUGINS_DIR "${MINGW_LIB_DIR}\\..\\share\\qt5\\plugins") message(STATUS "QT5_PLUGINS_DIR = ${QT5_PLUGINS_DIR}") configure_file( "${PROJECT_SOURCE_DIR}/data/setup.nsi" "${PROJECT_BINARY_DIR}/setup.nsi" @ONLY ) add_custom_command(OUTPUT ${SETUP_PROG} COMMAND "${MAKENSIS_EXECUTABLE}" -V2 setup.nsi MAIN_DEPENDENCY setup.nsi DEPENDS "${PROJECT_BINARY_DIR}/hdrmerge.exe" WORKING_DIRECTORY "${PROJECT_BINARY_DIR}") add_custom_target(hdrmerge-setup ALL DEPENDS "${PROJECT_BINARY_DIR}/${SETUP_PROG}") else(MINGW_LIB_DIR) message(STATUS "Unable to locate the 'bin' directory to get the dependencies") endif(MINGW_LIB_DIR) else() message(STATUS "NSIS not found") endif() elseif(APPLE) set_source_files_properties(data/images/icon.icns PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") install(TARGETS hdrmerge BUNDLE DESTINATION ${CMAKE_INSTALL_BINDIR}) else() if(NOT DEFINED CMAKE_INSTALL_BINDIR) set(CMAKE_INSTALL_BINDIR "bin") endif() message(STATUS "Install binary to: " ${CMAKE_INSTALL_BINDIR}) install(TARGETS hdrmerge DESTINATION ${CMAKE_INSTALL_BINDIR}) find_program(XDG-DESKTOP-MENU_EXECUTABLE xdg-desktop-menu) find_program(XDG-ICON-RESOURCE_EXECUTABLE xdg-icon-resource) if(XDG-DESKTOP-MENU_EXECUTABLE AND XDG-ICON-RESOURCE_EXECUTABLE) configure_file( "${PROJECT_SOURCE_DIR}/data/hdrmerge.desktop" "${PROJECT_BINARY_DIR}/hdrmerge.desktop" ) install(CODE " execute_process(COMMAND \"${XDG-ICON-RESOURCE_EXECUTABLE}\" install --novendor --size 128 \"${PROJECT_SOURCE_DIR}/data/images/icon.png\" hdrmerge-icon) execute_process(COMMAND \"${XDG-DESKTOP-MENU_EXECUTABLE}\" install --novendor \"${PROJECT_BINARY_DIR}/hdrmerge.desktop\")" ) endif() endif() if(Boost_FOUND) add_subdirectory(test) endif()