Skip to content

Commit

Permalink
if building a static lib, prefer static pkgconfig settings (#6)
Browse files Browse the repository at this point in the history
* prefer static pkg-config settings when building a static lib

* show the required dynamic libraries

* add a kludge for macOS frameworks in pkgconfig files

* slightly cleaner solution
  • Loading branch information
mmomtchev authored and Momtchil Momtchev committed May 6, 2024
1 parent 3067411 commit 5b82da0
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 7 deletions.
8 changes: 8 additions & 0 deletions .github/workflows/cmake-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,14 @@ jobs:
env:
PATH: ${{ env.PATH }};${{ env.INSTALL_PREFIX }}/bin

- name: Check required shared libraries (Linux)
run: ldd build/utilities/Magick
if: runner.os == 'Linux'

- name: Check required shared libraries (macOS)
run: otool -L build/utilities/Magick
if: runner.os == 'macOS'

wasm32:

runs-on: ubuntu-latest
Expand Down
24 changes: 18 additions & 6 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,18 @@ include(cmake/checks.cmake)
find_package(PkgConfig)
set(CMAKE_TRY_COMPILE_CONFIGURATION ${CMAKE_BUILD_TYPE})

# Prefer static pkgconfig settings when building a static library
macro(get_pkgconfig_setting TARGET_LIST PKG SETTING)
if(MAGICK_BUILD_STATIC AND ${PKG}_STATIC_${SETTING})
list(APPEND ${TARGET_LIST} ${${PKG}_STATIC_${SETTING}})
else()
list(APPEND ${TARGET_LIST} ${${PKG}_${SETTING}})
endif()
endmacro()

#
# This is the centralized dependency resolution procedure
#
macro(magick_find_delegate)
cmake_parse_arguments(MAGICK_FIND "" "DELEGATE;NAME;DEFAULT;PKGCONFIG" "TARGETS" ${ARGN})

Expand Down Expand Up @@ -66,12 +78,12 @@ macro(magick_find_delegate)
endif()
pkg_check_modules(${MAGICK_FIND_NAME} ${MAGICK_FIND_SEARCH_TARGET})
if(${${MAGICK_FIND_NAME}_FOUND})
list(APPEND CMAKE_REQUIRED_INCLUDES ${${MAGICK_FIND_NAME}_INCLUDE_DIRS})
list(APPEND IMAGEMAGICK_DELEGATES_LIBRARIES ${${MAGICK_FIND_NAME}_LIBRARIES})
list(APPEND IMAGEMAGICK_DELEGATES_LIBRARY_DIRS ${${MAGICK_FIND_NAME}_LIBRARY_DIRS})
list(APPEND IMAGEMAGICK_DELEGATES_INCLUDE_DIRS ${${MAGICK_FIND_NAME}_INCLUDE_DIRS})
list(APPEND IMAGEMAGICK_DELEGATES_CFLAGS ${${MAGICK_FIND_NAME}_CFLAGS})
list(APPEND IMAGEMAGICK_DELEGATES_LDFLAGS ${${MAGICK_FIND_NAME}_LDFLAGS_OTHER})
get_pkgconfig_setting(CMAKE_REQUIRED_INCLUDES ${MAGICK_FIND_NAME} INCLUDE_DIRS)
get_pkgconfig_setting(IMAGEMAGICK_DELEGATES_INCLUDE_DIRS ${MAGICK_FIND_NAME} INCLUDE_DIRS)
get_pkgconfig_setting(IMAGEMAGICK_DELEGATES_LIBRARIES ${MAGICK_FIND_NAME} LIBRARIES)
get_pkgconfig_setting(IMAGEMAGICK_DELEGATES_LIBRARY_DIRS ${MAGICK_FIND_NAME} LIBRARY_DIRS)
get_pkgconfig_setting(IMAGEMAGICK_DELEGATES_CFLAGS ${MAGICK_FIND_NAME} CFLAGS)
get_pkgconfig_setting(IMAGEMAGICK_DELEGATES_LDFLAGS ${MAGICK_FIND_NAME} LDFLAGS_OTHER)
set(${MAGICK_FIND_DELEGATE} TRUE)
endif()
endif()
Expand Down
22 changes: 21 additions & 1 deletion MagickCore/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -720,6 +720,27 @@ else()
add_library(${MAGICKCORE_BINARY_NAME} SHARED ${MAGICKCORE_SRC} ${MAGICKCORE_FILTERS_SRCS} ${MAGICKCORE_CODERS_SRCS} ${MAGICKCORE_CODERS_DELEGATES_SRCS} ${MAGICK_RESOURCE_FILE_PATH})
endif()

# on macOS some pkgconfigs place the frameworks in LDFLAGS
# CMake has special handling for macOS frameworks but only in LIBRARIES
if(APPLE)
set(I 0)
list(LENGTH IMAGEMAGICK_DELEGATES_LDFLAGS LEN)
while(${I} LESS ${LEN} )
list(GET IMAGEMAGICK_DELEGATES_LDFLAGS ${I} EL)
if(${EL} STREQUAL "-framework")
MATH(EXPR I "${I}+1")
list(GET IMAGEMAGICK_DELEGATES_LDFLAGS ${I} EL)
target_link_libraries(${MAGICKCORE_BINARY_NAME} PUBLIC "-framework ${EL}")
else()
target_link_options(${MAGICKCORE_BINARY_NAME} PUBLIC ${EL})
endif()
MATH(EXPR I "${I}+1")
unset(EL)
endwhile()
else()
target_link_options(${MAGICKCORE_BINARY_NAME} PUBLIC ${IMAGEMAGICK_DELEGATES_LDFLAGS})
endif()

set_target_properties(${MAGICKCORE_BINARY_NAME} PROPERTIES PUBLIC_HEADER "${MAGICKCORE_PUBLIC_HEADERS}")
target_include_directories(${MAGICKCORE_BINARY_NAME} PUBLIC
$<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}>
Expand All @@ -730,7 +751,6 @@ target_include_directories(${MAGICKCORE_BINARY_NAME} PRIVATE ${IMAGEMAGICK_DELEG
target_compile_options(${MAGICKCORE_BINARY_NAME} PRIVATE ${IMAGEMAGICK_DELEGATES_CFLAGS})
target_link_directories(${MAGICKCORE_BINARY_NAME} PUBLIC ${IMAGEMAGICK_DELEGATES_LIBRARY_DIRS})
target_link_libraries(${MAGICKCORE_BINARY_NAME} PUBLIC ${IMAGEMAGICK_DELEGATES_LIBRARIES})
target_link_options(${MAGICKCORE_BINARY_NAME} PUBLIC ${IMAGEMAGICK_DELEGATES_LDFLAGS})
#TODO should we make a test to see if we need to link -lm ??
if(UNIX)
target_link_libraries(${MAGICKCORE_BINARY_NAME} PUBLIC -lm)
Expand Down

0 comments on commit 5b82da0

Please sign in to comment.