aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--CMake/GeneratePkgConfig.cmake112
1 files changed, 33 insertions, 79 deletions
diff --git a/CMake/GeneratePkgConfig.cmake b/CMake/GeneratePkgConfig.cmake
index cd05568c6..504433479 100644
--- a/CMake/GeneratePkgConfig.cmake
+++ b/CMake/GeneratePkgConfig.cmake
@@ -8,22 +8,13 @@ function(get_relative_link OUTPUT PATH)
get_filename_component(NAME "${PATH}" NAME_WE)
if (IS_ABSOLUTE ${PATH})
get_filename_component(DIRECTORY_NAME "${PATH}" DIRECTORY)
- if (WIN32)
- # On Windows, library files can be libname.lib or name.lib
- get_filename_component(FULL_NAME "${PATH}" NAME)
- # Extract library name without lib prefix and extension
- string(REGEX REPLACE "^lib(.+)\\.[^.]+$" "\\1" LIB_NAME "${FULL_NAME}")
- # If the regex didn't match (no lib prefix), use the name without extension
- if ("${LIB_NAME}" STREQUAL "${FULL_NAME}")
- set(LIB_NAME "${NAME}")
- endif()
- set(${OUTPUT} "-L\"${DIRECTORY_NAME}\" -l${LIB_NAME}" PARENT_SCOPE)
- else()
- get_filename_component(FULL_NAME "${PATH}" NAME)
- # Extract library name without lib prefix and extension for all platforms
- string(REGEX REPLACE "^lib(.+)\\.[^.]+$" "\\1" LIB_NAME "${FULL_NAME}")
- set(${OUTPUT} "-L\"${DIRECTORY_NAME}\" -l${LIB_NAME}" PARENT_SCOPE)
+ get_filename_component(FULL_NAME "${PATH}" NAME)
+ string(REGEX REPLACE "^lib(.+)\\.[^.]+$" "\\1" LIB_NAME "${FULL_NAME}")
+ # If the regex didn't match (no lib prefix), fall back to name without extension
+ if ("${LIB_NAME}" STREQUAL "${FULL_NAME}")
+ set(LIB_NAME "${NAME}")
endif()
+ set(${OUTPUT} "-L\"${DIRECTORY_NAME}\" -l${LIB_NAME}" PARENT_SCOPE)
return()
endif()
@@ -41,81 +32,48 @@ function(generate_pkgconfig TARGET DESCRIPTION)
# message("Generating pkg-config for ${TARGET}")
get_filename_component(PREFIX "${CMAKE_INSTALL_PREFIX}" REALPATH)
- # Get the target type to handle interface libraries differently
get_target_property(LIBRARY_TYPE "${TARGET}" TYPE)
- # For interface libraries, use INTERFACE_LINK_LIBRARIES instead of LINK_LIBRARIES
if ("${LIBRARY_TYPE}" STREQUAL "INTERFACE_LIBRARY")
get_target_property(LIST "${TARGET}" INTERFACE_LINK_LIBRARIES)
else()
get_target_property(LIST "${TARGET}" LINK_LIBRARIES)
endif()
- # Handle the case when no libraries are found
if ("${LIST}" STREQUAL "LIST-NOTFOUND")
set(LIST "")
endif()
- # Special handling for tdcore interface library
- if ("${TARGET}" STREQUAL "tdcore" AND "${LIBRARY_TYPE}" STREQUAL "INTERFACE_LIBRARY")
- # For tdcore interface library, we need to link to the actual part libraries
- # instead of the non-existent tdcore library
- set(TDCORE_LIBS "")
- set(COMBINED_REQS "")
- set(COMBINED_LIBS "")
-
- foreach (PART_LIB ${LIST})
- if (TARGET "${PART_LIB}" AND "${PART_LIB}" MATCHES "^tdcore_part[0-9]+$")
- # Add the actual part library to link against
- list(APPEND TDCORE_LIBS "-l${PART_LIB}")
-
- # Collect dependencies from the parts
- get_target_property(PART_LIST "${PART_LIB}" LINK_LIBRARIES)
- if (NOT "${PART_LIST}" STREQUAL "PART_LIST-NOTFOUND")
- foreach (PART_DEP ${PART_LIST})
- if (TARGET "${PART_DEP}")
- list(APPEND COMBINED_REQS "${PART_DEP}")
- else()
- list(APPEND COMBINED_LIBS "${PART_DEP}")
- endif()
- endforeach()
+ set(INTERFACE_LIBS "")
+ if ("${LIBRARY_TYPE}" STREQUAL "INTERFACE_LIBRARY")
+ set(PROPAGATED "")
+ foreach (DEP ${LIST})
+ if (TARGET "${DEP}")
+ get_target_property(DEP_TYPE "${DEP}" TYPE)
+ if ("${DEP_TYPE}" STREQUAL "STATIC_LIBRARY" OR "${DEP_TYPE}" STREQUAL "SHARED_LIBRARY")
+ list(APPEND INTERFACE_LIBS "${DEP}")
+ get_target_property(DEP_LIBS "${DEP}" LINK_LIBRARIES)
+ if (NOT "${DEP_LIBS}" STREQUAL "DEP_LIBS-NOTFOUND")
+ list(APPEND PROPAGATED ${DEP_LIBS})
+ endif()
+ else()
+ list(APPEND PROPAGATED "${DEP}")
endif()
- elseif (TARGET "${PART_LIB}")
- list(APPEND COMBINED_REQS "${PART_LIB}")
else()
- list(APPEND COMBINED_LIBS "${PART_LIB}")
+ list(APPEND PROPAGATED "${DEP}")
endif()
endforeach()
-
- # Remove duplicates
- if (COMBINED_REQS)
- list(REMOVE_DUPLICATES COMBINED_REQS)
+ if (PROPAGATED)
+ list(REMOVE_DUPLICATES PROPAGATED)
endif()
- if (COMBINED_LIBS)
- list(REMOVE_DUPLICATES COMBINED_LIBS)
- endif()
- if (TDCORE_LIBS)
- list(REMOVE_DUPLICATES TDCORE_LIBS)
- endif()
-
- set(LIST "")
- list(APPEND LIST ${COMBINED_REQS})
- list(APPEND LIST ${COMBINED_LIBS})
-
- # Set a flag to use different Libs line for tdcore
- set(USE_TDCORE_PARTS TRUE)
- else()
- set(USE_TDCORE_PARTS FALSE)
+ set(LIST "${PROPAGATED}")
endif()
set(REQS "")
set(LIBS "")
foreach (LIB ${LIST})
if (TARGET "${LIB}")
- # Skip internal tdcore parts as they don't have their own .pc files
- if (NOT "${LIB}" MATCHES "^tdcore_part[0-9]+$")
- set(HAS_REQS 1)
- list(APPEND REQS "${LIB}")
- endif()
+ set(HAS_REQS 1)
+ list(APPEND REQS "${LIB}")
else()
set(HAS_LIBS 1)
get_relative_link(LINK "${LIB}")
@@ -155,19 +113,17 @@ function(generate_pkgconfig TARGET DESCRIPTION)
endif()
file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/pkgconfig")
-
- # Generate the correct Libs line based on library type
- if (USE_TDCORE_PARTS)
- # For tdcore interface library, link to the actual part libraries
+
+ if ("${LIBRARY_TYPE}" STREQUAL "INTERFACE_LIBRARY")
set(LIBS_LINE "")
- foreach (PART_LIB ${TDCORE_LIBS})
- set(LIBS_LINE "${LIBS_LINE} ${PART_LIB}")
+ foreach (ILIB ${INTERFACE_LIBS})
+ set(LIBS_LINE "${LIBS_LINE} -l${ILIB}")
endforeach()
set(LIBS_LINE "Libs: -L\"${PKGCONFIG_LIBDIR}\"${LIBS_LINE}")
else()
set(LIBS_LINE "Libs: -L\"${PKGCONFIG_LIBDIR}\" -l${TARGET}")
endif()
-
+
file(GENERATE OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/pkgconfig/${TARGET}.pc" CONTENT
"prefix=${PREFIX}
@@ -179,10 +135,8 @@ CFlags: -I\"${PKGCONFIG_INCLUDEDIR}\"
${LIBS_LINE}
${REQUIRES}${LIBRARIES}")
- if ("${LIBRARY_TYPE}" STREQUAL "STATIC_LIBRARY" OR "${LIBRARY_TYPE}" STREQUAL "SHARED_LIBRARY")
- install(FILES "${CMAKE_CURRENT_BINARY_DIR}/pkgconfig/${TARGET}.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
- elseif ("${LIBRARY_TYPE}" STREQUAL "INTERFACE_LIBRARY")
- # Interface libraries are also supported, install the .pc file
+ if ("${LIBRARY_TYPE}" STREQUAL "STATIC_LIBRARY" OR "${LIBRARY_TYPE}" STREQUAL "SHARED_LIBRARY" OR
+ "${LIBRARY_TYPE}" STREQUAL "INTERFACE_LIBRARY")
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/pkgconfig/${TARGET}.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
else()
message(FATAL_ERROR "Don't know how to handle ${TARGET} of type ${LIBRARY_TYPE}")