RunCMake.CPack_RPM RPM/DIST-MONOLITHIC-type subtest fails if RPM disttag contains a plus
If disttag RPM macro contains a "+" character, RunCMake.CPack_RPM RPM/DIST-MONOLITHIC-type subtest fails:
397: CMake Error at /builddir/build/BUILD/cmake-3.9.3/Tests/RunCMake/RunCMake.cmake:132 (message):
397: RPM/DIST-MONOLITHIC-type - FAILED:
397:
397: Result is [1], not [0].
397:
397: stderr does not match that expected.
397:
397: Command was:
397:
397: command> "/builddir/build/BUILD/cmake-3.9.3/build/bin/cmake" "-DRunCMake_TEST=DIST-MONOLITHIC-type" "-DRunCMake_TEST_FILE_PREFIX=DIST" "-DRunCMake_SUBTEST_SUFFIX=" "-DGENERATOR_TYPE=RPM" "-DPACKAGING_TYPE=MONOLITHIC" "-Dsrc_dir=/builddir/build/BUILD/cmake-3.9.3/Tests/RunCMake/CPack" "-Dbin_dir=/builddir/build/BUILD/cmake-3.9.3/build/Tests/RunCMake/RPM/CPack/DIST-build" "-Dconfig_file=/builddir/build/BUILD/cmake-3.9.3/build/Tests/RunCMake/CPack/conf/RPM_config.cmake" "-P" "/builddir/build/BUILD/cmake-3.9.3/Tests/RunCMake/CPack/VerifyResult.cmake"
397:
397: Actual stdout:
397:
397: actual-out>
397:
397: Expected stderr to match:
397:
397: expect-err> ^(CPackRPM: Will use GENERATED spec file: (/[^/]*)*/Tests/RunCMake/RPM/CPack/[^-]*-build((-[^-]*-subtest/)|/)_CPack_Packages/.*/RPM/SPECS/[^\.]*\.spec(\n|$))*$
397:
397: Actual stderr:
397:
397: actual-err> CMake Error at /builddir/build/BUILD/cmake-3.9.3/Tests/RunCMake/CPack/tests/DIST/VerifyResult.cmake:10 (message):
397: actual-err> Unexpected Release in 'dist-0.1.1-Linux.rpm'; file info: 'Name : dist
397: actual-err>
397: actual-err> Version : 0.1.1
397: actual-err>
397: actual-err> Release : 1.module+36f4cc6b
397: actual-err>
397: actual-err> Architecture: x86_64
397: actual-err>
The subtest code is:
execute_process(COMMAND ${RPMBUILD_EXECUTABLE} -E %{?dist}
OUTPUT_VARIABLE DIST_TAG
ERROR_QUIET
OUTPUT_STRIP_TRAILING_WHITESPACE)
set(whitespaces_ "[\t\n\r ]*")
getPackageInfo("${FOUND_FILE_1}" "FILE_INFO_")
if(NOT FILE_INFO_ MATCHES ".*Release${whitespaces_}:${whitespaces_}1${DIST_TAG}")
message(FATAL_ERROR "Unexpected Release in '${FOUND_FILE_1}'; file info: '${FILE_INFO_}'")
endif()
It probably fails because the modular disttag contains plus "+" character and the value is used as a regular expression where plus is a metacharacter. The $DIST_TAG variable should be escaped against regular expression metacharacters. I tried Perl's \Q\E sequence, but looks like it's not supported.
I experience this issue with CMake 3.9.3. You can reproduce it with adding
%dist a+b
into a file in /usr/lib/rpm/macros.d/ directory (or where you rpmbuild loads macros from) and running the RunCMake.CPack_RPM test.