首页 > 解决方案 > 如何在配方中使用参数调用自定义函数并返回值?

问题描述

我的工作目录如下所示:

src/my_module/main.c
src/my_module/inc/my_header.h
obj/my_module

main.c包括my_header.h.

在我makefile的函数GET_INC应该返回基于当前模块的包含文件。不幸的是,我无法正确处理返回值,虽然网上也有类似的问题描述。

请考虑这个非常简单的例子:

OBJ=obj/my_module/main.o

# The original function is more complicated. In the end it echos a variable with all includes.
GET_INC = $$(X=src/$1/inc; \
    echo "$$X";)

prog: $(OBJ)
    @echo "$@ built."

# At first, we compute module name (here: my_module), which is then passed to GET_INC. 
obj/%.o: src/%.c
    @module=$$(echo $* | cut -d'/' -f1); \
    INC=$(call GET_INC,$$module); \
    $(CC) $< -o $@ $$INC;

不幸的是,变量 INC 仍然为空,即使函数调用有效。我有以下问题:

  1. 如何将 的输出存储GET_INC在变量中X,然后将其传递给我的编译器?
  2. 我想知道这个解决方案是否有效,因为我为每个 .c 文件调用相同的函数。由于INC取决于当前路径,我不能在规则之外调用它。有什么建议么?

标签: makefile

解决方案


您的代码似乎可以工作,除了最后一行,应该是:

$(CC) $< -o $@ -I $$INC;

出于调试目的,您可以尝试:

echo $(CC) $< -o $@ -I $$INC;

推荐阅读