mingw32-make:"输入行太长"的问题

hjs*_*ger 5 open-source mingw codeblocks

我们有一个在Windows 2003机器上运行的Makefile,我们正在使用mingw32-make.由于生成文件有许多包含路径,它超过8K的缓冲区大小意味着cmd可以处理[参考文献- http://support.microsoft.com/kb/830473/EN-US/由于该编译的结果为"输入行太久"问题.

我想知道以下内容 -

  1. 什么是优化Makefile的最佳方法,因为我已经删除了不需要的编译器开关,包括路径等.

  2. 有没有什么办法可以将所有INCLUDE路径放在一个.txt文件中并将其导入Makefile.I找不到任何相同的mingw32文档.

我们非常欢迎任何其他输入/提示/参考链接.

谢谢,
-HJSblogger

pax*_*blo 4

我们采取的一种方法(这并不是因为我们用完了命令行空间,只是因为我们想要一个更干净的构建系统)是让每个“模块”在通道中进行构建。

举例来说,假设您有 3 个模块:A、B 和 C。

您的控制 makefile 只需调用具有相同目标的每个模块 makefile。

然后我们将目标设置为一致的 clean、header、lib 和 exec。

所以,控制 makefile 是这样的:

modules=A B C
clean:
    for i in $modules:
        ( cd $i ; make clean ; cd .. )
header:
    for i in $modules:
        ( cd $i ; make header ; cd .. )
lib:
    for i in $modules:
        ( cd $i ; make lib ; cd .. )
exec:
    for i in $modules:
        ( cd $i ; make exec ; cd .. )
Run Code Online (Sandbox Code Playgroud)

每个具有其他模块所需的头文件的模块都会在头阶段将这些头文件复制到中央位置。然后,在 lib 或 exec 阶段,每个模块只需使用该中心位置来定位其所有标头。这也限制模块只能使用其他模块发布到中心位置的标头。

同样,创建 exec 阶段所需的库的每个模块都会将该库复制到中央位置。这极大地减少了构建命令中的-I(包含目录)和(库目录)子句。-L

make clean header lib exec使用该方案,您只需在顶层执行即可重建整个事物(或者放弃clean适当的 make 构建,考虑到依赖性)。

这是解决问题的一种方法,但我实际上想知道你是如何超出限制的。8K,即使每个路径有 25 个字符,也需要大约 300 个不同的包含路径。你的层次结构真的那么庞大吗?

更新1:

如果您正在寻找一种快速而肮脏的方法来使其工作而不更改 makefile“体系结构”,您可以编写一个脚本,在给定目录列表的情况下,该脚本会将所有头文件从这些目录复制到中央位置。

然后将其作为所有规则的第一步运行,并修改编译行中的 include 语句以仅引用该位置而不是大列表。您甚至可以分阶段进行复制(例如,一次 20 个目录 x 20 次总共可以处理 400 个目录)。

这为您提供了与我建议的解决方案相同的效果,但对 makefile 的更改较小。

更新2:

正如您在评论中所述,另一种解决方案是为路径添加别名。

您应该能够通过subst.exe以下方式做到这一点:

> subst x: "c:\Documents and Settings\Pax\My Documents\Not my directory"
> dir x:
  Volume in drive X has no label.
  Volume Serial Number is 8AA3-703A

  Directory of X:\

  08/09/2009  10:12 AM    <DIR>          .
  08/09/2009  10:12 AM    <DIR>          ..
  24/08/2009  01:54 PM             6,409 p0rn_sites.txt
  09/07/2008  02:49 PM    <DIR>          downloaded_p0rn
  : : :
  09/07/2008  02:52 PM    <DIR>          other_suspect_stuff
                 3 File(s)         18,520 bytes
                18 Dir(s)  63,840,849,920 bytes free

> subst x: /d
> dir x:
  The system cannot find the path specified.
Run Code Online (Sandbox Code Playgroud)