首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用在Windows (Windows_NT)和Mac (达尔文)上工作的.PHONY目标来制作Makefile

如何使用在Windows (Windows_NT)和Mac (达尔文)上工作的.PHONY目标来制作Makefile
EN

Stack Overflow用户
提问于 2022-10-14 15:50:25
回答 1查看 21关注 0票数 0

因此,我找到了一个链接,显示我应该使用以下内容,但可能我的逻辑在Makefile中是错误的。我需要使用Makefile进行测试,以便在Mac和Windows上工作。映像很好,并且码头容器可以工作,我只是想利用这样一个事实:在Linux/Mac中,可以使用\来缩短命令,而在Windows中,您必须使用回勾(`)。

示例:

代码语言:javascript
复制
.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笔记本上的分析人员:

错误:

代码语言:javascript
复制
C:\Users\richa\Git\Mirantis\dataops-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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-14 18:18:44

这里很混乱。

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

Make通过使用TAB字符来说明这两者之间的区别。未缩进TAB的行由make解析,与TAB缩进的行被赋予shell。所以,在你的makefile中:

代码语言:javascript
复制
validate-lookml:
        UNAME_S=$(shell uname -s)
        ifeq ($(UNAME), Linux)
        docker run --rm -it -e LOOKER_BASE_URL=${LOOKER_BASE_URL} \

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

代码语言:javascript
复制
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,.)失败。如果您有GNUmake4.0或更高版本,我建议您查看MAKE_HOST变量并使用它,而不是尝试运行uname

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74071824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档