首页 文章

包含依赖于目标的文件

提问于
浏览
3

我有一个Makefile,其中包含来自子目录的makefile . 但是,我想要的是在所选目标的基础上包含这些“sub”-makefiles .

背景是,子makefile定义了不同的目标文件,并且根据这些目标文件,应该创建目标可执行文件 .

假设sub-makefile1设置变量

OBJECTS := foo.o foo1.o

sub-makefile2集

OBJECTS := bar.o bar1.o

通用规则是:

lib/%.so: $(OBJECTS)
    link $^ -o $@

目标是(例如):

foo: lib/foo.so
bar: lib/bar.so

而目标foo应该包含foo makefile,目标栏就是bar-makefile .

知道如何处理这种情况吗?

谢谢,克里斯蒂安

2 回答

  • 2

    Beta已经提到 $(MAKECMDGOALS) ,但没有描述它:

    ifeq ($(MAKECMDGOALS),foo)
    include sub-makefile1
    endif
    ifeq ($(MAKECMDGOALS),bar)
    include sub-makefile2
    endif
    
    # Rest of Makefile follows...
    

    这不是一个好主意,因为它只有在交互式调用 make 时才有效 . 您可以通过为递送调用 makefoobar 制定规则来解决这个问题:

    ifeq ($(MAKECMDGOALS),foo)
    include sub-makefile1
    foo: # ...
        # Normal commands to build foo
    else
    foo:
        $(MAKE) $<
    endif
    
    ifeq ($(MAKECMDGOALS),bar)
    include sub-makefile2
    bar: # ...
        # Normal commands to build bar
    else
    bar:
        $(MAKE) $<
    endif
    
  • 2

    你要求的具体事情 - 条件包含 - 在Make中很难 . 它可以做到,但它并不优雅 .

    有几种方法可以达到你想要的效果 . 您可以在MAKECMDGOALS上使用条件 . 您可以让makefile调用第二个makefile,并将其传递给要使用的子目录的名称 . 但是(不知道更多情况)我认为这种方式是最整洁的:

    include sub-makefile1
    FOO_OBJECTS := $(OBJECTS)
    
    include sub-makefile2
    BAR_OBJECTS := $(OBJECTS)
    
    lib/%.so:
        link $^ -o $@
    
    lib/foo.so: $(FOO_OBJECTS)
    
    lib/bar.so: $(BAR_OBJECTS)
    
    foo bar : % : lib/%.so
    

    (你可以聪明地用变量名如 foo_OBJECTS 来保存一两行,但我建议反对 . )

相关问题