Makefile: ifeq directive doesn't work with $*

本文详细解释了在Makefile中遇到的使用自动变量进行条件判断的问题,并提供了解决方案:通过使用$(if)指令来绕过自动变量在条件判断中的限制。举例说明了如何在Makefile中正确地应用这一解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在修改Makefile时,发现如果condition中包含$*(automatic variables),无论取什么值,ifeq语句永远只执行true语句或false语句。

do_lrg%: 
ifeq ("$(findstring $*,$(ALL_SHIPHOME_LRGS))", "")
        echo "regression test..."
else
        echo "shiphome test..."
endif

通过参照Makefile: ifeq directive compares special variable to constant does not work找到了答案。

Conditional Statements All instances of conditional syntax are parsed immediately, in their entirety; this includes the ifdef, ifeq, ifndef, and ifneq forms. Of course this means that automatic variables cannot be used in conditional statements, as automatic variables are not set until the command script for that rule is invoked. If you need to use automatic variables in a conditional you must use shell conditional syntax, in your command script proper, for these tests, not make conditionals.

但可以使用$(if condition,then-part[,else-part])去workaround它。

do_lrg%: 
        $(if $(findstring $*, $(ALL_SHIPHOME_LRGS)), 
           echo "shiphome test", 
           echo "regress test" 
        )
<think>好的,我现在需要帮助用户解决Makefile中的'missing separator'错误。首先,我得回忆一下这个错误的常见原因和处理方法。根据用户提供的引用内容,特别是引用[1]和引用[2],这个错误通常与Makefile的语法有关,尤其是缩进问题。 我记得Makefile要求命令行必须用Tab键缩进,而不能用空格。用户可能在编辑时不小心用了空格,或者编辑器自动将Tab转换成了空格。比如引用[2]中的例子,执行make时出现了missing separator错误,很可能是因为Makefile第13行的缩进不正确。 接下来,我需要检查用户提到的其他可能原因。比如,引用[3]提到路径问题,但这里的问题更直接是语法错误。引用[5]提到静态模式规则使用不正确,但这种情况较少见,所以可能不是主要原因。因此,我应该先确认缩进是否正确,是否使用了Tab。 修复步骤方面,应该建议用户检查Makefile中的每一行命令是否以Tab开头。可以使用cat -A命令来显示不可见字符,区分Tab和空格。另外,编辑器的配置也很重要,比如在Vim中设置:set list显示缩进,或者启用Tab替换为空格的功能。如果用户误用了空格,需要手动替换为Tab。 此外,用户可能使用了错误的语法结构,比如在条件语句中漏掉了Tab,或者规则定义不正确。例如,在引用[4]中提到的规则结构,确保目标后的命令正确缩进。如果用户复制粘贴时格式出错,也会导致这个问题。 最后,需要提醒用户测试修改后的Makefile,运行make命令确认错误是否解决。可能还需要检查其他部分是否有类似的缩进错误,避免遗漏。总结起来,重点在于缩进检查、编辑器配置和语法验证。</think>### Makefile 'missing separator' 错误原因及修复方法 #### 错误原因 1. **缩进格式错误** Makefile 要求规则下的命令行必须使用 **Tab 字符缩进**,而非空格。若用空格或混合缩进,会触发此错误。例如: ```makefile target: echo "Hello" # 错误!此处用空格而非Tab ``` 2. **语法规则冲突** - 误将变量赋值、条件语句(如 `ifeq`)等非规则结构与命令行混用,未正确使用 Tab 缩进[^5]。 - 静态模式规则(如 `%.o: %.c`)书写格式错误。 3. **编辑器自动转换** 部分编辑器(如 VS Code、Notepad)默认将 Tab 转换为空格,导致缩进失效[^2]。 --- #### 修复步骤 1. **验证缩进字符** 使用 `cat -A Makefile` 命令显示不可见字符,确认缩进是否为 `^I`(Tab 符号)而非空格: ```bash cat -A Makefile # 正确示例 target:$ ^Iecho "Hello" # ^I 表示 Tab ``` 2. **调整编辑器配置** - **Vim/Neovim**: 执行 `:set list` 显示不可见字符,或添加配置: ```vim autocmd FileType make setlocal noexpandtab # 禁止将 Tab 转空格 ``` - **VS Code**: 右下角切换语言模式为 "Makefile",并关闭 "Editor: Insert Spaces" 选项。 3. **手动替换缩进** 将错误的空格缩进替换为 Tab: ```makefile # 修复前(空格) clean: rm -rf *.o # 修复后(Tab) clean: rm -rf *.o ``` 4. **检查语法结构** 确保规则(`target:`)后的命令单独成块,且条件语句、变量赋值等与命令行分离: ```makefile # 错误示例(条件语句与命令混合) ifeq ($(DEBUG),1) CFLAGS += -g # 此处无需 Tab all: gcc $(CFLAGS) -o main main.c # 需要 Tab endif # 正确示例 ifeq ($(DEBUG),1) CFLAGS += -g endif all: gcc $(CFLAGS) -o main main.c ``` --- #### 示例修复对比 **错误 Makefile**: ```makefile all: @echo "Building..." # 用空格缩进 ``` **正确 Makefile**: ```makefile all: @echo "Building..." # 用 Tab 缩进 ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值