diff --git a/CMakeLists.txt b/CMakeLists.txt index c3819214..8f5f59c2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -331,6 +331,12 @@ get_target_property(LDC_LOC ${LDC_EXE} LOCATION) # # LDMD # +include(CheckSymbolExists) +CHECK_SYMBOL_EXISTS(_SC_ARG_MAX "unistd.h" HAVE_SC_ARG_MAX) +if (HAVE_SC_ARG_MAX) + add_definitions(-DHAVE_SC_ARG_MAX) +endif() + set_source_files_properties(dmd2/root/response.c dmd2/root/man.c PROPERTIES LANGUAGE CXX) add_executable(${LDMD_EXE} dmd2/root/response.c dmd2/root/man.c driver/ldmd.cpp) set_target_properties(${LDMD_EXE} PROPERTIES diff --git a/driver/ldmd.cpp b/driver/ldmd.cpp index 567982b9..a4a6dd9c 100644 --- a/driver/ldmd.cpp +++ b/driver/ldmd.cpp @@ -55,6 +55,10 @@ #include "llvm/Support/SystemUtils.h" #include "llvm/Support/raw_ostream.h" +#ifdef HAVE_SC_ARG_MAX +# include +#endif + namespace ls = llvm::sys; // We reuse DMD's response file parsing routine for maximum compatibilty - it @@ -784,13 +788,15 @@ void buildCommandLine(std::vector& r, const Params& p) */ size_t maxCommandLineLen() { -#ifdef WINDOWS - // http://blogs.msdn.com/b/oldnewthing/archive/2003/12/10/56028.aspx - return 32767; -#else +#if defined(HAVE_SC_ARG_MAX) // http://www.in-ulm.de/~mascheck/various/argmax – the factor 2 is just // a wild guess to account for the enviroment. return sysconf(_SC_ARG_MAX) / 2; +#elif defined(_WIN32) + // http://blogs.msdn.com/b/oldnewthing/archive/2003/12/10/56028.aspx + return 32767; +#else +# error "Do not know how to determine maximum command line length." #endif }