繁体   English   中英

如何在 makefile 条件中使用自动变量?

[英]How do I use automatic variables in makefile conditionals?

总结问题
我想更改单个源文件的编译,如下所示:

%.exe: %.c
ifeq($@, cannon.exe)
    $(CC) $(CFLAGS) -o $(patsubst %.exe,%,$@) $^ $(inc_flags) $(LDLIBS)
else
    $(CC) $(CFLAGS) -o $(patsubst %.exe,%,$@) $^
endif

但它不起作用!

描述你尝试过的东西
我曾尝试让 bash 条件涉及,但我无法弄清楚,我不应该混合 bash 和 make。

这是完整的 Makefile:

CC := gcc
CFLAGS := -g -Wall -Wextra
LDLIBS := -lm
inc_dirs := math.h stdio.h
inc_flags := $(addprefix -I,$(inc_dirs))

executable:=cannon.exe
source:=$(executable:%.exe=%.cpp)

.DELETE_ON_ERROR:
all: $(executable)

%.exe: %.c
ifeq($@, cannon.exe)
    $(CC) $(CFLAGS) -o $(patsubst %.exe,%,$@) $^ $(inc_flags) $(LDLIBS)
else
    $(CC) $(CFLAGS) -o $(patsubst %.exe,%,$@) $^
endif

clean:
    rm -f $(executable:%.exe=%)

事实证明,如果你想为某个源文件做一个特殊情况,你可以明确定义它的配方! Make 将显式接管隐式规则。 下面的完整工作代码。

CC := gcc
CFLAGS := -g -Wall -Wextra
LDLIBS := -lm
inc_dirs := math.h stdio.h
inc_flags := $(addprefix -I,$(inc_dirs))

executable:=cannon.exe
source:=$(executable:%.exe=%.cpp)
# no deps so no objs

.DELETE_ON_ERROR:
all: $(executable)

%.exe: %.c
    $(CC) $(CFLAGS) -o $(patsubst %.exe,%,$@) $^

cannon.exe: cannon.c
    $(CC) $(CFLAGS) -o $(patsubst %.exe,%,$@) $^ $(inc_flags) $(LDLIBS)

clean:
    rm -f $(executable:%.exe=%)

一个更好/更完美的解决方案是使用构造变量名称,如下所示:

CC := gcc
CFLAGS := -g -Wall -Wextra
LDLIBS := -lm

inc_dirs := math.h stdio.h    
cannon_CFLAGS := $(addprefix -I,$(inc_dirs))

executable := cannon.exe
source := $(executable:%.exe=%.cpp)
# no deps so no objs

.DELETE_ON_ERROR:
all: $(executable)

%.exe: %.c
        $(CC) $(CFLAGS) $($*_CFLAGS) -o $@ $^

clean:
        rm -f $(executable:%.exe=%)

笔记:

您的规则应始终创建与 makefile 中的目标相同的名称。 将目标命名为foo.exe是不对的,但是 build 命令会创建一个名为foo的文件。 如果要创建一个名为foo的文件,则 makefile 目标应命名为foo 基本上,您应该始终创建包含在 make 变量$@中的文件。

您拥有的目录是否真的被命名为math.hstdio.h 这……很奇怪。 而且极有可能造成严重的问题。 如果math.hstdio.h是文件,则不应将它们与-I添加,因为-I采用目录名称,在其中搜索文件文件。 它不需要文件名。

如果您确实创建了名为math.hstdio.h的本地文件,那也是一个非常糟糕的主意:这些是标准头文件名,除非您真的知道自己在做什么,否则您不应该自己重新声明它们。

如果您没有创建这些文件,而只是尝试在文件中包含标准头文件math.hstdio.h ,那么您绝对不需要在编译行中添加任何标志。 只需包括它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM