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