Browse Source

Merge topic 'cpack-nsis-reserved-component-names' into release-3.30

b1f956529a CPack/NSIS: Fix matching of reserved component names

Acked-by: Kitware Robot <[email protected]>
Merge-request: !9757
Brad King 1 year ago
parent
commit
8eaaa0023e

+ 2 - 1
Source/CPack/cmCPackGenerator.cxx

@@ -1552,6 +1552,7 @@ std::string cmCPackGenerator::GetSanitizedDirOrFileName(
 #ifdef _WIN32
     // Given name matches a reserved name (on Windows)?
     // Then return it prepended with an underscore.
+    // See https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file
     cmsys::RegularExpression reserved_pattern("^("
                                               "[Cc][Oo][Nn]|"
                                               "[Pp][Rr][Nn]|"
@@ -1559,7 +1560,7 @@ std::string cmCPackGenerator::GetSanitizedDirOrFileName(
                                               "[Nn][Uu][Ll]|"
                                               "[Cc][Oo][Mm][1-9]|"
                                               "[Ll][Pp][Tt][1-9]"
-                                              ")([.].+)?");
+                                              ")[.]?$");
     if (reserved_pattern.find(name)) {
       return "_" + name;
     }

+ 2 - 2
Source/CPack/cmCPackNSISGenerator.cxx

@@ -863,8 +863,8 @@ std::string cmCPackNSISGenerator::CreateComponentDescription(
     /* clang-format on */
     componentCode += out.str();
   } else {
-    componentCode +=
-      "  File /r \"${INST_DIR}\\" + component->Name + "\\*.*\"\n";
+    componentCode += "  File /r \"${INST_DIR}\\" +
+      this->GetSanitizedDirOrFileName(component->Name) + "\\*.*\"\n";
   }
   componentCode += "SectionEnd\n";
 

+ 20 - 0
Tests/CPackNSISGenerator/CMakeLists.txt

@@ -10,6 +10,26 @@ install(TARGETS hello
   LIBRARY DESTINATION .
   BUNDLE DESTINATION .)
 
+# Component that is a reserved name on Windows.
+# See https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file
+install(
+  DIRECTORY .
+  DESTINATION txt
+  COMPONENT CON
+  FILES_MATCHING PATTERN *.txt)
+# Component name that is similar to a reserved name on Windows.
+install(
+  DIRECTORY .
+  DESTINATION txt
+  COMPONENT Console
+  FILES_MATCHING PATTERN *.txt)
+# Component name that is strongly discouraged on Windows.
+install(
+  DIRECTORY .
+  DESTINATION txt
+  COMPONENT EndsWithDot.
+  FILES_MATCHING PATTERN *.txt)
+
 set(CPACK_NSIS_MUI_HEADERIMAGE "${PROJECT_SOURCE_DIR}\\\\header-image.bmp")
 set(CPACK_PACKAGE_ICON "${PROJECT_SOURCE_DIR}\\\\header-icon.bmp")
 set(CPACK_NSIS_MUI_ICON "${PROJECT_SOURCE_DIR}\\\\install.ico")

+ 21 - 0
Tests/CPackNSISGenerator/RunCPackVerifyResult.cmake

@@ -69,3 +69,24 @@ if("${output_index}" EQUAL "-1")
 else()
   message(FATAL_ERROR "License found in the project")
 endif()
+
+file(STRINGS "${project_file}" line REGEX [[\\_CON\\]])
+string(FIND "${line}" [[\_CON\]] output_index)
+message(STATUS "Found CON component reserved directory name as _CON")
+if("${output_index}" EQUAL "-1")
+  message(FATAL_ERROR "CON component reserved directory name not found as _CON in the project")
+endif()
+
+file(STRINGS "${project_file}" line REGEX [[\\Console\\]])
+string(FIND "${line}" [[\Console\]] output_index)
+message(STATUS "Found Console component directory name as Console")
+if("${output_index}" EQUAL "-1")
+  message(FATAL_ERROR "Console component directory name not found as Console in the project")
+endif()
+
+file(STRINGS "${project_file}" line REGEX [[\\EndsWithDot._\\]])
+string(FIND "${line}" [[\EndsWithDot._\]] output_index)
+message(STATUS "Found EndsWithDot. component directory name as EndsWithDot._")
+if("${output_index}" EQUAL "-1")
+  message(FATAL_ERROR "EndsWithDot. component directory name not found as EndsWithDot._ in the project")
+endif()