gpt4 book ai didi

linux - makefile 中的条件检查

转载 作者:太空宇宙 更新时间:2023-11-04 10:11:44 24 4
gpt4 key购买 nike

我正在更新项目的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com