【问题标题】:variable doesn't get exanded for patsubst in makefile变量不会在makefile中扩展为patsubst
【发布时间】:2021-03-27 20:23:06
【问题描述】:

我正在尝试编写一个规则,将一组 .c 文件替换为一个变量的 .o 文件。

为了确保它有效,我在呼应他们的价值观。 .c 文件是通过 shell 通配符从当前工作目录获取的

sources := *.c

但是,.o 文件没有打印任何内容,因为无论我使用 patsubst 还是更方便的 $(src:%.c=%.o) 似乎都没有为此扩展“源” .

另一方面,如果我设置“手动”的值,一切都会按预期工作,例如

sources := source1.c source2.c source3.c

生成文件:

sources := *.c
srcs = one.c two.c
objects := $(sources:.c=.o)
objs := $(patsubst %.c, %.o, $(srcs))

prints:
    @echo sources
    @echo $(sources)
    @echo objects
    @echo $(objects)
    @echo $(objs)

输出:

sources
source1.c source2.c source3.c source4.c
objects
*.o
one.o two.o

如您所见,“objects”(基于使用通配符的“sources”)是不可行的,但“objs”(基于手动设置的“srcs”可以正常工作)。

我错过了什么。我知道这一定与扩张发生的时间或方式有关。

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    Make 不是外壳。这一行:

    sources := *.c
    

    将 make 变量 sources 设置为文字字符串 *.c。然后这一行:

    objects := $(sources:.c=.o)
    

    objects 设置为文字字符串*.o

    然后这一行:

    @echo $(sources)
    

    echo *.c 发送到shell,然后SHELL 将*.c 扩展为与该glob 匹配的文件列表。

    然后这一行:

    @echo $(objects)
    

    echo *.o 发送到shell,由于没有与*.o glob 匹配的文件,它只打印glob 本身*.o

    如果你想得到一个文件列表在make你必须使用wildcard函数:

    sources := $(wildcard *.c)
    

    此外,您在尝试调试 makefile 时遇到了两种不同的常见错误:

    首先,你不应该,永远在你的食谱行中使用@ 来隐藏命令。这就像试图在蒙着眼睛的情况下调试您的 makefile。查看 make 发送到 shell 的内容可以为您提供关于这里发生的事情的绝对重要信息。我个人不使用@,即使在我的makefile 工作之后,除了一些琐碎的操作,我绝对不会在尝试调试时使用它。

    其次,如果您想查看配方中make 变量的内容,您应该始终在它们周围使用单引号。如果你不加引号或使用双引号,那么 shell 会出现并弄乱这些值(取决于值是什么),你将无法看到它们的真正含义。要么在它们周围使用'',要么使用像$(info ...) 这样的make 函数来查看它们的值,而不是像echo 这样的shell 程序。

    如果您这样编写测试 makefile:

    prints:
            echo sources
            echo '$(sources)'
            echo objects
            echo '$(objects)'
            echo '$(objs)'
    

    问题出在哪里会更明显。

    【讨论】:

    • 非常有帮助,谢谢。关于使用“@”——是的,你是对的。我只是在这里清理了stackoverflow的输出,我通常不会像这样沉默
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多