代码之家  ›  专栏  ›  技术社区  ›  Matteo

停止执行makefile

  •  8
  • Matteo  · 技术社区  · 6 年前

    我实现了一个配方,以便将所有剩余字符串传递给命令,如以下脚本中的示例:

    生成文件

    run:
    #   ./bin/run.sh $(filter-out $@,$(MAKECMDGOALS)) 
        @echo $(filter-out $@,$(MAKECMDGOALS))
    

    但当我以跑步为例时:

    >make run my custom input params
    my custom input params
    make: *** No rule to make target `my'.  Stop.
    

    make: *** No rule to make target `my'.  Stop.
    

    我怎样才能防止这种情况?

    %:
        @echo
    

    因此,这将打印一个空字符串,而不是错误。

    make run-example param="my custom param"
    
    3 回复  |  直到 6 年前
        1
  •  9
  •   Renaud Pacalet    6 年前

    你也许可以用一个简单的方法实现你想要的 match-anything rule . 示例(使用假人 printf 配方(而不是真正的配方):

    PARAMS := $(filter-out run,$(MAKECMDGOALS))
    
    run:
        @printf './bin/run.sh $(PARAMS)\n'
    
    %:;
    

    演示:

    $ make run my custom input params
    ./bin/run.sh my custom input params
    make: 'my' is up to date.
    make: 'custom' is up to date.
    make: 'input' is up to date.
    make: 'params' is up to date.
    

    你可以忽略 make: 'target' is up to date. 消息或使用 --quiet 选择权(或 --silent -s ):

    $ make --quiet run my custom input params
    ./bin/run.sh my custom input params
    

    如果您的Makefile比这更复杂,那么match anywhere规则可能是一个问题,因为它可能会捕获您不希望捕获的其他目标。在这种情况下,make条件是一个选项:

    ifeq ($(SECONDPASS),)
    PARAMS := $(filter-out run,$(MAKECMDGOALS))
    
    run:
        @$(MAKE) --quiet $@ PARAMS='$(PARAMS)' SECONDPASS=true
    
    %:;
    else
    run:
        @printf './bin/run.sh $(PARAMS)\n'
    
    # other rules if any
    endif
    

    最后,如果第一个目标的名称不总是相同的,您可以通过以下方式进行调整:

    GOAL   := $(firstword $(MAKECMDGOALS))
    PARAMS := $(filter-out $(GOAL),$(MAKECMDGOALS))
    
    $(GOAL):
        @printf './bin/$(GOAL).sh $(PARAMS)\n'
    
    %:;
    

    或:

    GOAL   := $(firstword $(MAKECMDGOALS))
    
    ifeq ($(SECONDPASS),)
    PARAMS := $(filter-out $(GOAL),$(MAKECMDGOALS))
    
    $(GOAL):
        @$(MAKE) --quiet $@ PARAMS='$(PARAMS)' SECONDPASS=true
    
    %:;
    else
    $(GOAL):
        @printf './bin/$(GOAL).sh $(PARAMS)\n'
    
    # other rules if any
    endif
    

    $ make --quiet nur foo bar
    ./bin/nur.sh foo bar
    
        2
  •  6
  •   Nick ODell    6 年前

    我认为你不应该使用Makefile。您希望自己对选项进行解析,这在make中更麻烦。

    %:
        @true
    

    …这将避免打印空行。

    不过,最好在Bash中这样做。这里有一种方法可以做到:

    #!/usr/bin/env bash
    
    if [ $# -lt 1 ]; then
        echo Not enough args
        exit 1
    fi
    
    case "$1" in
        "run")
            shift
            ./bin/run.sh $@
            ;;
        *)
            echo "Command $1 not recognized"
            exit 1
            ;;
    esac
    

    这似乎更容易,也更易于扩展。

        3
  •  2
  •   Gillsoft AB    6 年前

    MYPARAM1=123 MYPARAM2=456 make
    

    或者使用子shell

    (MYPARAM1=123; MYPARAM2=456; echo A=$MYPARAM1 B=$MYPARAM2; make)
    (export MYPARAM1=123; export MYPARAM2=456; A=$MYPARAM1 B=$MYPARAM2; make) // exporting
    

    你也可以看看 bash-shell-special-parameters