|
|
@@ -5,11 +5,9 @@
|
|
|
#include <algorithm>
|
|
|
#include <assert.h>
|
|
|
#include <iterator>
|
|
|
-#include <limits>
|
|
|
#include <map>
|
|
|
#include <set>
|
|
|
#include <sstream>
|
|
|
-#include <stddef.h>
|
|
|
|
|
|
#include "cmAlgorithms.h"
|
|
|
#include "cmCustomCommand.h"
|
|
|
@@ -35,10 +33,6 @@
|
|
|
#include "cm_auto_ptr.hxx"
|
|
|
#include "cmake.h"
|
|
|
|
|
|
-#ifndef _WIN32
|
|
|
-#include <unistd.h>
|
|
|
-#endif
|
|
|
-
|
|
|
cmNinjaNormalTargetGenerator::cmNinjaNormalTargetGenerator(
|
|
|
cmGeneratorTarget* target)
|
|
|
: cmNinjaTargetGenerator(target)
|
|
|
@@ -546,36 +540,6 @@ std::vector<std::string> cmNinjaNormalTargetGenerator::ComputeLinkCmd()
|
|
|
return std::vector<std::string>();
|
|
|
}
|
|
|
|
|
|
-static int calculateCommandLineLengthLimit(int linkRuleLength)
|
|
|
-{
|
|
|
- static int const limits[] = {
|
|
|
-#ifdef _WIN32
|
|
|
- 8000,
|
|
|
-#endif
|
|
|
-#if defined(__linux)
|
|
|
- // #define MAX_ARG_STRLEN (PAGE_SIZE * 32) in Linux's binfmts.h
|
|
|
- ((int)sysconf(_SC_PAGESIZE) * 32) - 1000,
|
|
|
-#endif
|
|
|
- std::numeric_limits<int>::max()
|
|
|
- };
|
|
|
-
|
|
|
- size_t const arrSz = cmArraySize(limits);
|
|
|
- int sz = *std::min_element(limits, limits + arrSz);
|
|
|
-#if defined(_SC_ARG_MAX)
|
|
|
- // for instance ARG_MAX is 2096152 on Ubuntu or 262144 on Mac
|
|
|
- int const szArgMax = static_cast<int>(sysconf(_SC_ARG_MAX));
|
|
|
- // a return value of -1 signifies an unrestricted value
|
|
|
- if (szArgMax != -1) {
|
|
|
- sz = std::min(sz, szArgMax - 1000);
|
|
|
- }
|
|
|
-#endif
|
|
|
- if (sz == std::numeric_limits<int>::max()) {
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- return sz - linkRuleLength;
|
|
|
-}
|
|
|
-
|
|
|
void cmNinjaNormalTargetGenerator::WriteDeviceLinkStatement()
|
|
|
{
|
|
|
cmGeneratorTarget& genTarget = *this->GetGeneratorTarget();
|
|
|
@@ -761,8 +725,9 @@ void cmNinjaNormalTargetGenerator::WriteDeviceLinkStatement()
|
|
|
|
|
|
// Device linking currently doesn't support response files so
|
|
|
// do not check if the user has explicitly forced a response file.
|
|
|
- int const commandLineLengthLimit = calculateCommandLineLengthLimit(
|
|
|
- globalGen.GetRuleCmdLength(this->LanguageLinkerDeviceRule()));
|
|
|
+ int const commandLineLengthLimit =
|
|
|
+ static_cast<int>(cmSystemTools::CalculateCommandLineLengthLimit()) -
|
|
|
+ globalGen.GetRuleCmdLength(this->LanguageLinkerDeviceRule());
|
|
|
|
|
|
const std::string rspfile =
|
|
|
std::string(cmake::GetCMakeFilesDirectoryPostSlash()) +
|
|
|
@@ -1048,8 +1013,9 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement()
|
|
|
!(this->TargetLinkLanguage == "RC" || this->TargetLinkLanguage == "CUDA");
|
|
|
int commandLineLengthLimit = -1;
|
|
|
if (!lang_supports_response || !this->ForceResponseFile()) {
|
|
|
- commandLineLengthLimit = calculateCommandLineLengthLimit(
|
|
|
- globalGen.GetRuleCmdLength(this->LanguageLinkerRule()));
|
|
|
+ commandLineLengthLimit =
|
|
|
+ static_cast<int>(cmSystemTools::CalculateCommandLineLengthLimit()) -
|
|
|
+ globalGen.GetRuleCmdLength(this->LanguageLinkerRule());
|
|
|
}
|
|
|
|
|
|
const std::string rspfile =
|