是否可以获取配方行的一部分输出并用于设置make变量?例如:
%.o: %.cc
$(eval __time_$* := $(shell date "+%s.%N"))
$(COMPILE.cc) -o $@ $<
@echo `date +%s.%N` - $(__time_$*) | bc | xargs printf "%s compile time %6.3f sec\n" $@
而不是echo
我想要在make变量中捕获它的时间。但是,当我使用eval
和shell
而不是上面的第3行时,类似于第1行,make似乎一次读取所有行,然后安排实际的配方shell调用以供日后使用。因此结果是配方线都被一次性评估,因此时间差异很小。
答案 0 :(得分:1)
我能看到你想做的唯一方法就是在$(shell)中运行编译器。这样做的一个问题是,当$(shell)中的命令失败时,Make似乎没有看到错误。除此之外,这就是我认为你想要的东西:
%.o: %.cc
$(eval __start_$* := $(shell date "+%s.%N"))
@echo $(shell $(COMPILE.cc) -o $@ $<)
$(eval __dur_$* := $(shell echo `date +%s.%N` - $(__time_$*) | bc | xargs printf "%s compile time %6.3f sec\n" $@))
由于上面提到的警告,我建议使用&#39; time&#39; @wojtow说,收集这些统计数据的命令。如果您有不同的要求,请考虑使用收集计时数据的脚本包装编译并将其记录到文件中。然后,处理文件的内容作为后处理步骤。
答案 1 :(得分:0)
Droid Coder提出了一个聪明的方法。解决我能看到你想要的唯一方法就是运行编译器 在$(shell)里面。这样做的一个问题是Make没有 当$(shell)中的命令失败时,似乎看到了错误。
make
未看到错误(从而不会因错误而中止)的问题的方法是通过命令的输出传递退出状态,而原始编译器输出(如果有的话)被重定向到标准错误流。那么规则是e。 G:
%.o: %.cc
$(eval __start_$* := $(shell date "+%s.%N"))
exit $(shell $(COMPILE.cc) -o $@ $< >&2; echo $$?)
$(eval __dur_$* := $(shell echo `date +%s.%N` - $(__time_$*) | bc …))