diff --git a/CMakeLists.txt b/CMakeLists.txt index f4faca0b1..e83abf7cb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -329,7 +329,7 @@ ENDMACRO (CMAKE_BUILD_UTILITIES) SET(CMake_VERSION_MAJOR 2) SET(CMake_VERSION_MINOR 8) SET(CMake_VERSION_PATCH 1) -SET(CMake_VERSION_RC 2) +SET(CMake_VERSION_RC 3) # We use odd minor numbers for development versions. # Use a date for the development patch level. diff --git a/ChangeLog.manual b/ChangeLog.manual index 60b4b4312..a4dc089bd 100644 --- a/ChangeLog.manual +++ b/ChangeLog.manual @@ -1,3 +1,9 @@ +Changes in CMake 2.8.1 RC 3 +- Add CMAKE_XCODE_ATTRIBUTE_ interface to set compiler (#9125) +- Fix Eclipse files for targets in subdirectories (#9978) +- Fix custom command rule hashes to avoid extra rebuilds +- Print non-make generator name in initial compiler test + Changes in CMake 2.8.1 RC 2 - CPack: Avoid deleting long PATH values with NSIS (#10257) - CTest: Fix and test cost-based test scheduler diff --git a/Modules/CMakeTestCCompiler.cmake b/Modules/CMakeTestCCompiler.cmake index 856a65b47..eeaff7d64 100644 --- a/Modules/CMakeTestCCompiler.cmake +++ b/Modules/CMakeTestCCompiler.cmake @@ -12,13 +12,15 @@ # (To distributed this file outside of CMake, substitute the full # License text for the above reference.) +INCLUDE(CMakeTestCompilerCommon) + # This file is used by EnableLanguage in cmGlobalGenerator to # determine that that selected C compiler can actually compile # and link the most basic of programs. If not, a fatal error # is set and cmake stops processing commands and will not generate # any makefiles or projects. IF(NOT CMAKE_C_COMPILER_WORKS) - MESSAGE(STATUS "Check for working C compiler: ${CMAKE_C_COMPILER}") + PrintTestCompilerStatus("C" "") FILE(WRITE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testCCompiler.c "#ifdef __cplusplus\n" "# error \"The CMAKE_C_COMPILER is set to a C++ compiler\"\n" @@ -38,7 +40,7 @@ IF(NOT CMAKE_C_COMPILER_WORKS) ENDIF(NOT CMAKE_C_COMPILER_WORKS) IF(NOT CMAKE_C_COMPILER_WORKS) - MESSAGE(STATUS "Check for working C compiler: ${CMAKE_C_COMPILER} -- broken") + PrintTestCompilerStatus("C" " -- broken") FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log "Determining if the C compiler works failed with " "the following output:\n${OUTPUT}\n\n") @@ -53,7 +55,7 @@ IF(NOT CMAKE_C_COMPILER_WORKS) "CMake will not be able to correctly generate this project.") ELSE(NOT CMAKE_C_COMPILER_WORKS) IF(C_TEST_WAS_RUN) - MESSAGE(STATUS "Check for working C compiler: ${CMAKE_C_COMPILER} -- works") + PrintTestCompilerStatus("C" " -- works") FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log "Determining if the C compiler works passed with " "the following output:\n${OUTPUT}\n\n") diff --git a/Modules/CMakeTestCXXCompiler.cmake b/Modules/CMakeTestCXXCompiler.cmake index 81b848499..72bb8f2c9 100644 --- a/Modules/CMakeTestCXXCompiler.cmake +++ b/Modules/CMakeTestCXXCompiler.cmake @@ -12,13 +12,15 @@ # (To distributed this file outside of CMake, substitute the full # License text for the above reference.) +INCLUDE(CMakeTestCompilerCommon) + # This file is used by EnableLanguage in cmGlobalGenerator to # determine that that selected C++ compiler can actually compile # and link the most basic of programs. If not, a fatal error # is set and cmake stops processing commands and will not generate # any makefiles or projects. IF(NOT CMAKE_CXX_COMPILER_WORKS) - MESSAGE(STATUS "Check for working CXX compiler: ${CMAKE_CXX_COMPILER}") + PrintTestCompilerStatus("CXX" "") FILE(WRITE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testCXXCompiler.cxx "#ifndef __cplusplus\n" "# error \"The CMAKE_CXX_COMPILER is set to a C compiler\"\n" @@ -31,7 +33,7 @@ IF(NOT CMAKE_CXX_COMPILER_WORKS) ENDIF(NOT CMAKE_CXX_COMPILER_WORKS) IF(NOT CMAKE_CXX_COMPILER_WORKS) - MESSAGE(STATUS "Check for working CXX compiler: ${CMAKE_CXX_COMPILER} -- broken") + PrintTestCompilerStatus("CXX" " -- broken") # if the compiler is broken make sure to remove the platform file # since Windows-cl configures both c/cxx files both need to be removed # when c or c++ fails @@ -46,7 +48,7 @@ IF(NOT CMAKE_CXX_COMPILER_WORKS) "CMake will not be able to correctly generate this project.") ELSE(NOT CMAKE_CXX_COMPILER_WORKS) IF(CXX_TEST_WAS_RUN) - MESSAGE(STATUS "Check for working CXX compiler: ${CMAKE_CXX_COMPILER} -- works") + PrintTestCompilerStatus("CXX" " -- works") FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log "Determining if the CXX compiler works passed with " "the following output:\n${OUTPUT}\n\n") diff --git a/Modules/CMakeTestCompilerCommon.cmake b/Modules/CMakeTestCompilerCommon.cmake new file mode 100644 index 000000000..4307627d9 --- /dev/null +++ b/Modules/CMakeTestCompilerCommon.cmake @@ -0,0 +1,21 @@ + +#============================================================================= +# Copyright 2010 Kitware, Inc. +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distributed this file outside of CMake, substitute the full +# License text for the above reference.) + +function(PrintTestCompilerStatus LANG MSG) + IF(CMAKE_GENERATOR MATCHES Make) + MESSAGE(STATUS "Check for working ${LANG} compiler: ${CMAKE_${LANG}_COMPILER}${MSG}") + ELSE() + MESSAGE(STATUS "Check for working ${LANG} compiler using: ${CMAKE_GENERATOR}${MSG}") + ENDIF() +endfunction() diff --git a/Modules/CMakeTestFortranCompiler.cmake b/Modules/CMakeTestFortranCompiler.cmake index 31857b117..6f419c28b 100644 --- a/Modules/CMakeTestFortranCompiler.cmake +++ b/Modules/CMakeTestFortranCompiler.cmake @@ -12,13 +12,15 @@ # (To distributed this file outside of CMake, substitute the full # License text for the above reference.) +INCLUDE(CMakeTestCompilerCommon) + # This file is used by EnableLanguage in cmGlobalGenerator to # determine that that selected Fortran compiler can actually compile # and link the most basic of programs. If not, a fatal error # is set and cmake stops processing commands and will not generate # any makefiles or projects. IF(NOT CMAKE_Fortran_COMPILER_WORKS) - MESSAGE(STATUS "Check for working Fortran compiler: ${CMAKE_Fortran_COMPILER}") + PrintTestCompilerStatus("Fortran" "") FILE(WRITE ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/testFortranCompiler.f " PROGRAM TESTFortran PRINT *, 'Hello' @@ -31,7 +33,7 @@ IF(NOT CMAKE_Fortran_COMPILER_WORKS) ENDIF(NOT CMAKE_Fortran_COMPILER_WORKS) IF(NOT CMAKE_Fortran_COMPILER_WORKS) - MESSAGE(STATUS "Check for working Fortran compiler: ${CMAKE_Fortran_COMPILER} -- broken") + PrintTestCompilerStatus("Fortran" " -- broken") FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log "Determining if the Fortran compiler works failed with " "the following output:\n${OUTPUT}\n\n") @@ -41,7 +43,7 @@ IF(NOT CMAKE_Fortran_COMPILER_WORKS) "CMake will not be able to correctly generate this project.") ELSE(NOT CMAKE_Fortran_COMPILER_WORKS) IF(FORTRAN_TEST_WAS_RUN) - MESSAGE(STATUS "Check for working Fortran compiler: ${CMAKE_Fortran_COMPILER} -- works") + PrintTestCompilerStatus("Fortran" " -- works") FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log "Determining if the Fortran compiler works passed with " "the following output:\n${OUTPUT}\n\n") diff --git a/Source/cmExtraEclipseCDT4Generator.cxx b/Source/cmExtraEclipseCDT4Generator.cxx index 43c8b21d0..fe914fd23 100644 --- a/Source/cmExtraEclipseCDT4Generator.cxx +++ b/Source/cmExtraEclipseCDT4Generator.cxx @@ -43,9 +43,9 @@ void cmExtraEclipseCDT4Generator entry.Name = this->GetName(); entry.Brief = "Generates Eclipse CDT 4.0 project files."; entry.Full = - "Project files for Eclipse will be created in the top directory " - "and will have a linked resource to every subdirectory which " - "features a CMakeLists.txt file containing a PROJECT() call." + "Project files for Eclipse will be created in the top directory. " + "In out of source builds, a linked resource to the top level source " + "directory will be created." "Additionally a hierarchy of makefiles is generated into the " "build tree. The appropriate make program can build the project through " "the default make target. A \"make install\" target is also provided."; @@ -392,24 +392,24 @@ void cmExtraEclipseCDT4Generator::CreateProjectFile() if (this->IsOutOfSourceBuild) { fout << "\t\n"; - // for each sub project create a linked resource to the source dir - // - only if it is an out-of-source build - for (std::map >::const_iterator - it = this->GlobalGenerator->GetProjectMap().begin(); - it != this->GlobalGenerator->GetProjectMap().end(); - ++it) - { - std::string linkSourceDirectory = this->GetEclipsePath( - it->second[0]->GetMakefile()->GetStartDirectory()); - // .project dir can't be subdir of a linked resource dir - if (!cmSystemTools::IsSubDirectory(this->HomeOutputDirectory.c_str(), + // create a linked resource to CMAKE_SOURCE_DIR + // (this is not done anymore for each project because of + // http://public.kitware.com/Bug/view.php?id=9978 and because I found it + // actually quite confusing in bigger projects with many directories and + // projects, Alex + + std::string sourceLinkedResourceName = "[Source directory]"; + std::string linkSourceDirectory = this->GetEclipsePath( + mf->GetStartDirectory()); + // .project dir can't be subdir of a linked resource dir + if (!cmSystemTools::IsSubDirectory(this->HomeOutputDirectory.c_str(), linkSourceDirectory.c_str())) - { - this->AppendLinkedResource(fout, it->first, - this->GetEclipsePath(linkSourceDirectory)); - this->SrcLinkedResources.push_back(it->first); - } + { + this->AppendLinkedResource(fout, sourceLinkedResourceName, + this->GetEclipsePath(linkSourceDirectory)); + this->SrcLinkedResources.push_back(sourceLinkedResourceName); } + // for EXECUTABLE_OUTPUT_PATH when not in binary dir this->AppendOutLinkedResource(fout, mf->GetSafeDefinition("CMAKE_RUNTIME_OUTPUT_DIRECTORY"), diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index 05c684895..0d6e389ec 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -2758,6 +2758,22 @@ void cmGlobalXCodeGenerator this->CreateString(deploymentTarget)); } + // Put this last so it can override existing settings + // Convert "CMAKE_XCODE_ATTRIBUTE_*" variables directly. + { + std::vector vars = this->CurrentMakefile->GetDefinitions(); + for(std::vector::const_iterator i = vars.begin(); + i != vars.end(); ++i) + { + if(i->find("CMAKE_XCODE_ATTRIBUTE_") == 0) + { + buildSettings->AddAttribute(i->substr(22).c_str(), + this->CreateString( + this->CurrentMakefile->GetDefinition(i->c_str()))); + } + } + } + std::string symroot = root->GetMakefile()->GetCurrentOutputDirectory(); symroot += "/build"; buildSettings->AddAttribute("SYMROOT", this->CreateString(symroot.c_str())); diff --git a/Source/kwsys/kwsysPlatformTests.cmake b/Source/kwsys/kwsysPlatformTests.cmake index 994b7e73e..d042450ee 100644 --- a/Source/kwsys/kwsysPlatformTests.cmake +++ b/Source/kwsys/kwsysPlatformTests.cmake @@ -177,7 +177,7 @@ MACRO(KWSYS_PLATFORM_INFO_TEST lang var description) ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/${var}.bin) # Compile the test binary. - IF(NOT DEFINED ${var}_COMPILED) + IF(NOT EXISTS ${KWSYS_PLATFORM_INFO_FILE}) MESSAGE(STATUS "${description}") TRY_COMPILE(${var}_COMPILED ${CMAKE_CURRENT_BINARY_DIR}