在makefile中进行条件编译,以便忽略命令行参数



在linux上使用gcc编译器,我有一个C程序,使用命令行参数(一个参数)像/myprog 0

。我想写一个makefile,使用条件编译,这样如果我编译喜欢特别= 1然后使用命令行参数。如果我编译没有特别喜欢使那么即使我们输入命令行参数,它也会被忽略。

如何使之成为可能。我正在使用以下编译命令

myprog.c

makefile可能很琐碎,但真正的工作必须在C代码中进行。像这样,作为一个最小的例子:

#include <stdio.h>
int main(int argc, char **argv, char **envp) {
int i;
#ifndef SPECIAL
argc=1;
argv[1] = NULL;
#endif
for(i=1; i<argc; ++i) {
printf(">>%s<<n", argv[i]);
}
}

现在,对于这个简单的程序,您甚至不需要Makefile

bash$ make CFLAGS=-DSPECIAL=1 -f /dev/null myprog
cc -DSPECIAL=1     myprog.c   -o myprog

话虽如此,通过引入依赖于短暂的构建时突发奇想的变化而使构建不确定是一种疯狂的做法。有两个单独的目标,创建两个单独的二进制文件,一个具有常规行为,另一个具有脚炮语义。

DEPS := myprog.c prog2.c prog3.c # or whatever your dependencies are
myprog: $(DEPS)
myprog-footgun: CLAGS+=-DSPECIAL=1
myprog-footgun: $(DEPS) # same dependencies, different output file
$(CC) $(CFLAGS) -o $@ $^

有关此语法的详细信息,请参阅GNU Make文档中的目标特定变量值。

(注意Stack Overflow将Markdown源代码中的制表符呈现为空格,因此您将无法逐字复制/粘贴此内容。)

事实上,我可能会颠倒SPECIAL的含义,使它能够实现脚枪版本,而不是反过来(这个答案的原始版本有这个设计,只是因为我最初是以这种方式阅读你的问题)。

最新更新