linux - makefile 中的条件检查

标签 linux ubuntu gnu-make

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

相关文章:

c - umount 不适用于 C 中的设备(但可以在终端中使用)

c - 如何在 Linux 上刷新由 pipe() 创建的管道?

戈朗 : fatal error: unexpected signal during runtime execution

c - 链接时是否必须保持目标文件的相对目录路径完整?

build - gmake 和 make 有什么区别?

c - GNU 使用 stem 制定隐式归档规则

java - 在 Linux 中获取 Java 线程的线程 ID

python - 脚本在 IDLE 中返回输出,而不是在 CLI 上执行时

linux - 尝试在 Ubuntu Linux debian 中打包 Unity 游戏

linux - 无法找到 ejabberd/src 文件夹 - Ubuntu