Browse Source

Merge topic 'pkg_get_variable-list'

9ddef32ba0 FindPkgConfig: Fix parsing of quoted lists with pkgconf <1.5.1

Acked-by: Kitware Robot <[email protected]>
Merge-request: !9447
Brad King 1 year ago
parent
commit
3d8d13f4bc

+ 11 - 0
Modules/FindPkgConfig.cmake

@@ -158,6 +158,17 @@ macro(_pkgconfig_invoke _pkglist _prefix _varname _regexp)
       string(REGEX REPLACE "${_regexp}" " " _pkgconfig_invoke_result "${_pkgconfig_invoke_result}")
     endif()
 
+    # pkg-config <0.29.1 and pkgconf <1.5.1 prints quoted variables without unquoting
+    # unquote only if quotes are first and last characters
+    if((PKG_CONFIG_VERSION_STRING VERSION_LESS 0.29.1) OR
+        (PKG_CONFIG_VERSION_STRING VERSION_GREATER_EQUAL 1.0 AND PKG_CONFIG_VERSION_STRING VERSION_LESS 1.5.1))
+      if (_pkgconfig_invoke_result MATCHES "^\"(.*)\"$")
+        set(_pkgconfig_invoke_result "${CMAKE_MATCH_1}")
+      elseif(_pkgconfig_invoke_result MATCHES "^'(.*)'$")
+        set(_pkgconfig_invoke_result "${CMAKE_MATCH_1}")
+      endif()
+    endif()
+
     # pkg-config can represent "spaces within an argument" by backslash-escaping the space.
     # UNIX_COMMAND mode treats backslash-escaped spaces as "not a space that delimits arguments".
     separate_arguments(_pkgconfig_invoke_result UNIX_COMMAND "${_pkgconfig_invoke_result}")

+ 31 - 0
Tests/RunCMake/FindPkgConfig/FindPkgConfig_GET_VARIABLE_MULTIPLE_VALUES.cmake

@@ -0,0 +1,31 @@
+# Prepare environment and variables
+set(PKG_CONFIG_USE_CMAKE_PREFIX_PATH TRUE)
+if(WIN32)
+    set(ENV{CMAKE_PREFIX_PATH} "${CMAKE_CURRENT_SOURCE_DIR}\\pc-bletch")
+else()
+    set(ENV{CMAKE_PREFIX_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/pc-bletch")
+endif()
+
+find_package(PkgConfig REQUIRED)
+pkg_check_modules(BLETCH QUIET bletch)
+
+if (NOT BLETCH_FOUND)
+  message(FATAL_ERROR "Failed to find embedded package bletch via CMAKE_PREFIX_PATH")
+endif ()
+
+set(expected_value "item1;item2;item3;item with spaces")
+pkg_get_variable(bletchvar1 bletch multiple_values1)
+pkg_get_variable(bletchvar2 bletch multiple_values2)
+
+string(FIND "${bletchvar1}" ";" IS_VARIABLE_A_LIST1)
+string(FIND "${bletchvar2}" ";" IS_VARIABLE_A_LIST2)
+
+if (IS_VARIABLE_A_LIST1 EQUAL -1 OR IS_VARIABLE_A_LIST2 EQUAL -1)
+  message(FATAL_ERROR "Failed to fetch variable multiple_values from embedded package bletch as a list")
+endif()
+
+if (NOT (bletchvar1 STREQUAL expected_value AND bletchvar2 STREQUAL expected_value))
+  message(NOTICE "multiple_values1=${bletchvar1} and expected_value=${expected_value}")
+  message(NOTICE "multiple_values2=${bletchvar2} and expected_value=${expected_value}")
+  message(FATAL_ERROR "Failed to fetch variable multiple_values from embedded package bletch with escaped spaces")
+endif()

+ 1 - 0
Tests/RunCMake/FindPkgConfig/RunCMakeTest.cmake

@@ -54,6 +54,7 @@ Libs: -L\${libdir}
   run_cmake(FindPkgConfig_GET_VARIABLE_DEFINE_VARIABLES)
   run_cmake(FindPkgConfig_GET_VARIABLE_PREFIX_PATH)
   run_cmake(FindPkgConfig_GET_VARIABLE_PKGCONFIG_PATH)
+  run_cmake(FindPkgConfig_GET_VARIABLE_MULTIPLE_VALUES)
   run_cmake(FindPkgConfig_cache_variables)
   run_cmake(FindPkgConfig_IMPORTED_TARGET)
   run_cmake(FindPkgConfig_VERSION_OPERATORS)

+ 3 - 1
Tests/RunCMake/FindPkgConfig/pc-bletch/lib/pkgconfig/bletch.pc

@@ -4,9 +4,11 @@ libdir=${exec_prefix}/lib
 includedir=${prefix}/include
 
 jackpot=bletch-lives
+multiple_values1="item1 item2 item3 item\ with\ spaces"
+multiple_values2='item1 item2 item3 item\ with\ spaces'
 
 Name: Bletch
-Description: Dummy packaget to test variable support
+Description: Dummy package to test variable support
 Version: 1.0
 Libs: -L${libdir} -lbletch
 Cflags: -Dbletch_version=1