<p><br>
On Jul 8, 2012 10:59 PM, &quot;Zaheer Chothia&quot; &lt;<a href="mailto:zaheer.chothia@gmail.com">zaheer.chothia@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt; Hello,<br>
&gt;<br>
&gt; I posted a mail here [1] but have yet to receive any replies.  I think my last<br>
&gt; message was too long and detailed so let me summarize:<br>
&gt; * Command line length is limited on Windows.<br>
&gt; * To alleviate this, CMake places object files into a response file, but the<br>
&gt;   same is not done for libraries.<br>
&gt; * This can pose a problem when the link line becomes too long.<br>
&gt;<br>
&gt; I am primarily interested in a solution for the Ninja generator, although this<br>
&gt; issue affects other generators too.  My previous mail contains a testcase and<br>
&gt; proposed solution.  In the interim another issue [2] was posted, but that is<br>
&gt; orthogonal and does not solve what is discussed here.</p>
<p>I&#39;d suggest you raise a defect. Kitware are pretty good at fixing things or suggesting temporary workarounds until the underlying issue is fixed.</p>
<p>&gt;<br>
&gt; Kind regards,<br>
&gt;<br>
&gt; --Zaheer<br>
&gt;<br>
&gt; [1]: <a href="http://www.cmake.org/pipermail/cmake/2012-June/051065.html">http://www.cmake.org/pipermail/cmake/2012-June/051065.html</a><br>
&gt; [2]: <a href="http://public.kitware.com/Bug/view.php?id=13366">http://public.kitware.com/Bug/view.php?id=13366</a><br>
&gt;<br>
&gt; On Thu, Jun 28, 2012 at 3:50 PM, Zaheer Chothia &lt;<a href="mailto:zaheer.chothia@gmail.com">zaheer.chothia@gmail.com</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; Hello,<br>
&gt;&gt;<br>
&gt;&gt; I encountered an issue while building a CMake project where one target is linked<br>
&gt;&gt; against a large number of libraries.  Unlike object files, libraries are not<br>
&gt;&gt; placed into a response file, which can lead to build commands which exceed the<br>
&gt;&gt; length limits on Windows.  For reference, I am using the CMake 2.8.9-rc1 and<br>
&gt;&gt; Ninja generator with Microsoft compilers.<br>
&gt;&gt;<br>
&gt;&gt; Following this mail is a testcase generator [1] to demonstrate this issue<br>
&gt;&gt; (sample project attached for convenience).  The build fails with this error (for<br>
&gt;&gt; readibility I replaced a long sequence of libraries with &lt;...&gt;):<br>
&gt;&gt;<br>
&gt;&gt;     FAILED: cmd.exe /c cd. &amp;&amp; &quot;C:\Program Files<br>
&gt;&gt; (x86)\CMake\bin\cmake.exe&quot; -E vs_link_exe<br>
&gt;&gt; C:\PROGRA~2\MICROS~3.0\VC\bin\cl.exe  /nologo @hello.exe.rsp  /DWIN32<br>
&gt;&gt; /D_WINDOWS /W3 /Zm1000 /D_DEBUG /MDd /Zi  /Ob0 /Od /RTC1 /Fehello.exe<br>
&gt;&gt; /Fdhello.pdb -link /implib:hello.lib /version:0.0  /STACK:10000000<br>
&gt;&gt; /machine:X86  /debug /INCREMENTAL /subsystem:console<br>
&gt;&gt; src\abcdefghijklmnopqrstuvwxyz0123456789\library1.lib<br>
&gt;&gt; src\abcdefghijklmnopqrstuvwxyz0123456789\library2.lib &lt;...&gt;<br>
&gt;&gt; kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib<br>
&gt;&gt; oleaut32.lib uuid.lib comdlg32.lib advapi32.lib &amp;&amp; cd.<br>
&gt;&gt;     The command line is too long.<br>
&gt;&gt;<br>
&gt;&gt;     ninja: build stopped: subcommand failed.<br>
&gt;&gt;<br>
&gt;&gt; Although this example may seem artificial, with the use case I refer to (i)<br>
&gt;&gt; libraries are are specified by absolute paths so they are indeed reasonably long<br>
&gt;&gt; and (ii) since there are third-party libraries involved I would not be able to<br>
&gt;&gt; simply combine source files into one large library as is possible here.  I<br>
&gt;&gt; should also mention that this issue does not affect the Visual Studio<br>
&gt;&gt; generators, however it is present with the following: Ninja, MinGW<br>
&gt;&gt; Makefiles, NMake Makefiles, MSYS Makefiles.  For Ninja I suspect that the<br>
&gt;&gt; indirection via cmd.exe imposes a maximum command length of 8192 KB, whereas for<br>
&gt;&gt; the others this will likely be 32 KB (CreateProcess).<br>
&gt;&gt;<br>
&gt;&gt; I would be quite content if this is fixed for the Ninja generator.  A simple fix<br>
&gt;&gt; would be to adapt the build rules by moving $LINK_LIBRARIES from &#39;command&#39; to<br>
&gt;&gt; &#39;rspfile_content&#39;:<br>
&gt;&gt;<br>
&gt;&gt;     --- rules.ninja.bak 2012-06-28 15:23:35 +0100<br>
&gt;&gt;     +++ rules.ninja     2012-06-28 15:38:09 +0100<br>
&gt;&gt;     @@ -40,10 +40,10 @@<br>
&gt;&gt;      # Rule for linking C executable.<br>
&gt;&gt;<br>
&gt;&gt;      rule C_EXECUTABLE_LINKER_RSPFILE<br>
&gt;&gt;     -  command = cmd.exe /c $PRE_LINK &amp;&amp; &quot;C:\Program Files<br>
&gt;&gt; (x86)\CMake\bin\cmake.exe&quot; -E vs_link_exe<br>
&gt;&gt; C:\PROGRA~2\MICROS~3.0\VC\bin\cl.exe  /nologo @$out.rsp  $FLAGS<br>
&gt;&gt; /Fe$out /Fd$TARGET_PDB -link /implib:$TARGET_IMPLIB /version:0.0<br>
&gt;&gt; $LINK_FLAGS $LINK_LIBRARIES &amp;&amp; $POST_BUILD<br>
&gt;&gt;     +  command = cmd.exe /c $PRE_LINK &amp;&amp; &quot;C:\Program Files<br>
&gt;&gt; (x86)\CMake\bin\cmake.exe&quot; -E vs_link_exe<br>
&gt;&gt; C:\PROGRA~2\MICROS~3.0\VC\bin\cl.exe  /nologo @$out.rsp  $FLAGS<br>
&gt;&gt; /Fe$out /Fd$TARGET_PDB -link /implib:$TARGET_IMPLIB /version:0.0<br>
&gt;&gt; $LINK_FLAGS &amp;&amp; $POST_BUILD<br>
&gt;&gt;        description = Linking C executable $out<br>
&gt;&gt;        rspfile = $out.rsp<br>
&gt;&gt;     -  rspfile_content = $in<br>
&gt;&gt;     +  rspfile_content = $in $LINK_LIBRARIES<br>
&gt;&gt;<br>
&gt;&gt; Best,<br>
&gt;&gt;<br>
&gt;&gt; --Zaheer<br>
&gt;&gt;<br>
&gt;&gt; ---- [1]: BEGIN: testcase.sh ---------------------------------------------------<br>
&gt;&gt; #!/bin/bash -e<br>
&gt;&gt;<br>
&gt;&gt; NUM_LIBRARIES=500<br>
&gt;&gt; # Use a long path to quickly exhaust the command-line length limit.<br>
&gt;&gt; SRC_DIR=src/abcdefghijklmnopqrstuvwxyz0123456789<br>
&gt;&gt;<br>
&gt;&gt; # Root directory: application and CMakeLists.txt<br>
&gt;&gt; echo &quot;int main() { return 0; }&quot; &gt; hello.c<br>
&gt;&gt;<br>
&gt;&gt; cat &lt;&lt; EOF &gt; CMakeLists.txt<br>
&gt;&gt; cmake_minimum_required(VERSION 2.8)<br>
&gt;&gt;<br>
&gt;&gt; project(Hello)<br>
&gt;&gt;<br>
&gt;&gt; add_subdirectory($SRC_DIR)<br>
&gt;&gt;<br>
&gt;&gt; add_executable(hello hello.c)<br>
&gt;&gt; target_link_libraries(hello<br>
&gt;&gt; EOF<br>
&gt;&gt;<br>
&gt;&gt; for ((i = 1; i &lt;= $NUM_LIBRARIES; i++)); do<br>
&gt;&gt;     echo &quot;    library$i&quot; &gt;&gt; &quot;CMakeLists.txt&quot;<br>
&gt;&gt; done<br>
&gt;&gt;<br>
&gt;&gt; echo &quot;)&quot; &gt;&gt; &quot;CMakeLists.txt&quot;<br>
&gt;&gt;<br>
&gt;&gt; # Libraries: sources and CMakeLists.txt<br>
&gt;&gt; mkdir -p &quot;$SRC_DIR&quot;<br>
&gt;&gt; [[ -f &quot;$SRC_DIR/CMakeLists.txt&quot; ]] &amp;&amp; rm &quot;$SRC_DIR/CMakeLists.txt&quot;<br>
&gt;&gt; for ((i = 1; i &lt;= $NUM_LIBRARIES; i++)); do<br>
&gt;&gt;     echo &quot;int function$i() { return $i; }&quot; &gt; &quot;$SRC_DIR/function$i.c&quot;<br>
&gt;&gt;     echo &quot;add_library(library$i function$i.c)&quot; &gt;&gt; &quot;$SRC_DIR/CMakeLists.txt&quot;<br>
&gt;&gt; done<br>
&gt;&gt;<br>
&gt;&gt; echo &quot;Testcase has been setup: now build with CMake and Ninja generator.&quot;<br>
&gt;&gt; ---- [1]: END: testcase.sh ---------------------------------------------------<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt; --<br>
&gt;<br>
&gt; Powered by <a href="http://www.kitware.com">www.kitware.com</a><br>
&gt;<br>
&gt; Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html">http://www.kitware.com/opensource/opensource.html</a><br>
&gt;<br>
&gt; Please keep messages on-topic and check the CMake FAQ at: <a href="http://www.cmake.org/Wiki/CMake_FAQ">http://www.cmake.org/Wiki/CMake_FAQ</a><br>
&gt;<br>
&gt; Follow this link to subscribe/unsubscribe:<br>
&gt; <a href="http://www.cmake.org/mailman/listinfo/cmake">http://www.cmake.org/mailman/listinfo/cmake</a><br>
</p>