Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Refine pkg-config files generation.
Browse files Browse the repository at this point in the history
The generated pkg-config files of libscap and libsinsp now makes use
of pkg-config Requires and Requires.static fields, which should reduce
over-linking when linking to shared libraries.

* cmake/modules/BuildPkgConfigDependencies.cmake
(add_pkgconfig_library): Add debug messages and fix an issue where
IN_LIST had no effect.
* cmake/modules/libscap.cmake: Move pkgconfig dependency computation
to, pkg-config file configuration to...
* userspace/libscap/CMakeLists.txt: ... here, conditionally
accumulating Requires and Requires.private values.
* userspace/libscap/libscap.pc.in (prefix): Set directly to
CMAKE_INSTALL_PREFIX.
(Requires, Requires.private): New fields.
* userspace/libsinsp/CMakeLists.txt: Separate libraries into
pkg-config Requires and Requires.private lists.  Add the pkg-config
requirements to the ignored link dependencies, since these are now
recorded as Requires in the pkg-config file.
* userspace/libsinsp/libsinsp.pc.in (Requires): Add
@LIBSINSP_REQUIRES@.
(Requires.private): New field.
(Libs): Remove -lsinsp, automatically computed in SINSP_PKG_CONFIG_LIBS.

Signed-off-by: Maxim Cournoyer <[email protected]>
Apteryks committed Jan 28, 2025

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
1 parent ded97e3 commit e241659
Showing 6 changed files with 68 additions and 17 deletions.
17 changes: 15 additions & 2 deletions cmake/modules/BuildPkgConfigDependencies.cmake
Original file line number Diff line number Diff line change
@@ -3,6 +3,7 @@
# libsinsp.pc (which requires libscap.pc and pulls them in that way)
function(add_pkgconfig_library LIBDIRS_VAR LIBS_VAR lib ignored)

message(DEBUG "[add_pkgconfig_library] processing lib \"${lib}\"")
# if it's not a target, it doesn't have dependencies we know or care about
if(NOT TARGET ${lib})
return()
@@ -14,14 +15,26 @@ function(add_pkgconfig_library LIBDIRS_VAR LIBS_VAR lib ignored)
return()
endif()

message(DEBUG "[add_pkgconfig_library] LINK_LIBRARIES property: \"${PKGCONFIG_LIBRARIES}\"")

get_property(
target_type
TARGET ${lib}
PROPERTY TYPE
)
message(DEBUG "[add_pkgconfig_library] ignored list: \"${ignored}\"")
foreach(dep ${PKGCONFIG_LIBRARIES})
# ignore dependencies in the list ${ignored}
if(${dep} IN_LIST "${ignored}")
# XXX: We use a (very) loose match as we are potentially comparing absolute library file
# names (dep) to pkg-config library names to be ignored. The only alternative I can think
# of would be to maintain a map associating pkg-config names to their library file name.
get_filename_component(dep_base ${dep} NAME_WE)
string(REGEX REPLACE "^lib" "" dep_name ${dep_base})
# For CMake imported targets, keep only the suffix, e.g. gRPC::grpc -> grpc.
string(REGEX REPLACE "[^:]*::" "" dep_name ${dep_base})
message(DEBUG "[add_pkgconfig_library] processing dep ${dep}")
string(FIND "${ignored}" "${dep_name}" find_result)
if(NOT ${find_result} EQUAL -1)
message(DEBUG "[add_pkgconfig_library] \"${dep}\" ignored")
continue()
endif()

10 changes: 0 additions & 10 deletions cmake/modules/libscap.cmake
Original file line number Diff line number Diff line change
@@ -91,16 +91,6 @@ if(NOT HAVE_LIBSCAP)
endif()
endforeach()

set(libscap_link_flags)
set(libscap_link_libdirs "")
add_pkgconfig_dependency(libscap_link_libdirs libscap_link_flags scap "")

string(REPLACE ";" " " LIBSCAP_LINK_LIBRARIES_FLAGS "${libscap_link_flags}")
string(REPLACE ";" " " LIBSCAP_LINK_LIBDIRS_FLAGS "${libscap_link_libdirs}")
configure_file(
${LIBS_DIR}/userspace/libscap/libscap.pc.in ${PROJECT_BINARY_DIR}/libscap/libscap.pc @ONLY
)

install(
TARGETS ${LIBSCAP_INSTALL_LIBS}
ARCHIVE DESTINATION "${CMAKE_INSTALL_LIBDIR}"
24 changes: 24 additions & 0 deletions userspace/libscap/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -89,6 +89,8 @@ target_include_directories(
)

target_link_libraries(scap PRIVATE scap_error "${ZLIB_LIB}")
set(SCAP_PKGCONFIG_REQUIRES "")
set(SCAP_PKGCONFIG_REQUIRES_PRIVATE zlib)

add_library(
scap_event_schema STATIC
@@ -174,17 +176,20 @@ if(HAS_ENGINE_BPF)
add_subdirectory(engine/bpf)
target_link_libraries(scap PUBLIC scap_engine_bpf)
target_include_directories(scap_engine_bpf PRIVATE ${PROJECT_BINARY_DIR}/driver/src)
list(APPEND SCAP_PKGCONFIG_REQUIRES libelf)
endif()

if(HAS_ENGINE_MODERN_BPF)
add_subdirectory(engine/modern_bpf)
target_link_libraries(scap PUBLIC scap_engine_modern_bpf)
target_include_directories(scap_engine_modern_bpf PRIVATE ${PROJECT_BINARY_DIR}/driver/src)
list(APPEND SCAP_PKGCONFIG_REQUIRES libpman)
endif()

if(HAS_ENGINE_GVISOR)
add_subdirectory(engine/gvisor)
target_link_libraries(scap PUBLIC scap_engine_gvisor)
list(APPEND SCAP_PKGCONFIG_REQUIRES protobuf jsoncpp)
endif()

# ##################################################################################################
@@ -193,3 +198,22 @@ if(BUILD_LIBSCAP_EXAMPLES)
add_subdirectory(examples/01-open)
add_subdirectory(examples/02-validatebuffer)
endif()

set(libscap_link_flags)
set(libscap_link_libdirs "")
add_pkgconfig_dependency(
libscap_link_libdirs
libscap_link_flags
scap
# Avoid using these in libscap.pc Libs field, as they are already listed in Requires. lbpf is
# transitively required via libpman.pc.
"${SCAP_PKGCONFIG_REQUIRES};${SCAP_PKGCONFIG_REQUIRES_PRIVATE}"
)

string(REPLACE ";" " " LIBSCAP_REQUIRES "${SCAP_PKGCONFIG_REQUIRES}")
string(REPLACE ";" " " LIBSCAP_REQUIRES_PRIVATE "${SCAP_PKGCONFIG_REQUIRES_PRIVATE}")
string(REPLACE ";" " " LIBSCAP_LINK_LIBRARIES_FLAGS "${libscap_link_flags}")
string(REPLACE ";" " " LIBSCAP_LINK_LIBDIRS_FLAGS "${libscap_link_libdirs}")
configure_file(
${LIBS_DIR}/userspace/libscap/libscap.pc.in ${PROJECT_BINARY_DIR}/libscap/libscap.pc @ONLY
)
4 changes: 3 additions & 1 deletion userspace/libscap/libscap.pc.in
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
prefix=${pcfiledir}/../..
prefix=@CMAKE_INSTALL_PREFIX@
libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@
includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@/@LIBS_PACKAGE_NAME@

Name: libscap
Description: lib for System CAPture
Version: @FALCOSECURITY_LIBS_VERSION@

Requires: @LIBSCAP_PKGCONFIG_REQUIRES@
Requires.private: @LIBSCAP_PKGCONFIG_REQUIRES_PRIVATE@
Libs: -L${libdir} @LIBSCAP_LINK_LIBDIRS_FLAGS@ @LIBSCAP_LINK_LIBRARIES_FLAGS@
Cflags: -I${includedir} -I${includedir}/libscap -I${includedir}/driver -I@UTHASH_INCLUDE@
23 changes: 22 additions & 1 deletion userspace/libsinsp/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -177,12 +177,17 @@ target_link_libraries(
PRIVATE "${CURL_LIBRARIES}" "${JSONCPP_LIB}" "${RE2_LIB}"
)

set(SINSP_PKGCONFIG_REQUIRES jsoncpp)
set(SINSP_PKGCONFIG_REQUIRES_PRIVATE libcurl re2)

if(NOT EMSCRIPTEN)
target_link_libraries(
sinsp
INTERFACE "${CARES_LIB}"
PRIVATE "${TBB_LIB}"
)
list(APPEND SINSP_PKGCONFIG_REQUIRES libcares)
list(APPEND SINSP_PKGCONFIG_REQUIRES_PRIVATE tbb)
endif()

if(USE_BUNDLED_VALIJSON)
@@ -275,6 +280,15 @@ if(NOT WIN32)
)

target_link_libraries(sinsp PRIVATE cri_v1alpha2 cri_v1 containerd_interface)
list(
APPEND
SINSP_PKGCONFIG_REQUIRES
gpr
grpc
grpc++
protobuf
libcares
)

if(NOT MUSL_OPTIMIZED_BUILD)
find_library(LIB_ANL anl)
@@ -290,6 +304,8 @@ if(NOT WIN32)
endif() # NOT MINIMAL_BUILD
endif() # NOT APPLE

list(APPEND SINSP_PKGCONFIG_REQUIRES libcrypto libssl)

target_link_libraries(sinsp INTERFACE dl pthread)

if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
@@ -329,14 +345,19 @@ add_definitions(-DSINSP_AGENT_CGROUP_MEM_PATH_ENV_VAR="${SINSP_AGENT_CGROUP_MEM_
# https://github.com/curl/curl/blob/curl-7_84_0/CMakeLists.txt#L1539
set(SINSP_PKG_CONFIG_LIBS)
set(SINSP_PKG_CONFIG_LIBDIRS "")
add_pkgconfig_dependency(SINSP_PKG_CONFIG_LIBDIRS SINSP_PKG_CONFIG_LIBS sinsp scap)
add_pkgconfig_dependency(
SINSP_PKG_CONFIG_LIBDIRS SINSP_PKG_CONFIG_LIBS sinsp
"scap;${SINSP_PKGCONFIG_REQUIRES};${SINSP_PKGCONFIG_REQUIRES_PRIVATE}"
)

# Build our pkg-config "Cflags:" flags.
set(SINSP_PKG_CONFIG_INCLUDES "")
foreach(sinsp_include_directory ${LIBSINSP_INCLUDE_DIRS})
list(APPEND SINSP_PKG_CONFIG_INCLUDES -I${sinsp_include_directory})
endforeach()

string(REPLACE ";" " " LIBSINSP_REQUIRES "${SINSP_PKGCONFIG_REQUIRES}")
string(REPLACE ";" " " LIBSINSP_REQUIRES_PRIVATE "${SINSP_PKGCONFIG_REQUIRES_PRIVATE}")
string(REPLACE ";" " " SINSP_PKG_CONFIG_LIBS "${SINSP_PKG_CONFIG_LIBS}")
list(REMOVE_DUPLICATES SINSP_PKG_CONFIG_LIBDIRS)
string(REPLACE ";" " " SINSP_PKG_CONFIG_LIBDIRS "${SINSP_PKG_CONFIG_LIBDIRS}")
7 changes: 4 additions & 3 deletions userspace/libsinsp/libsinsp.pc.in
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
prefix=${pcfiledir}/../..
prefix=@CMAKE_INSTALL_PREFIX@
libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@
includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@/@LIBS_PACKAGE_NAME@

Name: libsinsp
Description: lib for System INSPection
Version: @FALCOSECURITY_LIBS_VERSION@

Requires: libscap
Libs: -L${libdir} -lsinsp @SINSP_PKG_CONFIG_LIBDIRS@ @SINSP_PKG_CONFIG_LIBS@
Requires: libscap @LIBSINSP_REQUIRES@
Requires.private: @LIBSINSP_REQUIRES_PRIVATE@
Libs: -L${libdir} @SINSP_PKG_CONFIG_LIBDIRS@ @SINSP_PKG_CONFIG_LIBS@
Cflags: -I${includedir} -I${includedir}/libsinsp -I${includedir}/driver @SINSP_PKG_CONFIG_INCLUDES@

0 comments on commit e241659

Please sign in to comment.