在不引入依赖关系的情况下并行执行命令规则

时间:2014-11-14 14:05:41

标签: makefile

我有一个包含单个目标的项目,需要~30个A类文件,由一个模式规则处理,另一个B类型目标独立于另一个30.这里有一些伪代码以非常简化的形式展示我所拥有的东西:

OBJECTS=obj/obj1.o obj/obj2.o ...
SPECIAL=special/specialobj.o

libMyLibrary.so: $(OBJECTS) $(SPECIAL)
    g++ -shared -o $@ $^

obj/%.o: src/%.cxx
    g++ -c -fPIC -o $@ $^

$(SPECIAL): special/mySpecialCode.cxx
    g++ -c -fPIC -o $@ $^ -DFANCY_FLAG

makefile工作正常,依赖项解析完美无瑕。但是,不知何故,make始终决定最后构建$(SPECIAL)。虽然这根本不重要,因为无论哪种方式都有效,$(SPECIAL)的编译所需的时间比我的情况要长得多,几乎与所有其他对象相结合。因此,如果可以鼓励make开始编译$(SPECIAL),那么它就可以与其他编译器并行编译,这将大大缩短编译时间。

有可能实现这样的目标吗?

PS:我可以使用非便携版本,因为代码是一个非常专用的软件,只能在非常特定的一组机器上编译和运行,我在开发时很熟悉它的设置

修改

跟进评论让我意识到,在我在这里展示的情况下,问题确实可以通过简单地将订单$(OBJECTS) $(SPECIAL)交换到$(SPECIAL) $(OBJECTS)来解决 - 有时,就是这么简单。 / p>

然而,在我的实际用例中,这不起作用,所以我构建了一个MWE(1)实际上可以工作(使用gnumake)并且(2)更接近于我的项目中实际工作的方式。 这里,编译需要很长时间的文件实际上取决于仅在附加步骤中生成的源文件。您可以通过交换注释后的两行来按顺序观察更改。

如果有人可以为这种情况提供一种解决方法的方法,那就太棒了!

如果在这种情况下无法将订单更改为所需的订单,我会接受任何解释为什么不可能的详细解答。

OBJECTS=obj/obj1.o obj/obj2.o obj/obj3.o obj/obj4.o obj/obj5.o
SPECIAL=special/specialobj.o
SPECIALSRC=special/mySpecialCode.cxx

OBJ_DIR=obj
SPECIAL_DIR=special

all: libMyLibrary

$(SPECIAL_DIR):
    mkdir -p $@

$(OBJ_DIR):
    mkdir -p $@

libMyLibrary: $(SPECIAL) $(OBJECTS) 
    cat $^ > $@

obj/%.o: | $(OBJ_DIR)
    @echo creating $@
    @echo $@ > $@

$(SPECIALSRC): | $(SPECIAL_DIR)
    @echo special > $@

# swap the following two lines to observe the change in ordering
# $(SPECIAL): $(SPECIALSRC) | $(SPECIAL_DIR)
$(SPECIAL): | $(SPECIAL_DIR)
    @echo starting special
    @echo special > $@
    @sleep 1s
    @echo special done

clean:
    rm -rf libMyLibrary $(OBJ_DIR) $(SPECIAL_DIR)

0 个答案:

没有答案