How do I get $(error …) to work conditionally in GNU Make?

前端 未结 2 1846
-上瘾入骨i
-上瘾入骨i 2021-02-15 05:29

I\'d like to use $(error ...) to abort my make process if certain preconditions aren\'t met. The fails_to_work target should abort when failing t

2条回答
  •  庸人自扰
    2021-02-15 05:45

    Shell commands for a make recipe are effectively stored as a single recursively expanded variable. At the point make decides to run the recipe, it expands the variable, and then runs each line in its own shell invocation. Any $(error ...) that gets expanded will cause make to abort even before invoking the first command.

    Note though that the untaken branch of a $(if ...) or $(or ...) &c. will not be expanded. Thus, you could do

    .PHONY: rule-with-assert
    rule-with-assert:
        $(if $(realpath ${should-be-file}/),$(error Assertion failure: ${should-be-file} is a folder!))
        ⋮
    

    Note that trailing / in the realpath.

    Of course macros help to tidy this up a lot.

    assert-is-file = $(if $(realpath $1/),$(error Assertion failure: [$1] is a folder!))
    
    .PHONY: rule-with-assert
    rule-with-assert:
        $(call assert-is-file,${should-be-file})
        ⋮
    

    It's worth noting again that it doesn't matter where you put the $(call assert-is-file,…) in the recipe. Any $(error)will be generated as the recipe is expanded, before any shell commands are run.

提交回复
热议问题