在运行Make规则之前检查二进制文件

时间:2012-03-20 20:11:19

标签: makefile phpunit

我有这个简单的规则:

.PHONY: test
test: src/*Test.php
    $(PHPUNIT) $?;\

它将看起来我所拥有的单元测试并运行phpunit。

我希望有类似的东西:(警告,无效的makefile语法)

ifneq($(HAS_PHPUNIT),)
test: testok
else
test: testbad
endif

testok: src/*Test.php
    $(PHPUNIT) $?;\

testbad:
    echo "test: failed checking for executable file $(PHPUNIT)";\
    echo "      You may need to install phpunit";\

我可以使用当前代码并添加if [ ! -e $(PHPUNIT) ]; then warn; else test it; done但是如果过于冗长,因为它会在每个文件中警告用户一次。

我在这里缺少什么模式?

2 个答案:

答案 0 :(得分:2)

执行此操作的“制作方法”是将您的一次性检查本身作为单独的目标,并将其列为您希望仅在该检查发生后运行的目标的先决条件。这是GNU make的一种方法:

TESTS:=$(wildcard *.test)
TEST_TARGETS=$(patsubst %,run_%,$(TESTS))
.PHONY: test

test: $(TEST_TARGETS)

run_%: check_php_unit
        @echo Running test $(*)

check_php_unit:
        @echo Checking for php unit

即,为执行该组测试的每个测试文件创建一个虚拟目标,然后使这些目标依赖于check_php_unit目标。 check_php_unit的命令可以执行您想要的任何验证,然后打印警告,或者使用错误代码退出并导致make run终止,或者您喜欢的任何内容。

答案 1 :(得分:1)

我已经完成了以下makefile

.PHONY: check
check:
    @[ -f `which cmake` ] ||  $(error Install cmake first)

.PHONY: check2    
check2:
    @[ -f `which cmake` ] || echo "Install cmake first"

.PHONY: exec
exec: check
    @echo "Compiling executable ..."
    @[ -d ./build ] || mkdir ./build
    @cd ./build; cmake ../src; make

目标 check2 有效(当cmake存在时,我没有收到消息“首先安装cmake”,如果没有,我收到消息),目标检查< / strong>即使存在cmake也会一直退出。

所以我不能将目标检查用于目标 exec 。我必须使用目标 check2 ,当然, make 退出,因为它找不到cmake。

我希望 make 在开始回应“编译可执行文件......”之前退出。