makefile中一些符号

a.o : b.c c.c
$?所有比目标新的依赖目标的集合
$^代表所有依赖文件(b.c, c.c)
$@代表规则的目标文件(a.o)
$<代表第一个依赖文件(b.c)
[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[
在u-boot的makefile中,有这样里两段
smdk2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0

第一个@是让编译时不显示这条命令。。。

第二个@并不是单独的,而是和$一起构成$@,表示目标(注意是整个目标,包括扩展名的),在这里的意思就是smdk2410_config ,s:a=b的意思是把s中的a用b替换, 
这样就很清楚了,$(@:_config=)等价于(smdk2410_config:_config=),是要把smdk2410_config转变为smdk2410

### Makefile 中的符号及其作用 Makefile 是 GNU `make` 工具解析的构建脚本,用于控制编译流程。其语法中使用了多种符号来表示变量、规则、依赖关系等。以下是对 Makefile 中常见符号的详细说明。 --- #### 1. **`:`(冒号)** 表示规则中的目标与依赖之间的分隔符。左侧是目标,右侧是依赖文件列表。 ```makefile main.o: main.c defs.h cc -c main.c ``` 此语法定义了 `main.o` 的生成规则,依赖于 `main.c` 和 `defs.h` [^5]。 --- #### 2. **`=`(赋值符)** 用于定义变量并赋值,是基本的变量赋值方式。 ```makefile objects = main.o kbd.o command.o ``` 该语句定义了变量 `objects` 并赋值为目标文件列表 [^5]。 --- #### 3. **`:=`(立即展开赋值符)** 定义变量时立即展开右边的表达式,而不是延迟展开。 ```makefile x := foo y := $(x) bar ``` 此时 `y` 的值为 `foo bar`,因为 `$(x)` 在赋值时已经展开 [^1]。 --- #### 4. **`?=`(条件赋值符)** 只有在变量未定义时才赋值。 ```makefile FOO ?= bar ``` 如果 `FOO` 尚未定义,则其值为 `bar`;否则保持原值 [^1]。 --- #### 5. **`+=`(追加赋值符)** 向已有变量追加值。 ```makefile CFLAGS += -Wall ``` 将 `-Wall` 添加到 `CFLAGS` 变量中 [^1]。 --- #### 6. **`$`(变量引用符)** 用于引用变量的值,通常与括号或花括号一起使用。 ```makefile cc -o edit $(objects) ``` `$(objects)` 表示引用变量 `objects` 的值 [^5]。 --- #### 7. **`@`(命令前缀)** 在命令前加上 `@` 可以阻止该命令在执行时被输出。 ```makefile @echo "Compiling..." ``` 运行时不会显示 `echo "Compiling..."`,只显示输出结果 [^1]。 --- #### 8. **`-`(忽略错误前缀)** 在命令前加 `-` 表示忽略该命令的执行错误。 ```makefile -rm *.o ``` 即使 `rm` 命令失败(如文件不存在),也不会中断 `make` 的执行 。 --- #### 9. **`+`(强制执行前缀)** 在命令前加 `+` 表示即使使用 `-n` 选项,该命令也会被执行。 ```makefile +echo "This will run even with -n" ``` --- #### 10. **`#`(注释符)** 用于在 Makefile 中添加注释,从 `#` 开始到行尾的内容将被忽略。 ```makefile # This is a comment CC = gcc ``` --- #### 11. **`\`(续行符)** 用于将一行内容延续到下一行,避免单行过长。 ```makefile objects = main.o kbd.o command.o \ display.o insert.o search.o ``` --- #### 12. **`%`(通配符)** 用于模式规则中,匹配任意非空字符串。 ```makefile %.o: %.c $(CC) -c $< ``` 该规则表示所有 `.o` 文件都依赖于同名的 `.c` 文件 [^5]。 --- #### 13. **`$@`(自动变量)** 表示规则中的目标文件名。 ```makefile edit: $(objects) cc -o $@ $(objects) ``` `$@` 等价于 `edit` [^5]。 --- #### 14. **`$<`(自动变量)** 表示第一个依赖文件。 ```makefile %.o: %.c $(CC) -c $< -o $@ ``` `$<` 表示 `.c` 文件 。 --- #### 15. **`$^`(自动变量)** 表示所有依赖文件列表,去重。 ```makefile edit: main.o kbd.o cc -o $@ $^ ``` `$^` 等价于 `main.o kbd.o` [^5]。 --- #### 16. **`vpath`(关键字)** 用于指定搜索路径,支持模式匹配。 ```makefile vpath %.c src/ ``` 表示在 `src/` 目录下查找 `.c` 文件 [^3]。 --- #### 17. **`VPATH`(变量)** 指定所有依赖文件的搜索路径。 ```makefile VPATH = src:include ``` 表示在 `src` 和 `include` 目录中查找依赖文件 [^3]。 --- #### 18. **`.PHONY`(伪目标)** 声明一个目标为伪目标,即使存在同名文件也不会跳过执行。 ```makefile .PHONY: clean clean: rm *.o ``` 如果没有声明 `.PHONY`,而当前目录存在 `clean` 文件,则 `make clean` 不会执行 [^4]。 --- #### 19. **`include`(关键字)** 用于在 Makefile 中包含其他 Makefile 文件。 ```makefile include config.mk ``` 可以将 `config.mk` 中的变量和规则包含进当前 Makefile [^1]。 --- #### 20. **`-I`(命令行选项)** 指定包含其他 Makefile 文件的搜索路径。 ```bash make -I includes/ ``` 表示在 `includes/` 目录中查找被 `include` 引用的文件 [^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值