makefile中shell注意

1、在Makfile中shell变量需要使用$$来引用,而$(A)是Makefile的变量

test:
    for i in 1 2 3 4 5 ; \
    do\
        echo $$i ; \   #使用 $(i) 的话输出不正确
    done

2、makefile只能在target中调用shell,其他地方调用不出错但是不会被执行

VAR="hello"
$(echo $(VAR))
rul:
	gcc - o main.exe mian.c

上面makefile执行不会打印VAR变量的值,因为echo不在target rul里面

3、shell在makefile中执行时, 每一行shell都由一个单独进程执行,所以不同行的shell之间的变量值不能传递。为此写makefile时,不管shell有多长都要写在一行,这要是很多makefile中有很多行都是以"; "结尾的。

SUBDIR=src example
all:
    @for subdir in $(SUBDIR);  \
    do \
      echo "building ";  \
    done

4、makfeil中赋值符号"="两边允许空格,但是shell脚本的不允许有空格;

5、参考:
https://blog.youkuaiyun.com/groundhappy/article/details/52798234

### Makefile 中使用 Shell 命令的概述 在 Makefile 中,Shell 命令可以用来执行各种任务,例如文件操作、环境变量设置以及动态生成目标文件列表等。Makefile 支持直接调用 Shell 命令,并且可以通过特定的语法实现复杂的功能[^1]。 #### 调用 Shell 命令的基本方式 在 Makefile 中,每个命令行默认会被当作一条独立的 Shell 命令来执行。以下是一个简单的示例,展示如何通过 Makefile 调用 Shell 命令: ```makefile all: @echo "当前工作目录是: $(shell pwd)" ``` 上述代码中,`$(shell pwd)` 会调用 Shell 的 `pwd` 命令以获取当前的工作目录,并将其作为变量插入到 `echo` 命令中[^4]。 #### 使用分号分隔多条命令 如果需要在同一规则下执行多个 Shell 命令,可以使用分号 `;` 将它们连接起来。例如: ```makefile target: main.c utils.c $(CC) $(CFLAGS) -o $@ $^; cp $@ /usr/local/bin ``` 在此示例中,编译完成后会立即将生成的可执行文件复制到 `/usr/local/bin` 目录[^2]。 #### 动态生成目标文件列表 通过 `$(shell ...)` 函数,可以在 Makefile 中动态生成目标文件列表。例如: ```makefile SOURCES := $(shell find . -name "*.c") OBJECTS := $(SOURCES:.c=.o) all: $(OBJECTS) ``` 这里,`find` 命令用于查找所有 `.c` 文件,并将结果存储在 `SOURCES` 变量中。随后,通过替换后缀生成对应的 `.o` 文件列表[^3]。 #### 注意事项 - **Shell 环境变量的作用域**:在 Makefile 中定义的变量(如 `${data}`)与 Shell 中定义的变量是相互独立的。例如,在以下代码中,`data=2` 是一个 Shell 命令,它不会影响 Makefile 中的变量值: ```makefile data=1 all: @echo ${data}; \ data=2; \ echo ${data}; \ echo $${data}; ``` 输出结果为: ``` 1 1 2 ``` 这是因为 `${data}` 在 MakefileShell 中分别代表不同的变量[^5]。 - **避免冗余的 Shell 调用**:频繁使用 `$(shell ...)` 可能会导致性能问题,因为每次调用都会启动一个新的 Shell 实例。因此,应尽量减少对 `$(shell ...)` 的使用频率[^1]。 ```makefile # 示例:清理生成的文件 clean: $(RM) *.o $(RM) *.out ``` ### 总结 Makefile 提供了灵活的方式来调用 Shell 命令,既可以用于简单的文件操作,也可以实现复杂的构建逻辑。通过合理使用 `$(shell ...)` 和分号分隔符,可以显著提升 Makefile 的功能和效率[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值