在makefile中使用条件规则

Mik*_*ike 13 makefile conditional-compilation

我用伪代码捕获Makefile的意图,然后指出我遇到的问题.我正在寻找一个在测试环境中更加用户友好的Makefile.Makefile的正确用法如下所示.

    make CATEGORY=parser TEST=basic.
    make ALL
Run Code Online (Sandbox Code Playgroud)

如果用户给出"JUST"命令,如下所示,它应该打印一条消息"CATEGORY defined TEST undefined",反之亦然

    make CATEGORY=parser
    make TEST=basic
Run Code Online (Sandbox Code Playgroud)

我尝试以下列方式编写Makefile,但它出错了:

    help:
        echo"Usage: make CATEGORY=<advanced|basic> TEST=<test-case>
        echo"       make ALL

    ifdef CATEGORY
        ifdef TEST
            CATEGORY_TEST_DEFINED = 1
        else
             echo "TEST not defined"
    else
        echo "CATEGORY not defined"
    endif



    ifeq ($(CATEGORY_TEST_DEFINED), 1)
    $(CATEGORY):
        cd $(PROJ)/$(CATEGORY)
        make -f test.mk $(TEST)
    endif

    ifdef ALL
    $(ALL):
         for i in `ls`
         cd $$(i)
         make all
    endif
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. Makefile中的规则是否可以选择性(使用ifdef选择规则和目标).

  2. 回声不起作用.echo应该帮助用户正确使用.

Bet*_*eta 20

问题是echo属于shell; Make可以在命令中将它传递给shell,但Make不能执行它.info改为使用:

ifdef CATEGORY
$(info CATEGORY defined)
else
$(info CATEGORY undefined)
endif
Run Code Online (Sandbox Code Playgroud)

如果您希望规则是有条件的:

ifdef CATEGORY
ifdef TEST
$(CATEGORY):
    whatever
else
$(info TEST not defined)
else
$(info CATEGORY not defined)
endif
Run Code Online (Sandbox Code Playgroud)


小智 11

这里最大的问题是所有ifdef/// ... 语句必须位于第 0 列ifndefifeq否则将导致错误。与压痕问题相比,回声是一个小问题。