macOS: bundle and statically link external dependencies.
This fixes numerous linking issues where updated system libraries on macOS cause errors on startup in newer OS versions.pull/252/merge
parent
03e479eb25
commit
f37881a2e3
|
@ -99,22 +99,29 @@ if(ENABLE_SANITIZERS)
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SANITIZE_FLAGS}")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${SANITIZE_FLAGS}")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# dependencies
|
# common dependencies
|
||||||
|
|
||||||
|
if(APPLE)
|
||||||
|
set(CMAKE_FIND_FRAMEWORK LAST)
|
||||||
|
endif()
|
||||||
|
|
||||||
message(STATUS "Using in-tree libdxfrw")
|
message(STATUS "Using in-tree libdxfrw")
|
||||||
add_subdirectory(extlib/libdxfrw)
|
add_subdirectory(extlib/libdxfrw)
|
||||||
|
|
||||||
if(WIN32)
|
if(WIN32 OR APPLE)
|
||||||
|
# On Win32 and macOS we use vendored packages, since there is little to no benefit
|
||||||
|
# to trying to find system versions. In particular, trying to link to libraries from
|
||||||
|
# Homebrew or macOS system libraries into the .app file is highly likely to result
|
||||||
|
# in incompatibilities after upgrades.
|
||||||
|
|
||||||
include(FindVendoredPackage)
|
include(FindVendoredPackage)
|
||||||
include(AddVendoredSubdirectory)
|
include(AddVendoredSubdirectory)
|
||||||
|
|
||||||
find_vendored_package(Freetype freetype
|
if(APPLE)
|
||||||
WITH_ZLIB OFF
|
set(FORCE_VENDORED_ZLIB ON)
|
||||||
WITH_BZip2 OFF
|
set(FORCE_VENDORED_PNG ON)
|
||||||
WITH_PNG OFF
|
set(FORCE_VENDORED_Freetype ON)
|
||||||
WITH_HarfBuzz OFF
|
endif()
|
||||||
FREETYPE_LIBRARY freetype
|
|
||||||
FREETYPE_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/extlib/freetype/include)
|
|
||||||
|
|
||||||
find_vendored_package(ZLIB zlib
|
find_vendored_package(ZLIB zlib
|
||||||
ZLIB_LIBRARY zlibstatic
|
ZLIB_LIBRARY zlibstatic
|
||||||
|
@ -127,6 +134,14 @@ if(WIN32)
|
||||||
PNG_PNG_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/extlib/libpng)
|
PNG_PNG_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/extlib/libpng)
|
||||||
list(APPEND PNG_PNG_INCLUDE_DIR ${CMAKE_BINARY_DIR}/extlib/libpng)
|
list(APPEND PNG_PNG_INCLUDE_DIR ${CMAKE_BINARY_DIR}/extlib/libpng)
|
||||||
|
|
||||||
|
find_vendored_package(Freetype freetype
|
||||||
|
WITH_ZLIB OFF
|
||||||
|
WITH_BZip2 OFF
|
||||||
|
WITH_PNG OFF
|
||||||
|
WITH_HarfBuzz OFF
|
||||||
|
FREETYPE_LIBRARY freetype
|
||||||
|
FREETYPE_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/extlib/freetype/include)
|
||||||
|
|
||||||
message(STATUS "Using in-tree pixman")
|
message(STATUS "Using in-tree pixman")
|
||||||
add_vendored_subdirectory(extlib/pixman)
|
add_vendored_subdirectory(extlib/pixman)
|
||||||
set(PIXMAN_FOUND YES)
|
set(PIXMAN_FOUND YES)
|
||||||
|
@ -140,8 +155,24 @@ if(WIN32)
|
||||||
set(CAIRO_LIBRARIES cairo)
|
set(CAIRO_LIBRARIES cairo)
|
||||||
set(CAIRO_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/extlib/cairo/src)
|
set(CAIRO_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/extlib/cairo/src)
|
||||||
list(APPEND CAIRO_INCLUDE_DIRS ${CMAKE_BINARY_DIR}/extlib/cairo/src)
|
list(APPEND CAIRO_INCLUDE_DIRS ${CMAKE_BINARY_DIR}/extlib/cairo/src)
|
||||||
|
else()
|
||||||
|
# On Linux and BSDs we're a good citizen and link to system libraries.
|
||||||
|
|
||||||
if(ENABLE_GUI)
|
find_package(PkgConfig REQUIRED)
|
||||||
|
|
||||||
|
find_package(Backtrace)
|
||||||
|
find_package(SpaceWare)
|
||||||
|
|
||||||
|
find_package(ZLIB REQUIRED)
|
||||||
|
find_package(PNG REQUIRED)
|
||||||
|
find_package(Freetype REQUIRED)
|
||||||
|
pkg_check_modules(CAIRO REQUIRED cairo)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# GUI dependencies
|
||||||
|
|
||||||
|
if(ENABLE_GUI)
|
||||||
|
if(WIN32)
|
||||||
if(OPENGL STREQUAL "3")
|
if(OPENGL STREQUAL "3")
|
||||||
message(STATUS "Using in-tree ANGLE")
|
message(STATUS "Using in-tree ANGLE")
|
||||||
set(ANGLE_STATIC ON CACHE INTERNAL "")
|
set(ANGLE_STATIC ON CACHE INTERNAL "")
|
||||||
|
@ -166,33 +197,10 @@ if(WIN32)
|
||||||
set(SPACEWARE_LIBRARIES
|
set(SPACEWARE_LIBRARIES
|
||||||
"${CMAKE_SOURCE_DIR}/extlib/si/siapp.lib")
|
"${CMAKE_SOURCE_DIR}/extlib/si/siapp.lib")
|
||||||
endif()
|
endif()
|
||||||
endif()
|
elseif(APPLE)
|
||||||
elseif(APPLE)
|
|
||||||
set(CMAKE_FIND_FRAMEWORK LAST)
|
|
||||||
|
|
||||||
find_package(ZLIB REQUIRED)
|
|
||||||
find_package(PNG REQUIRED)
|
|
||||||
find_package(Freetype REQUIRED)
|
|
||||||
|
|
||||||
find_library(CAIRO_LIBRARIES cairo REQUIRED)
|
|
||||||
find_path(CAIRO_INCLUDE_DIRS cairo.h PATH_SUFFIXES cairo)
|
|
||||||
|
|
||||||
if(ENABLE_GUI)
|
|
||||||
find_package(OpenGL REQUIRED)
|
find_package(OpenGL REQUIRED)
|
||||||
find_library(APPKIT_LIBRARY AppKit REQUIRED)
|
find_library(APPKIT_LIBRARY AppKit REQUIRED)
|
||||||
endif()
|
else()
|
||||||
else() # Linux and compatible systems
|
|
||||||
find_package(PkgConfig REQUIRED)
|
|
||||||
|
|
||||||
find_package(Backtrace)
|
|
||||||
find_package(SpaceWare)
|
|
||||||
|
|
||||||
find_package(ZLIB REQUIRED)
|
|
||||||
find_package(PNG REQUIRED)
|
|
||||||
find_package(Freetype REQUIRED)
|
|
||||||
pkg_check_modules(CAIRO REQUIRED cairo)
|
|
||||||
|
|
||||||
if(ENABLE_GUI)
|
|
||||||
find_package(OpenGL REQUIRED)
|
find_package(OpenGL REQUIRED)
|
||||||
pkg_check_modules(FONTCONFIG REQUIRED fontconfig)
|
pkg_check_modules(FONTCONFIG REQUIRED fontconfig)
|
||||||
pkg_check_modules(JSONC REQUIRED json-c)
|
pkg_check_modules(JSONC REQUIRED json-c)
|
||||||
|
@ -200,6 +208,8 @@ else() # Linux and compatible systems
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# code coverage
|
||||||
|
|
||||||
if(ENABLE_COVERAGE)
|
if(ENABLE_COVERAGE)
|
||||||
if(CMAKE_CXX_COMPILER_ID STREQUAL GNU)
|
if(CMAKE_CXX_COMPILER_ID STREQUAL GNU)
|
||||||
find_program(GCOV gcov)
|
find_program(GCOV gcov)
|
||||||
|
@ -220,6 +230,8 @@ if(ENABLE_COVERAGE)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
# translations
|
||||||
|
|
||||||
find_program(XGETTEXT xgettext)
|
find_program(XGETTEXT xgettext)
|
||||||
find_program(MSGINIT msginit)
|
find_program(MSGINIT msginit)
|
||||||
find_program(MSGMERGE msgmerge)
|
find_program(MSGMERGE msgmerge)
|
||||||
|
@ -294,7 +306,7 @@ if(ENABLE_COVERAGE)
|
||||||
set(COVERAGE_LIBRARY --coverage)
|
set(COVERAGE_LIBRARY --coverage)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# components
|
# application components
|
||||||
|
|
||||||
add_subdirectory(res)
|
add_subdirectory(res)
|
||||||
add_subdirectory(src)
|
add_subdirectory(src)
|
||||||
|
|
|
@ -14,7 +14,9 @@
|
||||||
include(DisableWarnings)
|
include(DisableWarnings)
|
||||||
|
|
||||||
function(find_vendored_package PKG_NAME PKG_PATH)
|
function(find_vendored_package PKG_NAME PKG_PATH)
|
||||||
|
if(NOT FORCE_VENDORED_${PKG_NAME})
|
||||||
find_package(${PKG_NAME})
|
find_package(${PKG_NAME})
|
||||||
|
endif()
|
||||||
|
|
||||||
set(cfg_name)
|
set(cfg_name)
|
||||||
foreach(item ${ARGN})
|
foreach(item ${ARGN})
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 5561dfc3f7e992454076ff3f10a0554c6b407e19
|
Subproject commit 127f1a7ad3eb88f7e74c83f89590fa8ee76853ae
|
|
@ -118,10 +118,6 @@ elseif(APPLE)
|
||||||
platform/cocoamain.mm
|
platform/cocoamain.mm
|
||||||
render/rendergl.cpp
|
render/rendergl.cpp
|
||||||
${gl_SOURCES})
|
${gl_SOURCES})
|
||||||
|
|
||||||
set(platform_BUNDLED_LIBS
|
|
||||||
${PNG_LIBRARIES}
|
|
||||||
${FREETYPE_LIBRARIES})
|
|
||||||
else()
|
else()
|
||||||
set(platform_SOURCES
|
set(platform_SOURCES
|
||||||
platform/gtkmain.cpp
|
platform/gtkmain.cpp
|
||||||
|
@ -398,22 +394,6 @@ if(APPLE)
|
||||||
COMMENT "Bundling executable solvespace-cli"
|
COMMENT "Bundling executable solvespace-cli"
|
||||||
VERBATIM)
|
VERBATIM)
|
||||||
|
|
||||||
foreach(lib ${platform_BUNDLED_LIBS})
|
|
||||||
get_filename_component(name ${lib} NAME)
|
|
||||||
|
|
||||||
execute_process(COMMAND otool -D ${lib}
|
|
||||||
OUTPUT_VARIABLE canonical_lib OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
string(REGEX REPLACE "^.+:\n" "" canonical_lib ${canonical_lib})
|
|
||||||
add_custom_command(TARGET ${bundle} POST_BUILD
|
|
||||||
COMMAND ${CMAKE_COMMAND} -E copy ${lib} ${bundle_bin}/${name}
|
|
||||||
COMMAND install_name_tool -change ${canonical_lib} @executable_path/${name}
|
|
||||||
$<TARGET_FILE:${bundle}>
|
|
||||||
COMMAND install_name_tool -change ${canonical_lib} @executable_path/${name}
|
|
||||||
$<TARGET_FILE:solvespace-cli>
|
|
||||||
COMMENT "Bundling shared library ${lib}"
|
|
||||||
VERBATIM)
|
|
||||||
endforeach()
|
|
||||||
|
|
||||||
add_custom_command(OUTPUT ${EXECUTABLE_OUTPUT_PATH}/${bundle}.dmg
|
add_custom_command(OUTPUT ${EXECUTABLE_OUTPUT_PATH}/${bundle}.dmg
|
||||||
COMMAND ${CMAKE_COMMAND} -E remove ${EXECUTABLE_OUTPUT_PATH}/${bundle}.dmg
|
COMMAND ${CMAKE_COMMAND} -E remove ${EXECUTABLE_OUTPUT_PATH}/${bundle}.dmg
|
||||||
COMMAND hdiutil create -srcfolder ${EXECUTABLE_OUTPUT_PATH}/${bundle}.app
|
COMMAND hdiutil create -srcfolder ${EXECUTABLE_OUTPUT_PATH}/${bundle}.app
|
||||||
|
|
Loading…
Reference in New Issue