GNU 中的 patsubst 使 returns 什么都没有
patsubst in GNU make returns nothing
我试图将我的 cpp 源文件和我的目标文件放在不同的目录中,所以我试图使用 Make 的 patsubst 来替换路径。在什么都没有编译之后,我做了一个假目标来简单地打印出相关变量,我发现 patsubst 没有返回任何东西。这对我来说意义不大,据我所知,与模式不匹配的目标应该原封不动地通过,所以即使我的模式格式不正确,我仍然应该看到 东西 返回。
我的变量是这样声明的:
SRC_DIR := source/
SRC := $(wildcard $(SRC_DIR)*.cpp)
OBJ_DIR := obj/
OBJ := $(PATSUBST $(SRC_DIR)%.cpp, $(OBJ_DIR)%.o, $(SRC))
我只是打印出上述变量的假目标看起来像这样:
.PHONY: print
print:
@echo $(SRC_DIR)
@echo $(SRC)
@echo $(OBJ_DIR)
@echo $(OBJ)
运行 make print
的结果是:
user@athena:~/proj$ make print
source/
source/main.cpp source/util.cpp
obj/
user@athena:~/proj$
我尝试过的其他东西
我试过 SRC_DIR 和 OBJ_DIR 有尾部斜线但没有它们,我试过 $(SRC:$(SRC_DIR)%.cpp=$(OBJ_DIR)%.o)
没有 工作, 和 $(OBJ) 将同时具有 main.o 和 util.o,但是我的静态规则 ($(OBJ): $(OBJ_DIR)%.o : $(SRC_DIR)%.cpp
) 只会触发 main.cpp,并且不会尝试编译util.cpp,我正在考虑一个完全不同的问题?
我希望我只是在做一些愚蠢的事情并且有一个简单的修复方法,但我一直在绞尽脑汁,我看不出是什么导致 patsubst 只是空白。任何帮助将不胜感激。
与(实际上)所有编程语言一样,makefile 区分大小写。 $(FOO)
与 $(foo)
不同,$(PATSUBST ...)
与 $(patsubst ...)
不同。
事实上,$(PATSUBST ...)
什么也没有,展开为空字符串。
我试图将我的 cpp 源文件和我的目标文件放在不同的目录中,所以我试图使用 Make 的 patsubst 来替换路径。在什么都没有编译之后,我做了一个假目标来简单地打印出相关变量,我发现 patsubst 没有返回任何东西。这对我来说意义不大,据我所知,与模式不匹配的目标应该原封不动地通过,所以即使我的模式格式不正确,我仍然应该看到 东西 返回。
我的变量是这样声明的:
SRC_DIR := source/
SRC := $(wildcard $(SRC_DIR)*.cpp)
OBJ_DIR := obj/
OBJ := $(PATSUBST $(SRC_DIR)%.cpp, $(OBJ_DIR)%.o, $(SRC))
我只是打印出上述变量的假目标看起来像这样:
.PHONY: print
print:
@echo $(SRC_DIR)
@echo $(SRC)
@echo $(OBJ_DIR)
@echo $(OBJ)
运行 make print
的结果是:
user@athena:~/proj$ make print
source/
source/main.cpp source/util.cpp
obj/
user@athena:~/proj$
我尝试过的其他东西
我试过 SRC_DIR 和 OBJ_DIR 有尾部斜线但没有它们,我试过 $(SRC:$(SRC_DIR)%.cpp=$(OBJ_DIR)%.o)
没有 工作, 和 $(OBJ) 将同时具有 main.o 和 util.o,但是我的静态规则 ($(OBJ): $(OBJ_DIR)%.o : $(SRC_DIR)%.cpp
) 只会触发 main.cpp,并且不会尝试编译util.cpp,我正在考虑一个完全不同的问题?
我希望我只是在做一些愚蠢的事情并且有一个简单的修复方法,但我一直在绞尽脑汁,我看不出是什么导致 patsubst 只是空白。任何帮助将不胜感激。
与(实际上)所有编程语言一样,makefile 区分大小写。 $(FOO)
与 $(foo)
不同,$(PATSUBST ...)
与 $(patsubst ...)
不同。
事实上,$(PATSUBST ...)
什么也没有,展开为空字符串。