Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix CMake Glib detection #442

Merged
merged 1 commit into from
Apr 17, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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