尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

【Makefile 专家之路 | 逻辑篇】07. 逻辑之光:条件判断(ifeq/ifdef)在多环境下的应用

【Makefile 专家之路 | 逻辑篇】07. 逻辑之光:条件判断(ifeq/ifdef)在多环境下的应用 文章目录一、 条件判断的本质预处理二、四大判断金刚三、 语法细节最容易报错的地方四、 安卓工程师的实战案例多架构适配五、 安卓工程师的记忆卡片一、 条件判断的本质预处理一定要记住Makefile 的条件判断是在make解析读取文件阶段执行的而不是在命令执行阶段。这意味着你不能在命令Tab 开头的行里直接写ifeq。它的作用是决定“哪些代码块”会被make纳入执行计划。二、四大判断金刚指令逻辑实战场景ifeq (a, b)如果 a 等于 b判断TARGET_PRODUCT是否为某个特定机型ifneq (a, b)如果 a 不等于 b排除掉某些不支持的硬件模块ifdef var如果变量var值非空检查用户是否在命令行传了DEBUG1ifndef var如果变量var值为空设置默认路径或默认开关三、 语法细节最容易报错的地方参数的括号ifeq后面可以加括号(a, b)也可以用引号a b。Android 源码中为了清晰通常使用括号。空格的尊严ifeq与左括号之间必须有一个空格。❌ifeq(A,B)- 报错✅ifeq (A, B)- 正确注意缩进if的内容体可以缩进也可以不缩进。如果选择缩进美观代码千万不要用Tab键开头缩进否则会被Makefile误解为命令。可以选择使用两个空格或四个空格缩进。结束标志 每一个判断块必须以endif结尾。四、 安卓工程师的实战案例多架构适配在Android.mk中你经常会看到这种根据架构分配不同 CFLAGS 的逻辑# 根据 Android 目标架构选择编译优化ifeq($(TARGET_ARCH), arm64)LOCAL_CFLAGS-DARM64_OPTIMIZATIONelseifeq($(TARGET_ARCH), x86_64)LOCAL_CFLAGS-DX86_64_STABILITYelseLOCAL_CFLAGS-DGENERIC_ARCHendif进阶技巧嵌套判断你可以像写 C 语言一样嵌套判断比如先判断是不是arm64再判断是不是userdebug版本从而开启更深层的日志。五、 安卓工程师的记忆卡片ifdef的陷阱ifdef只是测试变量是否有值。如果你定义了DEBUG 后面是空的那么ifdef DEBUG会被判定为假。不要在命令块里写判断如果你想在 Shell 命令里做判断请使用 Shell 的if [ ... ]; then ... fi语法。Makefile 判断 控制 Makefile 规则的生成。Shell 判断 控制命令在运行时如何跳过。与strip函数配合在 Android 源码中为了防止变量里有看不见的空格大牛们喜欢写ifeq ($(strip $(LOCAL_MODULE_CLASS)), SHARED_LIBRARIES)这能保证逻辑的绝对健壮。【本篇自测】请看这段代码DEBUG :ifeq($(DEBUG),)FLAG :-O2elseFLAG :-gendif最终FLAG的值是多少如果把第一行改为DEBUG : 1执行结果会变吗
返回列表