gpt4 book ai didi

makefile - GNU Make : How to call $(wildcard) within $(eval)

转载 作者:行者123 更新时间:2023-12-04 07:13:38 26 4
gpt4 key购买 nike

我正在尝试为我的Makefile创建通用的构建模板,就像它们在eval documentation中讨论的那样。

我似乎无法让通配符函数在评估中工作。我遇到的基本代码如下所示。

SRC_DIR = ./src/

PROG_NAME = test

define PROGRAM_template
$(1)_SRC_DIR = $(join $(SRC_DIR), $(1)/)
$(1)_SRC_FILES = $(wildcard $$($(1)_SRC_DIR)*.c)
endef

$(eval $(call PROGRAM_template, $(PROG_NAME)))

all:
@echo $(test_SRC_DIR)
@echo $(test_SRC_FILES)
@echo $(wildcard $(wildcard $(test_SRC_DIR)*.c)

当我运行make时,输出为
./src/test

[correct list of all .c files in ./src/test/]

基本上,没有像我期望的那样评估PROGRAM_template中的通配符调用。该调用将导致一个空列表。
但是,join调用已正确评估。

那么,我在做什么错呢?我的猜测是
$$($(1)_SRC_DIR) 

是不正确的,但我想不出正确的方法来做。

编辑
一旦解决了这个问题,我很快就发现了eval的另一个问题。
我将其发布为新问题
Workaround for GNU Make 3.80 eval bug

最佳答案

使用eval时,实际上需要对所有函数和变量加倍转义。在大多数情况下,不需要重复转义的就是函数参数(因为call函数将完全扩展它们)。在这种情况下,从技术上讲,您不需要双重转义joinSRC_DIR,但是如果在使用eval时始终总是双重转义所有变量和函数,则会简化您的生活。

您需要两次转义的原因是,在使用eval时,扩展了两次eval函数本身执行扩展,然后在该块最终被解析为makefile语法时(即,在实际评估时)再次进行扩展。

编写方法是在字符串文字wildcard上调用$( test_SRC_DIR)*.c。如果需要,可以通过在您的版本中将wildcard替换为info来自己查看,并查看会发生什么。

您需要推迟实际调用wildcard的操作,直到第二次扩展为止,以便它的参数是$(test_SRC_DIR)扩展的结果。

试试这个:

SRC_DIR = ./src/

PROG_NAME = test

define PROGRAM_template
$(1)_SRC_DIR = $$(join $$(SRC_DIR),$(1)/)
$(1)_SRC_FILES = $$(wildcard $$($(1)_SRC_DIR)*.c)
endef

$(eval $(call PROGRAM_template,$(PROG_NAME)))

all:
@echo $(test_SRC_DIR)
@echo $(test_SRC_FILES)
@echo $(wildcard $(test_SRC_DIR)*.c)

编辑:发布此内容后,我认为最好对其进行测试,以确保它确实有效。这样,我发现了另一个问题。调用函数时,应避免在逗号和参数之间放置空格。它使文字空格字符前置于传递给函数的参数之前,并导致意外的结果。在我的版本中,函数调用中的逗号后已删除空格(虽然这对 join的调用不是问题,但我也删除了空格,只是因为这是一种良好的习惯)。

关于makefile - GNU Make : How to call $(wildcard) within $(eval),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2421518/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com