我正在尝试在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_UNIX
和printf "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
...
问题是case语句中括号不平衡。幸运的是,由于您正在使用bash,因此可以使用稍微修改的case语法并执行:
IS_UNIX := $(shell case "$$(uname -s)" in (CYGWIN*|MINGW*|MSYS*) ...
我只是通过在评估它之前将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