【发布时间】:2019-08-05 11:51:30
【问题描述】:
因此默认情况下使用响应文件来为某些工具链指定编译器和链接器的命令行开关。不过,这似乎只适用于 makefile。考虑到我使用 NMake Makefiles 生成器的场景,可以说这样做是为了绕过 Windows 上命令行的 8192 个字符长度限制。
显然,这些设置应该由CMAKE_<LANG>_USE_RESPONSE_FILE_FOR_OBJECTS 管理,据我所知,它并没有完全记录在案。无论如何,CMake (3.15.1) 发行版附带的各种 CMake 脚本包含这些设置的 0 或 1(即每种语言 <LANG>)。唯一似乎被阅读的地方是cmMakefileTargetGenerator.cxx 中的cmMakefileTargetGenerator::CheckUseResponseFileForObjects()(在撰写本文时)。
补充设置以CMAKE_<LANG>_USE_RESPONSE_FILE_FOR_INCLUDES和CMAKE_<LANG>_USE_RESPONSE_FILE_FOR_LIBRARIES的形式存在。
现在,虽然这在技术上有效,但它确实给我带来了一个不受欢迎的副作用。在自动构建的日志中,我想看看发生了什么(是的,我也在设置CMAKE_VERBOSE_MAKEFILE=ON)。鉴于这些响应文件是动态生成的,我从日志文件中看到的命令行类似于:
C:\PROGRA~2\MICROS~1\2019\PROFES~1\VC\Tools\MSVC\1422~1.279\bin\Hostx86\x86\cl.exe @C:\Users\XA1DB~1.RLM\AppData\Local\Temp\nm2A99.tmp
这意味着我不再能看到正在传递的参数。对于我的目的,输出基本上变得毫无用处。
如何让 CMake 生成生成文件,该文件还会向我显示内联响应文件的内容,以便我可以从构建日志中收集编译器/链接器命令行参数?
注意:不要误会我的意思,我完全理解 Windows 上的现有限制。但是,即使调用编译器或链接器的实际 call 使用响应文件,我也只想查看响应文件内容而不是响应文件名。我正在寻找一种规范的方式来做到这一点,而不必想出一些在下次 CMake 对其内部进行更新时会破坏的 hacky 解决方案。
我还发现看到 2019 年使用的 8.3(替代)路径名称有点令人担忧(给定 fsutil behavior set disable8dot3 1 / NtfsDisable8dot3NameCreation),但也许 CMake 作者有我没有的见解。我在Git repo 的最新源代码中找不到任何设置来配置该行为。
【问题讨论】:
标签: visual-c++ cmake nmake