发出文件警告,覆盖目标命令

Jam*_*ard 21 warnings makefile

作为makefile的一部分,我想生成目标的调试版或发行版.

在功能上,一切正常,但是,我在运行make时收到警告

 12 SRC := $(shell echo src/*.cpp)
 13 SRC += $(shell echo $(TEST_ROOT)/*.cpp)
 14 
 15 D_OBJECTS = $(SRC:.cpp=.o)       # same objects will need to be built differently
 16 R_OBJECTS = $(SRC:.cpp=.o)       # same objects will need to be built differently

 22 all: $(TARGET)
 23 
 25 $(TARGET): $(D_OBJECTS)
 26   $(CC) $(D_OBJECTS) -o $(TARGET)
 27 
 28 $(D_OBJECTS) : %.o: %.cpp                     # ----- run with debug flags 
 29   $(CC) $(COMMON_FLAGS) $(DEBUG_FLAGS) -c $< -o $@
 30 
 31 release: $(R_OBJECTS)
 32   $(CC) $(R_OBJECTS) -o $(TARGET)
 33 
 34 $(R_OBJECTS) : %.o: %.cpp                     # ----- run with release flags
 35   $(CC) $(COMMON_FLAGS) $(RELEASE_FLAGS) -c $< -o $@
Run Code Online (Sandbox Code Playgroud)

当我make得到调试版本,当make release我得到发布版本.

但我也得到警告:

Makefile:35: warning: overriding commands for target `src/Timer.o'
Makefile:29: warning: ignoring old commands for target `src/Timer.o'
Makefile:35: warning: overriding commands for target `test/TimerTest.o'
Makefile:29: warning: ignoring old commands for target `test/TimerTest.o'
Run Code Online (Sandbox Code Playgroud)

有了这2个问题:

  1. 任何忽略警告的方法
  2. 我做得对吗?需要进行哪些更改?

twa*_*erg 15

执行此操作的最常见方法之一是将发布对象和调试对象放在单独的子目录中.这样,您就无法获得对象规则的重新定义,因为它们将具有不同的名称.像这样的东西:

D_OBJECTS=$(SRC:%.cpp=debug/%.o)
R_OBJECTS=$(SRC:%.cpp=release/%.o)

RTARGET = a.out
DTARGET = a.out.debug

all : dirs $(RTARGET)

debug : dirs $(DTARGET)

dirs :
    @mkdir -p debug release

debug/%.o : %.c
    $(CC) $(DEBUG_CFLAGS) -o $@ -c $<

release/%.o : %.c
    $(CC) $(RELEASE_CFLAGS) -o $@ -c $<

$(DTARGET) : $(D_OBJECTS)
    $(CC) $(DEBUG_CFLAGS) -o $@ $(D_OBJECTS)

$(RTARGET) : $(R_OBJECTS)
    $(CC) $(RELEASE_CFLAGS) -o $@ $(R_OBJECTS)
Run Code Online (Sandbox Code Playgroud)


mpb*_*mpb 9

像OP(James Leonard)一样,我想抑制或避免有关覆盖Makefile目标的警告。但是,我的情况和目标是不同的。

我想Makefileinclude base.mk的,我希望Makefile能够从覆盖的目标base.mk没有任何警告消息。我正在使用GNU Make。

GNU Make文档描述了一种执行此操作的方法:

创建Makefile如下:

foo:
        echo 'bar' > foo

%: force
        @$(MAKE) -f base.mk $@
force: ;
Run Code Online (Sandbox Code Playgroud)

来源:https : //www.gnu.org/software/make/manual/html_node/Overriding-Makefiles.html

上面的方法有一个(可能很严重的)缺点,它会调用的一个单独的实例$(MAKE),这意味着(某些或全部?)变量可能不会(不会?)在make的父子调用之间共享。

令人高兴的是,我找到了一个更好的解决方案,如下所示:

创建base.mk如下:

foo-default:
        echo  'foo-default'

bar-default:
        echo  'bar-default'

%:  %-default
        @  true
Run Code Online (Sandbox Code Playgroud)

创建Makefile如下:

include  base.mk

foo:
        echo  'foo  Makefile'
Run Code Online (Sandbox Code Playgroud)

输出示例:

$ make foo
echo  'foo  Makefile'
foo  Makefile

$ make bar
echo  'bar-default'
bar-default
Run Code Online (Sandbox Code Playgroud)

请注意,您需要能够控制目标的名称,base.mk以便可以命名它们<target>-default。换句话说,您不能使用这种方法来扩展任意基本的makefile。但是,如果您同时控制base.mkMakefile,则此方法将允许您创建一个base.mk,然后进行许多自定义。