我正在更新项目的 makefile,我需要根据客户或制造构建执行不同的步骤,
我已经编写了如下简单的 makefile,并且看到了意想不到的输出,
有人可以帮助解决 makefile 的问题吗。
PKG_VER ?= 1.2
TARGET_DEVICE ?= myboard_mf
BUILD_TYPE_CUSTOMER := CUSTOMER
BUILD_TYPE_MFG := MANUFACTURING
BUILD_TYPE := $(BUILD_TYPE_CUSTOMER)
TARGET_COMMON := $(subst _mf,,$(TARGET_DEVICE))
all:
#Check if it is mfg target or customer target
ifneq (,$(findstring _mf,$(TARGET_DEVICE)))
$(info common target name:$(TARGET_COMMON))
$(eval BUILD_TYPE := $(BUILD_TYPE_MFG))
endif
$(info build type:$(BUILD_TYPE))
$(info customer build type string:$(BUILD_TYPE_CUSTOMER))
#If it is customer build check package version.
ifneq ($(BUILD_TYPE), $(BUILD_TYPE_MFG))
$(info "inside customer build")
ifneq ($(PKG_VER),)
$(error pkage version not passed)
endif
endif
.PHONEY:all
我得到以下生成文件的输出
common target name:myboard
build type:MANUFACTURING
customer build type string:CUSTOMER
"inside customer build"
Makefile:12: *** pkage version not passed. Stop.
这是意外的输出,因为构建类型显然是 MANUFACTURING
。我记得 makefile 分两个阶段工作,我尝试按如下方式修复它,但这也不起作用
PKG_VER ?= 1.2
TARGET_DEVICE ?= myboard
BUILD_TYPE_CUSTOMER := CUSTOMER
BUILD_TYPE_MFG := MANUFACTURING
BUILD_TYPE := $(BUILD_TYPE_CUSTOMER)
TARGET_COMMON := $(subst _mf,,$(TARGET_DEVICE))
all:
#Check if it is mfg target or customer target
ifneq (,$(findstring _mf,$(TARGET_DEVICE)))
$(info common target name:$(TARGET_COMMON))
$(eval BUILD_TYPE := $(BUILD_TYPE_MFG))
endif
$(info build type:$(BUILD_TYPE))
$(info customer build type string:$(BUILD_TYPE_CUSTOMER))
#If it is customer build check package version.
if [ $(BUILD_TYPE) = $(BUILD_TYPE_CUSTOMER) ];then \
$(info "inside customer build") \
if [ $(PKG_VER) = "" ];then \
$(error pkage version not passed) \
fi \
fi
.PHONEY:all
基本上 TARGET_DEVICE=myboard_mf
它将是制造构建,而当 TARGET_DEVICE=myboard
时它将是客户构建,所以不要在 _mf
中搜索所有不同的条件我都想设置一些标志来指示构建类型,我可以在所有其他地方使用它。
有任何修复它的建议/指示吗?
最佳答案
我太累了,无法详细解释为什么您的尝试不起作用 :)。但是,您的问题的答案是,不要尝试将 make 预处理器命令和函数与配方脚本混合使用。根本不要将它们混合在一起,您就不会对这两个阶段产生混淆。我真的不明白为什么那么多人热衷于在食谱中编写 eval
语句……奇怪的是它如此普遍。实际上,该结构仅在最深奥的情况下才有用。
无论如何,如果您希望将这些变量设置为“在所有其他地方”使用,那么您为什么要尝试将它们设置在一个配方中呢?
我会完全抛弃“所有”目标并将其写为:
PKG_VER ?= 1.2
TARGET_DEVICE ?= myboard
BUILD_TYPE_CUSTOMER := CUSTOMER
BUILD_TYPE_MFG := MANUFACTURING
BUILD_TYPE := $(BUILD_TYPE_CUSTOMER)
TARGET_COMMON := $(subst _mf,,$(TARGET_DEVICE))
#Check if it is mfg target or customer target
ifneq (,$(findstring _mf,$(TARGET_DEVICE)))
$(info common target name:$(TARGET_COMMON))
BUILD_TYPE := $(BUILD_TYPE_MFG)
endif
$(info build type:$(BUILD_TYPE))
$(info customer build type string:$(BUILD_TYPE_CUSTOMER))
#If it is customer build check package version.
ifneq ($(BUILD_TYPE), $(BUILD_TYPE_MFG))
$(info "inside customer build")
ifneq ($(PKG_VER),)
$(error pkage version not passed)
endif
endif
关于linux - makefile 中的条件检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48673574/