diff --git a/CMakeLists.txt b/CMakeLists.txt index 635ce80ea..7dcd3520d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -66,6 +66,7 @@ endif() list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/) include(ProjectCStandard) +include(PkgConfigHelpers) # Check for cmake compatibility (enable/disable features) include(CheckCmakeCompat) @@ -544,6 +545,9 @@ if(WITH_THIRD_PARTY) endif() endif() +# used in libfreerdp subfolder as well +setfreerdpcmakeinstalldir(FREERDP_CMAKE_INSTALL_DIR "FreeRDP${FREERDP_VERSION_MAJOR}") + add_subdirectory(libfreerdp) if(WITH_CHANNELS) @@ -558,6 +562,9 @@ if(WITH_SERVER) add_subdirectory(server) endif() +# must be after all targets have been added in libfreerdp and channel +install(EXPORT FreeRDPTargets DESTINATION ${FREERDP_CMAKE_INSTALL_DIR}) + # Packaging set(CMAKE_CPACK_INCLUDE_FILE "CMakeCPack.cmake") diff --git a/channels/audin/client/alsa/CMakeLists.txt b/channels/audin/client/alsa/CMakeLists.txt index 432ff1b4f..09af7b150 100644 --- a/channels/audin/client/alsa/CMakeLists.txt +++ b/channels/audin/client/alsa/CMakeLists.txt @@ -23,6 +23,8 @@ set(${MODULE_PREFIX}_SRCS audin_alsa.c) set(${MODULE_PREFIX}_LIBS winpr freerdp ${ALSA_LIBRARIES}) +freerdp_client_pc_add_requires_private("alsa") + include_directories(..) include_directories(SYSTEM ${ALSA_INCLUDE_DIRS}) diff --git a/channels/audin/client/pulse/CMakeLists.txt b/channels/audin/client/pulse/CMakeLists.txt index 1cec9fab9..9635c18d9 100644 --- a/channels/audin/client/pulse/CMakeLists.txt +++ b/channels/audin/client/pulse/CMakeLists.txt @@ -18,6 +18,7 @@ define_channel_client_subsystem("audin" "pulse" "") find_package(PulseAudio REQUIRED) +freerdp_client_pc_add_requires_private("libpulse") set(${MODULE_PREFIX}_SRCS audin_pulse.c) diff --git a/channels/printer/client/cups/CMakeLists.txt b/channels/printer/client/cups/CMakeLists.txt index cde1ce4a6..5b244fbb0 100644 --- a/channels/printer/client/cups/CMakeLists.txt +++ b/channels/printer/client/cups/CMakeLists.txt @@ -18,6 +18,7 @@ define_channel_client_subsystem("printer" "cups" "") find_package(Cups 2.0 REQUIRED) +freerdp_client_pc_add_requires_private("cups") set(${MODULE_PREFIX}_SRCS printer_cups.c) set(${MODULE_PREFIX}_LIBS winpr freerdp ${CUPS_LIBRARIES}) diff --git a/channels/rdpear/CMakeLists.txt b/channels/rdpear/CMakeLists.txt index 082b2c49c..b277c856a 100644 --- a/channels/rdpear/CMakeLists.txt +++ b/channels/rdpear/CMakeLists.txt @@ -20,6 +20,7 @@ if(NOT IOS AND NOT WIN32 AND NOT ANDROID) if(KRB5_FOUND) define_channel("rdpear") + freerdp_client_pc_add_requires_private("mit-krb5") if(KRB5_FLAVOUR STREQUAL "Heimdal") message(FATAL_ERROR "krb5 implementation Heimdal not supported with -DCHANNEL_RDPEAR=ON") diff --git a/channels/rdpear/common/CMakeLists.txt b/channels/rdpear/common/CMakeLists.txt index baabcaea2..f5a593095 100644 --- a/channels/rdpear/common/CMakeLists.txt +++ b/channels/rdpear/common/CMakeLists.txt @@ -30,6 +30,8 @@ target_include_directories(rdpear-common-obj SYSTEM PRIVATE ${KRB5_INCLUDE_DIRS} target_link_directories(rdpear-common INTERFACE ${KRB5_LIBRARY_DIRS}) target_link_libraries(rdpear-common INTERFACE ${KRB5_LIBRARIES} rdpear-common-obj) +freerdp_client_pc_add_library_private(rdpear-common-obj) + channel_install(rdpear-common ${FREERDP_ADDIN_PATH} "FreeRDPTargets") channel_install(rdpear-common-obj ${FREERDP_ADDIN_PATH} "FreeRDPTargets") diff --git a/channels/rdpecam/client/CMakeLists.txt b/channels/rdpecam/client/CMakeLists.txt index a8028c309..9019c5004 100644 --- a/channels/rdpecam/client/CMakeLists.txt +++ b/channels/rdpecam/client/CMakeLists.txt @@ -20,6 +20,7 @@ define_channel_client("rdpecam") if(NOT WITH_SWSCALE OR NOT WITH_FFMPEG) message(FATAL_ERROR "WITH_FFMPEG and WITH_SWSCALE required for CHANNEL_RDPECAM_CLIENT") endif() +freerdp_client_pc_add_requires_private("libswscale") # currently camera redirect client supported for platforms with Video4Linux only find_package(FFmpeg REQUIRED COMPONENTS SWSCALE) diff --git a/channels/rdpecam/client/v4l/CMakeLists.txt b/channels/rdpecam/client/v4l/CMakeLists.txt index 2de0089d6..0a463e886 100644 --- a/channels/rdpecam/client/v4l/CMakeLists.txt +++ b/channels/rdpecam/client/v4l/CMakeLists.txt @@ -20,6 +20,7 @@ if(WITH_V4L) define_channel_client_subsystem("rdpecam" "v4l" "") find_package(libusb-1.0 REQUIRED) + freerdp_client_pc_add_requires_private("libusb-1.0") include_directories(SYSTEM ${LIBUSB_1_INCLUDE_DIRS}) set(${MODULE_PREFIX}_SRCS camera_v4l.c uvc_h264.c) diff --git a/channels/rdpsnd/client/alsa/CMakeLists.txt b/channels/rdpsnd/client/alsa/CMakeLists.txt index 63c2db3f2..1686de37d 100644 --- a/channels/rdpsnd/client/alsa/CMakeLists.txt +++ b/channels/rdpsnd/client/alsa/CMakeLists.txt @@ -18,6 +18,7 @@ define_channel_client_subsystem("rdpsnd" "alsa" "") find_package(ALSA REQUIRED) +freerdp_client_pc_add_requires_private("alsa") set(${MODULE_PREFIX}_SRCS rdpsnd_alsa.c) diff --git a/channels/rdpsnd/client/pulse/CMakeLists.txt b/channels/rdpsnd/client/pulse/CMakeLists.txt index e08491e01..bb8ee9bd4 100644 --- a/channels/rdpsnd/client/pulse/CMakeLists.txt +++ b/channels/rdpsnd/client/pulse/CMakeLists.txt @@ -18,6 +18,7 @@ define_channel_client_subsystem("rdpsnd" "pulse" "") find_package(PulseAudio REQUIRED) +freerdp_client_pc_add_requires_private("libpulse") set(${MODULE_PREFIX}_SRCS rdpsnd_pulse.c) diff --git a/channels/rdpsnd/common/CMakeLists.txt b/channels/rdpsnd/common/CMakeLists.txt index 936c39c9c..8dbe29c48 100644 --- a/channels/rdpsnd/common/CMakeLists.txt +++ b/channels/rdpsnd/common/CMakeLists.txt @@ -22,4 +22,5 @@ set(SRCS rdpsnd_common.h rdpsnd_common.c) add_library(rdpsnd-common STATIC ${SRCS}) set_property(TARGET rdpsnd-common PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Common") +freerdp_client_pc_add_library_private(rdpsnd-common) channel_install(rdpsnd-common ${FREERDP_ADDIN_PATH} "FreeRDPTargets") diff --git a/channels/remdesk/common/CMakeLists.txt b/channels/remdesk/common/CMakeLists.txt index 65784df94..e7059eb23 100644 --- a/channels/remdesk/common/CMakeLists.txt +++ b/channels/remdesk/common/CMakeLists.txt @@ -21,4 +21,5 @@ set(SRCS remdesk_common.h remdesk_common.c) add_library(remdesk-common STATIC ${SRCS}) set_property(TARGET remdesk-common PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Common") +freerdp_client_pc_add_library_private(remdesk-common) channel_install(remdesk-common ${FREERDP_ADDIN_PATH} "FreeRDPTargets") diff --git a/channels/tsmf/client/CMakeLists.txt b/channels/tsmf/client/CMakeLists.txt index 51ae4c5fc..5c71cbb83 100644 --- a/channels/tsmf/client/CMakeLists.txt +++ b/channels/tsmf/client/CMakeLists.txt @@ -23,6 +23,7 @@ message(DEPRECATION "TSMF channel is no longer maintained. Use [MS-RDPEVOR] (/vi find_package(PkgConfig) if(PkgConfig_FOUND) pkg_check_modules(gstreamer gstreamer-1.0) + freerdp_client_pc_add_requires_private("gstreamer-1.0") endif() if(WITH_GSTREAMER_1_0) diff --git a/channels/tsmf/client/alsa/CMakeLists.txt b/channels/tsmf/client/alsa/CMakeLists.txt index 3e9d74eec..bae0442b3 100644 --- a/channels/tsmf/client/alsa/CMakeLists.txt +++ b/channels/tsmf/client/alsa/CMakeLists.txt @@ -18,6 +18,7 @@ define_channel_client_subsystem("tsmf" "alsa" "audio") find_package(ALSA REQUIRED) +freerdp_client_pc_add_requires_private("alsa") set(${MODULE_PREFIX}_SRCS tsmf_alsa.c) diff --git a/channels/tsmf/client/gstreamer/CMakeLists.txt b/channels/tsmf/client/gstreamer/CMakeLists.txt index 75c15d7eb..ce1b1ae07 100644 --- a/channels/tsmf/client/gstreamer/CMakeLists.txt +++ b/channels/tsmf/client/gstreamer/CMakeLists.txt @@ -26,6 +26,7 @@ set(SRC "tsmf_gstreamer.c") pkg_check_modules(gstreamerbase gstreamer-base-1.0 REQUIRED) pkg_check_modules(gstreamervideo gstreamer-video-1.0 REQUIRED) pkg_check_modules(gstreamerapp gstreamer-app-1.0 REQUIRED) +freerdp_client_pc_add_requires_private("gstreamer-base-1.0;gstreamer-video-1.0;gstreamer-app-1.0") set(LIBS ${gstreamer_LIBRARIES} ${gstreamerbase_LIBRARIES} ${gstreamervideo_LIBRARIES} ${gstreamerapp_LIBRARIES}) include_directories( @@ -37,6 +38,7 @@ if(ANDROID) set(SRC ${SRC} tsmf_android.c) else() find_package(X11 REQUIRED) + freerdp_client_pc_add_requires_private("x11") list(APPEND SRC tsmf_X11.c) list(APPEND LIBS ${X11_LIBRARIES} ${X11_Xext_LIB}) diff --git a/channels/tsmf/client/pulse/CMakeLists.txt b/channels/tsmf/client/pulse/CMakeLists.txt index b9f54c28a..2a1b88098 100644 --- a/channels/tsmf/client/pulse/CMakeLists.txt +++ b/channels/tsmf/client/pulse/CMakeLists.txt @@ -18,6 +18,7 @@ define_channel_client_subsystem("tsmf" "pulse" "audio") find_package(PulseAudio REQUIRED) +freerdp_client_pc_add_requires_private("libpulse") set(${MODULE_PREFIX}_SRCS tsmf_pulse.c) diff --git a/channels/urbdrc/CMakeLists.txt b/channels/urbdrc/CMakeLists.txt index f7443f421..77357a4a8 100644 --- a/channels/urbdrc/CMakeLists.txt +++ b/channels/urbdrc/CMakeLists.txt @@ -24,6 +24,7 @@ if(WITH_CLIENT_CHANNELS) option(WITH_DEBUG_URBDRC "Dump data send/received in URBDRC channel" ${DEFAULT_DEBUG_OPTION}) find_package(libusb-1.0 REQUIRED) + freerdp_client_pc_add_requires_private("libusb-1.0") include_directories(SYSTEM ${LIBUSB_1_INCLUDE_DIRS}) add_channel_client(${MODULE_PREFIX} ${CHANNEL_NAME}) diff --git a/channels/urbdrc/common/CMakeLists.txt b/channels/urbdrc/common/CMakeLists.txt index 5dd5b8d20..ba8726f1b 100644 --- a/channels/urbdrc/common/CMakeLists.txt +++ b/channels/urbdrc/common/CMakeLists.txt @@ -21,4 +21,5 @@ set(SRCS urbdrc_types.h urbdrc_helpers.h urbdrc_helpers.c msusb.h msusb.c) add_library(urbdrc-common STATIC ${SRCS}) set_property(TARGET urbdrc-common PROPERTY FOLDER "Channels/${CHANNEL_NAME}/Common") +freerdp_client_pc_add_library_private(urbdrc-common) channel_install(urbdrc-common ${FREERDP_ADDIN_PATH} "FreeRDPTargets") diff --git a/client/CMakeLists.txt b/client/CMakeLists.txt index 569f56374..2774a124e 100644 --- a/client/CMakeLists.txt +++ b/client/CMakeLists.txt @@ -99,10 +99,18 @@ if(WITH_CLIENT) endif() if(WITH_FUSE) - list(APPEND FREERDP_CLIENT_PC_PRIVATE_LIBS "-lfuse3") + freerdp_client_pc_add_requires_private("fuse3") +endif() + +list(REMOVE_DUPLICATES FREERDP_CLIENT_PC_REQUIRES_PRIVATE) +list(JOIN FREERDP_CLIENT_PC_REQUIRES_PRIVATE " " FREERDP_CLIENT_PC_REQUIRES_PRIVATE) + +list(REMOVE_DUPLICATES FREERDP_CLIENT_PC_LIBRARY_PRIVATE) +list(JOIN FREERDP_CLIENT_PC_LIBRARY_PRIVATE " -l" FREERDP_CLIENT_PC_LIBRARY_PRIVATE) +if(FREERDP_CLIENT_PC_LIBRARY_PRIVATE) + string(PREPEND FREERDP_CLIENT_PC_LIBRARY_PRIVATE "-l") endif() -list(JOIN FREERDP_CLIENT_PC_PRIVATE_LIBS " " FREERDP_CLIENT_PC_PRIVATE_LIBS) include(pkg-config-install-prefix) cleaning_configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/freerdp-client.pc.in diff --git a/client/common/CMakeLists.txt b/client/common/CMakeLists.txt index 1cf0e8556..dc4831184 100644 --- a/client/common/CMakeLists.txt +++ b/client/common/CMakeLists.txt @@ -59,6 +59,8 @@ if(WITH_FUSE) find_package(PkgConfig REQUIRED) pkg_check_modules(FUSE3 REQUIRED fuse3) + freerdp_client_pc_add_requires_private("fuse3") + include_directories(SYSTEM ${FUSE3_INCLUDE_DIRS}) add_compile_definitions(WITH_FUSE) list(APPEND LIBS ${FUSE3_LIBRARIES}) diff --git a/client/freerdp-client.pc.in b/client/freerdp-client.pc.in index e446657cf..3c6014795 100644 --- a/client/freerdp-client.pc.in +++ b/client/freerdp-client.pc.in @@ -9,7 +9,7 @@ Description: FreeRDP: A Remote Desktop Protocol Implementation URL: http://www.freerdp.com/ Version: @FREERDP_VERSION@ Requires: -Requires.private: @WINPR_PKG_CONFIG_FILENAME@ freerdp@FREERDP_VERSION_MAJOR@ +Requires.private: @WINPR_PKG_CONFIG_FILENAME@ freerdp@FREERDP_VERSION_MAJOR@ @FREERDP_CLIENT_PC_REQUIRES_PRIVATE@ Libs: -L${libdir} ${libs} -Libs.private: -ldl -lpthread @FREERDP_CLIENT_PC_PRIVATE_LIBS@ +Libs.private: -ldl -lpthread @FREERDP_CLIENT_PC_LIBRARY_PRIVATE@ Cflags: -I${includedir} diff --git a/cmake/PkgConfigHelpers.cmake b/cmake/PkgConfigHelpers.cmake new file mode 100644 index 000000000..1b8f608b1 --- /dev/null +++ b/cmake/PkgConfigHelpers.cmake @@ -0,0 +1,17 @@ +set(FREERDP_CLIENT_PC_REQUIRES_PRIVATE "" CACHE INTERNAL "dependencies") + +function(freerdp_client_pc_add_requires_private) + foreach(_lib ${ARGN}) + list(APPEND FREERDP_CLIENT_PC_REQUIRES_PRIVATE ${_lib}) + endforeach() + set(FREERDP_CLIENT_PC_REQUIRES_PRIVATE ${FREERDP_CLIENT_PC_REQUIRES_PRIVATE} CACHE INTERNAL "dependencies") +endfunction() + +set(FREERDP_CLIENT_PC_LIBRARY_PRIVATE "" CACHE INTERNAL "dependencies") + +function(freerdp_client_pc_add_library_private) + foreach(_lib ${ARGN}) + list(APPEND FREERDP_CLIENT_PC_LIBRARY_PRIVATE ${_lib}) + endforeach() + set(FREERDP_CLIENT_PC_LIBRARY_PRIVATE ${FREERDP_CLIENT_PC_LIBRARY_PRIVATE} CACHE INTERNAL "dependencies") +endfunction()