如何在Makefile变量分配中运行shell / bash切换程序?

问题描述 投票:0回答:2

我正在尝试在make全局变量中运行bash开关案例。开关本身运行良好:

#!/bin/bash

case "$(uname -s)" in CYGWIN*|MINGW*|MSYS*) echo "Hi!";; esac;
# Hi!

我尝试使用此答案作为示例:Assign a makefile variable value to a bash command result?,但是当我将其放入VARAIBLE := $(shell thing)中时,得到的语法无效:

SHELL := /bin/bash
.SHELLFLAGS := -eu -o pipefail -c ${SHELLFLAGS}

IS_UNIX := $(shell case "$$(uname -s)" in CYGWIN*|MINGW*|MSYS*) printf "Hi!";; esac;)

all:
    echo IS_UNIX ${IS_UNIX}

# /bin/bash: -c: line 0: syntax error near unexpected token `newline'

echo IS_UNIXprintf "Hi!"只是为了使本示例简单而已。在我的真实代码中,我像这样使用它们:

...
ifeq (${OS},Windows_NT)
    ifndef PYTHON_BIN
        PYTHON_BIN := $(shell which python)
        IS_UNIX := $(shell case "$$(uname -s)" in CYGWIN*|MINGW*|MSYS*) printf "Hi!";; esac;)

        ifneq (,${IS_UNIX})
            PYTHON_BIN := $(shell cygpath -w "${PYTHON_BIN}") 
        endif   
    endif
else
    ...
bash shell makefile switch-statement
2个回答
2
投票

问题是case语句中括号不平衡。幸运的是,由于您正在使用bash,因此可以使用稍微修改的case语法并执行:

IS_UNIX := $(shell case "$$(uname -s)" in (CYGWIN*|MINGW*|MSYS*) ...

0
投票

我只是通过在评估它之前将bash switch大小写到一个变量中来使其工作:

SHELL := /bin/bash
.SHELLFLAGS := -eu -o pipefail -c ${SHELLFLAGS}

IS_UNIX_COMMAND := case $$(uname -s) in CYGWIN*|MINGW*|MSYS*) printf Hi;; esac;
IS_UNIX := $(shell ${IS_UNIX_COMMAND})

all:
    echo IS_UNIX ${IS_UNIX}

# echo IS_UNIX Hi
# IS_UNIX Hi
© www.soinside.com 2019 - 2024. All rights reserved.