Merge pull request #5644 from Benitoite/patch-22

mac: simplifies bundle structure, bundle packaging fixes
This commit is contained in:
Beep6581
2020-02-25 09:05:20 +01:00
committed by GitHub
17 changed files with 524 additions and 351 deletions

View File

@@ -30,7 +30,7 @@ jobs:
CMAKE_CXX_STANDARD: 11 CMAKE_CXX_STANDARD: 11
PKG_CONFIG_PATH: /usr/local/opt/libffi/lib/pkgconfig:/usr/local/opt/expat/lib/pkgconfig PKG_CONFIG_PATH: /usr/local/opt/libffi/lib/pkgconfig:/usr/local/opt/expat/lib/pkgconfig
RAW_THERAPEE_MAJOR: '5' RAW_THERAPEE_MAJOR: '5'
RAW_THERAPEE_MINOR: '7' RAW_THERAPEE_MINOR: '8'
C_FLAGS: -Xpreprocessor -fopenmp /usr/local/lib/libomp.dylib -I/usr/local/include -I/usr/local/opt/gdk-pixbuf/include -I/usr/local/opt/libiconv/include -I/usr/local/opt/libxml2/include -I/usr/local/opt/expat/include -I/usr/local/opt/llvm/include C_FLAGS: -Xpreprocessor -fopenmp /usr/local/lib/libomp.dylib -I/usr/local/include -I/usr/local/opt/gdk-pixbuf/include -I/usr/local/opt/libiconv/include -I/usr/local/opt/libxml2/include -I/usr/local/opt/expat/include -I/usr/local/opt/llvm/include
run: | run: |
# GITHUB_REF is the ref that triggered the build, like refs/heads/new-feature - the next line parses that to REF: the branch name only (new-feature) # GITHUB_REF is the ref that triggered the build, like refs/heads/new-feature - the next line parses that to REF: the branch name only (new-feature)
@@ -54,6 +54,7 @@ jobs:
-DOpenMP_CXX_FLAGS="${C_FLAGS}" \ -DOpenMP_CXX_FLAGS="${C_FLAGS}" \
-DCMAKE_AR="/usr/local/opt/llvm/bin/llvm-ar" \ -DCMAKE_AR="/usr/local/opt/llvm/bin/llvm-ar" \
-DCMAKE_RANLIB="/usr/local/opt/llvm/bin/llvm-ranlib" \ -DCMAKE_RANLIB="/usr/local/opt/llvm/bin/llvm-ranlib" \
-DCMAKE_OSX_DEPLOYMENT_TARGET="10.11"
.. ..
make --jobs make --jobs
make install make install

View File

@@ -7,17 +7,22 @@ endif()
# Must stay before the project() command: # Must stay before the project() command:
if(${CMAKE_EXTRA_GENERATOR} MATCHES "Eclipse CDT4") if(${CMAKE_EXTRA_GENERATOR} MATCHES "Eclipse CDT4")
set(CMAKE_CXX_COMPILER_ARG1 "-std=c++11" CACHE STRING "C++ version for eclipse" FORCE) set(CMAKE_CXX_COMPILER_ARG1
"-std=c++11"
CACHE STRING "C++ version for eclipse" FORCE)
# Users building with Eclipse should set CMAKE_ECLIPSE_VERSION through the # Users building with Eclipse should set CMAKE_ECLIPSE_VERSION through the
# command line to their current version of Eclipse: # command line to their current version of Eclipse:
#set(CMAKE_ECLIPSE_VERSION "4.6.0" CACHE STRING "Eclipse version" FORCE) # set(CMAKE_ECLIPSE_VERSION "4.6.0" CACHE STRING "Eclipse version" FORCE)
endif() endif()
project(RawTherapee) project(RawTherapee)
# The default target is Debug: # The default target is Debug:
if(CMAKE_BUILD_TYPE STREQUAL "") if(CMAKE_BUILD_TYPE STREQUAL "")
set(CMAKE_BUILD_TYPE Debug CACHE STRING "One of: None Debug Release RelWithDebInfo MinSizeRel" FORCE) set(CMAKE_BUILD_TYPE
Debug
CACHE STRING "One of: None Debug Release RelWithDebInfo MinSizeRel"
FORCE)
endif() endif()
string(TOUPPER ${CMAKE_BUILD_TYPE} UPPER_CMAKE_BUILD_TYPE) string(TOUPPER ${CMAKE_BUILD_TYPE} UPPER_CMAKE_BUILD_TYPE)
@@ -26,11 +31,15 @@ string(TOUPPER ${CMAKE_BUILD_TYPE} UPPER_CMAKE_BUILD_TYPE)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=c11")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.9") if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION
message(FATAL_ERROR "Building RawTherapee requires using GCC version 4.9 or higher!") VERSION_LESS "4.9")
message(
FATAL_ERROR
"Building RawTherapee requires using GCC version 4.9 or higher!")
endif() endif()
# We might want to build using the old C++ ABI, even when using a new GCC version: # We might want to build using the old C++ ABI, even when using a new GCC
# version:
if(USE_OLD_CXX_ABI) if(USE_OLD_CXX_ABI)
add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0) add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)
endif() endif()
@@ -46,30 +55,50 @@ message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules/") set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/modules/")
# Cache name suffix examples: "" = ~/.config/RawTherapee, "5" = ~/.config/RawTherapee-5, "_testing" = ~/.config/RawTherapee_testing # Cache name suffix examples: "" = ~/.config/RawTherapee, "5" =
# Use "" for stable releases and "5-dev" for anything else. # ~/.config/RawTherapee-5, "_testing" = ~/.config/RawTherapee_testing Use "" for
set(CACHE_NAME_SUFFIX "" CACHE STRING "RawTherapee's cache folder suffix") # stable releases and "5-dev" for anything else.
set(CACHE_NAME_SUFFIX
""
CACHE STRING "RawTherapee's cache folder suffix")
# By default we don't use a specific processor target, so PROC_TARGET_NUMBER is set to 0. # By default we don't use a specific processor target, so PROC_TARGET_NUMBER is
# Specify other values to optimize for specific processor architecture as listed in ProcessorTargets.cmake: # set to 0. Specify other values to optimize for specific processor architecture
set(PROC_TARGET_NUMBER 0 CACHE STRING "Selected target processor from the list above (taken from ProcessorTargets.cmake)") # as listed in ProcessorTargets.cmake:
set(PROC_TARGET_NUMBER
0
CACHE
STRING
"Selected target processor from the list above (taken from ProcessorTargets.cmake)"
)
# Set special compilation flags for rtengine which get added to CMAKE_CXX_FLAGS: # Set special compilation flags for rtengine which get added to CMAKE_CXX_FLAGS:
# Some Linux distros build with -O2 instead of -O3. We explicitly enable auto vectorization by using -ftree-vectorize # Some Linux distros build with -O2 instead of -O3. We explicitly enable auto
set(RTENGINE_CXX_FLAGS "-ftree-vectorize" CACHE STRING "Special compilation flags for RTEngine") # vectorization by using -ftree-vectorize
set(RTENGINE_CXX_FLAGS
"-ftree-vectorize"
CACHE STRING "Special compilation flags for RTEngine")
# Loads the ProcessorTargets list: # Loads the ProcessorTargets list:
include(ProcessorTargets.cmake) include(ProcessorTargets.cmake)
set(PROC_LABEL "undefined" CACHE STRING "Target processor label, unused if PROC_TARGET_NUMBER = 0 or 2") set(PROC_LABEL
set(PROC_FLAGS "" CACHE STRING "Target processor related build/link flags") "undefined"
CACHE STRING
"Target processor label, unused if PROC_TARGET_NUMBER = 0 or 2")
set(PROC_FLAGS
""
CACHE STRING "Target processor related build/link flags")
if((NOT (PROC_TARGET_NUMBER EQUAL 0)) AND (NOT (PROC_TARGET_NUMBER EQUAL 2))) if((NOT (PROC_TARGET_NUMBER EQUAL 0)) AND (NOT (PROC_TARGET_NUMBER EQUAL 2)))
set(PROC_LABEL ${PROC_TARGET_${PROC_TARGET_NUMBER}_LABEL}) set(PROC_LABEL ${PROC_TARGET_${PROC_TARGET_NUMBER}_LABEL})
endif() endif()
if(NOT(PROC_TARGET_NUMBER EQUAL 0)) if(NOT (PROC_TARGET_NUMBER EQUAL 0))
set(PROC_FLAGS ${PROC_TARGET_${PROC_TARGET_NUMBER}_FLAGS}) set(PROC_FLAGS ${PROC_TARGET_${PROC_TARGET_NUMBER}_FLAGS})
endif() endif()
if(UNIX AND PROC_LABEL STREQUAL "undefined") if(UNIX AND PROC_LABEL STREQUAL "undefined")
execute_process(COMMAND uname -p OUTPUT_STRIP_TRAILING_WHITESPACE OUTPUT_VARIABLE cpu) execute_process(
COMMAND uname -p
OUTPUT_STRIP_TRAILING_WHITESPACE
OUTPUT_VARIABLE cpu)
if("${cpu}" STREQUAL "unknown") if("${cpu}" STREQUAL "unknown")
set(PROC_LABEL "${CMAKE_SYSTEM_PROCESSOR}") set(PROC_LABEL "${CMAKE_SYSTEM_PROCESSOR}")
else() else()
@@ -77,7 +106,8 @@ if(UNIX AND PROC_LABEL STREQUAL "undefined")
endif() endif()
endif() endif()
# If PROC_FORCED_LABEL exists, its value is loaded in PROC_LABEL to override the one from ProcessorTargets: # If PROC_FORCED_LABEL exists, its value is loaded in PROC_LABEL to override the
# one from ProcessorTargets:
if(DEFINED PROC_FORCED_LABEL) if(DEFINED PROC_FORCED_LABEL)
set(PROC_LABEL ${PROC_FORCED_LABEL}) set(PROC_LABEL ${PROC_FORCED_LABEL})
endif() endif()
@@ -87,7 +117,8 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${PROC_FLAGS}")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${PROC_FLAGS}") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${PROC_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${PROC_FLAGS}") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${PROC_FLAGS}")
# Stop compilation on typos such as std:swap (missing colon will be detected as unused label): # Stop compilation on typos such as std:swap (missing colon will be detected as
# unused label):
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=unused-label") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=unused-label")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=delete-incomplete") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror=delete-incomplete")
@@ -106,21 +137,35 @@ endif()
include(FindUnalignedMalloc) include(FindUnalignedMalloc)
if(WIN32) if(WIN32)
# Add additional paths. Look in the MinGW path first, then in the Gtkmm path. # Add additional paths. Look in the MinGW path first, then in the Gtkmm
# If you wish to build some dependent libraries, you have to install them in MinGW to use them: # path. If you wish to build some dependent libraries, you have to install
set(CMAKE_PREFIX_PATH $ENV{MINGW_BASEPATH} $ENV{GTKMM_BASEPATH} CACHE STRING "Additional search paths") # them in MinGW to use them:
set(CMAKE_PREFIX_PATH
$ENV{MINGW_BASEPATH} $ENV{GTKMM_BASEPATH}
CACHE STRING "Additional search paths")
endif() endif()
if(APPLE) if(APPLE)
if(CMAKE_CXX_COMPILER MATCHES "g\\+\\+-mp-4.[5-8]" OR CMAKE_CXX_COMPILER_ARG1 MATCHES "g\\+\\+-mp-4.[5-8]") if(CMAKE_CXX_COMPILER MATCHES "g\\+\\+-mp-4.[5-8]"
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /usr/lib/libstdc++.6.dylib") OR CMAKE_CXX_COMPILER_ARG1 MATCHES "g\\+\\+-mp-4.[5-8]")
message(STATUS "CMAKE_CXX_COMPILER is MacPorts GCC.\n CMAKE_EXE_LINKER_FLAGS: ${CMAKE_EXE_LINKER_FLAGS}") set(CMAKE_EXE_LINKER_FLAGS
"${CMAKE_EXE_LINKER_FLAGS} /usr/lib/libstdc++.6.dylib -Wl,-headerpad_max_install_names -mtune=generic"
)
message(
STATUS
"CMAKE_CXX_COMPILER is MacPorts GCC.\n CMAKE_EXE_LINKER_FLAGS: ${CMAKE_EXE_LINKER_FLAGS}"
)
endif() endif()
# Set minimum system version # Set minimum system version
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mmacosx-version-min=10.9") set(CMAKE_CXX_FLAGS
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -mmacosx-version-min=10.9") "${CMAKE_CXX_FLAGS} -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}"
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -headerpad_max_install_names") )
set(CMAKE_C_FLAGS
"${CMAKE_C_FLAGS} -mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}")
set(CMAKE_EXE_LINKER_FLAGS
"${CMAKE_EXE_LINKER_FLAGS} -Wl,-headerpad_max_install_names -mtune=generic"
)
endif() endif()
option(USE_EXPERIMENTAL_LANG_VERSIONS "Build with -std=c++0x" OFF) option(USE_EXPERIMENTAL_LANG_VERSIONS "Build with -std=c++0x" OFF)
@@ -132,33 +177,53 @@ option(WITH_SAN "Build with run-time sanitizer" OFF)
option(WITH_PROF "Build with profiling instrumentation" OFF) option(WITH_PROF "Build with profiling instrumentation" OFF)
option(WITH_SYSTEM_KLT "Build using system KLT library." OFF) option(WITH_SYSTEM_KLT "Build using system KLT library." OFF)
option(OPTION_OMP "Build with OpenMP support" ON) option(OPTION_OMP "Build with OpenMP support" ON)
option(STRICT_MUTEX "True (recommended): MyMutex will behave like POSIX Mutex; False: MyMutex will behave like POSIX RecMutex; Note: forced to ON for Debug builds" ON) option(
option(TRACE_MYRWMUTEX "Trace custom R/W Mutex (Debug builds only); redirecting std::out to a file is strongly recommended!" OFF) STRICT_MUTEX
option(AUTO_GDK_FLUSH "Use gdk_flush on all gdk_thread_leave other than the GUI thread; set it ON if you experience X Server warning/errors" OFF) "True (recommended): MyMutex will behave like POSIX Mutex; False: MyMutex will behave like POSIX RecMutex; Note: forced to ON for Debug builds"
#option(TARGET32BIT "Build for 32-bit architecture when ON, otherwise 64-bit. Default is OFF" OFF) ON)
option(
TRACE_MYRWMUTEX
"Trace custom R/W Mutex (Debug builds only); redirecting std::out to a file is strongly recommended!"
OFF)
option(
AUTO_GDK_FLUSH
"Use gdk_flush on all gdk_thread_leave other than the GUI thread; set it ON if you experience X Server warning/errors"
OFF)
# option(TARGET32BIT "Build for 32-bit architecture when ON, otherwise 64-bit.
# Default is OFF" OFF)
option(ENABLE_TCMALLOC "Use the tcmalloc library if available" OFF) option(ENABLE_TCMALLOC "Use the tcmalloc library if available" OFF)
set(TCMALLOC_LIB_DIR "" CACHE PATH "Custom path for the tcmalloc library") set(TCMALLOC_LIB_DIR
""
CACHE PATH "Custom path for the tcmalloc library")
# Set installation directories: # Set installation directories:
if(WIN32 OR APPLE) if(WIN32 OR APPLE)
if(BUILD_BUNDLE) if(BUILD_BUNDLE)
message(STATUS "You have set BUILD_BUNDLE=ON but this is not necessary - the option is forced to ON for Windows and macOS.") message(
STATUS
"You have set BUILD_BUNDLE=ON but this is not necessary - the option is forced to ON for Windows and macOS."
)
endif() endif()
set(BUILD_BUNDLE ON FORCE) set(BUILD_BUNDLE ON FORCE)
endif() endif()
if(NOT DEFINED BUNDLE_BASE_INSTALL_DIR) if(NOT DEFINED BUNDLE_BASE_INSTALL_DIR)
if(APPLE) if(APPLE)
set(BUNDLE_BASE_INSTALL_DIR "${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}/MacOS") set(BUNDLE_BASE_INSTALL_DIR "${CMAKE_BUILD_TYPE}/MacOS")
else() else()
set(BUNDLE_BASE_INSTALL_DIR "${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}") set(BUNDLE_BASE_INSTALL_DIR "${CMAKE_BINARY_DIR}/${CMAKE_BUILD_TYPE}")
endif() endif()
endif() endif()
if(BUILD_BUNDLE) if(BUILD_BUNDLE)
set(BINDIR .) if(APPLE)
set(CMAKE_INSTALL_PREFIX "${BUNDLE_BASE_INSTALL_DIR}") set(BINDIR "${BUNDLE_BASE_INSTALL_DIR}")
set(CMAKE_INSTALL_PREFIX ".")
else()
set(BINDIR .)
set(CMAKE_INSTALL_PREFIX "${BUNDLE_BASE_INSTALL_DIR}")
endif()
endif() endif()
if(NOT DEFINED BINDIR) if(NOT DEFINED BINDIR)
@@ -168,7 +233,7 @@ endif()
if(NOT DEFINED DATADIR) if(NOT DEFINED DATADIR)
if(BUILD_BUNDLE) if(BUILD_BUNDLE)
if(APPLE) if(APPLE)
set(DATADIR "../../Resources") set(DATADIR "${CMAKE_BUILD_TYPE}/Resources/share")
else() else()
set(DATADIR .) set(DATADIR .)
endif() endif()
@@ -180,7 +245,7 @@ endif()
if(NOT DEFINED LIBDIR) if(NOT DEFINED LIBDIR)
if(BUILD_BUNDLE) if(BUILD_BUNDLE)
if(APPLE) if(APPLE)
set(LIBDIR "../../Frameworks") set(LIBDIR "${CMAKE_BUILD_TYPE}/Frameworks")
else() else()
set(LIBDIR .) set(LIBDIR .)
endif() endif()
@@ -200,7 +265,11 @@ endif()
if(NOT DEFINED DOCDIR) if(NOT DEFINED DOCDIR)
if(BUILD_BUNDLE) if(BUILD_BUNDLE)
set(DOCDIR "${DATADIR}/share/doc") if(APPLE)
set(DOCDIR "${DATADIR}/doc")
else()
set(DOCDIR "${DATADIR}/share/doc")
endif()
else() else()
set(DOCDIR "${CMAKE_INSTALL_PREFIX}/share/doc/rawtherapee") set(DOCDIR "${CMAKE_INSTALL_PREFIX}/share/doc/rawtherapee")
endif() endif()
@@ -208,7 +277,11 @@ endif()
if(NOT DEFINED CREDITSDIR) if(NOT DEFINED CREDITSDIR)
if(BUILD_BUNDLE) if(BUILD_BUNDLE)
set(CREDITSDIR "${DATADIR}") if(APPLE)
set(CREDITSDIR "${DATADIR}")
else()
set(CREDITSDIR "${DATADIR}")
endif()
else() else()
set(CREDITSDIR "${CMAKE_INSTALL_PREFIX}/share/doc/rawtherapee") set(CREDITSDIR "${CMAKE_INSTALL_PREFIX}/share/doc/rawtherapee")
endif() endif()
@@ -216,7 +289,11 @@ endif()
if(NOT DEFINED LICENCEDIR) if(NOT DEFINED LICENCEDIR)
if(BUILD_BUNDLE) if(BUILD_BUNDLE)
set(LICENCEDIR "${DATADIR}") if(APPLE)
set(LICENCEDIR "${CREDITSDIR}")
else()
set(LICENCEDIR "${DATADIR}")
endif()
else() else()
set(LICENCEDIR "${CMAKE_INSTALL_PREFIX}/share/doc/rawtherapee") set(LICENCEDIR "${CMAKE_INSTALL_PREFIX}/share/doc/rawtherapee")
endif() endif()
@@ -225,7 +302,11 @@ endif()
if(NOT DEFINED DESKTOPDIR) if(NOT DEFINED DESKTOPDIR)
if(UNIX) if(UNIX)
if(BUILD_BUNDLE) if(BUILD_BUNDLE)
set(DESKTOPDIR "${DATADIR}/share/applications") if(APPLE)
set(DESKTOPDIR "${DATADIR}/applications")
else()
set(DESKTOPDIR "${DATADIR}/share/applications")
endif()
else() else()
set(DESKTOPDIR "${CMAKE_INSTALL_PREFIX}/share/applications") set(DESKTOPDIR "${CMAKE_INSTALL_PREFIX}/share/applications")
endif() endif()
@@ -235,7 +316,11 @@ endif()
if(NOT DEFINED ICONSDIR) if(NOT DEFINED ICONSDIR)
if(UNIX) if(UNIX)
if(BUILD_BUNDLE) if(BUILD_BUNDLE)
set(ICONSDIR "${DATADIR}/share/icons") if(APPLE)
set(ICONSDIR "${DATADIR}/icons")
else()
set(ICONSDIR "${DATADIR}/share/icons")
endif()
else() else()
set(ICONSDIR "${CMAKE_INSTALL_PREFIX}/share/icons") set(ICONSDIR "${CMAKE_INSTALL_PREFIX}/share/icons")
endif() endif()
@@ -245,38 +330,57 @@ endif()
if(NOT DEFINED APPDATADIR) if(NOT DEFINED APPDATADIR)
if(UNIX) if(UNIX)
if(BUILD_BUNDLE) if(BUILD_BUNDLE)
set(APPDATADIR "${DATADIR}/share/metainfo") if(APPLE)
set(APPDATADIR "${DATADIR}/metainfo")
else()
set(APPDATADIR "${DATADIR}/share/metainfo")
endif()
else() else()
set(APPDATADIR "${CMAKE_INSTALL_PREFIX}/share/metainfo") set(APPDATADIR "${CMAKE_INSTALL_PREFIX}/share/metainfo")
endif() endif()
endif() endif()
endif() endif()
if (NOT APPLE) if(NOT APPLE)
if(DEFINED LENSFUNDBDIR AND NOT IS_ABSOLUTE "${LENSFUNDBDIR}") if(DEFINED LENSFUNDBDIR AND NOT IS_ABSOLUTE "${LENSFUNDBDIR}")
set(LENSFUNDBDIR "${DATADIR}/${LENSFUNDBDIR}") set(LENSFUNDBDIR "${DATADIR}/${LENSFUNDBDIR}")
endif() endif()
endif() endif()
if(APPLE) if(APPLE)
if("${CODESIGNID}") if("${CODESIGNID}")
set(CODESIGNID "${CODESIGNID}" CACHE STRING "Codesigning Identity") set(CODESIGNID
"${CODESIGNID}"
CACHE STRING "Codesigning Identity")
endif() endif()
if("${NOTARY}") if("${NOTARY}")
set(NOTARY "${NOTARY}" CACHE STRING "Notarization Identity") set(NOTARY
"${NOTARY}"
CACHE STRING "Notarization Identity")
endif() endif()
if("${LOCAL_PREFIX}") if("${LOCAL_PREFIX}")
set(LOCAL_PREFIX "${LOCAL_PREFIX}" CACHE STRING "macos/gtk parent directory ie /usr or /opt") set(LOCAL_PREFIX
"${LOCAL_PREFIX}"
CACHE STRING "macos/gtk parent directory ie /usr or /opt")
elseif(NOT DEFINED LOCAL_PREFIX) elseif(NOT DEFINED LOCAL_PREFIX)
set(LOCAL_PREFIX "/usr") set(LOCAL_PREFIX "/usr")
endif() endif()
if("${FANCY_DMG}")
set(FANCY_DMG
ON
CACHE BOOL
"Use the andreyvit/create-dmg script to make a fancy .dmg")
endif()
endif() endif()
# Enforce absolute paths for non-bundle builds: # Enforce absolute paths for non-bundle builds:
if(NOT BUILD_BUNDLE) if(NOT BUILD_BUNDLE)
foreach(path BINDIR DATADIR LIBDIR DOCDIR CREDITSDIR LICENCEDIR) foreach(path BINDIR DATADIR LIBDIR DOCDIR CREDITSDIR LICENCEDIR)
if(NOT (IS_ABSOLUTE "${${path}}")) if(NOT (IS_ABSOLUTE "${${path}}"))
message(FATAL_ERROR "The ${path} path has to be absolute when using -DBUILD_BUNDLE=OFF") message(
FATAL_ERROR
"The ${path} path has to be absolute when using -DBUILD_BUNDLE=OFF"
)
endif() endif()
endforeach() endforeach()
endif() endif()
@@ -305,11 +409,11 @@ endif()
find_package(PkgConfig) find_package(PkgConfig)
if(WIN32) if(WIN32)
pkg_check_modules (GTK REQUIRED gtk+-3.0>=3.22.24) pkg_check_modules(GTK REQUIRED gtk+-3.0>=3.22.24)
pkg_check_modules (GTKMM REQUIRED gtkmm-3.0>=3.22) pkg_check_modules(GTKMM REQUIRED gtkmm-3.0>=3.22)
else() else()
pkg_check_modules (GTK REQUIRED gtk+-3.0>=3.16) pkg_check_modules(GTK REQUIRED gtk+-3.0>=3.16)
pkg_check_modules (GTKMM REQUIRED gtkmm-3.0>=3.16) pkg_check_modules(GTKMM REQUIRED gtkmm-3.0>=3.16)
endif() endif()
if(GTK_VERSION VERSION_GREATER "3.24.1" AND GTK_VERSION VERSION_LESS "3.24.7") if(GTK_VERSION VERSION_GREATER "3.24.1" AND GTK_VERSION VERSION_LESS "3.24.7")
@@ -318,19 +422,26 @@ if(GTK_VERSION VERSION_GREATER "3.24.1" AND GTK_VERSION VERSION_LESS "3.24.7")
else() else()
set(CERTAINTY "likely to") set(CERTAINTY "likely to")
endif() endif()
message(WARNING "\nWarning! You are using GTK+ version " ${GTK_VERSION} " which is " ${CERTAINTY} " have an issue where combobox menu scroll-arrows are missing when a Gtk::ComboBox list does not fit vertically on the screen. As a result, users of your build will not be able to select items in the following comboboxes: Processing Profiles, Film Simulation, and the camera and lens profiles in Profiled Lens Correction.\nIt is recommended that you either downgrade GTK+ to <= 3.24.1 or upgrade to >= 3.24.7.") message(
WARNING
"\nWarning! You are using GTK+ version "
${GTK_VERSION}
" which is "
${CERTAINTY}
" have an issue where combobox menu scroll-arrows are missing when a Gtk::ComboBox list does not fit vertically on the screen. As a result, users of your build will not be able to select items in the following comboboxes: Processing Profiles, Film Simulation, and the camera and lens profiles in Profiled Lens Correction.\nIt is recommended that you either downgrade GTK+ to <= 3.24.1 or upgrade to >= 3.24.7."
)
endif() endif()
pkg_check_modules (GLIB2 REQUIRED glib-2.0>=2.44) pkg_check_modules(GLIB2 REQUIRED glib-2.0>=2.44)
pkg_check_modules (GLIBMM REQUIRED glibmm-2.4>=2.44) pkg_check_modules(GLIBMM REQUIRED glibmm-2.4>=2.44)
pkg_check_modules (CAIROMM REQUIRED cairomm-1.0) pkg_check_modules(CAIROMM REQUIRED cairomm-1.0)
pkg_check_modules (GIO REQUIRED gio-2.0>=2.44) pkg_check_modules(GIO REQUIRED gio-2.0>=2.44)
pkg_check_modules (GIOMM REQUIRED giomm-2.4>=2.44) pkg_check_modules(GIOMM REQUIRED giomm-2.4>=2.44)
pkg_check_modules (GTHREAD REQUIRED gthread-2.0>=2.44) pkg_check_modules(GTHREAD REQUIRED gthread-2.0>=2.44)
pkg_check_modules (GOBJECT REQUIRED gobject-2.0>=2.44) pkg_check_modules(GOBJECT REQUIRED gobject-2.0>=2.44)
pkg_check_modules (SIGC REQUIRED sigc++-2.0>=2.3.1) pkg_check_modules(SIGC REQUIRED sigc++-2.0>=2.3.1)
pkg_check_modules (LENSFUN REQUIRED lensfun>=0.2) pkg_check_modules(LENSFUN REQUIRED lensfun>=0.2)
pkg_check_modules (RSVG REQUIRED librsvg-2.0>=2.40) pkg_check_modules(RSVG REQUIRED librsvg-2.0>=2.40)
if(WIN32) if(WIN32)
add_definitions(-DWIN32) add_definitions(-DWIN32)
@@ -357,7 +468,7 @@ if(WITH_SYSTEM_KLT)
endif() endif()
# Check for libcanberra-gtk3 (sound events on Linux): # Check for libcanberra-gtk3 (sound events on Linux):
if(UNIX AND(NOT APPLE)) if(UNIX AND (NOT APPLE))
pkg_check_modules(CANBERRA-GTK REQUIRED libcanberra-gtk3) pkg_check_modules(CANBERRA-GTK REQUIRED libcanberra-gtk3)
endif() endif()
@@ -368,9 +479,12 @@ endif()
if(WITH_LTO) if(WITH_LTO)
# Using LTO with older versions of binutils requires setting extra flags # Using LTO with older versions of binutils requires setting extra flags
set(BINUTILS_VERSION_MININUM "2.29") set(BINUTILS_VERSION_MININUM "2.29")
execute_process(COMMAND ar --version OUTPUT_VARIABLE BINUTILS_VERSION_DETECTED) execute_process(COMMAND ar --version
string(REGEX REPLACE ".* ([0-9.]+)\n.*" "\\1" BINUTILS_VERSION_DETECTED "${BINUTILS_VERSION_DETECTED}") OUTPUT_VARIABLE BINUTILS_VERSION_DETECTED)
if("${BINUTILS_VERSION_DETECTED}" VERSION_LESS "${BINUTILS_VERSION_MININUM}") string(REGEX REPLACE ".* ([0-9.]+)\n.*" "\\1" BINUTILS_VERSION_DETECTED
"${BINUTILS_VERSION_DETECTED}")
if("${BINUTILS_VERSION_DETECTED}" VERSION_LESS
"${BINUTILS_VERSION_MININUM}")
if(APPLE) if(APPLE)
if(!CMAKE_AR) if(!CMAKE_AR)
set(CMAKE_AR "/opt/local/bin/ar") set(CMAKE_AR "/opt/local/bin/ar")
@@ -382,7 +496,15 @@ if(WITH_LTO)
set(CMAKE_AR "/usr/bin/gcc-ar") set(CMAKE_AR "/usr/bin/gcc-ar")
set(CMAKE_RANLIB "/usr/bin/gcc-ranlib") set(CMAKE_RANLIB "/usr/bin/gcc-ranlib")
endif() endif()
message(STATUS "Binutils version detected as less than " ${BINUTILS_VERSION_MININUM} " - setting CMake parameters to enable LTO linking:\n CMAKE_AR=\"" ${CMAKE_AR} "\"\n CMAKE_RANLIB=\"" ${CMAKE_RANLIB} "\"") message(
STATUS
"Binutils version detected as less than "
${BINUTILS_VERSION_MININUM}
" - setting CMake parameters to enable LTO linking:\n CMAKE_AR=\""
${CMAKE_AR}
"\"\n CMAKE_RANLIB=\""
${CMAKE_RANLIB}
"\"")
endif() endif()
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -flto") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -flto")
@@ -393,7 +515,8 @@ endif()
if(WITH_SAN) if(WITH_SAN)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=${WITH_SAN}") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=${WITH_SAN}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=${WITH_SAN}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=${WITH_SAN}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=${WITH_SAN}") set(CMAKE_EXE_LINKER_FLAGS
"${CMAKE_EXE_LINKER_FLAGS} -fsanitize=${WITH_SAN}")
endif() endif()
if(WITH_PROF) if(WITH_PROF)
@@ -402,11 +525,14 @@ if(WITH_PROF)
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pg")
endif() endif()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wuninitialized -Wcast-qual -Wno-deprecated-declarations -Wno-unused-result -Wunused-macros") set(CMAKE_CXX_FLAGS
"${CMAKE_CXX_FLAGS} -Wall -Wuninitialized -Wcast-qual -Wno-deprecated-declarations -Wno-unused-result -Wunused-macros"
)
if(OPTION_OMP) if(OPTION_OMP)
find_package(OpenMP) find_package(OpenMP)
if(OPENMP_FOUND) if(OPENMP_FOUND)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS} -Werror=unknown-pragmas") set(CMAKE_CXX_FLAGS
"${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS} -Werror=unknown-pragmas")
endif() endif()
endif() endif()
@@ -420,13 +546,14 @@ if(OPENMP_FOUND)
set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${_f}) set(CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${_f})
endforeach() endforeach()
check_c_source_compiles( check_c_source_compiles(
"#include <fftw3.h> "#include <fftw3.h>
int main() int main()
{ {
fftwf_init_threads(); fftwf_init_threads();
fftwf_plan_with_nthreads(1); fftwf_plan_with_nthreads(1);
return 0; return 0;
}" _fftw3f_multithread) }"
_fftw3f_multithread)
if(_fftw3f_multithread) if(_fftw3f_multithread)
add_definitions(-DRT_FFTW3F_OMP) add_definitions(-DRT_FFTW3F_OMP)
else() else()
@@ -444,63 +571,83 @@ get_filename_component(ABS_BINARY_DIR "${CMAKE_BINARY_DIR}" ABSOLUTE)
set(OUT_OF_SOURCE_BUILD TRUE) set(OUT_OF_SOURCE_BUILD TRUE)
if(ABS_SOURCE_DIR STREQUAL ABS_BINARY_DIR) if(ABS_SOURCE_DIR STREQUAL ABS_BINARY_DIR)
set(OUT_OF_SOURCE_BUILD FALSE) set(OUT_OF_SOURCE_BUILD FALSE)
message(WARNING "You are performing an in-source build. This is discouraged. For an explanation and the advantages of out-of-source builds, please refer to http://www.cmake.org/Wiki/CMake_FAQ#What_is_an_.22out-of-source.22_build.3F") message(
WARNING
"You are performing an in-source build. This is discouraged. For an explanation and the advantages of out-of-source builds, please refer to http://www.cmake.org/Wiki/CMake_FAQ#What_is_an_.22out-of-source.22_build.3F"
)
endif() endif()
# Remove files which could require manual work. # Remove files which could require manual work. We will remove this after some
# We will remove this after some time to have a clean build system without file modifications in the source tree again. (?) # time to have a clean build system without file modifications in the source
set(OOSB_FILES "${PROJECT_SOURCE_DIR}/rtdata/rawtherapee.desktop" "${PROJECT_SOURCE_DIR}/rtgui/version.h" "${PROJECT_SOURCE_DIR}/rtgui/config.h" "${PROJECT_SOURCE_DIR}/AboutThisBuild.txt") # tree again. (?)
set(OOSB_FILES
"${PROJECT_SOURCE_DIR}/rtdata/rawtherapee.desktop"
"${PROJECT_SOURCE_DIR}/rtgui/version.h"
"${PROJECT_SOURCE_DIR}/rtgui/config.h"
"${PROJECT_SOURCE_DIR}/AboutThisBuild.txt")
if(OUT_OF_SOURCE_BUILD) if(OUT_OF_SOURCE_BUILD)
foreach(f ${OOSB_FILES}) foreach(f ${OOSB_FILES})
file(REMOVE "${f}") file(REMOVE "${f}")
endforeach() endforeach()
endif() endif()
# Check for generated files in the source tree which should not be there when doing an out-of-source build. # Check for generated files in the source tree which should not be there when
# Without checking for this it might happen that old versions are used for the compilation: # doing an out-of-source build. Without checking for this it might happen that
# old versions are used for the compilation:
if(OUT_OF_SOURCE_BUILD) if(OUT_OF_SOURCE_BUILD)
foreach(f ${OOSB_FILES}) foreach(f ${OOSB_FILES})
if(EXISTS "${f}") if(EXISTS "${f}")
message(SEND_ERROR "Generated \"${f}\" found inside the source tree. Please remove it as it is a relic of the old build system and prevents valid compilation now.") message(
SEND_ERROR
"Generated \"${f}\" found inside the source tree. Please remove it as it is a relic of the old build system and prevents valid compilation now."
)
endif() endif()
endforeach() endforeach()
endif() endif()
### Start generating AboutThisBuild.txt # Start generating AboutThisBuild.txt Set the platform bit-depth:
# Set the platform bit-depth:
if(CMAKE_SIZEOF_VOID_P EQUAL 4) if(CMAKE_SIZEOF_VOID_P EQUAL 4)
set(PROC_BIT_DEPTH 32 bits) set(PROC_BIT_DEPTH 32 bits)
else() else()
set(PROC_BIT_DEPTH 64 bits) set(PROC_BIT_DEPTH 64 bits)
endif() endif()
# Get compiler name and version. # Get compiler name and version. Only CMake > 2.8.7 knows
# Only CMake > 2.8.7 knows CMAKE_*_COMPILER_VERSION # CMAKE_*_COMPILER_VERSION
if(CMAKE_VERSION VERSION_GREATER 2.8.7) if(CMAKE_VERSION VERSION_GREATER 2.8.7)
get_filename_component(COMPILER_INFO ${CMAKE_C_COMPILER} NAME_WE) get_filename_component(COMPILER_INFO ${CMAKE_C_COMPILER} NAME_WE)
set(COMPILER_INFO "${COMPILER_INFO} ${CMAKE_C_COMPILER_VERSION}") set(COMPILER_INFO "${COMPILER_INFO} ${CMAKE_C_COMPILER_VERSION}")
else() else()
execute_process(COMMAND gcc -dumpversion OUTPUT_VARIABLE GCC_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE) execute_process(
COMMAND gcc -dumpversion
OUTPUT_VARIABLE GCC_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE)
set(COMPILER_INFO "gcc ${GCC_VERSION}") set(COMPILER_INFO "gcc ${GCC_VERSION}")
endif() endif()
# Get C++ and linker flags for rtengine (the GUI's C++ flags may have fewer flags): # Get C++ and linker flags for rtengine (the GUI's C++ flags may have fewer
set(CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${UPPER_CMAKE_BUILD_TYPE}} ${RTENGINE_CXX_FLAGS}") # flags):
set(LFLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_${UPPER_CMAKE_BUILD_TYPE}}") set(CXX_FLAGS
"${CMAKE_CXX_FLAGS} ${CMAKE_CXX_FLAGS_${UPPER_CMAKE_BUILD_TYPE}} ${RTENGINE_CXX_FLAGS}"
)
set(LFLAGS
"${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_${UPPER_CMAKE_BUILD_TYPE}}"
)
set(ABOUT_COMMAND_WITH_ARGS ${CMAKE_COMMAND} set(ABOUT_COMMAND_WITH_ARGS
-DPROJECT_SOURCE_DIR:STRING=${PROJECT_SOURCE_DIR} ${CMAKE_COMMAND} -DPROJECT_SOURCE_DIR:STRING=${PROJECT_SOURCE_DIR}
-DCACHE_NAME_SUFFIX:STRING=${CACHE_NAME_SUFFIX} -DCACHE_NAME_SUFFIX:STRING=${CACHE_NAME_SUFFIX}
-DPROC_LABEL:STRING="${PROC_LABEL}" -DPROC_LABEL:STRING="${PROC_LABEL}"
-DPROC_BIT_DEPTH:STRING="${PROC_BIT_DEPTH}" -DPROC_BIT_DEPTH:STRING="${PROC_BIT_DEPTH}"
-DBUILD_TYPE:STRING=${CMAKE_BUILD_TYPE} -DBUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
-DGTKMM_VERSION:STRING=${GTKMM_VERSION} -DGTKMM_VERSION:STRING=${GTKMM_VERSION} -DOPTION_OMP:STRING=${OPTION_OMP}
-DOPTION_OMP:STRING=${OPTION_OMP}
-DWITH_MYFILE_MMAP:STRING=${WITH_MYFILE_MMAP} -DWITH_MYFILE_MMAP:STRING=${WITH_MYFILE_MMAP}
-DLENSFUN_VERSION:STRING=${LENSFUN_VERSION}) -DLENSFUN_VERSION:STRING=${LENSFUN_VERSION})
if(WIN32) if(WIN32)
list(APPEND ABOUT_COMMAND_WITH_ARGS -DSYSTEM:STRING=Windows list(
APPEND
ABOUT_COMMAND_WITH_ARGS
-DSYSTEM:STRING=Windows
-DCXX_FLAGS:STRING="${CXX_FLAGS}" -DCXX_FLAGS:STRING="${CXX_FLAGS}"
-DLFLAGS:STRING="${LFLAGS}" -DLFLAGS:STRING="${LFLAGS}"
-DCOMPILER_INFO:STRING="${COMPILER_INFO}" -DCOMPILER_INFO:STRING="${COMPILER_INFO}"
@@ -508,35 +655,45 @@ if(WIN32)
-DBIT_DEPTH:STRING="${CMAKE_SIZEOF_VOID_P}") -DBIT_DEPTH:STRING="${CMAKE_SIZEOF_VOID_P}")
elseif(APPLE) elseif(APPLE)
list(APPEND ABOUT_COMMAND_WITH_ARGS -DSYSTEM:STRING=Apple list(APPEND ABOUT_COMMAND_WITH_ARGS -DSYSTEM:STRING=Apple
-DCXX_FLAGS:STRING=${CXX_FLAGS} -DCXX_FLAGS:STRING=${CXX_FLAGS} -DLFLAGS:STRING=${LFLAGS}
-DLFLAGS:STRING=${LFLAGS} -DCOMPILER_INFO:STRING=${COMPILER_INFO})
-DCOMPILER_INFO:STRING=${COMPILER_INFO})
else() else()
list(APPEND ABOUT_COMMAND_WITH_ARGS -DSYSTEM:STRING=Linux list(APPEND ABOUT_COMMAND_WITH_ARGS -DSYSTEM:STRING=Linux
-DCXX_FLAGS:STRING=${CXX_FLAGS} -DCXX_FLAGS:STRING=${CXX_FLAGS} -DLFLAGS:STRING=${LFLAGS}
-DLFLAGS:STRING=${LFLAGS} -DCOMPILER_INFO:STRING=${COMPILER_INFO})
-DCOMPILER_INFO:STRING=${COMPILER_INFO})
endif() endif()
list(APPEND ABOUT_COMMAND_WITH_ARGS -P "${PROJECT_SOURCE_DIR}/UpdateInfo.cmake") list(APPEND ABOUT_COMMAND_WITH_ARGS -P "${PROJECT_SOURCE_DIR}/UpdateInfo.cmake")
add_custom_target(UpdateInfo ALL add_custom_target(
UpdateInfo ALL
COMMAND ${ABOUT_COMMAND_WITH_ARGS} COMMAND ${ABOUT_COMMAND_WITH_ARGS}
COMMENT "Creating AboutThisBuild.txt and other version-dependent files") COMMENT "Creating AboutThisBuild.txt and other version-dependent files")
### End generating AboutThisBuild.txt # End generating AboutThisBuild.txt
install(FILES AUTHORS.txt DESTINATION "${CREDITSDIR}") install(FILES AUTHORS.txt DESTINATION "${CREDITSDIR}")
install(FILES LICENSE.txt DESTINATION "${LICENCEDIR}") install(FILES LICENSE.txt DESTINATION "${LICENCEDIR}")
install(FILES "${CMAKE_BINARY_DIR}/AboutThisBuild.txt" DESTINATION "${CREDITSDIR}") install(FILES "${CMAKE_BINARY_DIR}/AboutThisBuild.txt"
install(FILES RELEASE_NOTES.txt DESTINATION "${CREDITSDIR}" OPTIONAL) DESTINATION "${CREDITSDIR}")
install(
FILES RELEASE_NOTES.txt
DESTINATION "${CREDITSDIR}"
OPTIONAL)
# The standard location for man pages in Linux is /usr/share/man # The standard location for man pages in Linux is /usr/share/man Use "manpath"
# Use "manpath" to see the search paths for man pages on your system. # to see the search paths for man pages on your system.
if(BUILD_BUNDLE) if(BUILD_BUNDLE)
install(FILES "${PROJECT_SOURCE_DIR}/doc/manpage/rawtherapee.1" DESTINATION "${DATADIR}/share/man/man1") if(APPLE)
install(FILES "${PROJECT_SOURCE_DIR}/doc/manpage/rawtherapee.1"
DESTINATION "${DATADIR}/man/man1")
else()
install(FILES "${PROJECT_SOURCE_DIR}/doc/manpage/rawtherapee.1"
DESTINATION "${DATADIR}/share/man/man1")
endif()
else() else()
install(FILES "${PROJECT_SOURCE_DIR}/doc/manpage/rawtherapee.1" DESTINATION "${CMAKE_INSTALL_PREFIX}/share/man/man1") install(FILES "${PROJECT_SOURCE_DIR}/doc/manpage/rawtherapee.1"
DESTINATION "${CMAKE_INSTALL_PREFIX}/share/man/man1")
endif() endif()
if(WIN32) if(WIN32)
@@ -544,7 +701,8 @@ if(WIN32)
endif() endif()
if(UNIX) if(UNIX)
install(FILES com.rawtherapee.RawTherapee.appdata.xml DESTINATION "${APPDATADIR}") install(FILES com.rawtherapee.RawTherapee.appdata.xml
DESTINATION "${APPDATADIR}")
endif() endif()
# check whether the used version of lensfun has lfDatabase::LoadDirectory # check whether the used version of lensfun has lfDatabase::LoadDirectory
@@ -572,26 +730,31 @@ int main()
lfDatabase *db = 0; lfDatabase *db = 0;
bool b = db->LoadDirectory(0); bool b = db->LoadDirectory(0);
return 0; return 0;
}" LENSFUN_HAS_LOAD_DIRECTORY) }"
LENSFUN_HAS_LOAD_DIRECTORY)
set(TCMALLOC_LIB_DIR) set(TCMALLOC_LIB_DIR)
if(ENABLE_TCMALLOC) if(ENABLE_TCMALLOC)
if(TCMALLOC_LIB_DIR) if(TCMALLOC_LIB_DIR)
find_library(TCMALLOC_LIBRARIES tcmalloc PATHS ${TCMALLOC_LIB_DIR} NO_DEFAULT_PATH) find_library(TCMALLOC_LIBRARIES tcmalloc PATHS ${TCMALLOC_LIB_DIR}
NO_DEFAULT_PATH)
else() else()
find_library(TCMALLOC_LIBRARIES tcmalloc) find_library(TCMALLOC_LIBRARIES tcmalloc)
endif() endif()
if(TCMALLOC_LIBRARIES) if(TCMALLOC_LIBRARIES)
message(STATUS "using tcmalloc library in ${TCMALLOC_LIBRARIES}") message(STATUS "using tcmalloc library in ${TCMALLOC_LIBRARIES}")
else() else()
set(TCMALLOC_LIBRARIES "" CACHE INTERNAL "" FORCE) set(TCMALLOC_LIBRARIES
""
CACHE INTERNAL "" FORCE)
message(STATUS "tcmalloc not found") message(STATUS "tcmalloc not found")
endif() endif()
else() else()
set(TCMALLOC_LIBRARIES "" CACHE INTERNAL "" FORCE) set(TCMALLOC_LIBRARIES
""
CACHE INTERNAL "" FORCE)
endif() endif()
add_subdirectory(rtexif) add_subdirectory(rtexif)
add_subdirectory(rtengine) add_subdirectory(rtengine)
add_subdirectory(rtgui) add_subdirectory(rtgui)

View File

@@ -24,7 +24,7 @@ mark_as_advanced(MACINTEGRATION_LIBRARY)
# handle the QUIETLY and REQUIRED arguments and set MACINTEGRATION_FOUND to TRUE if # handle the QUIETLY and REQUIRED arguments and set MACINTEGRATION_FOUND to TRUE if
# all listed variables are TRUE # all listed variables are TRUE
include(FindPackageHandleStandardArgs) include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(MACINTEGRATION DEFAULT_MSG MACINTEGRATION_LIBRARY MACINTEGRATION_INCLUDE_DIR) find_package_handle_standard_args(MacIntegration DEFAULT_MSG MACINTEGRATION_LIBRARY MACINTEGRATION_INCLUDE_DIR)
if(MACINTEGRATION_FOUND) if(MACINTEGRATION_FOUND)
set(MacIntegration_LIBRARIES ${MACINTEGRATION_LIBRARY}) set(MacIntegration_LIBRARIES ${MACINTEGRATION_LIBRARY})

View File

@@ -9,6 +9,7 @@
# which can be useful if you want to keep the application and all the cache data in a single place, # which can be useful if you want to keep the application and all the cache data in a single place,
# an external HD for example # an external HD for example
MultiUser=true MultiUser=true
UseSystemTheme=false
[File Browser] [File Browser]
# Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include)
@@ -38,5 +39,6 @@ CustomProfileBuilder=
#ImgDefault=Neutral #ImgDefault=Neutral
[GUI] [GUI]
FontFamily=Helvetica Regular # Set the included font as default
CPFontFamily=Helvetica Regular FontFamily=Droid Sans Mono Slashed
CPFontFamily=Droid Sans Mono Slashed

View File

@@ -195,4 +195,8 @@ target_link_libraries(rtengine rtexif
${KLT_LIBRARIES} ${KLT_LIBRARIES}
) )
install(FILES ${CAMCONSTSFILE} DESTINATION "${DATADIR}" PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ) if(APPLE)
install(FILES ${CAMCONSTSFILE} DESTINATION "${DATADIR}" PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)
else()
install(FILES ${CAMCONSTSFILE} DESTINATION "${DATADIR}" PERMISSIONS OWNER_WRITE OWNER_READ GROUP_READ WORLD_READ)
endif()

View File

@@ -22,10 +22,19 @@
#cmakedefine BUILD_BUNDLE #cmakedefine BUILD_BUNDLE
#cmakedefine HAVE_UNALIGNED_MALLOC #cmakedefine HAVE_UNALIGNED_MALLOC
#ifdef __APPLE__
#define DATA_SEARCH_PATH "/Applications/RawTherapee.app/Contents/Resources/share"
#define DOC_SEARCH_PATH "/Applications/RawTherapee.app/Contents/Resources"
#define CREDITS_SEARCH_PATH "/Applications/RawTherapee.app/Contents/Resources"
#define LICENCE_SEARCH_PATH "/Applications/RawTherapee.app/Contents/Resources"
#define LENSFUN_DB_PATH "${LENSFUNDBDIR}"
#else
#define DATA_SEARCH_PATH "${DATADIR}" #define DATA_SEARCH_PATH "${DATADIR}"
#define DOC_SEARCH_PATH "${DOCDIR}" #define DOC_SEARCH_PATH "${DOCDIR}"
#define CREDITS_SEARCH_PATH "${CREDITSDIR}" #define CREDITS_SEARCH_PATH "${CREDITSDIR}"
#define LICENCE_SEARCH_PATH "${LICENCEDIR}" #define LICENCE_SEARCH_PATH "${LICENCEDIR}"
#define LENSFUN_DB_PATH "${LENSFUNDBDIR}" #define LENSFUN_DB_PATH "${LENSFUNDBDIR}"
#endif
#endif #endif

View File

@@ -2314,8 +2314,18 @@ void Options::load(bool lightweight)
const gchar* path; const gchar* path;
Glib::ustring dPath; Glib::ustring dPath;
#ifdef __APPLE__
// Build Application Support directory path for macOS.
const char* homedir = g_getenv("HOME"); // This returns the current container data dir in ~/Library
std::string homebuf{homedir};
int homelength = strlen(homebuf.c_str());
homebuf[homelength-44] = '\0'; // Terminate string after ${HOME}/Library
std::string homeconfig{homebuf};
std::strcat(&homeconfig[0], "/Application Support/RawTherapee/config");
path = homeconfig.c_str();
#else
path = g_getenv("RT_SETTINGS"); path = g_getenv("RT_SETTINGS");
#endif
if (path != nullptr) { if (path != nullptr) {
rtdir = Glib::ustring(path); rtdir = Glib::ustring(path);
@@ -2324,6 +2334,7 @@ void Options::load(bool lightweight)
throw Error(msg); throw Error(msg);
} }
} else { } else {
#ifdef WIN32 #ifdef WIN32
WCHAR pathW[MAX_PATH] = {0}; WCHAR pathW[MAX_PATH] = {0};
@@ -2356,9 +2367,14 @@ void Options::load(bool lightweight)
rtdir = Glib::build_filename(argv0, "mysettings"); rtdir = Glib::build_filename(argv0, "mysettings");
} }
// Modify the path of the cache folder to the one provided in RT_CACHE environment variable // Modify the path of the cache folder to the one provided in RT_CACHE environment variable. Build the cache folder name in macOS.
#ifdef __APPLE__
std::string homecache{homebuf};
std::strcat(&homecache[0], "/Application Support/RawTherapee/cache");
path = homecache.c_str();
#else
path = g_getenv("RT_CACHE"); path = g_getenv("RT_CACHE");
#endif
if (path != nullptr) { if (path != nullptr) {
cacheBaseDir = Glib::ustring(path); cacheBaseDir = Glib::ustring(path);
@@ -2367,6 +2383,7 @@ void Options::load(bool lightweight)
throw Error(msg); throw Error(msg);
} }
} }
// No environment variable provided, so falling back to the multi user mode, if enabled // No environment variable provided, so falling back to the multi user mode, if enabled
else if (options.multiUser) { else if (options.multiUser) {
#ifdef WIN32 #ifdef WIN32

View File

@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleName</key>
<string>RawTherapee-bin</string>
<key>CFBundleIdentifier</key>
<string>com.rawtherapee.rawtherapee</string>
</dict>
</plist>

View File

@@ -1,7 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>LSEnvironment</key>
<dict>
<key>XDG_DATA_DIRS</key>
<string>/Applications/RawTherapee.app/Contents/Resources/share</string>
<key>DYLD_FALLBACK_LIBRARY_PATH</key>
<string>/Applications/RawTherapee.app/Contents/Frameworks</string>
<key>GTK_PATH</key>
<string>/Applications/RawTherapee.app/Contents/Frameworks</string>
<key>GTK_IM_MODULE_FILE</key>
<string>/Applications/RawTherapee.app/Contents/Resources/etc/gtk-3.0/gtk.immodules</string>
<key>GTK_MODULES</key>
<string>/Applications/RawTherapee.app/Contents/Frameworks/im-quartz.so</string>
<key>XDG_DATA_HOME</key>
<string>/Applications/RawTherapee.app/Contents/Resources/share</string>
<key>GSETTINGS_SCHEMA_DIR</key>
<string>/Applications/RawTherapee.app/Contents/Resources/share/glib-2.0/schemas</string>
<key>GDK_PIXBUF_MODULE_FILE</key>
<string>/Applications/RawTherapee.app/Contents/Resources/etc/gtk-3.0/gdk-pixbuf.loaders</string>
<key>GDK_PIXBUF_MODULEDIR</key>
<string>/Applications/RawTherapee.app/Contents/Frameworks</string>
<key>FONTCONFIG_PATH</key>
<string>/Applications/RawTherapee.app/Contents/Resources/etc/fonts</string>
<key>LIBDIR</key>
<string>/Applications/RawTherapee.app/Contents/Frameworks</string>
<key>DATADIR</key>
<string>/Applications/RawTherapee.app/Contents/Resources</string>
<key>GDK_RENDERING</key>
<string>similar</string>
<key>GTK_OVERLAY_SCROLLING</key>
<string>0</string>
<key>GDK_NATIVE_WINDOWS</key>
<string>1</string>
</dict>
<key>ATSApplicationFontsPath</key>
<string>etc/fonts</string>
<key>LSMultipleInstancesProhibited</key>
<true />
<key>LSMinimumSystemVersion</key>
<string>@minimum_macos_version@</string>
<key>CFBundleDevelopmentRegion</key> <key>CFBundleDevelopmentRegion</key>
<string>English</string> <string>English</string>
<key>CFBundleDisplayName</key> <key>CFBundleDisplayName</key>
@@ -21,7 +59,7 @@
<key>CFBundleTypeRole</key> <key>CFBundleTypeRole</key>
<string>Editor</string> <string>Editor</string>
<key>LSIsAppleDefaultForType</key> <key>LSIsAppleDefaultForType</key>
<true/> <true />
<key>LSItemContentTypes</key> <key>LSItemContentTypes</key>
<array> <array>
<string>com.rawtherapee.pp3</string> <string>com.rawtherapee.pp3</string>
@@ -115,7 +153,7 @@
<key>CFBundleIconFile</key> <key>CFBundleIconFile</key>
<string>rawtherapee.icns</string> <string>rawtherapee.icns</string>
<key>CFBundleIdentifier</key> <key>CFBundleIdentifier</key>
<string>com.rawtherapee.rawtherapee</string> <string>com.rawtherapee.RawTherapee</string>
<key>CFBundleInfoDictionaryVersion</key> <key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string> <string>6.0</string>
<key>CFBundleName</key> <key>CFBundleName</key>
@@ -133,7 +171,7 @@
<string>@arch@</string> <string>@arch@</string>
</array> </array>
<key>NSHighResolutionCapable</key> <key>NSHighResolutionCapable</key>
<true/> <true />
<key>NSHumanReadableCopyright</key> <key>NSHumanReadableCopyright</key>
<string>Copyright © 2004-2010 Gábor Horváth, 2010-2017 RawTherapee Development Team</string> <string>Copyright © 2004-2010 Gábor Horváth, 2010-2017 RawTherapee Development Team</string>
<key>UTExportedTypeDeclarations</key> <key>UTExportedTypeDeclarations</key>
@@ -164,4 +202,4 @@
</dict> </dict>
</array> </array>
</dict> </dict>
</plist> </plist>

View File

@@ -1,33 +0,0 @@
#!/bin/sh
# GIMP has this next line regarding raising the number-of-open-files limit:
ulimit -n 7000
cd "$(dirname "$0")" || exit 1
cwd="$(pwd)"
app="/Applications/RawTherapee.app"
lib="${app}/Contents/Frameworks"
resources="${app}/Contents/Resources"
etc="${resources}/etc"
export XDG_DATA_DIRS="${resources}/share"
export DYLD_FALLBACK_LIBRARY_PATH="${lib}"
export GTK_PATH="${lib}/gtk-3.0/3.0.0"
export XDG_DATA_HOME="${resources}/share"
export GSETTINGS_SCHEMA_DIR="${resources}/share/glib-2.0/schemas"
export GDK_PIXBUF_MODULE_FILE="${etc}/gtk-3.0/gdk-pixbuf.loaders"
export GDK_PIXBUF_MODULEDIR="${lib}"
export RT_SETTINGS="${HOME}/Library/Application Support/RawTherapee/config"
export RT_CACHE="${HOME}/Library/Application Support/RawTherapee/cache"
# Strip out system argument
case "$1" in
-psn_*) shift ;;
esac
# Prevent crash when directory name contains special characters
AppleLocale=`defaults read -g AppleLocale`
export LANG=${AppleLocale%@*}.UTF-8
exec "${app}/Contents/MacOS/bin/rawtherapee-bin" "$@"

View File

@@ -1,30 +0,0 @@
diff --git a/lib/iconv.c b/lib/iconv.c
index 3785296..24a0f07 100644
--- a/lib/iconv.c
+++ b/lib/iconv.c
@@ -607,4 +607,25 @@ strong_alias (libiconv, iconv)
strong_alias (libiconv_close, iconv_close)
#endif
+#undef iconv_open
+#undef iconv
+#undef iconv_close
+
+LIBICONV_DLL_EXPORTED iconv_t iconv_open (const char* tocode, const char* fromcode)
+{
+ return libiconv_open(tocode, fromcode);
+}
+
+LIBICONV_DLL_EXPORTED size_t iconv (iconv_t icd,
+ ICONV_CONST char * * inbuf, size_t *inbytesleft,
+ char * * outbuf, size_t *outbytesleft)
+{
+ return libiconv(icd, inbuf, inbytesleft, outbuf, outbytesleft);
+}
+
+LIBICONV_DLL_EXPORTED int iconv_close (iconv_t icd)
+{
+ return libiconv_close(icd);
+}
+
#endif

View File

@@ -1,30 +0,0 @@
diff --git a/lib/iconv.c b/lib/iconv.c
index 31853a7..630a498 100644
--- a/lib/iconv.c
+++ b/lib/iconv.c
@@ -611,4 +611,25 @@ strong_alias (libiconv, iconv)
strong_alias (libiconv_close, iconv_close)
#endif
+#undef iconv_open
+#undef iconv
+#undef iconv_close
+
+LIBICONV_DLL_EXPORTED iconv_t iconv_open (const char* tocode, const char* fromcode)
+{
+ return libiconv_open(tocode, fromcode);
+}
+
+LIBICONV_DLL_EXPORTED size_t iconv (iconv_t icd,
+ ICONV_CONST char * * inbuf, size_t *inbytesleft,
+ char * * outbuf, size_t *outbytesleft)
+{
+ return libiconv(icd, inbuf, inbytesleft, outbuf, outbytesleft);
+}
+
+LIBICONV_DLL_EXPORTED int iconv_close (iconv_t icd)
+{
+ return libiconv_close(icd);
+}
+
#endif

View File

@@ -34,27 +34,43 @@ function CheckLink {
done done
} }
function ModifyInstallNames {
find -E "${CONTENTS}" -type f -regex '.*/(rawtherapee-cli|rawtherapee|.*\.(dylib|so))' | while read -r x; do
msg "Modifying install names: ${x}"
{
# id
if [[ ${x:(-6)} == ".dylib" ]] || [[ f${x:(-3)} == ".so" ]]; then
install_name_tool -id /Applications/"${LIB}"/$(basename ${x}) ${x}
fi
GetDependencies "${x}" | while read -r y
do
install_name_tool -change ${y} /Applications/"${LIB}"/$(basename ${y}) ${x}
done
} | bash -v
done
}
# Source check # Source check
if [[ ! -d "${CMAKE_BUILD_TYPE}" ]]; then if [[ ! -d $CMAKE_BUILD_TYPE ]]; then
msgError "${PWD}/${CMAKE_BUILD_TYPE} folder does not exist. Please execute 'make install' first." msgError "${PWD}/${CMAKE_BUILD_TYPE} folder does not exist. Please execute 'make install' first."
exit 1 exit 1
fi fi
# Update project version # Update project version
if [[ -x "$(which git)" && -d "${PROJECT_SOURCE_DIR}/.git" ]]; then if [[ -x $(which git) && -d $PROJECT_SOURCE_DIR/.git ]]; then
### This section is copied from tools/generateReleaseInfo ### This section is copied from tools/generateReleaseInfo
# Get version description. # Get version description.
# Depending on whether you checked out a branch (dev) or a tag (release), # Depending on whether you checked out a branch (dev) or a tag (release),
# "git describe" will return "5.0-gtk2-2-g12345678" or "5.0-gtk2", respectively. # "git describe" will return "5.0-gtk2-2-g12345678" or "5.0-gtk2", respectively.
gitDescribe="$(git describe --tags --always)" gitDescribe="$(git describe --tags --always)"
# Apple requires a numeric version of the form n.n.n # Apple requires a numeric version of the form n.n.n
# https://goo.gl/eWDQv6 # https://goo.gl/eWDQv6
# Get number of commits since tagging. This is what gitDescribe uses. # Get number of commits since tagging. This is what gitDescribe uses.
# Works when checking out branch, tag or commit. # Works when checking out branch, tag or commit.
gitCommitsSinceTag="$(git rev-list --count HEAD --not $(git tag --merged HEAD))" gitCommitsSinceTag="$(git rev-list --count HEAD --not $(git tag --merged HEAD))"
# Create numeric version. # Create numeric version.
# This version is nonsense, either don't use it at all or use it only where you have no other choice, e.g. Inno Setup's VersionInfoVersion. # This version is nonsense, either don't use it at all or use it only where you have no other choice, e.g. Inno Setup's VersionInfoVersion.
# Strip everything after hyphen, e.g. "5.0-gtk2" -> "5.0", "5.1-rc1" -> "5.1" (ergo BS). # Strip everything after hyphen, e.g. "5.0-gtk2" -> "5.0", "5.1-rc1" -> "5.1" (ergo BS).
@@ -65,14 +81,13 @@ if [[ -x "$(which git)" && -d "${PROJECT_SOURCE_DIR}/.git" ]]; then
gitVersionNumericBS="${gitVersionNumericBS}.${gitCommitsSinceTag}" # Remove everything until after first hyphen: 5.0 gitVersionNumericBS="${gitVersionNumericBS}.${gitCommitsSinceTag}" # Remove everything until after first hyphen: 5.0
fi fi
### Copy end. ### Copy end.
PROJECT_FULL_VERSION="$gitDescribe" PROJECT_FULL_VERSION="$gitDescribe"
PROJECT_VERSION="$gitVersionNumericBS" PROJECT_VERSION="$gitVersionNumericBS"
fi fi
MINIMUM_SYSTEM_VERSION="$(otool -l "${CMAKE_BUILD_TYPE}"/MacOS/rawtherapee | grep -A2 'LC_VERSION_MIN_MACOSX' | awk '$1 ~ /version/ { printf $2 }')" MINIMUM_SYSTEM_VERSION="$(otool -l "${CMAKE_BUILD_TYPE}"/MacOS/rawtherapee | grep -A2 'LC_VERSION_MIN_MACOSX' | awk '$1 ~ /version/ { printf $2 }')"
if [[ -z "${MINIMUM_SYSTEM_VERSION}" ]]; then if [[ -z $MINIMUM_SYSTEM_VERSION ]]; then
MINIMUM_SYSTEM_VERSION="$(sw_vers -productVersion | cut -d. -f-2)" MINIMUM_SYSTEM_VERSION="$(sw_vers -productVersion | cut -d. -f-2)"
fi fi
@@ -89,9 +104,33 @@ GTK_PREFIX: ${GTK_PREFIX}
PWD: ${PWD} PWD: ${PWD}
__EOS__ __EOS__
LOCAL_PREFIX="$(cmake .. -LA -N | grep "LOCAL_PREFIX" | cut -d "=" -f2)" minimum_macos_version=${MINIMUM_SYSTEM_VERSION}
EXPATLIB="$(cmake .. -LA -N | grep "pkgcfg_lib_EXPAT_expat" | cut -d "=" -f2)"
# Retreive cached values from cmake
#In: LOCAL_PREFIX:STRING=/opt
#Out: /opt
LOCAL_PREFIX="$(cmake .. -L -N | grep LOCAL_PREFIX)"; LOCAL_PREFIX="${LOCAL_PREFIX#*=}"
#In: pkgcfg_lib_EXPAT_expat:FILEPATH=/opt/local/lib/libexpat.dylib
#Out: /opt/local/lib/libexpat.dylib
EXPATLIB="$(cmake .. -LA -N | grep pkgcfg_lib_EXPAT_expat)"; pkgcfg_lib_EXPAT_expat="${pkgcfg_lib_EXPAT_expat#*=}"
#In: CODESIGNID:STRING=Developer ID Application: Doctor Who (1234567890)
#Out: Developer ID Application: Doctor Who (1234567890)
CODESIGNID="$(cmake .. -L -N | grep CODESIGNID)"; CODESIGNID="${CODESIGNID#*=}"
#In: NOTARY:STRING=--username drwho@bbc.com --password abcd-efgh-hijk-lmno
#Out: --username drwho@bbc.com --password abcd-efgh-hijk-lmno
NOTARY="$(cmake .. -L -N | grep NOTARY)"; NOTARY="${NOTARY#*=}"
# In: FANCY_DMG:BOOL=ON
# Out: ON
FANCY_DMG="$(cmake .. -L -N | grep FANCY_DMG)"; FANCY_DMG="${FANCY_DMG#*=}"
if [[ -n $FANCY_DMG ]]; then
echo "Fancy .dmg build is ON."
fi
APP="${PROJECT_NAME}.app" APP="${PROJECT_NAME}.app"
CONTENTS="${APP}/Contents" CONTENTS="${APP}/Contents"
RESOURCES="${CONTENTS}/Resources" RESOURCES="${CONTENTS}/Resources"
@@ -102,17 +141,27 @@ EXECUTABLE="${MACOS}/rawtherapee"
GDK_PREFIX="${LOCAL_PREFIX}/local/" GDK_PREFIX="${LOCAL_PREFIX}/local/"
msg "Removing old files:" msg "Removing old files:"
rm -rf "${APP}" "${PROJECT_NAME}_*.dmg" "*zip" rm -rf "${APP}" *.dmg *.zip
msg "Creating bundle container:" msg "Creating bundle container:"
install -d "${RESOURCES}" \ install -d "${RESOURCES}"
"${MACOS}" \ install -d "${MACOS}"
"${LIB}" \ install -d "${LIB}"
"${ETC}" install -d "${ETC}"
msg "Copying release files:" msg "Copying binary executable files."
ditto "${CMAKE_BUILD_TYPE}/MacOS" "${MACOS}" ditto "${CMAKE_BUILD_TYPE}/MacOS" "${MACOS}"
ditto "Resources" "${RESOURCES}"
msg "Copying Resources directory."
cp AboutThisBuild.txt "${RESOURCES}"
ditto "${CMAKE_BUILD_TYPE}/Resources" "${RESOURCES}"
echo "\n--------\n" >> "${RESOURCES}/AboutThisBuild.txt"
echo "Bundle system: $(sysctl -n machdep.cpu.brand_string)" >> "${RESOURCES}/AboutThisBuild.txt"
echo "Bundle OS: $(sw_vers -productName) $(sw_vers -productVersion) $(sw_vers -buildVersion) $(uname -mrs)" >> "${RESOURCES}/AboutThisBuild.txt"
echo "Bundle date: $(date -Ru) UTC" >> "${RESOURCES}/AboutThisBuild.txt"
echo "Bundle epoch: $(date +%s)" >> "${RESOURCES}/AboutThisBuild.txt"
echo "Bundle UUID: $(uuidgen|tr 'A-Z' 'a-z')" >> "${RESOURCES}/AboutThisBuild.txt"
# Copy the Lensfun database into the app bundle # Copy the Lensfun database into the app bundle
mkdir -p "${RESOURCES}/share/lensfun" mkdir -p "${RESOURCES}/share/lensfun"
@@ -124,9 +173,12 @@ ditto ${LOCAL_PREFIX}/local/lib/liblensfun.2.dylib "${CONTENTS}/Frameworks/lible
# Copy libomp to Frameworks # Copy libomp to Frameworks
ditto ${LOCAL_PREFIX}/local/lib/libomp.dylib "${CONTENTS}/Frameworks" ditto ${LOCAL_PREFIX}/local/lib/libomp.dylib "${CONTENTS}/Frameworks"
msg "Copying dependencies from ${GTK_PREFIX}:" msg "Copying dependencies from ${GTK_PREFIX}."
CheckLink "${EXECUTABLE}" CheckLink "${EXECUTABLE}"
# dylib install names
ModifyInstallNames
# Copy libjpeg-turbo ("62") into the app bundle # Copy libjpeg-turbo ("62") into the app bundle
ditto ${LOCAL_PREFIX}/local/lib/libjpeg.62.dylib "${CONTENTS}/Frameworks/libjpeg.62.dylib" ditto ${LOCAL_PREFIX}/local/lib/libjpeg.62.dylib "${CONTENTS}/Frameworks/libjpeg.62.dylib"
@@ -168,11 +220,6 @@ ditto "${LIB}"/gtk-3.0/3*/immodules/*.{dylib,so} "${LIB}"
rm -r "${LIB}"/gtk-3.0 rm -r "${LIB}"/gtk-3.0
rm -r "${LIB}"/gdk-pixbuf-2.0 rm -r "${LIB}"/gdk-pixbuf-2.0
msg "Build glib database:"
mkdir -p ${RESOURCES}/share/glib-2.0
ditto {"${LOCAL_PREFIX}/local","${RESOURCES}"}/share/glib-2.0/schemas
"${LOCAL_PREFIX}/local/bin/glib-compile-schemas" "${RESOURCES}/share/glib-2.0/schemas"
# GTK+3 themes # GTK+3 themes
msg "Copy GTK+3 theme and icon resources:" msg "Copy GTK+3 theme and icon resources:"
ditto {"${LOCAL_PREFIX}/local","${RESOURCES}"}/share/themes/Mac/gtk-3.0/gtk-keys.css ditto {"${LOCAL_PREFIX}/local","${RESOURCES}"}/share/themes/Mac/gtk-3.0/gtk-keys.css
@@ -189,32 +236,15 @@ ditto {"${LOCAL_PREFIX}/local","${RESOURCES}"}/share/icons/Adwaita/index.theme
"${LOCAL_PREFIX}/local/bin/gtk-update-icon-cache" "${RESOURCES}/share/icons/Adwaita" "${LOCAL_PREFIX}/local/bin/gtk-update-icon-cache" "${RESOURCES}/share/icons/Adwaita"
ditto "${LOCAL_PREFIX}/local/share/icons/hicolor" "${RESOURCES}/share/icons/hicolor" ditto "${LOCAL_PREFIX}/local/share/icons/hicolor" "${RESOURCES}/share/icons/hicolor"
# Install names
find -E "${CONTENTS}" -type f -regex '.*/(rawtherapee-cli|rawtherapee|.*\.(dylib|so))' | while read -r x; do
msg "Modifying install names: ${x}"
{
# id
case ${x} in *.dylib) echo " install_name_tool -id '@rpath/$(basename "${x}")' '${x}'";; esac
# names
GetDependencies "${x}" | while read -r y; do
echo " install_name_tool -change '${y}' '@rpath/$(basename "${y}")' '${x}'"
done
} | bash -v
done
# fix @rpath in Frameworks
msg "Registering @rpath in Frameworks folder:"
for frameworklibs in ${CONTENTS}/Frameworks/* ; do
echo " install_name_tool -delete_rpath /opt/local/lib '${frameworklibs}'" | bash -v
echo " install_name_tool -add_rpath /Applications/RawTherapee.app/Contents/Frameworks '${frameworklibs}'" | bash -v
done
# pixbuf loaders & immodules # pixbuf loaders & immodules
msg "Build GTK3 databases:" msg "Build GTK3 databases:"
"${LOCAL_PREFIX}"/local/bin/gdk-pixbuf-query-loaders "${LIB}"/libpix*.so > "${ETC}"/gtk-3.0/gdk-pixbuf.loaders "${LOCAL_PREFIX}"/local/bin/gdk-pixbuf-query-loaders "${LIB}"/libpix*.so > "${ETC}"/gtk-3.0/gdk-pixbuf.loaders
"${LOCAL_PREFIX}"/local/bin/gtk-query-immodules-3.0 "${LIB}"/im-* > "${ETC}"/gtk-3.0/gtk.immodules "${LOCAL_PREFIX}"/local/bin/gtk-query-immodules-3.0 "${LIB}"/im-* > "${ETC}"/gtk-3.0/gtk.immodules
sed -i "" -e "s|${PWD}/RawTherapee.app/Contents/|/Applications/RawTherapee.app/Contents/|" "${ETC}/gtk-3.0/gdk-pixbuf.loaders" "${ETC}/gtk-3.0/gtk.immodules" sed -i "" -e "s|${PWD}/RawTherapee.app/Contents/|/Applications/RawTherapee.app/Contents/|" "${ETC}/gtk-3.0/gdk-pixbuf.loaders" "${ETC}/gtk-3.0/gtk.immodules"
sed -i "" -e "s|/opt/local/|/usr/|" "${ETC}/gtk-3.0/gtk.immodules" sed -i "" -e "s|/opt/local/|/Applications/RawTherapee.app/Contents/Frameworks/|" "${ETC}/gtk-3.0/gtk.immodules"
# Install names
ModifyInstallNames
# Mime directory # Mime directory
msg "Copying shared files from ${GTK_PREFIX}:" msg "Copying shared files from ${GTK_PREFIX}:"
@@ -222,65 +252,70 @@ ditto {"${LOCAL_PREFIX}/local","${RESOURCES}"}/share/mime
msg "Installing required application bundle files:" msg "Installing required application bundle files:"
PROJECT_SOURCE_DATA_DIR="${PROJECT_SOURCE_DIR}/tools/osx" PROJECT_SOURCE_DATA_DIR="${PROJECT_SOURCE_DIR}/tools/osx"
ditto "${PROJECT_SOURCE_DIR}/build/Resources" "${RESOURCES}" ditto "${CMAKE_BUILD_TYPE}/Resources" "${RESOURCES}"
# Executable loader ditto "${PROJECT_SOURCE_DIR}/rtdata/fonts" "${ETC}/fonts"
# Note: executable is renamed to 'rawtherapee-bin'.
mkdir "${MACOS}/bin"
ditto "${MACOS}/rawtherapee" "${MACOS}/bin/rawtherapee-bin"
rm "${MACOS}/rawtherapee"
install -m 0755 "${PROJECT_SOURCE_DATA_DIR}/executable_loader.in" "${MACOS}/rawtherapee"
# App bundle resources # App bundle resources
ditto "${PROJECT_SOURCE_DATA_DIR}/"{rawtherapee,profile}.icns "${RESOURCES}" ditto "${PROJECT_SOURCE_DATA_DIR}/"{rawtherapee,profile}.icns "${RESOURCES}"
ditto "${PROJECT_SOURCE_DATA_DIR}/PkgInfo" "${CONTENTS}" ditto "${PROJECT_SOURCE_DATA_DIR}/PkgInfo" "${CONTENTS}"
install -m 0644 "${PROJECT_SOURCE_DATA_DIR}/Info.plist.in" "${CONTENTS}/Info.plist" install -m 0644 "${PROJECT_SOURCE_DATA_DIR}/Info.plist.in" "${CONTENTS}/Info.plist"
install -m 0644 "${PROJECT_SOURCE_DATA_DIR}/Info.plist-bin.in" "${CONTENTS}/MacOS/bin/Info.plist"
sed -i "" -e "s|@version@|${PROJECT_FULL_VERSION}| sed -i "" -e "s|@version@|${PROJECT_FULL_VERSION}|
s|@shortVersion@|${PROJECT_VERSION}| s|@shortVersion@|${PROJECT_VERSION}|
s|@arch@|${arch}|" \ s|@arch@|${arch}|" \
"${CONTENTS}/Info.plist" "${CONTENTS}/Info.plist"
plutil -convert xml1 "${CONTENTS}/Info.plist" plutil -convert binary1 "${CONTENTS}/Info.plist"
plutil -convert xml1 "${CONTENTS}/MacOS/bin/Info.plist" update-mime-database -V "${RESOURCES}/share/mime"
update-mime-database -V "${CONTENTS}/Resources/share/mime"
msg "Build glib database:"
mkdir -p ${RESOURCES}/share/glib-2.0
ditto {"${LOCAL_PREFIX}/local","${RESOURCES}"}/share/glib-2.0/schemas
"${LOCAL_PREFIX}/local/bin/glib-compile-schemas" "${RESOURCES}/share/glib-2.0/schemas"
# Append an LC_RPATH # Append an LC_RPATH
msg "Registering @rpath into the executable:" msg "Registering @rpath into the main executable."
echo " install_name_tool -add_rpath /Applications/RawTherapee.app/Contents/Frameworks '${MACOS}/bin/rawtherapee-bin'" | bash -v install_name_tool -add_rpath /Applications/"${LIB}" "${EXECUTABLE}"
echo " install_name_tool -add_rpath /Applications/RawTherapee.app/Contents/Frameworks '${EXECUTABLE}-cli'" | bash -v
# Sign the app ModifyInstallNames
msg "Codesigning:"
CODESIGNID="$(cmake .. -LA -N | grep "CODESIGNID" | cut -d "=" -f2)" # fix @rpath in Frameworks
if ! test -z "$CODESIGNID" ; then msg "Registering @rpath in Frameworks folder."
install -m 0644 "${PROJECT_SOURCE_DATA_DIR}/rt.entitlements" "${CONTENTS}/Entitlements.plist" for frameworklibs in "${LIB}"/*{dylib,so}; do
plutil -convert xml1 "${CONTENTS}/Entitlements.plist" install_name_tool -delete_rpath ${LOCAL_PREFIX}/local/lib "${frameworklibs}"
install -m 0644 "${PROJECT_SOURCE_DATA_DIR}/rt-bin.entitlements" "${CONTENTS}/MacOS/bin/Entitlements.plist" install_name_tool -add_rpath /Applications/"${LIB}" "${frameworklibs}"
plutil -convert xml1 "${CONTENTS}/MacOS/bin/Entitlements.plist"
codesign -v -s "${CODESIGNID}" -i "com.rawtherapee.rawtherapee-bin" -o runtime --timestamp --entitlements "${APP}/Contents/MacOS/bin/Entitlements.plist" "${APP}/Contents/MacOS/bin/rawtherapee-bin"
for frameworklibs in ${CONTENTS}/Frameworks/* ; do
codesign -v -s "${CODESIGNID}" -i "com.rawtherapee.rawtherapee-bin" -o runtime --timestamp "${frameworklibs}"
done done
codesign --deep --preserve-metadata=identifier,entitlements,runtime --timestamp --strict -v -s "${CODESIGNID}" -i "com.rawtherapee.RawTherapee" -o runtime --entitlements "${CONTENTS}/Entitlements.plist" "${APP}" install_name_tool -delete_rpath RawTherapee.app/Contents/Frameworks "${EXECUTABLE}"-cli
spctl -a -vvvv "${APP}" install_name_tool -add_rpath @executable_path "${EXECUTABLE}"-cli
# Codesign the app
if [[ -n $CODESIGNID ]]; then
msg "Codesigning Application."
install -m 0644 "${PROJECT_SOURCE_DATA_DIR}"/rt.entitlements "${CMAKE_BUILD_TYPE}"/rt.entitlements
plutil -convert binary1 "${CMAKE_BUILD_TYPE}"/rt.entitlements
mv "${EXECUTABLE}"-cli "${LIB}"
for frameworklibs in "${LIB}"/*; do
codesign -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee --force --verbose -o runtime --timestamp "${frameworklibs}"
done
codesign --timestamp --strict -v -s "${CODESIGNID}" -i com.rawtherapee.RawTherapee -o runtime --entitlements "${CMAKE_BUILD_TYPE}"/rt.entitlements "${APP}"
spctl -a -vvvv "${APP}"
fi fi
# Notarize the app # Notarize the app
NOTARY="$(cmake .. -LA -N | grep "NOTARY" | cut -d "=" -f2)" if [[ -n $NOTARY ]]; then
if ! test -z "$NOTARY" ; then
msg "Notarizing the application:" msg "Notarizing the application:"
ditto -c -k --sequesterRsrc --keepParent "${APP}" "${APP}.zip" ditto -c -k --sequesterRsrc --keepParent "${APP}" "${APP}.zip"
uuid=`xcrun altool --notarize-app --primary-bundle-id "com.rawtherapee.RawTherapee" ${NOTARY} --file "${APP}.zip" 2>&1 | grep 'RequestUUID' | awk '{ print $3 }'` uuid=`xcrun altool --notarize-app --primary-bundle-id "com.rawtherapee.RawTherapee" ${NOTARY} --file "${APP}.zip" 2>&1 | grep 'RequestUUID' | awk '{ print $3 }'`
echo "Result= $uuid" # Display identifier string echo "Result= $uuid" # Display identifier string
sleep 15 sleep 15
while : while :
do do
fullstatus=`xcrun altool --notarization-info "$uuid" ${NOTARY} 2>&1` # get the status fullstatus=`xcrun altool --notarization-info "$uuid" ${NOTARY} 2>&1` # get the status
status1=`echo "$fullstatus" | grep 'Status\:' | awk '{ print $2 }'` status1=`echo "$fullstatus" | grep 'Status\:' | awk '{ print $2 }'`
if [ "$status1" = "success" ]; then if [[ $status1 = "success" ]]; then
xcrun stapler staple *app # staple the ticket xcrun stapler staple *app # staple the ticket
xcrun stapler validate -v *app xcrun stapler validate -v *app
echo "Notarization success" echo "Notarization success"
break break
elif [ "$status1" = "in" ]; then elif [[ $status1 = "in" ]]; then
echo "Notarization still in progress, sleeping for 15 seconds and trying again" echo "Notarization still in progress, sleeping for 15 seconds and trying again"
sleep 15 sleep 15
else else
@@ -293,38 +328,55 @@ fi
function CreateDmg { function CreateDmg {
local srcDir="$(mktemp -dt $$)" local srcDir="$(mktemp -dt $$)"
msg "Preparing disk image sources at ${srcDir}:" msg "Preparing disk image sources at ${srcDir}:"
cp -R "${APP}" "${srcDir}" cp -R "${APP}" "${srcDir}"
ditto AboutThisBuild.txt "${srcDir}" cp "${RESOURCES}"/share/LICENSE.txt "${srcDir}"
ln -s /Applications "${srcDir}" ln -s /Applications "${srcDir}"
# Web bookmarks # Web bookmarks
function CreateWebloc { function CreateWebloc {
defaults write "${srcDir}/$1" URL "$2" defaults write "${srcDir}/$1" URL "$2"
mv "${srcDir}/$1".{plist,webloc} mv "${srcDir}/$1".{plist,webloc}
} }
CreateWebloc 'Website' 'http://www.rawtherapee.com/' CreateWebloc 'Website' 'https://www.rawtherapee.com/'
CreateWebloc 'Manual' 'http://rawpedia.rawtherapee.com/' CreateWebloc 'Documentation' 'https://rawpedia.rawtherapee.com/'
CreateWebloc 'Forum' 'https://discuss.pixls.us/c/software/rawtherapee'
CreateWebloc 'Report Bug' 'https://github.com/Beep6581/RawTherapee/issues/new'
# Disk image name # Disk image name
dmg_name="${PROJECT_NAME// /_}_OSX_${MINIMUM_SYSTEM_VERSION}_${PROC_BIT_DEPTH}_${PROJECT_FULL_VERSION}" dmg_name="${PROJECT_NAME// /_}_OSX_${MINIMUM_SYSTEM_VERSION}_${PROC_BIT_DEPTH}_${PROJECT_FULL_VERSION}"
lower_build_type="$(tr '[:upper:]' '[:lower:]' <<< "$CMAKE_BUILD_TYPE")" lower_build_type="$(tr '[:upper:]' '[:lower:]' <<< "$CMAKE_BUILD_TYPE")"
if [[ ${lower_build_type} != release ]]; then if [[ $lower_build_type != release ]]; then
dmg_name="${dmg_name}_${lower_build_type}" dmg_name="${dmg_name}_${lower_build_type}"
fi fi
msg "Creating disk image:" msg "Creating disk image:"
hdiutil create -format UDBZ -fs HFS+ -srcdir "${srcDir}" -volname "${PROJECT_NAME}_${PROJECT_FULL_VERSION}" "${dmg_name}.dmg" if [[ ! -z $FANCY_DMG ]]; then
echo "Building Fancy .dmg"
mkdir "${srcDir}/.background"
cp -R "${PROJECT_SOURCE_DATA_DIR}/rtdmg.icns" "${srcDir}/.VolumeIcon.icns"
cp -R "${PROJECT_SOURCE_DATA_DIR}/rtdmg-bkgd.png" "${srcDir}/.background/background.png"
SetFile -c incC "${srcDir}/.VolumeIcon.icns"
create-dmg "${dmg_name}.dmg" "${srcDir}" \
--volname "${PROJECT_NAME}_${PROJECT_FULL_VERSION}" \
--volicon "${srcDir}/.VolumeIcon.icns" \
--sandbox-safe \
--no-internet-enable \
--eula LICENSE.txt \
--hdiutil-verbose \
--rez /Library/Developer/CommandLineTools/usr/bin/Rez
else
hdiutil create -format UDBZ -fs HFS+ -srcdir "${srcDir}" -volname "${PROJECT_NAME}_${PROJECT_FULL_VERSION}" "${dmg_name}.dmg"
fi
# Sign disk image # Sign disk image
if ! test -z "$CODESIGNID" ; then if [[ -n $CODESIGNID ]]; then
codesign --deep --force -v -s "${CODESIGNID}" --timestamp "${dmg_name}.dmg" codesign --deep --force -v -s "${CODESIGNID}" --timestamp "${dmg_name}.dmg"
fi fi
# Notarize the dmg # Notarize the dmg
if ! test -z "$NOTARY"; then
if ! test -z "$NOTARY" ; then
msg "Notarizing the dmg:" msg "Notarizing the dmg:"
zip "${dmg_name}.dmg.zip" "${dmg_name}.dmg" zip "${dmg_name}.dmg.zip" "${dmg_name}.dmg"
uuid=`xcrun altool --notarize-app --primary-bundle-id "com.rawtherapee" ${NOTARY} --file "${dmg_name}.dmg.zip" 2>&1 | grep 'RequestUUID' | awk '{ print $3 }'` uuid=`xcrun altool --notarize-app --primary-bundle-id "com.rawtherapee" ${NOTARY} --file "${dmg_name}.dmg.zip" 2>&1 | grep 'RequestUUID' | awk '{ print $3 }'`
@@ -334,31 +386,30 @@ function CreateDmg {
do do
fullstatus=`xcrun altool --notarization-info "$uuid" ${NOTARY} 2>&1` # get the status fullstatus=`xcrun altool --notarization-info "$uuid" ${NOTARY} 2>&1` # get the status
status1=`echo "$fullstatus" | grep 'Status\:' | awk '{ print $2 }'` status1=`echo "$fullstatus" | grep 'Status\:' | awk '{ print $2 }'`
if [ "$status1" = "success" ]; then if [[ $status1 = "success" ]]; then
xcrun stapler staple "${dmg_name}.dmg" # staple the ticket xcrun stapler staple "${dmg_name}.dmg" # staple the ticket
xcrun stapler validate -v "${dmg_name}.dmg" xcrun stapler validate -v "${dmg_name}.dmg"
echo "dmg Notarization success" echo "dmg Notarization success"
break break
elif [ "$status1" = "in" ]; then elif [[ $status1 = "in" ]]; then
echo "dmg Notarization still in progress, sleeping for 15 seconds and trying again" echo "dmg Notarization still in progress, sleeping for 15 seconds and trying again"
sleep 15 sleep 15
else else
echo "dmg Notarization failed fullstatus below" echo "dmg Notarization failed fullstatus below"
echo "$fullstatus" echo "$fullstatus"
exit 1 exit 1
fi fi
done done
fi fi
# Zip disk image for redistribution # Zip disk image for redistribution
msg "Zipping disk image for redistribution:" msg "Zipping disk image for redistribution:"
zip "${dmg_name}.zip" "${dmg_name}.dmg" AboutThisBuild.txt
rm "${dmg_name}.dmg" rm "${dmg_name}.dmg"
msg "Removing disk image caches:" msg "Removing disk image caches:"
rm -rf "${srcDir}" rm -rf "${srcDir}"
} }
CreateDmg CreateDmg
msg "Finishing build:" msg "Finishing build:"
echo "Script complete." echo "Script complete."
#
# TODO filter out the benign errors

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.inherit</key>
<true/>
</dict>
</plist>

View File

@@ -1,20 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0"> <plist version="1.0">
<dict> <dict>
<key>application-identifier</key> <key>application-identifier</key>
<string>com.rawtherapee.rawtherapee</string> <string>com.rawtherapee.RawTherapee</string>
<key>com.apple.security.temporary-exception.files.absolute-path.read-write</key> <key>com.apple.security.temporary-exception.files.absolute-path.read-write</key>
<array> <array>
<string>&quot;/&quot;</string> <string>/</string>
</array> </array>
<key>com.apple.security.cs.allow-dyld-environment-variables</key> <key>com.apple.security.cs.allow-dyld-environment-variables</key>
<true/> <true />
<key>com.apple.security.files.user-selected.read-write</key> <key>com.apple.security.files.user-selected.read-write</key>
<true/> <true />
<key>com.apple.security.app-sandbox</key> <key>com.apple.security.app-sandbox</key>
<true/> <true />
<key>com.apple.security.files.downloads.read-write</key> <key>com.apple.security.files.downloads.read-write</key>
<true/> <true />
</dict> </dict>
</plist> </plist>

BIN
tools/osx/rtdmg-bkgd.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 367 KiB

BIN
tools/osx/rtdmg.icns Normal file

Binary file not shown.