Skip to content

Commit

Permalink
Fix CMake Glib detection
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
tprk77 committed Apr 15, 2023
1 parent 562f232 commit b615914
Show file tree
Hide file tree
Showing 7 changed files with 138 additions and 27 deletions.
7 changes: 5 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
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")
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)
Expand Down
124 changes: 124 additions & 0 deletions cmake/FindGLib2.cmake
Original file line number Diff line number Diff line change
@@ -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
)
12 changes: 2 additions & 10 deletions lcm-logger/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -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
Expand Down
4 changes: 1 addition & 3 deletions lcm/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,8 @@ foreach(lcm_lib lcm lcm-static)
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
)

target_include_directories(${lcm_lib} PRIVATE ${GLIB_INCLUDE_DIRS})

target_link_libraries(${lcm_lib} PRIVATE
${GLIB_LDFLAGS}
GLib2::glib
${CMAKE_THREAD_LIBS_INIT}
)

Expand Down
3 changes: 1 addition & 2 deletions lcmgen/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
12 changes: 4 additions & 8 deletions liblcm-test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand All @@ -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
Expand Down
3 changes: 1 addition & 2 deletions test/c/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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})
Expand Down

0 comments on commit b615914

Please sign in to comment.