From b0afca5d61a03c027501174fa45692b869e04f97 Mon Sep 17 00:00:00 2001 From: rangersly <2281598291@qq.com> Date: Fri, 2 May 2025 12:09:05 +0800 Subject: [PATCH] FIX: makefile and .vimrc no show `-` --- program/tool/makefile.md | 314 +++++++++++++++++++-------------------- tool/vim/.vimrc | 4 + 2 files changed, 157 insertions(+), 161 deletions(-) diff --git a/program/tool/makefile.md b/program/tool/makefile.md index e398e43..ed72dc5 100644 --- a/program/tool/makefile.md +++ b/program/tool/makefile.md @@ -3,49 +3,71 @@ ## 目录 - [参数](#参数) - [makefile](#makefile) + - [变量与赋值](#变量和赋值) + - [自动变量](#自动变量) + - [函数](#函数) + - [条件判断](#条件判断) + - [包含其他 Makefile](#include) + - [多目标规则](#多目标规则) + - [伪目标](#伪目标) + - [自定义函数](#自定义函数) + - [错误处理](#错误处理) + - [环境变量](#环境变量) + - [多行命令](#多行命令) + - [命令前缀](#命令前缀) + - [文件搜索路径](#文件搜索路径) + - [静态模式规则](#静态模式规则) + - [自定义后缀规则](#自定义后缀规则) + - [动态生成规则](#动态生成规则) + - [使用循环](#使用循环) + - [执行外部命令](#执行外部命令) + - [](#) + - [](#) + - [](#) + - [](#) + - [](#) + - [](#) -## 参数 -`-n` 参数可以打印出make会执行的命令,但不真正执行 -`-f ` 指定makefile -`-i` 忽略错误 -`-k` 在某个目标失败时,尽量构建其他 -`-s` 静默 -`-j4` 4线程 -`-C /dir` 进入指定目录再运行 -`-d` debug -`-w` 打印工作目录 -`-B` 强制重新构建 +--- -## makefile +## **参数** +- `-n` 参数可以打印出make会执行的命令,但不真正执行 +- `-f ` 指定makefile +- `-i` 忽略错误 +- `-k` 在某个目标失败时,尽量构建其他 +- `-s` 静默 +- `-j4` 4线程 +- `-C /dir` 进入指定目录再运行 +- `-d` debug +- `-w` 打印工作目录 +- `-B` 强制重新构建 + +## **makefile** Makefile 是一种用于自动化构建和管理项目的工具,尤其在 C/C++ 项目中广泛使用。除了基本的规则和依赖关系,Makefile 还支持一些高级语法和功能,可以帮助你编写更灵活和高效的构建脚本 +``` 规则:依赖 命令 __注意: 命令前面必须要用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 $@ ``` -### 3. 模式规则 -模式规则允许你使用通配符来定义规则,适用于多个文件。 +--- -```makefile -%.o: %.c - $(CC) $(CFLAGS) -c $< -o $@ -``` - -### 4. 函数 +### 函数 Makefile 提供了一些内置函数,用于处理字符串、文件名等。 - **`$(wildcard pattern)`**:匹配文件名模式。 @@ -78,8 +94,10 @@ SRCS = $(wildcard *.c) OBJS = $(patsubst %.c,%.o,$(SRCS)) ``` -### 5. 条件判断 -Makefile 支持条件判断,可以根据条件执行不同的操作。 +--- + +### 条件判断 +- Makefile 条件判断,可以根据条件执行不同的操作。 ```makefile ifeq ($(DEBUG),1) @@ -89,35 +107,42 @@ else 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 中。 ```makefile include config.mk ``` -### 7. 多目标规则 -你可以为一个规则定义多个目标,这样它们可以共享相同的命令。 - -```makefile -all: target1 target2 - -target1 target2: - @echo Building $@ -``` - -### 8. 伪目标 -伪目标是指那些不对应实际文件的目标,通常用于执行一些操作,如清理、安装等。 - -```makefile -.PHONY: clean - -clean: - rm -f *.o -``` - -### 9. 嵌套 Makefile -你可以在 Makefile 中调用另一个 Makefile,通常用于构建子目录中的项目。 +- 你可以在 Makefile 中调用另一个 Makefile,通常用于构建子目录中的项目。 ```makefile SUBDIRS = dir1 dir2 @@ -128,8 +153,34 @@ $(SUBDIRS): all: $(SUBDIRS) ``` -### 10. 自定义函数 -你可以通过 `define` 和 `endef` 定义自定义函数。 +--- + +### 多目标规则 +- 你可以为一个规则定义多个目标,这样它们可以共享相同的命令。 + +```makefile +all: target1 target2 + +target1 target2: + @echo Building $@ +``` + +--- + +### 伪目标 +伪目标是指那些不对应实际文件的目标,通常用于执行一些操作,如清理、安装等。 + +```makefile +.PHONY: clean + +clean: + rm -f *.o +``` + +--- + +### 自定义函数 +- 你可以通过 `define` 和 `endef` 定义自定义函数。 ```makefile define greet @@ -140,43 +191,40 @@ all: $(call greet,World) ``` -### 11. 错误处理 +- `call` 函数可以调用自定义函数,并传递参数。 + +```makefile +define greet + @echo "Hello, $(1)!" +endef + +all: + $(call greet,World) +``` + +--- + +### 错误处理 你可以使用 `$(error text)` 和 `$(warning text)` 来生成错误或警告信息。 ```makefile -ifeq ($(CC),) - $(error CC is not set) -endif +$(error CC is not set) +$(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 PATH := $(PATH):/usr/local/bin ``` -### 17. 多行命令 +--- + +### 多行命令 你可以使用反斜杠 `\` 将长命令分成多行。 ```makefile @@ -185,7 +233,9 @@ all: multiple lines." ``` -### 18. 命令前缀 +--- + +### 命令前缀 命令前缀可以控制命令的执行方式: - **`@`**:不显示命令本身,只显示输出。 @@ -197,7 +247,9 @@ all: -rm -f non_existent_file ``` -### 19. 文件搜索路径 +--- + +### 文件搜索路径 你可以使用 `VPATH` 或 `vpath` 来指定源文件的搜索路径。 ```makefile @@ -207,19 +259,9 @@ vpath %.c src vpath %.h include ``` -### 20. 递归扩展变量 -递归扩展变量在使用时才会展开,可以用于动态生成内容。 +--- -```makefile -FOO = $(BAR) -BAR = $(BAZ) -BAZ = Hello - -all: - @echo $(FOO) # 输出 Hello -``` - -### 21. 静态模式规则 +### 静态模式规则 静态模式规则允许你为特定目标定义规则。 ```makefile @@ -229,18 +271,9 @@ $(objects): %.o: %.c $(CC) $(CFLAGS) -c $< -o $@ ``` -### 22. 多架构支持 -你可以通过条件判断来支持多架构编译。 +--- -```makefile -ifeq ($(ARCH),x86) - CFLAGS += -m32 -else ifeq ($(ARCH),x64) - CFLAGS += -m64 -endif -``` - -### 23. 自定义后缀规则 +### 自定义后缀规则 你可以定义自定义的后缀规则来处理特定类型的文件。 ```makefile @@ -250,7 +283,9 @@ endif $(CXX) $(CXXFLAGS) -c $< -o $@ ``` -### 24. 使用 `eval` 动态生成规则 +--- + +### 动态生成规则 `eval` 函数可以动态生成 Makefile 规则。 ```makefile @@ -262,7 +297,9 @@ endef $(eval $(call MAKE_RULE,foo.o,foo.c)) ``` -### 25. 使用 `foreach` 循环 +--- + +### 使用循环 `foreach` 函数可以用于循环处理列表中的每个元素。 ```makefile @@ -272,61 +309,16 @@ all: $(foreach dir,$(DIRS),$(MAKE) -C $(dir);) ``` -### 26. 使用 `call` 调用自定义函数 -`call` 函数可以调用自定义函数,并传递参数。 +--- -```makefile -define greet - @echo "Hello, $(1)!" -endef - -all: - $(call greet,World) -``` - -### 27. 使用 `shell` 函数执行外部命令 +### 执行外部命令 `shell` 函数可以执行外部命令并返回结果。 ```makefile 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` 过滤列表 `filter` 和 `filter-out` 函数可以用于过滤列表。 diff --git a/tool/vim/.vimrc b/tool/vim/.vimrc index 69d97cf..38cbca6 100644 --- a/tool/vim/.vimrc +++ b/tool/vim/.vimrc @@ -20,6 +20,10 @@ set ts=4 set softtabstop=4 " 编辑时退格键删除的空格数 set shiftwidth=4 " 自动缩进使用的空格数 +"把 - 和 _ 也看作单词的一部分 +set iskeyword+=- +set iskeyword+=_ + "缓冲区操作 nnoremap b :buffers:b nnoremap e :b#