【问题标题】:Assign variable read from file in Makefile recipe在 Makefile 配方中分配从文件中读取的变量
【发布时间】:2019-12-27 01:28:24
【问题描述】:

我正在尝试在 Makefile 配方中执行以下操作。使用 python 脚本获取服务器容器 IP。构建要在 docker 容器中运行的命令。在 docker 容器中运行命令。

test:
    SIP=$(shell python ./scripts/script.py get-server-ip)
    CMD="iperf3 -c ${SIP} -p 33445"
    docker exec server ${CMD}

我明白了

$ make test
SIP=172.17.0.6
CMD="iperf3 -c  -p 33445"
docker exec server 
"docker exec" requires at least 2 arguments.
See 'docker exec --help'.

用法:docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

在正在运行的容器中运行命令 make: *** [测试] 错误 1

【问题讨论】:

  • 每一行都在一个单独的子shell中执行。试着把它们都放在一条由&&连接的线上

标签: python makefile gnu-make


【解决方案1】:

我最终得到了这样的结果。

SERVER_IP=$(shell python ./scripts/script.py get-server-ip); \
    SERVER_CMD="iperf3 -s -p ${PORT} -4 --logfile s.out"; \
    CLIENT_CMD="iperf3 -c $${SERVER_IP} -p ${PORT} -t 1000 -4 --logfile c.out"; \
    echo "Server Command: " $${SERVER_CMD}; \
    echo "Client Command: " $${CLIENT_CMD}; \
    docker exec -d server $${SERVER_CMD}; \
    docker exec -d client $${CLIENT_CMD};

这似乎工作正常。很想知道是否有其他方法可以做到这一点。

【讨论】:

  • 我的意思是,为什么还要写一个makefile?这只不过是使用$(shell ...) make 函数嵌入到makefile 中的shell 脚本。只需将其编写为一个普通的 shell 脚本,它就会更易于理解和使用。
【解决方案2】:

你可以写这样的东西。在这里我使用了target-specific variable 假设 仅在此规则中需要 IP 地址。 iperf_command 被定义为变量 因为格式看起来相当固定,除了call function注入的IP地址。

另外,由于该规则似乎不应该将目标生成为文件,所以我也输入了.PHONY target

iperf_command = iperf3 -c $1 -p 33445

.PHONY: test
test: iperf_server_ip = $(shell python ./scripts/script.py get-server-ip)
test:
    docker exec server $(call iperf_command,$(iperf_server_ip))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多