回显输出到输入字符串大于Windows命令长度限制的文件

时间:2019-06-26 11:08:54

标签: echo gnu-make

我需要所有目标文件名的列表,并将路径写入文本文件。由于它是V3.79,所以我无法使用GNU make的文件功能。这个列表真的很庞大,因为它是一个很大的项目,因此我遇到了“ make(e = 87):参数不正确”错误,因为它超过了32K Windows命令行长度限制。

最初的问题是我需要将对象列表作为参数传递给archiver.exe来创建一个库,该库也产生了e = 87问题。它与列出的问题here几乎相同。那是我决定将此列表放入文本文件并将该文件作为参数传递给archiver.exe的时候。但是我受困是因为创建文件本身会产生相同的错误。以下是我尝试的方法:

MY_OBJECTS = $(shell $(FIND) $(MY_OBJPATH) -name '*.o')
MY_OBJECTSLIST = objlist.txt
all:
     @echo $(MY_OBJECTS) > $(MY_OBJECTSLIST)

我需要一种解决方案,以某种方式将整个对象列表放入文本文件。

2 个答案:

答案 0 :(得分:0)

您可以使用file功能。

all:
     $(file > $(MY_OBJECTSLIST) $(MY_OBJECTS))

请注意,对MY_OBJECTS文件的搜索会在评估MY_OBJECTS之后立即进行,无论您是否正在运行相关目标。在这种情况下,您可以将工作从make卸载到实际目标中的shell。 find的输出是流,没有shell命令行长度的限制。

另外,objlist.txt是一个文件!这就是make最好的地方-准确地在需要时立即构建文件。

all: objlist.txt
     @echo $(MY_OBJECTS) > $(MY_OBJECTSLIST)

objlist.txt: <should better depend on the condition that all the *.o files are already built>
     $(FIND) $(MY_OBJPATH) -name '*.o' > objlist.txt

答案 1 :(得分:0)

使用中间文件吗?

MY_OBJECTS = $(shell $(FIND) $(MY_OBJPATH) -name '*.o' | tee objects.txt)
MY_OBJECTSLIST = objlist.txt
all:
    cp objects.txt ${MY_OBJECTSLIST}

这里当然有很多优化的机会。