我有这个简单的规则:
.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
但是如果过于冗长,因为它会在每个文件中警告用户一次。
我在这里缺少什么模式?
答案 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 在开始回应“编译可执行文件......”之前退出。