浏览代码

cpack: Fix CPACK_PACKAGING_INSTALL_PREFIX handling for archives (#14677)

Fix the case when the archive generator is used to package components
with an install prefix.
Clinton Stimpson 10 年之前
父节点
当前提交
e3f84fc504

+ 8 - 0
Source/CPack/cmCPackArchiveGenerator.cxx

@@ -63,6 +63,14 @@ int cmCPackArchiveGenerator::addOneComponentToArchive(cmArchiveWrite& archive,
     filePrefix = this->GetOption("CPACK_PACKAGE_FILE_NAME");
     filePrefix = this->GetOption("CPACK_PACKAGE_FILE_NAME");
     filePrefix += "/";
     filePrefix += "/";
     }
     }
+  const char* installPrefix =
+    this->GetOption("CPACK_PACKAGING_INSTALL_PREFIX");
+  if(installPrefix && installPrefix[0] == '/' && installPrefix[1] != 0)
+    {
+    // add to file prefix and remove the leading '/'
+    filePrefix += installPrefix+1;
+    filePrefix += "/";
+    }
   std::vector<std::string>::const_iterator fileIt;
   std::vector<std::string>::const_iterator fileIt;
   for (fileIt = component->Files.begin(); fileIt != component->Files.end();
   for (fileIt = component->Files.begin(); fileIt != component->Files.end();
        ++fileIt )
        ++fileIt )

+ 28 - 0
Tests/CMakeLists.txt

@@ -862,6 +862,7 @@ ${CMake_BINARY_DIR}/bin/cmake -DDIR=dev -P ${CMake_SOURCE_DIR}/Utilities/Release
   set(CTEST_RUN_CPackComponents ${CTEST_TEST_CPACK})
   set(CTEST_RUN_CPackComponents ${CTEST_TEST_CPACK})
   set(CTEST_package_X11_TEST ${CTEST_TEST_CPACK})
   set(CTEST_package_X11_TEST ${CTEST_TEST_CPACK})
   set(CTEST_RUN_CPackComponentsForAll ${CTEST_TEST_CPACK})
   set(CTEST_RUN_CPackComponentsForAll ${CTEST_TEST_CPACK})
+  set(CTEST_RUN_CPackComponentsPrefix ${CTEST_TEST_CPACK})
 
 
   # Do not try to build RPM
   # Do not try to build RPM
   if (NOT RPMBUILD_EXECUTABLE)
   if (NOT RPMBUILD_EXECUTABLE)
@@ -1035,6 +1036,33 @@ ${CMake_BINARY_DIR}/bin/cmake -DDIR=dev -P ${CMake_SOURCE_DIR}/Utilities/Release
     list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/CPackTestAllGenerators")
     list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/CPackTestAllGenerators")
   endif()
   endif()
 
 
+  if(CTEST_RUN_CPackComponentsPrefix)
+    set(CPackComponents_BUILD_OPTIONS)
+    if(APPLE)
+      set(CPackComponents_BUILD_OPTIONS -DCPACK_BINARY_DRAGNDROP:BOOL=ON)
+    endif()
+    if(NOT NSIS_MAKENSIS_EXECUTABLE)
+      set(CPackComponents_BUILD_OPTIONS ${CPackComponents_BUILD_OPTIONS}
+        -DCPACK_BINARY_NSIS:BOOL=OFF)
+    endif()
+
+    add_test(CPackComponentsPrefix ${CMAKE_CTEST_COMMAND}
+      --build-and-test
+      "${CMake_SOURCE_DIR}/Tests/CPackComponentsPrefix"
+      "${CMake_BINARY_DIR}/Tests/CPackComponentsPrefix"
+      ${build_generator_args}
+      --build-project CPackComponentsPrefix
+      --build-two-config
+      --build-target package
+      --build-options ${build_options}
+        -DCPACK_BINARY_DEB:BOOL=${CPACK_BINARY_DEB}
+        -DCPACK_BINARY_RPM:BOOL=${CPACK_BINARY_RPM}
+        -DCPACK_BINARY_ZIP:BOOL=ON
+        ${CPackComponents_BUILD_OPTIONS}
+        )
+    list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/CPackComponentsPrefix")
+  endif()
+
   if(CTEST_package_X11_TEST)
   if(CTEST_package_X11_TEST)
     set(X11_build_target_arg --build-target package)
     set(X11_build_target_arg --build-target package)
   else()
   else()

+ 13 - 0
Tests/CPackComponentsPrefix/CMakeLists.txt

@@ -0,0 +1,13 @@
+cmake_minimum_required(VERSION 3.2)
+project(CPackComponentsPrefix NONE)
+
+install(FILES file-runtime.txt
+        DESTINATION bin COMPONENT Runtime)
+install(FILES file-development.txt
+        DESTINATION lib COMPONENT Development)
+
+set(CPACK_COMPONENT_INCLUDE_TOPLEVEL_DIRECTORY 1)
+set(CPACK_COMPONENTS_ALL Development)
+set(CPACK_ARCHIVE_COMPONENT_INSTALL 1)
+set(CPACK_PACKAGING_INSTALL_PREFIX "/opt/My-1.0")
+include(CPack)

+ 1 - 0
Tests/CPackComponentsPrefix/file-development.txt

@@ -0,0 +1 @@
+This file is installed with the Development component.

+ 1 - 0
Tests/CPackComponentsPrefix/file-runtime.txt

@@ -0,0 +1 @@
+This file is installed with the Runtime component.