FIX: makefile and .vimrc no show -
This commit is contained in:
parent
645ad6f9aa
commit
b0afca5d61
@ -3,49 +3,71 @@
|
|||||||
## 目录
|
## 目录
|
||||||
- [参数](#参数)
|
- [参数](#参数)
|
||||||
- [makefile](#makefile)
|
- [makefile](#makefile)
|
||||||
|
- [变量与赋值](#变量和赋值)
|
||||||
|
- [自动变量](#自动变量)
|
||||||
|
- [函数](#函数)
|
||||||
|
- [条件判断](#条件判断)
|
||||||
|
- [包含其他 Makefile](#include)
|
||||||
|
- [多目标规则](#多目标规则)
|
||||||
|
- [伪目标](#伪目标)
|
||||||
|
- [自定义函数](#自定义函数)
|
||||||
|
- [错误处理](#错误处理)
|
||||||
|
- [环境变量](#环境变量)
|
||||||
|
- [多行命令](#多行命令)
|
||||||
|
- [命令前缀](#命令前缀)
|
||||||
|
- [文件搜索路径](#文件搜索路径)
|
||||||
|
- [静态模式规则](#静态模式规则)
|
||||||
|
- [自定义后缀规则](#自定义后缀规则)
|
||||||
|
- [动态生成规则](#动态生成规则)
|
||||||
|
- [使用循环](#使用循环)
|
||||||
|
- [执行外部命令](#执行外部命令)
|
||||||
|
- [](#)
|
||||||
|
- [](#)
|
||||||
|
- [](#)
|
||||||
|
- [](#)
|
||||||
|
- [](#)
|
||||||
|
- [](#)
|
||||||
|
|
||||||
## 参数
|
---
|
||||||
`-n` 参数可以打印出make会执行的命令,但不真正执行
|
|
||||||
`-f <filename>` 指定makefile
|
|
||||||
`-i` 忽略错误
|
|
||||||
`-k` 在某个目标失败时,尽量构建其他
|
|
||||||
`-s` 静默
|
|
||||||
`-j4` 4线程
|
|
||||||
`-C /dir` 进入指定目录再运行
|
|
||||||
`-d` debug
|
|
||||||
`-w` 打印工作目录
|
|
||||||
`-B` 强制重新构建
|
|
||||||
|
|
||||||
## makefile
|
## **参数**
|
||||||
|
- `-n` 参数可以打印出make会执行的命令,但不真正执行
|
||||||
|
- `-f <filename>` 指定makefile
|
||||||
|
- `-i` 忽略错误
|
||||||
|
- `-k` 在某个目标失败时,尽量构建其他
|
||||||
|
- `-s` 静默
|
||||||
|
- `-j4` 4线程
|
||||||
|
- `-C /dir` 进入指定目录再运行
|
||||||
|
- `-d` debug
|
||||||
|
- `-w` 打印工作目录
|
||||||
|
- `-B` 强制重新构建
|
||||||
|
|
||||||
|
## **makefile**
|
||||||
Makefile 是一种用于自动化构建和管理项目的工具,尤其在 C/C++ 项目中广泛使用。除了基本的规则和依赖关系,Makefile 还支持一些高级语法和功能,可以帮助你编写更灵活和高效的构建脚本
|
Makefile 是一种用于自动化构建和管理项目的工具,尤其在 C/C++ 项目中广泛使用。除了基本的规则和依赖关系,Makefile 还支持一些高级语法和功能,可以帮助你编写更灵活和高效的构建脚本
|
||||||
|
|
||||||
|
```
|
||||||
规则:依赖
|
规则:依赖
|
||||||
命令
|
命令
|
||||||
__注意: 命令前面必须要用Tab__
|
__注意: 命令前面必须要用Tab__
|
||||||
|
```
|
||||||
|
|
||||||
## 普通变量定义
|
- 普通变量定义
|
||||||
OPTION = -O3 -Wall
|
`OPTION = -O3 -Wall`
|
||||||
|
|
||||||
## 变量使用
|
- 变量使用
|
||||||
g++ $(OPTION) xxx
|
`g++ $(OPTION) xxx`
|
||||||
|
|
||||||
### 1. 变量和赋值
|
---
|
||||||
Makefile 支持多种变量赋值方式:
|
|
||||||
|
|
||||||
|
### 变量和赋值
|
||||||
- **`=`**:递归展开变量,变量值在使用时展开。
|
- **`=`**:递归展开变量,变量值在使用时展开。
|
||||||
- **`:=`**:简单展开变量,变量值在定义时展开。
|
- **`:=`**:简单展开变量,变量值在定义时展开。
|
||||||
- **`?=`**:条件赋值,只有当变量未定义时才赋值。
|
- **`?=`**:条件赋值,只有当变量未定义时才赋值。
|
||||||
- **`+=`**:追加赋值,将值追加到变量末尾。
|
- **`+=`**:追加赋值,将值追加到变量末尾。
|
||||||
|
|
||||||
```makefile
|
---
|
||||||
CC = gcc
|
|
||||||
CFLAGS := -Wall -O2
|
|
||||||
CFLAGS += -g
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. 自动变量
|
|
||||||
Makefile 提供了一些自动变量,用于简化规则的编写:
|
|
||||||
|
|
||||||
|
### 自动变量
|
||||||
- **`$@`**:目标文件名。
|
- **`$@`**:目标文件名。
|
||||||
- **`$<`**:第一个依赖文件名。
|
- **`$<`**:第一个依赖文件名。
|
||||||
- **`$^`**:所有依赖文件列表。
|
- **`$^`**:所有依赖文件列表。
|
||||||
@ -57,15 +79,9 @@ Makefile 提供了一些自动变量,用于简化规则的编写:
|
|||||||
$(CC) $(CFLAGS) -c $< -o $@
|
$(CC) $(CFLAGS) -c $< -o $@
|
||||||
```
|
```
|
||||||
|
|
||||||
### 3. 模式规则
|
---
|
||||||
模式规则允许你使用通配符来定义规则,适用于多个文件。
|
|
||||||
|
|
||||||
```makefile
|
### 函数
|
||||||
%.o: %.c
|
|
||||||
$(CC) $(CFLAGS) -c $< -o $@
|
|
||||||
```
|
|
||||||
|
|
||||||
### 4. 函数
|
|
||||||
Makefile 提供了一些内置函数,用于处理字符串、文件名等。
|
Makefile 提供了一些内置函数,用于处理字符串、文件名等。
|
||||||
|
|
||||||
- **`$(wildcard pattern)`**:匹配文件名模式。
|
- **`$(wildcard pattern)`**:匹配文件名模式。
|
||||||
@ -78,8 +94,10 @@ SRCS = $(wildcard *.c)
|
|||||||
OBJS = $(patsubst %.c,%.o,$(SRCS))
|
OBJS = $(patsubst %.c,%.o,$(SRCS))
|
||||||
```
|
```
|
||||||
|
|
||||||
### 5. 条件判断
|
---
|
||||||
Makefile 支持条件判断,可以根据条件执行不同的操作。
|
|
||||||
|
### 条件判断
|
||||||
|
- Makefile 条件判断,可以根据条件执行不同的操作。
|
||||||
|
|
||||||
```makefile
|
```makefile
|
||||||
ifeq ($(DEBUG),1)
|
ifeq ($(DEBUG),1)
|
||||||
@ -89,35 +107,42 @@ else
|
|||||||
endif
|
endif
|
||||||
```
|
```
|
||||||
|
|
||||||
### 6. 包含其他 Makefile
|
- `if` 函数可以用于条件判断。
|
||||||
|
|
||||||
|
```makefile
|
||||||
|
DEBUG = 1
|
||||||
|
|
||||||
|
CFLAGS += $(if $(DEBUG),-g,-O2)
|
||||||
|
```
|
||||||
|
|
||||||
|
- `or` 和 `and` 函数可以用于逻辑操作。
|
||||||
|
|
||||||
|
```makefile
|
||||||
|
ifeq ($(DEBUG),1)
|
||||||
|
CFLAGS += -g
|
||||||
|
else ifeq ($(OPTIMIZE),1)
|
||||||
|
CFLAGS += -O2
|
||||||
|
endif
|
||||||
|
```
|
||||||
|
|
||||||
|
- `not` 函数可以用于取反操作。
|
||||||
|
|
||||||
|
```makefile
|
||||||
|
ifneq ($(DEBUG),1)
|
||||||
|
CFLAGS += -O2
|
||||||
|
endif
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### include
|
||||||
你可以使用 `include` 指令将其他 Makefile 包含到当前 Makefile 中。
|
你可以使用 `include` 指令将其他 Makefile 包含到当前 Makefile 中。
|
||||||
|
|
||||||
```makefile
|
```makefile
|
||||||
include config.mk
|
include config.mk
|
||||||
```
|
```
|
||||||
|
|
||||||
### 7. 多目标规则
|
- 你可以在 Makefile 中调用另一个 Makefile,通常用于构建子目录中的项目。
|
||||||
你可以为一个规则定义多个目标,这样它们可以共享相同的命令。
|
|
||||||
|
|
||||||
```makefile
|
|
||||||
all: target1 target2
|
|
||||||
|
|
||||||
target1 target2:
|
|
||||||
@echo Building $@
|
|
||||||
```
|
|
||||||
|
|
||||||
### 8. 伪目标
|
|
||||||
伪目标是指那些不对应实际文件的目标,通常用于执行一些操作,如清理、安装等。
|
|
||||||
|
|
||||||
```makefile
|
|
||||||
.PHONY: clean
|
|
||||||
|
|
||||||
clean:
|
|
||||||
rm -f *.o
|
|
||||||
```
|
|
||||||
|
|
||||||
### 9. 嵌套 Makefile
|
|
||||||
你可以在 Makefile 中调用另一个 Makefile,通常用于构建子目录中的项目。
|
|
||||||
|
|
||||||
```makefile
|
```makefile
|
||||||
SUBDIRS = dir1 dir2
|
SUBDIRS = dir1 dir2
|
||||||
@ -128,8 +153,34 @@ $(SUBDIRS):
|
|||||||
all: $(SUBDIRS)
|
all: $(SUBDIRS)
|
||||||
```
|
```
|
||||||
|
|
||||||
### 10. 自定义函数
|
---
|
||||||
你可以通过 `define` 和 `endef` 定义自定义函数。
|
|
||||||
|
### 多目标规则
|
||||||
|
- 你可以为一个规则定义多个目标,这样它们可以共享相同的命令。
|
||||||
|
|
||||||
|
```makefile
|
||||||
|
all: target1 target2
|
||||||
|
|
||||||
|
target1 target2:
|
||||||
|
@echo Building $@
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 伪目标
|
||||||
|
伪目标是指那些不对应实际文件的目标,通常用于执行一些操作,如清理、安装等。
|
||||||
|
|
||||||
|
```makefile
|
||||||
|
.PHONY: clean
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f *.o
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 自定义函数
|
||||||
|
- 你可以通过 `define` 和 `endef` 定义自定义函数。
|
||||||
|
|
||||||
```makefile
|
```makefile
|
||||||
define greet
|
define greet
|
||||||
@ -140,43 +191,40 @@ all:
|
|||||||
$(call greet,World)
|
$(call greet,World)
|
||||||
```
|
```
|
||||||
|
|
||||||
### 11. 错误处理
|
- `call` 函数可以调用自定义函数,并传递参数。
|
||||||
|
|
||||||
|
```makefile
|
||||||
|
define greet
|
||||||
|
@echo "Hello, $(1)!"
|
||||||
|
endef
|
||||||
|
|
||||||
|
all:
|
||||||
|
$(call greet,World)
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 错误处理
|
||||||
你可以使用 `$(error text)` 和 `$(warning text)` 来生成错误或警告信息。
|
你可以使用 `$(error text)` 和 `$(warning text)` 来生成错误或警告信息。
|
||||||
|
|
||||||
```makefile
|
```makefile
|
||||||
ifeq ($(CC),)
|
|
||||||
$(error CC is not set)
|
$(error CC is not set)
|
||||||
endif
|
$(info Building target $(TARGET))
|
||||||
|
$(warning This is a warning message)
|
||||||
```
|
```
|
||||||
|
|
||||||
### 13. 隐式规则
|
---
|
||||||
Makefile 有一些内置的隐式规则,可以自动推导如何从源文件生成目标文件。你可以通过定义自己的隐式规则来覆盖默认行为。
|
|
||||||
|
|
||||||
```makefile
|
### 环境变量
|
||||||
%.o: %.c
|
|
||||||
$(CC) $(CFLAGS) -c $< -o $@
|
|
||||||
```
|
|
||||||
|
|
||||||
### 14. 动态依赖
|
|
||||||
你可以使用 `-include` 来包含动态生成的依赖文件,通常用于自动生成头文件依赖。
|
|
||||||
|
|
||||||
```makefile
|
|
||||||
-include $(OBJS:.o=.d)
|
|
||||||
|
|
||||||
%.d: %.c
|
|
||||||
@$(CC) -MM $< > $@.$$$$; \
|
|
||||||
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
|
|
||||||
rm -f $@.$$$$
|
|
||||||
```
|
|
||||||
|
|
||||||
### 16. 环境变量
|
|
||||||
Makefile 可以访问环境变量,并且可以通过 `export` 将变量传递给子 Makefile。
|
Makefile 可以访问环境变量,并且可以通过 `export` 将变量传递给子 Makefile。
|
||||||
|
|
||||||
```makefile
|
```makefile
|
||||||
export PATH := $(PATH):/usr/local/bin
|
export PATH := $(PATH):/usr/local/bin
|
||||||
```
|
```
|
||||||
|
|
||||||
### 17. 多行命令
|
---
|
||||||
|
|
||||||
|
### 多行命令
|
||||||
你可以使用反斜杠 `\` 将长命令分成多行。
|
你可以使用反斜杠 `\` 将长命令分成多行。
|
||||||
|
|
||||||
```makefile
|
```makefile
|
||||||
@ -185,7 +233,9 @@ all:
|
|||||||
multiple lines."
|
multiple lines."
|
||||||
```
|
```
|
||||||
|
|
||||||
### 18. 命令前缀
|
---
|
||||||
|
|
||||||
|
### 命令前缀
|
||||||
命令前缀可以控制命令的执行方式:
|
命令前缀可以控制命令的执行方式:
|
||||||
|
|
||||||
- **`@`**:不显示命令本身,只显示输出。
|
- **`@`**:不显示命令本身,只显示输出。
|
||||||
@ -197,7 +247,9 @@ all:
|
|||||||
-rm -f non_existent_file
|
-rm -f non_existent_file
|
||||||
```
|
```
|
||||||
|
|
||||||
### 19. 文件搜索路径
|
---
|
||||||
|
|
||||||
|
### 文件搜索路径
|
||||||
你可以使用 `VPATH` 或 `vpath` 来指定源文件的搜索路径。
|
你可以使用 `VPATH` 或 `vpath` 来指定源文件的搜索路径。
|
||||||
|
|
||||||
```makefile
|
```makefile
|
||||||
@ -207,19 +259,9 @@ vpath %.c src
|
|||||||
vpath %.h include
|
vpath %.h include
|
||||||
```
|
```
|
||||||
|
|
||||||
### 20. 递归扩展变量
|
---
|
||||||
递归扩展变量在使用时才会展开,可以用于动态生成内容。
|
|
||||||
|
|
||||||
```makefile
|
### 静态模式规则
|
||||||
FOO = $(BAR)
|
|
||||||
BAR = $(BAZ)
|
|
||||||
BAZ = Hello
|
|
||||||
|
|
||||||
all:
|
|
||||||
@echo $(FOO) # 输出 Hello
|
|
||||||
```
|
|
||||||
|
|
||||||
### 21. 静态模式规则
|
|
||||||
静态模式规则允许你为特定目标定义规则。
|
静态模式规则允许你为特定目标定义规则。
|
||||||
|
|
||||||
```makefile
|
```makefile
|
||||||
@ -229,18 +271,9 @@ $(objects): %.o: %.c
|
|||||||
$(CC) $(CFLAGS) -c $< -o $@
|
$(CC) $(CFLAGS) -c $< -o $@
|
||||||
```
|
```
|
||||||
|
|
||||||
### 22. 多架构支持
|
---
|
||||||
你可以通过条件判断来支持多架构编译。
|
|
||||||
|
|
||||||
```makefile
|
### 自定义后缀规则
|
||||||
ifeq ($(ARCH),x86)
|
|
||||||
CFLAGS += -m32
|
|
||||||
else ifeq ($(ARCH),x64)
|
|
||||||
CFLAGS += -m64
|
|
||||||
endif
|
|
||||||
```
|
|
||||||
|
|
||||||
### 23. 自定义后缀规则
|
|
||||||
你可以定义自定义的后缀规则来处理特定类型的文件。
|
你可以定义自定义的后缀规则来处理特定类型的文件。
|
||||||
|
|
||||||
```makefile
|
```makefile
|
||||||
@ -250,7 +283,9 @@ endif
|
|||||||
$(CXX) $(CXXFLAGS) -c $< -o $@
|
$(CXX) $(CXXFLAGS) -c $< -o $@
|
||||||
```
|
```
|
||||||
|
|
||||||
### 24. 使用 `eval` 动态生成规则
|
---
|
||||||
|
|
||||||
|
### 动态生成规则
|
||||||
`eval` 函数可以动态生成 Makefile 规则。
|
`eval` 函数可以动态生成 Makefile 规则。
|
||||||
|
|
||||||
```makefile
|
```makefile
|
||||||
@ -262,7 +297,9 @@ endef
|
|||||||
$(eval $(call MAKE_RULE,foo.o,foo.c))
|
$(eval $(call MAKE_RULE,foo.o,foo.c))
|
||||||
```
|
```
|
||||||
|
|
||||||
### 25. 使用 `foreach` 循环
|
---
|
||||||
|
|
||||||
|
### 使用循环
|
||||||
`foreach` 函数可以用于循环处理列表中的每个元素。
|
`foreach` 函数可以用于循环处理列表中的每个元素。
|
||||||
|
|
||||||
```makefile
|
```makefile
|
||||||
@ -272,61 +309,16 @@ all:
|
|||||||
$(foreach dir,$(DIRS),$(MAKE) -C $(dir);)
|
$(foreach dir,$(DIRS),$(MAKE) -C $(dir);)
|
||||||
```
|
```
|
||||||
|
|
||||||
### 26. 使用 `call` 调用自定义函数
|
---
|
||||||
`call` 函数可以调用自定义函数,并传递参数。
|
|
||||||
|
|
||||||
```makefile
|
### 执行外部命令
|
||||||
define greet
|
|
||||||
@echo "Hello, $(1)!"
|
|
||||||
endef
|
|
||||||
|
|
||||||
all:
|
|
||||||
$(call greet,World)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 27. 使用 `shell` 函数执行外部命令
|
|
||||||
`shell` 函数可以执行外部命令并返回结果。
|
`shell` 函数可以执行外部命令并返回结果。
|
||||||
|
|
||||||
```makefile
|
```makefile
|
||||||
DATE := $(shell date)
|
DATE := $(shell date)
|
||||||
```
|
```
|
||||||
|
|
||||||
### 28. 使用 `info` 和 `warning` 输出信息
|
---
|
||||||
`info` 和 `warning` 函数可以用于输出信息。
|
|
||||||
|
|
||||||
```makefile
|
|
||||||
$(info Building target $(TARGET))
|
|
||||||
$(warning This is a warning message)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 29. 使用 `if` 条件判断
|
|
||||||
`if` 函数可以用于条件判断。
|
|
||||||
|
|
||||||
```makefile
|
|
||||||
DEBUG = 1
|
|
||||||
|
|
||||||
CFLAGS += $(if $(DEBUG),-g,-O2)
|
|
||||||
```
|
|
||||||
|
|
||||||
### 30. 使用 `or` 和 `and` 逻辑操作
|
|
||||||
`or` 和 `and` 函数可以用于逻辑操作。
|
|
||||||
|
|
||||||
```makefile
|
|
||||||
ifeq ($(DEBUG),1)
|
|
||||||
CFLAGS += -g
|
|
||||||
else ifeq ($(OPTIMIZE),1)
|
|
||||||
CFLAGS += -O2
|
|
||||||
endif
|
|
||||||
```
|
|
||||||
|
|
||||||
### 31. 使用 `not` 取反
|
|
||||||
`not` 函数可以用于取反操作。
|
|
||||||
|
|
||||||
```makefile
|
|
||||||
ifneq ($(DEBUG),1)
|
|
||||||
CFLAGS += -O2
|
|
||||||
endif
|
|
||||||
```
|
|
||||||
|
|
||||||
### 32. 使用 `filter` 和 `filter-out` 过滤列表
|
### 32. 使用 `filter` 和 `filter-out` 过滤列表
|
||||||
`filter` 和 `filter-out` 函数可以用于过滤列表。
|
`filter` 和 `filter-out` 函数可以用于过滤列表。
|
||||||
|
@ -20,6 +20,10 @@ set ts=4
|
|||||||
set softtabstop=4 " 编辑时退格键删除的空格数
|
set softtabstop=4 " 编辑时退格键删除的空格数
|
||||||
set shiftwidth=4 " 自动缩进使用的空格数
|
set shiftwidth=4 " 自动缩进使用的空格数
|
||||||
|
|
||||||
|
"把 - 和 _ 也看作单词的一部分
|
||||||
|
set iskeyword+=-
|
||||||
|
set iskeyword+=_
|
||||||
|
|
||||||
"缓冲区操作
|
"缓冲区操作
|
||||||
nnoremap <space>b :buffers<cr>:b<space>
|
nnoremap <space>b :buffers<cr>:b<space>
|
||||||
nnoremap <space>e :b#<cr>
|
nnoremap <space>e :b#<cr>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user