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.
This commit is contained in:
parent
0c20967a6b
commit
aaa88d33a9
@ -98,7 +98,6 @@ INCLUDE(CMakeCommonLanguageInclude)
|
|||||||
|
|
||||||
# CMAKE_C_CREATE_SHARED_LIBRARY
|
# CMAKE_C_CREATE_SHARED_LIBRARY
|
||||||
# CMAKE_C_CREATE_SHARED_MODULE
|
# CMAKE_C_CREATE_SHARED_MODULE
|
||||||
# CMAKE_C_CREATE_STATIC_LIBRARY
|
|
||||||
# CMAKE_C_COMPILE_OBJECT
|
# CMAKE_C_COMPILE_OBJECT
|
||||||
# CMAKE_C_LINK_EXECUTABLE
|
# 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})
|
SET(CMAKE_C_CREATE_SHARED_MODULE ${CMAKE_C_CREATE_SHARED_LIBRARY})
|
||||||
ENDIF(NOT CMAKE_C_CREATE_SHARED_MODULE)
|
ENDIF(NOT CMAKE_C_CREATE_SHARED_MODULE)
|
||||||
|
|
||||||
# create a C static library
|
# Create a static archive incrementally for large object file counts.
|
||||||
IF(NOT CMAKE_C_CREATE_STATIC_LIBRARY)
|
# If CMAKE_C_CREATE_STATIC_LIBRARY is set it will override these.
|
||||||
SET(CMAKE_C_CREATE_STATIC_LIBRARY
|
SET(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> cr <TARGET> <LINK_FLAGS> <OBJECTS>")
|
||||||
"<CMAKE_AR> cr <TARGET> <LINK_FLAGS> <OBJECTS> "
|
SET(CMAKE_C_ARCHIVE_APPEND "<CMAKE_AR> r <TARGET> <LINK_FLAGS> <OBJECTS>")
|
||||||
"<CMAKE_RANLIB> <TARGET> ")
|
SET(CMAKE_C_ARCHIVE_FINISH "<CMAKE_RANLIB> <TARGET>")
|
||||||
ENDIF(NOT CMAKE_C_CREATE_STATIC_LIBRARY)
|
|
||||||
|
|
||||||
# compile a C file into an object file
|
# compile a C file into an object file
|
||||||
IF(NOT CMAKE_C_COMPILE_OBJECT)
|
IF(NOT CMAKE_C_COMPILE_OBJECT)
|
||||||
|
@ -176,7 +176,6 @@ INCLUDE(CMakeCommonLanguageInclude)
|
|||||||
# now define the following rules:
|
# now define the following rules:
|
||||||
# CMAKE_CXX_CREATE_SHARED_LIBRARY
|
# CMAKE_CXX_CREATE_SHARED_LIBRARY
|
||||||
# CMAKE_CXX_CREATE_SHARED_MODULE
|
# CMAKE_CXX_CREATE_SHARED_MODULE
|
||||||
# CMAKE_CXX_CREATE_STATIC_LIBRARY
|
|
||||||
# CMAKE_CXX_COMPILE_OBJECT
|
# CMAKE_CXX_COMPILE_OBJECT
|
||||||
# CMAKE_CXX_LINK_EXECUTABLE
|
# CMAKE_CXX_LINK_EXECUTABLE
|
||||||
|
|
||||||
@ -212,12 +211,11 @@ IF(NOT CMAKE_CXX_CREATE_SHARED_MODULE)
|
|||||||
ENDIF(NOT CMAKE_CXX_CREATE_SHARED_MODULE)
|
ENDIF(NOT CMAKE_CXX_CREATE_SHARED_MODULE)
|
||||||
|
|
||||||
|
|
||||||
# create a C++ static library
|
# Create a static archive incrementally for large object file counts.
|
||||||
IF(NOT CMAKE_CXX_CREATE_STATIC_LIBRARY)
|
# If CMAKE_CXX_CREATE_STATIC_LIBRARY is set it will override these.
|
||||||
SET(CMAKE_CXX_CREATE_STATIC_LIBRARY
|
SET(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> cr <TARGET> <LINK_FLAGS> <OBJECTS>")
|
||||||
"<CMAKE_AR> cr <TARGET> <LINK_FLAGS> <OBJECTS> "
|
SET(CMAKE_CXX_ARCHIVE_APPEND "<CMAKE_AR> r <TARGET> <LINK_FLAGS> <OBJECTS>")
|
||||||
"<CMAKE_RANLIB> <TARGET> ")
|
SET(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> <TARGET>")
|
||||||
ENDIF(NOT CMAKE_CXX_CREATE_STATIC_LIBRARY)
|
|
||||||
|
|
||||||
# compile a C++ file into an object file
|
# compile a C++ file into an object file
|
||||||
IF(NOT CMAKE_CXX_COMPILE_OBJECT)
|
IF(NOT CMAKE_CXX_COMPILE_OBJECT)
|
||||||
|
@ -119,7 +119,6 @@ INCLUDE(CMakeCommonLanguageInclude)
|
|||||||
# now define the following rule variables
|
# now define the following rule variables
|
||||||
# CMAKE_Fortran_CREATE_SHARED_LIBRARY
|
# CMAKE_Fortran_CREATE_SHARED_LIBRARY
|
||||||
# CMAKE_Fortran_CREATE_SHARED_MODULE
|
# CMAKE_Fortran_CREATE_SHARED_MODULE
|
||||||
# CMAKE_Fortran_CREATE_STATIC_LIBRARY
|
|
||||||
# CMAKE_Fortran_COMPILE_OBJECT
|
# CMAKE_Fortran_COMPILE_OBJECT
|
||||||
# CMAKE_Fortran_LINK_EXECUTABLE
|
# 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})
|
SET(CMAKE_Fortran_CREATE_SHARED_MODULE ${CMAKE_Fortran_CREATE_SHARED_LIBRARY})
|
||||||
ENDIF(NOT CMAKE_Fortran_CREATE_SHARED_MODULE)
|
ENDIF(NOT CMAKE_Fortran_CREATE_SHARED_MODULE)
|
||||||
|
|
||||||
# create a Fortran static library
|
# Create a static archive incrementally for large object file counts.
|
||||||
IF(NOT CMAKE_Fortran_CREATE_STATIC_LIBRARY)
|
# If CMAKE_Fortran_CREATE_STATIC_LIBRARY is set it will override these.
|
||||||
SET(CMAKE_Fortran_CREATE_STATIC_LIBRARY
|
SET(CMAKE_Fortran_ARCHIVE_CREATE "<CMAKE_AR> cr <TARGET> <LINK_FLAGS> <OBJECTS>")
|
||||||
"<CMAKE_AR> cr <TARGET> <LINK_FLAGS> <OBJECTS> "
|
SET(CMAKE_Fortran_ARCHIVE_APPEND "<CMAKE_AR> r <TARGET> <LINK_FLAGS> <OBJECTS>")
|
||||||
"<CMAKE_RANLIB> <TARGET> ")
|
SET(CMAKE_Fortran_ARCHIVE_FINISH "<CMAKE_RANLIB> <TARGET>")
|
||||||
ENDIF(NOT CMAKE_Fortran_CREATE_STATIC_LIBRARY)
|
|
||||||
|
|
||||||
# compile a Fortran file into an object file
|
# compile a Fortran file into an object file
|
||||||
IF(NOT CMAKE_Fortran_COMPILE_OBJECT)
|
IF(NOT CMAKE_Fortran_COMPILE_OBJECT)
|
||||||
|
@ -612,12 +612,15 @@ void cmMakefileLibraryTargetGenerator::WriteLibraryRules
|
|||||||
}
|
}
|
||||||
|
|
||||||
// For static libraries there might be archiving rules.
|
// For static libraries there might be archiving rules.
|
||||||
|
bool haveStaticLibraryRule = false;
|
||||||
std::vector<std::string> archiveCreateCommands;
|
std::vector<std::string> archiveCreateCommands;
|
||||||
std::vector<std::string> archiveAppendCommands;
|
std::vector<std::string> archiveAppendCommands;
|
||||||
std::vector<std::string> archiveFinishCommands;
|
std::vector<std::string> archiveFinishCommands;
|
||||||
std::string::size_type archiveCommandLimit = std::string::npos;
|
std::string::size_type archiveCommandLimit = std::string::npos;
|
||||||
if(this->Target->GetType() == cmTarget::STATIC_LIBRARY)
|
if(this->Target->GetType() == cmTarget::STATIC_LIBRARY)
|
||||||
{
|
{
|
||||||
|
haveStaticLibraryRule =
|
||||||
|
this->Makefile->GetDefinition(linkRuleVar)? true:false;
|
||||||
std::string arCreateVar = "CMAKE_";
|
std::string arCreateVar = "CMAKE_";
|
||||||
arCreateVar += linkLanguage;
|
arCreateVar += linkLanguage;
|
||||||
arCreateVar += "_ARCHIVE_CREATE";
|
arCreateVar += "_ARCHIVE_CREATE";
|
||||||
@ -643,6 +646,7 @@ void cmMakefileLibraryTargetGenerator::WriteLibraryRules
|
|||||||
|
|
||||||
// Decide whether to use archiving rules.
|
// Decide whether to use archiving rules.
|
||||||
bool useArchiveRules =
|
bool useArchiveRules =
|
||||||
|
!haveStaticLibraryRule &&
|
||||||
!archiveCreateCommands.empty() && !archiveAppendCommands.empty();
|
!archiveCreateCommands.empty() && !archiveAppendCommands.empty();
|
||||||
if(useArchiveRules)
|
if(useArchiveRules)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user