首页 > 解决方案 > 您可以使用 NMAKE 为变量分配通配符吗?

问题描述

我来自 UNIX 背景,所以我习惯于在 GNU/Make 中做这样的事情:

SRC=$(wildcard src/*.c)
OBJ=$(SRC:.c=.o)

all: $(OBJ)
    ...

我想知道是否大致相当于在 Microsoft NMAKE 中完成。我有以下简单的 NMAKE Makefile:

all: obj\a.obj obj\b.obj obj\c.obj 

{src\}.c{obj\}.obj:
    cl /c $** /Fo$@

这工作正常。它从 中获取所有源文件src/,并将它们编译为obj/. 但是,我想将默认目标压缩为通配符,obj/*.obj这样我就不必手动写出所有目标文件。

这在 NMAKE 中可能吗?我已经非常彻底地检查了 NMAKE 文档,它似乎没有描述任何像我想要做的事情。

更新

我设法使用该问题的公认解决方案作为参考,并使用以下 Makefile 来获得我想要的效果:

.SUFFIXES: .c .obj

obj_files=$(**:.c=.obj)
all: src\*.c
    @$(MAKE) $(obj_files:src=obj)

{src\}.c{obj\}.obj:
    cl /c $< /Fo$@

这使用obj\子文件夹作为输出目录。$**宏在目标all内展开。

标签: makefilenmake

解决方案


我设法对子文件夹.c中的所有文件进行通配符,并使用以下 Makefile将src\它们编译到子文件夹中的.obj输出:obj\

.SUFFIXES: .c .obj

obj_files=$(**:.c=.obj)
all: src\*.c
    @$(MAKE) $(obj_files:src=obj)

{src\}.c{obj\}.obj:
    cl /c $< /Fo$@

obj_files必须用$**宏定义(它将在all目标中扩展),因为我需要进行双字符串替换以更改目录名称和文件后缀。到目前为止,我发现的所有资源都只指定了如何进行单个字符串替换。


推荐阅读