c - 如何根据目标更改 Makefile 依赖文件列表
问题描述
我的 Makefile 编译文件列表,但我想根据目标附加新文件。真正的makefile可以在这里找到
https://github.com/fangq/mmc/blob/v1.7.9/src/Makefile#L4 https://github.com/fangq/mmc/blob/v1.7.9/commons/Makefile_common.mk#L192-L194
但为了说明这个问题,我有下面的简化片段
OBJDIR=build
OBJSUFFIX=.o
BINARY=proj
FILES:=file1 file2
OBJS:= $(addprefix $(OBJDIR)/, $(FILES))
OBJS:= $(addsuffix $(OBJSUFFIX), $(OBJS))
opt: FILES+=file3 # append a file for a target
opt: OBJS:= $(addprefix $(OBJDIR)/, $(FILES))
opt: OBJS:= $(addsuffix $(OBJSUFFIX), $(OBJS))
## Link ##
all opt: $(BINARY)
## Compile .c files ##
$(OBJDIR)/%$(OBJSUFFIX): %.c
@$(ECHO) Building $@
$(CC) $(CCFLAGS) $(USERCCFLAGS) -I$(INCLUDEDIR) -o $@ $<
$(BINARY): $(OBJS)
@$(ECHO) Building $@
# link file1.o file2.o when make
# link file1.o file2.o file3.o when make opt
我的目标是在键入时make
,我想编译和链接file1.o/file2.o
,但是在键入“ make opt
”时,我希望 makefile 编译file1.o/file2.o
而file3.o
不是。
但我上面的代码片段无法做到这一点。它只能更改OBJS
,但会在编译中跳过 file3。
有解决办法吗?
解决方案
首先,您从未声明这opt
取决于$(OBJS)
任何地方。
但更重要的是,您不能使用特定于目标的变量来修改先决条件。目标特定变量的值仅在配方中可用。请参阅第二段中讨论的文档。
幸运的是,你只是让这变得比它需要的更复杂。而不是这个:
opt: FILES+=file3 # append a file for a target
opt: OBJS:= $(addprefix $(OBJDIR)/, $(FILES))
opt: OBJS:= $(addsuffix $(OBJSUFFIX), $(OBJS))
你所要做的就是写这个:
opt: $(OBJS) $(OBJDIR)/file3$(OBJSUFFIX)
推荐阅读
- c# - 用 C# 生成的 Excel 文件损坏(ExcelExportEngine & IExportEngine)
- html - 元素不在视口底部
- sql - 如何提高sql server中的while循环插入性能?
- bash - 带有特定文本的多行 grep
- revit-api - REVIT 将地板草图转移到家庭中的空隙挤压
- c++ - 静态 std::initializer_list 的初始化导致 VS2015 更新 3 警告 C4592
- swift - 是否需要在单例类中使用弱引用?
- c# - Xamarin.Forms,选择器,显示 SelectedItem 的问题
- c# - C#/MonoGame - 当我卸载我的游戏关卡时销毁内存中的大对象
- javascript - 如何从 jQuery 中的其他 html 文件中读取数组/数据并创建动态表(PLC 网络服务器)