如何使用在Windows(Windows_NT)和Mac(Darwin)上工作的.PHONY目标制作Makefile



所以我找到了一个链接,显示我应该使用以下内容,但可能我在Makefile中的逻辑是错误的。我需要使用Makefile进行测试,才能在Mac和Windows上工作。图像很好,docker容器也能工作,我只是想利用这样一个事实,即在Linux/Mac中,可以用来缩短命令,而在Windows中,你必须使用backtick(`(。

示例:

.PHONY: validate-lookml
validate-lookml:
UNAME_S=$(shell uname -s)
ifeq ($(UNAME), Linux)
docker run --rm -it -e LOOKER_BASE_URL=${LOOKER_BASE_URL} 
-e LOOKER_CLIENTID=${LOOKER_CLIENTID} 
-e LOOKER_CLIENT_SECRET=${LOOKER_CLIENTSECRET} mirantis/mirantis_spectacles 
lookml 
--base-url ${LOOKER_BASE_URL} 
--client-id ${LOOKER_CLIENTID} 
--client-secret ${LOOKER_CLIENTSECRET} 
--project ${PROJECT} 
--branch ${BRANCH}
endif
ifeq ($(UNAME), Darwin)
docker run --rm -it -e LOOKER_BASE_URL=${LOOKER_BASE_URL} 
-e LOOKER_CLIENTID=${LOOKER_CLIENTID} 
-e LOOKER_CLIENT_SECRET=${LOOKER_CLIENTSECRET} mirantis/mirantis_spectacles 
lookml 
--base-url ${LOOKER_BASE_URL} 
--client-id ${LOOKER_CLIENTID} 
--client-secret ${LOOKER_CLIENTSECRET} 
--project ${PROJECT} 
--branch ${BRANCH}
endif
ifeq ($(UNAME), Windows_NT)
docker run --rm -it -e LOOKER_BASE_URL=${LOOKER_BASE_URL} `
-e LOOKER_CLIENTID=${LOOKER_CLIENTID} `
-e LOOKER_CLIENT_SECRET=${LOOKER_CLIENTSECRET} mirantis/mirantis_spectacles `
lookml `
--base-url ${LOOKER_BASE_URL} `
--client-id ${LOOKER_CLIENTID} `
--client-secret ${LOOKER_CLIENTSECRET} `
--project ${PROJECT} `
--branch ${BRANCH}
endif

不幸的是,它在Windows上不起作用,我需要我的Makefile来支持Windows笔记本电脑上的分析师:

错误:

C:UsersrichaGitMirantisdataops-looker [main ≡ +0 ~1 -0 !]> make -s validate-lookml
process_begin: CreateProcess(NULL, uname -s, ...) failed.
Makefile:9: pipe: No error
process_begin: CreateProcess(NULL, uname -s, ...) failed.
Makefile:12: pipe: No error
process_begin: CreateProcess(NULL, uname -s, ...) failed.
Makefile:15: pipe: No error
usage: spectacles lookml [-h] [--config-file CONFIG_FILE] --base-url BASE_URL
--client-id CLIENT_ID --client-secret CLIENT_SECRET
[--port PORT] [--api-version API_VERSION] [-v]
[--log-dir LOG_DIR] [--do-not-track]
[--severity {success,info,warning,error,fatal}]
--project PROJECT [--branch BRANCH]
[--remote-reset | --commit-ref COMMIT_REF | --pin-imports PIN_IMPORTS [PIN_IMPORTS ...]]
spectacles lookml: error: argument --base-url: expected one argument
make: *** [Makefile:40: validate-lookml] Error 2

这里有很多混乱。

makefile由用两种完全不同的语言编写的行组成:一种是make语言,另一种是shell。不能将make操作发送到shell,也不能在make中(直接(运行shell命令。

Make通过使用TAB字符告诉这两者之间的区别。不使用TAB缩进的行由make解析,使用TAB缩排的行将提供给shell。所以,在你的makefile中:

validate-lookml:
UNAME_S=$(shell uname -s)
ifeq ($(UNAME), Linux)
docker run --rm -it -e LOOKER_BASE_URL=${LOOKER_BASE_URL} 

这是不对的,因为这里的前两行缩进是make命令,第三行是shell指令。你应该这样写:

UNAME_S := $(shell uname -s)
validate-lookml:
ifeq ($(UNAME), Linux)
docker run --rm -it -e LOOKER_BASE_URL=${LOOKER_BASE_URL} 
...
endif
ifeq ($(UNAME), Darwin)
...

等等。

但是,Windows上没有uname命令,所以当您运行该命令时,它将不起作用,这就是为什么您会收到错误process_begin:CreateProcess(NULL,uname-s,…(失败的原因如果您有GNU make 4.0或更好的版本,我建议您查看MAKE_HOST变量并使用它,而不是尝试运行uname

最后,您不必担心反斜杠的差异,因为make将解析所有反斜杠,并在启动shell之前自行删除它们。因此,只需使用反斜杠来继续食谱中的所有行,它将在所有不同的平台上以相同的方式工作。

最新更新