From aaa88d33a96c3006e7a862b9d60eaaac774890cd Mon Sep 17 00:00:00 2001 From: Brad King Date: Mon, 4 Aug 2008 11:37:19 -0400 Subject: [PATCH] ENH: Build large archives incrementally Creation of archive libraries with the unix 'ar' tool should be done incrementally when the number of object files is large. This avoids problems with the command line getting too many arguments. --- Modules/CMakeCInformation.cmake | 12 +++++------- Modules/CMakeCXXInformation.cmake | 12 +++++------- Modules/CMakeFortranInformation.cmake | 12 +++++------- Source/cmMakefileLibraryTargetGenerator.cxx | 4 ++++ 4 files changed, 19 insertions(+), 21 deletions(-) diff --git a/Modules/CMakeCInformation.cmake b/Modules/CMakeCInformation.cmake index e3a8d93435..a2ad460f9a 100644 --- a/Modules/CMakeCInformation.cmake +++ b/Modules/CMakeCInformation.cmake @@ -98,7 +98,6 @@ INCLUDE(CMakeCommonLanguageInclude) # CMAKE_C_CREATE_SHARED_LIBRARY # CMAKE_C_CREATE_SHARED_MODULE -# CMAKE_C_CREATE_STATIC_LIBRARY # CMAKE_C_COMPILE_OBJECT # CMAKE_C_LINK_EXECUTABLE @@ -133,12 +132,11 @@ IF(NOT CMAKE_C_CREATE_SHARED_MODULE) SET(CMAKE_C_CREATE_SHARED_MODULE ${CMAKE_C_CREATE_SHARED_LIBRARY}) ENDIF(NOT CMAKE_C_CREATE_SHARED_MODULE) -# create a C static library -IF(NOT CMAKE_C_CREATE_STATIC_LIBRARY) - SET(CMAKE_C_CREATE_STATIC_LIBRARY - " cr " - " ") -ENDIF(NOT CMAKE_C_CREATE_STATIC_LIBRARY) +# Create a static archive incrementally for large object file counts. +# If CMAKE_C_CREATE_STATIC_LIBRARY is set it will override these. +SET(CMAKE_C_ARCHIVE_CREATE " cr ") +SET(CMAKE_C_ARCHIVE_APPEND " r ") +SET(CMAKE_C_ARCHIVE_FINISH " ") # compile a C file into an object file IF(NOT CMAKE_C_COMPILE_OBJECT) diff --git a/Modules/CMakeCXXInformation.cmake b/Modules/CMakeCXXInformation.cmake index 65c590248c..c5608e0ad9 100644 --- a/Modules/CMakeCXXInformation.cmake +++ b/Modules/CMakeCXXInformation.cmake @@ -176,7 +176,6 @@ INCLUDE(CMakeCommonLanguageInclude) # now define the following rules: # CMAKE_CXX_CREATE_SHARED_LIBRARY # CMAKE_CXX_CREATE_SHARED_MODULE -# CMAKE_CXX_CREATE_STATIC_LIBRARY # CMAKE_CXX_COMPILE_OBJECT # CMAKE_CXX_LINK_EXECUTABLE @@ -212,12 +211,11 @@ IF(NOT CMAKE_CXX_CREATE_SHARED_MODULE) ENDIF(NOT CMAKE_CXX_CREATE_SHARED_MODULE) -# create a C++ static library -IF(NOT CMAKE_CXX_CREATE_STATIC_LIBRARY) - SET(CMAKE_CXX_CREATE_STATIC_LIBRARY - " cr " - " ") -ENDIF(NOT CMAKE_CXX_CREATE_STATIC_LIBRARY) +# Create a static archive incrementally for large object file counts. +# If CMAKE_CXX_CREATE_STATIC_LIBRARY is set it will override these. +SET(CMAKE_CXX_ARCHIVE_CREATE " cr ") +SET(CMAKE_CXX_ARCHIVE_APPEND " r ") +SET(CMAKE_CXX_ARCHIVE_FINISH " ") # compile a C++ file into an object file IF(NOT CMAKE_CXX_COMPILE_OBJECT) diff --git a/Modules/CMakeFortranInformation.cmake b/Modules/CMakeFortranInformation.cmake index d760de39a7..4615737849 100644 --- a/Modules/CMakeFortranInformation.cmake +++ b/Modules/CMakeFortranInformation.cmake @@ -119,7 +119,6 @@ INCLUDE(CMakeCommonLanguageInclude) # now define the following rule variables # CMAKE_Fortran_CREATE_SHARED_LIBRARY # CMAKE_Fortran_CREATE_SHARED_MODULE -# CMAKE_Fortran_CREATE_STATIC_LIBRARY # CMAKE_Fortran_COMPILE_OBJECT # CMAKE_Fortran_LINK_EXECUTABLE @@ -134,12 +133,11 @@ IF(NOT CMAKE_Fortran_CREATE_SHARED_MODULE) SET(CMAKE_Fortran_CREATE_SHARED_MODULE ${CMAKE_Fortran_CREATE_SHARED_LIBRARY}) ENDIF(NOT CMAKE_Fortran_CREATE_SHARED_MODULE) -# create a Fortran static library -IF(NOT CMAKE_Fortran_CREATE_STATIC_LIBRARY) - SET(CMAKE_Fortran_CREATE_STATIC_LIBRARY - " cr " - " ") -ENDIF(NOT CMAKE_Fortran_CREATE_STATIC_LIBRARY) +# Create a static archive incrementally for large object file counts. +# If CMAKE_Fortran_CREATE_STATIC_LIBRARY is set it will override these. +SET(CMAKE_Fortran_ARCHIVE_CREATE " cr ") +SET(CMAKE_Fortran_ARCHIVE_APPEND " r ") +SET(CMAKE_Fortran_ARCHIVE_FINISH " ") # compile a Fortran file into an object file IF(NOT CMAKE_Fortran_COMPILE_OBJECT) diff --git a/Source/cmMakefileLibraryTargetGenerator.cxx b/Source/cmMakefileLibraryTargetGenerator.cxx index 03b9622f72..7bd12a04e7 100644 --- a/Source/cmMakefileLibraryTargetGenerator.cxx +++ b/Source/cmMakefileLibraryTargetGenerator.cxx @@ -612,12 +612,15 @@ void cmMakefileLibraryTargetGenerator::WriteLibraryRules } // For static libraries there might be archiving rules. + bool haveStaticLibraryRule = false; std::vector archiveCreateCommands; std::vector archiveAppendCommands; std::vector archiveFinishCommands; std::string::size_type archiveCommandLimit = std::string::npos; if(this->Target->GetType() == cmTarget::STATIC_LIBRARY) { + haveStaticLibraryRule = + this->Makefile->GetDefinition(linkRuleVar)? true:false; std::string arCreateVar = "CMAKE_"; arCreateVar += linkLanguage; arCreateVar += "_ARCHIVE_CREATE"; @@ -643,6 +646,7 @@ void cmMakefileLibraryTargetGenerator::WriteLibraryRules // Decide whether to use archiving rules. bool useArchiveRules = + !haveStaticLibraryRule && !archiveCreateCommands.empty() && !archiveAppendCommands.empty(); if(useArchiveRules) {