From 097e26f4908b3099f112c3fdc5e043234f9adc53 Mon Sep 17 00:00:00 2001 From: Ben Boeckel Date: Wed, 14 Jan 2015 13:11:44 -0500 Subject: [PATCH] ninja: use the minimum of all command line length limits (#14892) When choosing whether to use a response file, consider several possible command line length limits for the current operating system, and choose the smallest. --- Source/cmNinjaNormalTargetGenerator.cxx | 29 +++++++++++++++++++------ 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/Source/cmNinjaNormalTargetGenerator.cxx b/Source/cmNinjaNormalTargetGenerator.cxx index a05719d8d..5595557c1 100644 --- a/Source/cmNinjaNormalTargetGenerator.cxx +++ b/Source/cmNinjaNormalTargetGenerator.cxx @@ -22,6 +22,7 @@ #include #include +#include #ifndef _WIN32 #include @@ -371,15 +372,29 @@ cmNinjaNormalTargetGenerator static int calculateCommandLineLengthLimit(int linkRuleLength) { + static int const limits[] = { #ifdef _WIN32 - return 8000 - linkRuleLength; -#elif defined(__linux) || defined(__APPLE__) || defined(__HAIKU__) - // for instance ARG_MAX is 2096152 on Ubuntu or 262144 on Mac - return ((int)sysconf(_SC_ARG_MAX)) - linkRuleLength - 1000; -#else - (void)linkRuleLength; - return -1; + 8000, #endif +#if defined(__APPLE__) || defined(__HAIKU__) || defined(__linux) + // for instance ARG_MAX is 2096152 on Ubuntu or 262144 on Mac + ((int)sysconf(_SC_ARG_MAX)) - 1000, +#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::max() + }; + + size_t const arrSz = cmArraySize(limits); + int const sz = *std::min_element(limits, limits + arrSz); + if (sz == std::numeric_limits::max()) + { + return -1; + } + + return sz - linkRuleLength; }