From b615914b10856967b643a8187056a5a6b7ccddd5 Mon Sep 17 00:00:00 2001 From: Tim Perkins Date: Sat, 15 Apr 2023 15:03:21 -0400 Subject: [PATCH] Fix CMake Glib detection Restores the original `FindGLib2.cmake` file with two modifications: First, `FOUND_VAR` has been removed (it's ignored anyway). Second, I set `set(FPHSA_NAME_MISMATCHED TRUE)` because `find_package_handle_standard_args` is called for each component and the mismatched names are expected. --- CMakeLists.txt | 7 ++- cmake/FindGLib2.cmake | 124 +++++++++++++++++++++++++++++++++++++ lcm-logger/CMakeLists.txt | 12 +--- lcm/CMakeLists.txt | 4 +- lcmgen/CMakeLists.txt | 3 +- liblcm-test/CMakeLists.txt | 12 ++-- test/c/CMakeLists.txt | 3 +- 7 files changed, 138 insertions(+), 27 deletions(-) create mode 100644 cmake/FindGLib2.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 668861f8f..7b9c640c3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,9 @@ cmake_minimum_required(VERSION 3.1) +if(POLICY CMP0111) + cmake_policy(SET CMP0111 NEW) +endif() + project(lcm) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") @@ -7,8 +11,7 @@ if(CMAKE_VERSION VERSION_LESS 3.7) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/3.7") endif() -find_package(PkgConfig REQUIRED) -pkg_check_modules(GLIB REQUIRED glib-2.0) +find_package(GLib2 REQUIRED) # Configuration and utility functions include(lcm-cmake/config.cmake NO_POLICY_SCOPE) diff --git a/cmake/FindGLib2.cmake b/cmake/FindGLib2.cmake new file mode 100644 index 000000000..1b4c5aec1 --- /dev/null +++ b/cmake/FindGLib2.cmake @@ -0,0 +1,124 @@ +# Find glib-2.0 and optional related components + +include(FindPackageHandleStandardArgs) + +# This is set because `find_package_handle_standard_args` is also used for each +# component of GLib2, e.g., `GLib2_glid`, `GLib2_gio`, etc. +set(FPHSA_NAME_MISMATCHED TRUE) + +#------------------------------------------------------------------------------ +function(_glib2_find_include VAR HEADER) + list(APPEND CMAKE_PREFIX_PATH $ENV{GLIB_PATH}) + + set(_paths) + foreach(_lib ${ARGN}) + get_filename_component(_libpath ${GLIB2_${_lib}_LIBRARY} DIRECTORY) + list(APPEND _paths ${_libpath}) + endforeach() + + find_path(GLIB2_${VAR}_INCLUDE_DIR ${HEADER} + PATHS ${_paths} + PATH_SUFFIXES glib-2.0 glib-2.0/include + ) + mark_as_advanced(GLIB2_${VAR}_INCLUDE_DIR) +endfunction() + +#------------------------------------------------------------------------------ +function(_glib2_find_library VAR LIB) + list(APPEND CMAKE_PREFIX_PATH $ENV{GLIB_PATH}) + + if(WIN32) + set(CMAKE_FIND_LIBRARY_SUFFIXES ".dll.a") + set(CMAKE_FIND_LIBRARY_PREFIXES "lib") + endif() + find_library(GLIB2_${VAR}_LIBRARY NAMES ${LIB}-2.0 ${LIB}) + mark_as_advanced(GLIB2_${VAR}_LIBRARY) + + if(WIN32) + find_program(GLIB2_${VAR}_RUNTIME NAMES lib${LIB}-2.0-0.dll) + mark_as_advanced(GLIB2_${VAR}_RUNTIME) + endif() +endfunction() + +#------------------------------------------------------------------------------ +function(_glib2_add_target TARGET LIBRARY) + set(GLIB2_${TARGET}_FIND_QUIETLY TRUE) + set(_deps GLIB2_${LIBRARY}_LIBRARY) + foreach(_include ${ARGN}) + list(APPEND _deps GLIB2_${_include}_INCLUDE_DIR) + endforeach() + + find_package_handle_standard_args(GLib2_${TARGET} + REQUIRED_VARS ${_deps} + ) + + if(GLib2_${TARGET}_FOUND) + set(GLib2_${TARGET}_FOUND TRUE PARENT_SCOPE) + + set(_target GLib2::${TARGET}) + add_library(${_target} UNKNOWN IMPORTED) + set_property(TARGET ${_target} APPEND PROPERTY + IMPORTED_LOCATION ${GLIB2_${LIBRARY}_LIBRARY} + ) + foreach(_include ${ARGN}) + set_property(TARGET ${_target} APPEND PROPERTY + INTERFACE_INCLUDE_DIRECTORIES ${GLIB2_${_include}_INCLUDE_DIR} + ) + endforeach() + endif() +endfunction() + +############################################################################### + +_glib2_find_library(GLIB glib) +_glib2_find_include(GLIB glib.h) +_glib2_find_include(GLIBCONFIG glibconfig.h GLIB) + +_glib2_add_target(glib GLIB GLIB GLIBCONFIG) + +if(WIN32 AND TARGET GLib2::glib) + set_property(TARGET GLib2::glib APPEND PROPERTY + INTERFACE_LINK_LIBRARIES ws2_32 winmm + ) +endif() + +foreach(_glib2_component ${GLib2_FIND_COMPONENTS}) + + if(_glib2_component STREQUAL "gio") + + _glib2_find_include(GIO gio/gio.h) + _glib2_find_library(GIO gio) + + _glib2_add_target(gio GIO GIO GMODULE GOBJECT GLIB GLIBCONFIG) + + elseif(_glib2_component STREQUAL "gmodule") + + _glib2_find_include(GMODULE gmodule.h) + _glib2_find_library(GMODULE gmodule) + + _glib2_add_target(gmodule GMODULE GMODULE GLIB GLIBCONFIG) + + elseif(_glib2_component STREQUAL "gobject") + + _glib2_find_include(GOBJECT glib-object.h) + _glib2_find_library(GOBJECT gobject) + + _glib2_add_target(gobject GOBJECT GOBJECT GLIB GLIBCONFIG) + + elseif(_glib2_component STREQUAL "gthread") + + _glib2_find_library(GTHREAD gthread) + + _glib2_add_target(gthread GTHREAD GLIB GLIBCONFIG) + + endif() + +endforeach() + +list(APPEND GLib2_FIND_COMPONENTS glib) +set(GLib2_FIND_REQUIRED_glib TRUE) + +find_package_handle_standard_args(GLib2 + REQUIRED_VARS GLIB2_GLIB_LIBRARY + HANDLE_COMPONENTS +) diff --git a/lcm-logger/CMakeLists.txt b/lcm-logger/CMakeLists.txt index 6e162f7e8..e1f2f5a66 100644 --- a/lcm-logger/CMakeLists.txt +++ b/lcm-logger/CMakeLists.txt @@ -1,16 +1,8 @@ add_executable(lcm-logger lcm_logger.c glib_util.c) -target_link_libraries(lcm-logger - lcm - ${GLIB_LDFLAGS} -) -target_include_directories(lcm-logger PRIVATE ${GLIB_INCLUDE_DIRS}) +target_link_libraries(lcm-logger lcm GLib2::glib) add_executable(lcm-logplayer lcm_logplayer.c) -target_link_libraries(lcm-logplayer - lcm - ${GLIB_LDFLAGS} -) -target_include_directories(lcm-logplayer PRIVATE ${GLIB_INCLUDE_DIRS}) +target_link_libraries(lcm-logplayer lcm GLib2::glib) install(TARGETS lcm-logger diff --git a/lcm/CMakeLists.txt b/lcm/CMakeLists.txt index 42906b19c..6b72db815 100644 --- a/lcm/CMakeLists.txt +++ b/lcm/CMakeLists.txt @@ -60,10 +60,8 @@ foreach(lcm_lib lcm lcm-static) $ ) - target_include_directories(${lcm_lib} PRIVATE ${GLIB_INCLUDE_DIRS}) - target_link_libraries(${lcm_lib} PRIVATE - ${GLIB_LDFLAGS} + GLib2::glib ${CMAKE_THREAD_LIBS_INIT} ) diff --git a/lcmgen/CMakeLists.txt b/lcmgen/CMakeLists.txt index 2e3c78f23..29354bbef 100644 --- a/lcmgen/CMakeLists.txt +++ b/lcmgen/CMakeLists.txt @@ -43,8 +43,7 @@ if(_uses_sanitizers AND NOT LCM_SANITIZE_LCMGEN) endif() add_executable(lcm-gen ${lcm-gen_sources}) -target_link_libraries(lcm-gen PRIVATE ${GLIB_LDFLAGS}) -target_include_directories(lcm-gen PRIVATE ${GLIB_INCLUDE_DIRS}) +target_link_libraries(lcm-gen PRIVATE GLib2::glib) install(TARGETS lcm-gen EXPORT lcmTargets diff --git a/liblcm-test/CMakeLists.txt b/liblcm-test/CMakeLists.txt index 1beb8c058..3e28be162 100644 --- a/liblcm-test/CMakeLists.txt +++ b/liblcm-test/CMakeLists.txt @@ -5,8 +5,7 @@ add_executable(lcm-source lcm-source.c) target_link_libraries(lcm-source lcm) add_executable(lcm-tester lcm-tester.c) -target_link_libraries(lcm-tester lcm ${GLIB_LDFLAGS}) -target_include_directories(lcm-tester PRIVATE ${GLIB_INCLUDE_DIRS}) +target_link_libraries(lcm-tester lcm GLib2::glib) if(WIN32) target_link_libraries(lcm-tester wsock32 ws2_32) endif() @@ -18,16 +17,13 @@ if(WIN32) endif() add_executable(lcm-logfilter lcm-logfilter.c) -target_link_libraries(lcm-logfilter lcm ${GLIB_LDFLAGS}) -target_include_directories(lcm-logfilter PRIVATE ${GLIB_INCLUDE_DIRS}) +target_link_libraries(lcm-logfilter lcm GLib2::glib) add_executable(lcm-buftest-receiver buftest-receiver.c) -target_link_libraries(lcm-buftest-receiver lcm ${GLIB_LDFLAGS}) -target_include_directories(lcm-buftest-receiver PRIVATE ${GLIB_INCLUDE_DIRS}) +target_link_libraries(lcm-buftest-receiver lcm GLib2::glib) add_executable(lcm-buftest-sender buftest-sender.c) -target_link_libraries(lcm-buftest-sender lcm ${GLIB_LDFLAGS}) -target_include_directories(lcm-buftest-sender PRIVATE ${GLIB_INCLUDE_DIRS}) +target_link_libraries(lcm-buftest-sender lcm GLib2::glib) install(TARGETS lcm-sink diff --git a/test/c/CMakeLists.txt b/test/c/CMakeLists.txt index d64bc7a2f..8f7f87933 100644 --- a/test/c/CMakeLists.txt +++ b/test/c/CMakeLists.txt @@ -10,8 +10,7 @@ add_executable(test-c-memq_test memq_test.cpp common.c) target_link_libraries(test-c-memq_test ${test_c_libs}) add_executable(test-c-eventlog_test eventlog_test.cpp common.c) -target_link_libraries(test-c-eventlog_test ${GLIB_LDFLAGS} ${test_c_libs}) -target_include_directories(test-c-eventlog_test PRIVATE ${GLIB_INCLUDE_DIRS}) +target_link_libraries(test-c-eventlog_test GLib2::glib ${test_c_libs}) add_executable(test-c-udpm_test udpm_test.cpp common.c) target_link_libraries(test-c-udpm_test ${test_c_libs})