makefile - 在 makefile 中,变量没有被覆盖,尽管显示它具有不同的值,并且也会导致错误的 ifeq
问题描述
考虑这个 Makefile,
#!/bin/sh
IS_FIRSTRUN:=false
.PHONY: firstrun
firstrun: export IS_FIRSTRUN:=true
firstrun: run
.PHONY: run
run:
@echo "IS_FIRSTRUN is <${IS_FIRSTRUN}>"
ifeq (${IS_FIRSTRUN},true)
@echo "In true statement, IS_FIRSTRUN after that is <${IS_FIRSTRUN}>"
endif
ifeq (${IS_FIRSTRUN},false)
@echo "In false statement, IS_FIRSTRUN after that is <${IS_FIRSTRUN}>"
endif
当我运行命令make run时,会发生这种情况。
make run
IS_FIRSTRUN is <false>
In false statement, IS_FIRSTRUN after that is <false>
当我运行命令make firstrun时,会发生这种情况。
make firstrun
IS_FIRSTRUN is <true>
In false statement, IS_FIRSTRUN after that is <true>
如您所见,执行make firstrun时,我希望执行 true 的 if 条件,但事实并非如此。我想知道为什么以及我做错了什么。
解决方案
您不能在ifeq
条件语句中使用特定于目标的变量。
条件语句在第一次通过时由 make 解析,当它读入 makefile 时。目标特定变量直到第二遍才定义,此时 make 实际上正在构建目标并运行配方。请参阅GNU make 手册,其中说:
与自动变量一样,这些值仅在目标配方的上下文中可用(以及在其他特定于目标的分配中)。
仅仅因为ifeq
出现在配方的中间并不意味着它是配方的一部分:只有缩进有 TAB 的行才是配方的一部分。
如果您希望对特定于目标的变量进行检查,则需要在配方中使用 shell 条件构造,而不是制作条件构造,如下所示:
run:
@echo "IS_FIRSTRUN is <${IS_FIRSTRUN}>"
@if [ '${IS_FIRSTRUN}' = true ]; then \
echo "In true statement, IS_FIRSTRUN after that is <${IS_FIRSTRUN}>"; \
fi
@if [ '${IS_FIRSTRUN}' = false ]; then \
echo "In false statement, IS_FIRSTRUN after that is <${IS_FIRSTRUN}>"; \
fi
推荐阅读
- kotlin - 如何对混合 Kotlin 集合的特定元素求和
- android - 在android中获取隐身chrome的屏幕截图
- reactjs - 无法使自定义无线电控件成为已包含动态生成的无线电控件的无线电组的一部分
- python - Flask 应用程序 - 部署到 AWS Elastic Beanstalk 时出错
- gtk - 系统主题不适用于程序
- ios - UIPageViewController 在孩子之间共享变量
- javascript - Safari 移动版忽略 if else 语句的第一块
- javascript - 为什么我从类到构造函数的转换不起作用?
- javascript - 重置阵列后,条的颜色保持绿色
- image-processing - 如何提取多个图像的公共部分并将其作为单个透明 PNG