首页 文章

如何将命令的输出分配给Makefile变量

提问于
浏览
159

我需要有条件地执行一些make规则,只要安装的Python大于某个版本(比如2.5) .

我以为我可以做一些像执行:

python -c 'import sys; print int(sys.version_info >= (2,5))'

然后在 ifeq make语句中使用输出('1',如果确定,否则为'0') .

在一个简单的bash shell脚本中,它只是:

MY_VAR=`python -c 'import sys; print int(sys.version_info >= (2,5))'`

但这在Makefile中不起作用 .

有什么建议?我可以使用任何其他合理的解决方法来实现这一目标 .

4 回答

  • 10

    MY_VAR=$(shell echo whatever) 中使用Make shell builtin

    me@Zack:~$make
    MY_VAR IS whatever
    
    me@Zack:~$ cat Makefile 
    MY_VAR := $(shell echo whatever)
    
    all:
        @echo MY_VAR IS $(MY_VAR)
    
  • 20

    将作业包装在 eval 中对我有用 .

    # dependency on .PHONY prevents Make from 
    # thinking there's `nothing to be done`
    set_opts: .PHONY
      $(eval DOCKER_OPTS = -v $(shell mktemp -d -p /scratch):/output)
    
  • 257

    我正在写一个答案,以提高解决问题的实际语法的可见性 . 不幸的是,对于那些寻找合理问题的简单答案的人来说,有些人可能认为琐碎的事情会成为一个非常重要的问题 .

    将以下内容放入文件“Makefile”中 .

    MY_VAR := $(shell python -c 'import sys; print int(sys.version_info >= (2,5))')
    
    all:
        @echo MY_VAR IS $(MY_VAR)
    

    您希望看到的行为如下(假设您最近安装了python) .

    make
    MY_VAR IS 1
    

    如果您将上述文本复制并粘贴到Makefile中,您会得到这个吗?可能不是 . 您可能会收到类似于此处报告的错误:

    makefile:4: *** missing separator. Stop

    原因:因为虽然我个人使用了真正的标签,但Stack Overflow(试图提供帮助)会将我的标签转换为多个空格 . 你,沮丧的互联网公民,现在复制这个,认为你现在拥有我使用的相同文本 . make命令现在读取空格并发现“all”命令格式不正确 . 因此,复制上面的文本,粘贴它,然后将“@echo”之前的空白转换为选项卡,这个例子最终应该为你工作 .

  • 8

    这里有一个更复杂的例子,配方内有管道和变量赋值:

    getpodname:
        # Getting pod name
        @eval $$(minikube docker-env) ;\
        $(eval PODNAME=$(shell sh -c "kubectl get pods | grep profile-posts-api | grep Running" | awk '{print $$1}'))
        echo $(PODNAME)
    

相关问题