如何从文件中读取目标依赖项?

时间:2014-02-28 14:21:21

标签: makefile gnu-make

所以,我有一个makefile项目,它有一个巨大的目标文件列表,需要编译。

我在Win32上遇到了问题,因为输入字符串太大了。我发现,不是将文件1-by-1传递给链接器,而是通过将@filename传递给链接器来读取要从文件链接的目标文件。

在我的makefile中:是否有一种方法如何从文件中读取依赖项?这样的事情:

main.lib: @dependency_file_name

其中dependency_file_name包含创建lib所需的.obj文件列表。

请记住,将文件内容放入变量也不起作用,因为当使用依赖项列表作为变量时,输入字符串也会出现问题。

另外:该方法应该是可移植的(Linux,Win32)


编辑:目前,我的makefile的结构如下:

# slurp in some global settings
include /path/to/global/settings

all: prepare_target mylib cleanup_target

prepare_target:
    # do preparing work (setup temp files etc)

cleanup_target:
    # do cleanup work (delete temp files etc)

mylib: \
    file1.obj \
    file2.obj \
    ... \
    file215.obj

# this file holds the dependencies for each .obj file
include file_with_obj_file_dependencies

实际上有215个C文件要编译到这个库中。正如我所说:当将此列表提供给链接器时,我需要通过文件来完成,因为字符串对于命令行来说太大了。

我可以随意更改makefile中所需的内容:它是从VisualStudio vcxproj生成的,我拥有生成模板。

file_with_obj_dependencies看起来像这样:

file1.obj: \
    file1.c \
    file1.h \

file2.obj: \
    file2.c \
    file2.h \

... \

file215.obj \
    file215.c \
    file215.h \

1 个答案:

答案 0 :(得分:0)

在Windows上,我倾向于使用cygwin。这是我发现的最接近unix的环境。这使您的Makefile可移植。我没有遇到任何限制命令行长度限制。以下是超过3/4的命令行参数的示例:

a := 1 2 3 4 5 6 7 8 9 a b c d e f

.PHONY: test
test:
    @echo $(foreach A,$a,$(foreach B,$a,$(foreach C,$a,$(foreach D,$a,$(foreach E,$a,$A$B$C$D$E))))) | wc -wc

wc使您不必等待5,000,000左右的字符滚动。)

因此,对于有限的win32工具,使用bash编写中间的命令行参数文件,然后将其传递给前缀为{{1}的link.exe(例如) }。

类似的东西:

@

(你确定你需要中间文件吗?215源文件似乎不太繁琐。)