Makefile 在运行生成规则之前检查二进制文件

Makefile 在运行生成规则之前检查二进制文件,makefile,phpunit,Makefile,Phpunit,我有一个简单的规则: .PHONY: test test: src/*Test.php $(PHPUNIT) $?;\ 它将查看我的单元测试并运行phpunit 我想要的是:(警告,无效的makefile语法) 我可以使用当前代码,只要添加if[!-e$(PHPUNIT)];然后警告;否则测试它;完成,但是if将过于冗长,因为它会对每个文件警告用户一次 我这里缺少的模式是什么?这样做的“让路”是让您的一次性检查本身成为一个单独的目标,并将其列为目标的先决条件,您只希望在检查发生后运行。

我有一个简单的规则:

.PHONY: test
test: src/*Test.php
    $(PHPUNIT) $?;\
它将查看我的单元测试并运行phpunit

我想要的是:(警告,无效的makefile语法)

我可以使用当前代码,只要添加
if[!-e$(PHPUNIT)];然后警告;否则测试它;完成
,但是if将过于冗长,因为它会对每个文件警告用户一次

我这里缺少的模式是什么?

这样做的“让路”是让您的一次性检查本身成为一个单独的目标,并将其列为目标的先决条件,您只希望在检查发生后运行。使用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\u php\u单元
target。
check\u php\u unit
的命令可以执行您想要的任何验证,然后打印警告,或者使用错误代码退出并导致make运行终止,或者执行您想要的任何操作。

我已经完成了以下make文件

.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
当targetcheck2工作时(当cmake存在时,我没有收到消息“先安装cmake”,当它不存在时,我收到消息),targetcheck始终退出,即使cmake存在

因此,我不能对targetexec使用targetcheck。我必须使用targetcheck2,当然,还必须放弃,因为它找不到cmake


我想在它开始响应“编译可执行文件…”之前退出。

我认为我做得太过分了。如果没有二进制文件,make在尝试再次运行phpunit的第一个文件之后将失败。没有必要这么做。但是谢谢你提供了更好的语法。在此基础上有所改进。
.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