Browse Source

InstallRules: added new variable to disable generation of install rules

The boolean variable CMAKE_SKIP_INSTALL_RULES
allows disabling generation of install rules for projects which don't
want them.
Nils Gladitz 12 years ago
parent
commit
be0458c562

+ 1 - 0
Help/manual/cmake-variables.7.rst

@@ -59,6 +59,7 @@ Variables that Provide Information
    /variable/CMAKE_SHARED_MODULE_PREFIX
    /variable/CMAKE_SHARED_MODULE_SUFFIX
    /variable/CMAKE_SIZEOF_VOID_P
+   /variable/CMAKE_SKIP_INSTALL_RULES
    /variable/CMAKE_SKIP_RPATH
    /variable/CMAKE_SOURCE_DIR
    /variable/CMAKE_STANDARD_LIBRARIES

+ 7 - 0
Help/variable/CMAKE_SKIP_INSTALL_RULES.rst

@@ -0,0 +1,7 @@
+CMAKE_SKIP_INSTALL_RULES
+------------------------
+
+Whether to disable generation of installation rules.
+
+If TRUE, cmake will neither generate installaton rules nor
+will it generate cmake_install.cmake files. This variable is FALSE by default.

+ 13 - 2
Source/cmGlobalGenerator.cxx

@@ -1172,7 +1172,11 @@ void cmGlobalGenerator::Generate()
     this->LocalGenerators[i]->GetMakefile()->SetGeneratingBuildSystem();
     this->SetCurrentLocalGenerator(this->LocalGenerators[i]);
     this->LocalGenerators[i]->Generate();
-    this->LocalGenerators[i]->GenerateInstallRules();
+    if(!this->LocalGenerators[i]->GetMakefile()->IsOn(
+      "CMAKE_SKIP_INSTALL_RULES"))
+      {
+      this->LocalGenerators[i]->GenerateInstallRules();
+      }
     this->LocalGenerators[i]->GenerateTestFiles();
     this->CMakeInstance->UpdateProgress("Generating",
       (static_cast<float>(i)+1.0f)/
@@ -2240,7 +2244,14 @@ void cmGlobalGenerator::CreateDefaultGlobalTargets(cmTargets* targets)
     }
 
   //Install
-  if(this->InstallTargetEnabled)
+  bool skipInstallRules = mf->IsOn("CMAKE_SKIP_INSTALL_RULES");
+  if(this->InstallTargetEnabled && skipInstallRules)
+    {
+    mf->IssueMessage(cmake::WARNING,
+      "CMAKE_SKIP_INSTALL_RULES was enabled even though "
+      "installation rules have been specified");
+    }
+  else if(this->InstallTargetEnabled && !skipInstallRules)
     {
     if(!cmakeCfgIntDir || !*cmakeCfgIntDir || cmakeCfgIntDir[0] == '.')
       {

+ 13 - 0
Tests/CMakeLists.txt

@@ -742,6 +742,19 @@ ${CMake_BINARY_DIR}/bin/cmake -DVERSION=master -P ${CMake_SOURCE_DIR}/Utilities/
     --test-command   ${SimpleInstallInstallDir}/MyTest/bin/SimpleInstExeS2)
   list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/SimpleInstallS2")
 
+  set(MissingInstallInstallDir
+    "${CMake_BINARY_DIR}/Tests/MissingInstall/InstallDirectory")
+  add_test(MissingInstall ${CMAKE_CTEST_COMMAND}
+    --build-and-test
+    "${CMake_SOURCE_DIR}/Tests/MissingInstall"
+    "${CMake_BINARY_DIR}/Tests/MissingInstall"
+    ${build_generator_args}
+    --build-project TestMissingInstall
+    --build-two-config
+    --build-options ${build_options}
+    "-DCMAKE_INSTALL_PREFIX:PATH=${MissingInstallInstallDir}")
+  list(APPEND TEST_BUILD_DIRS "${CMake_BINARY_DIR}/Tests/MissingInstall")
+
   # By default, run the CPackComponents test if the CTEST_TEST_CPACK
   # option is ON:
   #

+ 25 - 0
Tests/MissingInstall/CMakeLists.txt

@@ -0,0 +1,25 @@
+cmake_minimum_required (VERSION 2.8.12)
+project(TestMissingInstall)
+
+set(CMAKE_SKIP_INSTALL_RULES ON)
+
+# Skip the dependency that causes a build when installing.  This
+# avoids infinite loops when the post-build rule below installs.
+set(CMAKE_SKIP_INSTALL_ALL_DEPENDENCY 1)
+set(CMAKE_SKIP_PACKAGE_ALL_DEPENDENCY 1)
+
+if(CMAKE_CONFIGURATION_TYPES)
+  set(MULTI_CONFIG ON)
+else()
+  set(MULTI_CONFIG OFF)
+endif()
+
+add_executable(mybin mybin.cpp)
+install(TARGETS mybin RUNTIME DESTINATION bin)
+
+add_custom_command(TARGET mybin
+  POST_BUILD
+  COMMAND ${CMAKE_COMMAND} "-DMULTI_CONFIG=${MULTI_CONFIG}"
+    -P ${CMAKE_CURRENT_SOURCE_DIR}/ExpectInstallFail.cmake
+  COMMENT "Install Project"
+)

+ 18 - 0
Tests/MissingInstall/ExpectInstallFail.cmake

@@ -0,0 +1,18 @@
+if(MULTI_CONFIG)
+  set(SI_CONFIG --config $<CONFIGURATION>)
+else()
+  set(SI_CONFIG)
+endif()
+
+execute_process(
+  COMMAND ${CMAKE_COMMAND}
+    --build .
+    --target install ${SI_CONFIG}
+  RESULT_VARIABLE RESULT
+  OUTPUT_VARIABLE OUTPUT
+  ERROR_VARIABLE ERROR
+)
+
+if(RESULT EQUAL 0)
+  message(FATAL_ERROR "install should have failed")
+endif()

+ 1 - 0
Tests/MissingInstall/mybin.cpp

@@ -0,0 +1 @@
+int main() {}

+ 2 - 0
Tests/RunCMake/CMakeLists.txt

@@ -140,3 +140,5 @@ add_RunCMake_test(File_Generate)
 add_RunCMake_test(ExportWithoutLanguage)
 add_RunCMake_test(target_link_libraries)
 add_RunCMake_test(CheckModules)
+
+add_RunCMake_test(install)

+ 142 - 0
Tests/RunCMake/CMakeLists.txt.orig

@@ -0,0 +1,142 @@
+# This directory contains tests that run CMake to configure a project
+# but do not actually build anything.  To add a test:
+#
+# 1.) Add a subdirectory named for the test.
+#
+# 2.) Call add_RunCMake_test and pass the test directory name.
+#
+# 3.) Create a RunCMakeTest.cmake script in the directory containing
+#   include(RunCMake)
+#   run_cmake(SubTest1)
+#   ...
+#   run_cmake(SubTestN)
+# where SubTest1..SubTestN are sub-test names each corresponding to
+# an independent CMake run and project configuration.
+#
+# 3.) Create a CMakeLists.txt file in the directory containing
+#   cmake_minimum_required(...)
+#   project(${RunCMake_TEST} NONE) # or languages needed
+#   include(${RunCMake_TEST}.cmake)
+# where "${RunCMake_TEST}" is literal.  A value for RunCMake_TEST
+# will be passed to CMake by the run_cmake macro when running each
+# sub-test.
+#
+# 4.) Create a <SubTest>.cmake file for each sub-test named above
+# containing the actual test code.  Optionally create files
+# containing expected test results:
+#   <SubTest>-result.txt  = Process result expected if not "0"
+#   <SubTest>-stdout.txt  = Regex matching expected stdout content
+#   <SubTest>-stderr.txt  = Regex matching expected stderr content
+#   <SubTest>-check.cmake = Custom result check
+# Note that trailing newlines will be stripped from actual and expected test
+# output before matching against the stdout and stderr expressions.
+# The code in <SubTest>-check.cmake may use variables
+#   RunCMake_TEST_SOURCE_DIR = Top of test source tree
+#   RunCMake_TEST_BINARY_DIR = Top of test binary tree
+# and an failure must store a message in RunCMake_TEST_FAILED.
+
+macro(add_RunCMake_test test)
+  add_test(RunCMake.${test} ${CMAKE_CMAKE_COMMAND}
+    -DCMAKE_MODULE_PATH=${CMAKE_CURRENT_SOURCE_DIR}
+    -DRunCMake_GENERATOR=${CMAKE_TEST_GENERATOR}
+    -DRunCMake_GENERATOR_TOOLSET=${CMAKE_TEST_GENERATOR_TOOLSET}
+    -DRunCMake_SOURCE_DIR=${CMAKE_CURRENT_SOURCE_DIR}/${test}
+    -DRunCMake_BINARY_DIR=${CMAKE_CURRENT_BINARY_DIR}/${test}
+    ${${test}_ARGS}
+    -P "${CMAKE_CURRENT_SOURCE_DIR}/${test}/RunCMakeTest.cmake"
+    )
+endmacro()
+
+if(XCODE_VERSION AND "${XCODE_VERSION}" VERSION_LESS 3)
+  set(GeneratorToolset_ARGS -DXCODE_BELOW_3=1)
+endif()
+
+add_RunCMake_test(CMP0019)
+add_RunCMake_test(CMP0022)
+add_RunCMake_test(CMP0026)
+add_RunCMake_test(CMP0027)
+add_RunCMake_test(CMP0028)
+add_RunCMake_test(CMP0037)
+add_RunCMake_test(CMP0038)
+add_RunCMake_test(CMP0039)
+add_RunCMake_test(CMP0040)
+add_RunCMake_test(CMP0041)
+add_RunCMake_test(CTest)
+if(UNIX AND "${CMAKE_TEST_GENERATOR}" MATCHES "Unix Makefiles")
+  add_RunCMake_test(CompilerChange)
+endif()
+add_RunCMake_test(CompilerNotFound)
+add_RunCMake_test(Configure)
+add_RunCMake_test(DisallowedCommands)
+add_RunCMake_test(ExternalData)
+add_RunCMake_test(FPHSA)
+add_RunCMake_test(GeneratorExpression)
+add_RunCMake_test(GeneratorToolset)
+add_RunCMake_test(TargetPropertyGeneratorExpressions)
+add_RunCMake_test(Languages)
+add_RunCMake_test(ObjectLibrary)
+if(NOT WIN32)
+  add_RunCMake_test(PositionIndependentCode)
+  set(SKIP_VISIBILITY 0)
+  if("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU" AND "${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS 4.2)
+    set(SKIP_VISIBILITY 1)
+  endif()
+
+  if (CMAKE_CXX_COMPILER_ID MATCHES Watcom
+      OR CMAKE_SYSTEM_NAME MATCHES IRIX64
+      OR CMAKE_CXX_COMPILER_ID MATCHES HP
+      OR CMAKE_CXX_COMPILER_ID MATCHES XL
+      OR CMAKE_CXX_COMPILER_ID MATCHES SunPro)
+    set(SKIP_VISIBILITY 1)
+  endif()
+
+  if (NOT SKIP_VISIBILITY)
+    add_RunCMake_test(VisibilityPreset)
+  endif()
+endif()
+if (QT4_FOUND)
+  set(CompatibleInterface_ARGS -DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE})
+endif()
+add_RunCMake_test(CompatibleInterface)
+add_RunCMake_test(Syntax)
+
+add_RunCMake_test(add_dependencies)
+add_RunCMake_test(build_command)
+add_RunCMake_test(export)
+add_RunCMake_test(cmake_minimum_required)
+add_RunCMake_test(find_package)
+add_RunCMake_test(get_filename_component)
+add_RunCMake_test(if)
+add_RunCMake_test(include)
+add_RunCMake_test(include_directories)
+add_RunCMake_test(list)
+add_RunCMake_test(message)
+add_RunCMake_test(string)
+add_RunCMake_test(try_compile)
+add_RunCMake_test(set)
+add_RunCMake_test(variable_watch)
+add_RunCMake_test(CMP0004)
+add_RunCMake_test(TargetPolicies)
+add_RunCMake_test(alias_targets)
+add_RunCMake_test(interface_library)
+add_RunCMake_test(no_install_prefix)
+
+find_package(Qt4 QUIET)
+find_package(Qt5Core QUIET)
+if (QT4_FOUND AND Qt5Core_FOUND AND NOT Qt5Core_VERSION VERSION_LESS 5.1.0)
+  add_RunCMake_test(IncompatibleQt)
+endif()
+if (QT4_FOUND)
+  set(ObsoleteQtMacros_ARGS -DQT_QMAKE_EXECUTABLE:FILEPATH=${QT_QMAKE_EXECUTABLE})
+  add_RunCMake_test(ObsoleteQtMacros)
+endif()
+
+if("${CMAKE_TEST_GENERATOR}" MATCHES "Visual Studio [^6]")
+  add_RunCMake_test(include_external_msproject)
+  add_RunCMake_test(SolutionGlobalSections)
+endif()
+
+add_RunCMake_test(File_Generate)
+add_RunCMake_test(ExportWithoutLanguage)
+add_RunCMake_test(target_link_libraries)
+add_RunCMake_test(CheckModules)

+ 3 - 0
Tests/RunCMake/install/CMakeLists.txt

@@ -0,0 +1,3 @@
+cmake_minimum_required(VERSION 2.8.12)
+project(${RunCMake_TEST} NONE)
+include(${RunCMake_TEST}.cmake)

+ 4 - 0
Tests/RunCMake/install/RunCMakeTest.cmake

@@ -0,0 +1,4 @@
+include(RunCMake)
+run_cmake(SkipInstallRulesWarning)
+run_cmake(SkipInstallRulesNoWarning1)
+run_cmake(SkipInstallRulesNoWarning2)

+ 9 - 0
Tests/RunCMake/install/SkipInstallRulesNoWarning1-check.cmake

@@ -0,0 +1,9 @@
+if(NOT EXISTS "${RunCMake_TEST_BINARY_DIR}/CMakeCache.txt")
+  message(FATAL_ERROR "missing test prerequisite CMakeCache.txt")
+endif()
+
+set(CMAKE_INSTALL_CMAKE "${RunCMake_TEST_BINARY_DIR}/cmake_install.cmake")
+
+if(EXISTS ${CMAKE_INSTALL_CMAKE})
+  message(FATAL_ERROR "${CMAKE_INSTALL_CMAKE} should not exist")
+endif()

+ 1 - 0
Tests/RunCMake/install/SkipInstallRulesNoWarning1-stderr.txt

@@ -0,0 +1 @@
+^$

+ 1 - 0
Tests/RunCMake/install/SkipInstallRulesNoWarning1.cmake

@@ -0,0 +1 @@
+set(CMAKE_SKIP_INSTALL_RULES ON)

+ 9 - 0
Tests/RunCMake/install/SkipInstallRulesNoWarning2-check.cmake

@@ -0,0 +1,9 @@
+if(NOT EXISTS "${RunCMake_TEST_BINARY_DIR}/CMakeCache.txt")
+  message(FATAL_ERROR "missing test prerequisite CMakeCache.txt")
+endif()
+
+set(CMAKE_INSTALL_CMAKE "${RunCMake_TEST_BINARY_DIR}/cmake_install.cmake")
+
+if(NOT EXISTS ${CMAKE_INSTALL_CMAKE})
+  message(FATAL_ERROR "${CMAKE_INSTALL_CMAKE} should exist")
+endif()

+ 1 - 0
Tests/RunCMake/install/SkipInstallRulesNoWarning2-stderr.txt

@@ -0,0 +1 @@
+^$

+ 1 - 0
Tests/RunCMake/install/SkipInstallRulesNoWarning2.cmake

@@ -0,0 +1 @@
+install(FILES CMakeLists.txt DESTINATION src)

+ 9 - 0
Tests/RunCMake/install/SkipInstallRulesWarning-check.cmake

@@ -0,0 +1,9 @@
+if(NOT EXISTS "${RunCMake_TEST_BINARY_DIR}/CMakeCache.txt")
+  message(FATAL_ERROR "missing test prerequisite CMakeCache.txt")
+endif()
+
+set(CMAKE_INSTALL_CMAKE "${RunCMake_TEST_BINARY_DIR}/cmake_install.cmake")
+
+if(EXISTS ${CMAKE_INSTALL_CMAKE})
+  message(FATAL_ERROR "${CMAKE_INSTALL_CMAKE} should not exist")
+endif()

+ 3 - 0
Tests/RunCMake/install/SkipInstallRulesWarning-stderr.txt

@@ -0,0 +1,3 @@
+CMake Warning in CMakeLists.txt:
+  CMAKE_SKIP_INSTALL_RULES was enabled even though installation rules have
+  been specified

+ 2 - 0
Tests/RunCMake/install/SkipInstallRulesWarning.cmake

@@ -0,0 +1,2 @@
+set(CMAKE_SKIP_INSTALL_RULES ON)
+install(FILES CMakeLists.txt DESTINATION src)