首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GNU :如何使用模式规则,通过使用特定于模式的变量值,将编译标志添加到匹配的任何模式规则?

GNU :如何使用模式规则,通过使用特定于模式的变量值,将编译标志添加到匹配的任何模式规则?
EN

Stack Overflow用户
提问于 2022-11-10 09:41:44
回答 1查看 41关注 0票数 0

我创建了几个测试文件test_*.c,每个测试函数都是我构建的c库的一个函数。

我首先编写了一个Makefile,用于编译每个c文件以生成相应的二进制文件:

代码语言:javascript
复制
TEST_SRCS       =   ${wildcard *.c}

TEST_EXECS      =   ${TEST_SRCS:.c=}

PROJECT_PATH    =   ../my_project

CFLAGS          =   -Wall -Wextra -Werror

%::         %.c ${PROJECT_PATH}/libmyproject.a
            gcc ${CFLAGS} $< -L${PROJECT_PATH} -lmyproject -o $@

all:        ${TEST_EXECS}

clean:
            rm -f ${TEST_EXECS}

re:         clean all

.PHONY:     all clean re

这就像预期的一样,所以当我输入make test_<name_of_my_function>时,如果存在'test_.c‘文件,它会编译它来创建'test_’二进制文件。

但是现在我想添加一条规则,如果我运行命令-g make debug_test_<name_of_my_function>**.**,将gcc标志添加到命令中,从而在调试模式下创建二进制。

我尝试添加特定于模式的规则debug_%,并使用特定于模式的值将-g附加到CFLAGS中。

代码语言:javascript
复制
TEST_SRCS       =   ${wildcard *.c}

TEST_EXECS      =   ${TEST_SRCS:.c=}

PROJECT_PATH    =   ../my_project

CFLAGS          =   -Wall -Wextra -Werror

%::         %.c ${PROJECT_PATH}/libmyproject.a
            gcc ${CFLAGS} $< -L${PROJECT_PATH} -lmyproject -o $@

all:        ${TEST_EXECS}

debug_%:    CFLAGS += -g
debug_%:    %

clean:
            rm -f ${TEST_EXECS}

re:         clean all

.PHONY:     all clean re

但是,例如,当我运行debug_test_function1时,我得到了以下ouptut:

代码语言:javascript
复制
make: *** No rule to make target 'debug_test_function1'.  Stop.

注意,无论我为目标`debug%`_使用什么先决条件规则,它都不会被执行(即使先决条件不是模式规则)。

还请注意,如果我在makefile中替换

代码语言:javascript
复制
debug_%:    CFLAGS += -g
debug_%:    %

通过

代码语言:javascript
复制
debug%:     %.c ${PROJECT_PATH}/libft.a
            gcc ${CFLAGS} -g $< -L${PROJECT_PATH} -lmyproject -o $@

它起作用了。但是在这里我会失去使用特定于模式的变量的好处。

任何线索哦,如何使用特定于模式的变量值来实现呢?

谢谢你的帮助!

代码语言:javascript
复制
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-10 13:22:06

这是:

代码语言:javascript
复制
debug_%:    %

不定义模式规则。它删除一个模式规则。见GNU制作手册。因此,您没有在这里定义任何知道如何构建debug_test_function1的规则(因为没有文件debug_test_function1.c可用于构建它,唯一可用的规则是匹配-任何规则)。

你必须在这里提供菜谱,你不能省略它。但是很明显,您仍然可以添加一个特定于模式的变量;为什么不能呢?:

代码语言:javascript
复制
debug_%:    CFLAGS += -g
debug_%:    %.c ${PROJECT_PATH}/libft.a
        gcc ${CFLAGS} $< -L${PROJECT_PATH} -lmyproject -o $@

我不太清楚您所指的“模式特定变量的好处”,因为您似乎没有构建需要继承特定于模式的变量的其他先决条件。但以上所述应能奏效。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74386958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档