【发布时间】:2013-08-17 00:45:01
【问题描述】:
我的构建系统中有以下场景。
1。 src 目录中的 1000 个 makefile
2. 所有 1000 个 makefile 都包含 common.make 文件
3. 从源目录为对象目录中的 makefile 和源创建链接。因此,makefile 中的所有 makefile 和更多脚本都以存在于 build 目录中的方式编写。
4.obj目录是动态位置。
5. 现在我删除了所有链接。对象目录中不再有链接。
6. 我想执行源目录中的所有makefile,我希望在执行之前更改对象目录(动态目录名称)。 (这里我不能使用 make -C ,因为我不知道要更改哪个目录)。我可以设置 VPATH 来查找来源。
7.我想用common.make动态改变目录,但是我在common.make中做的任何cd,$(shell cd ...)都没有反映在main Makefile中。
8. 如果我不这样做,我最终会修改所有 1000 个 makefile。我不想这样做。
请告诉我最好的方法。简单来说,我想在执行 1000 个 makefile 之前更改目录(通过 common.make),
我希望 common.make 执行以下操作。
1) 保存 srcpath = 当前路径(当前路径为源目录)
2) 切换到输出目录(目录名称在这里是动态的)。
3) 设置 VPATH=srcpath
4) 现在源目录中的任何makefile都可以使用common.make编译并在输出目录中生成二进制文件和对象。
# 这是示例 Makefile 之一。我已经缩短了这个文件。所有 makefile 都没有使用相同的名称,例如 SRCS、CMDSRCS。会有所不同。
# 这是现有的makefile。源码位置/home/user/project/src/mod1/lib/resmgr>make BD=100。我希望输出为
# /home/user/project/build/swout100/mod1/lib/resmgr/*. common.make (common make) 可能会在此处验证参数 BD。不允许 BD=101。
# 我们可以强制用户执行 make -C /home/user/project/build/swout100/mod1/lib/resmgr (这里没有 BD 验证。用户应该知道该去哪个目录)。
# 我希望 common.make 作为实用程序 makefile 帮助用户
TOPDIR = ../../..
MAKEDIR = $(TOPDIR)/make
include $(MAKEDIR)/common.make # 它包含在大多数 makefile 中。这可以被视为常见的makefile。我想修改 common.make
包括 ........ #(更多包括在这里)
目标 = resmgrd
CMDSRCS = resmgr_cli.c \
resmgrlogshow.c \
# 更多源文件在这里
CMDOBJS = $(CMDSRCS:.c=.o)
CMDHNDLR = resmgrcmd
#... 此处为 CFLAGS,此处为库标志
MDSRC = main.c
SRCS = resmgr.c \
# 更多源文件在这里
HDRS = resmgr.h
MDOBJ = $(MDSRC:.c=.o)
OBJS = $(SRCS:.c=.o)
$(OBJS) $(MDOBJ) $(CMDOBJS): $(HDRS)
DEPENDSRCS = $(MDSRC) $(SRCS) $(CMDSRCS)
ST_LIBS = $(DEVOSLIBSRC)/apixdr/libapixdr.a
$(TARGET): $(MDOBJ) $(OBJS)
$(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS) $(ST_LIBS)
$(CMDHNDLR): $(CMDOBJS)
$(CC) $(LDFLAGS) -o $@ $^ $(DEVOSLIBS) $(IPCLIB) $(KILIB) $(MIAUXLIB) \
$(RESMGRLIB) $(RBACLIB)
安装:: 安装服务器
安装服务器: $(TARGET) $(TARGET).options $(DEVOSSBINDIR) $(DEVOSCONFDIR)
$(安装) -m 755 $(目标) $(DEVOSSBINDIR)
安装命令: $(DEVOSBINDIR)/$(CMDHNDLR) \
安装-管理员-cmds 安装-用户-cmds
干净::
$(RM) $(OBJS) $(TARGET) $(SCRIPTS) $(RAWMAN) $(CMDHNDLR) $(ZIPMAN)
【问题讨论】:
-
请向我们展示 1000 个 makefile 之一(您不想更改)。
-
包括 ~/project/make/common.make ; # 大多数 makefiles 创建二进制文件和对象文件,然后是这个常见的包含。这是在前面的输出目录中使用链接完成的。但是现在链接被删除了。每个 makefile 使用不同的变量名来引用源和对象。因此,没有办法改变共同点。现在编译应该在源目录中进行,输出应该到输出目录。在 common.make 中我能做些什么来让我的所有二进制文件和对象都放在输出目录中吗?更改目录是最好的选择,我不知道该怎么做。
-
您的要求可能是可能的,但这取决于生成文件以及您如何调用它们。没有适用于所有可能的 makefile 的解决方案,但可能有一个适用于您的特定 makefile 或其中大部分的解决方案。如果您向我们提供我们要求的信息,也许我们可以帮助您。
-
好的,我明白了。如何在此处附加文件?
-
如果不超过 40 行左右,只需再次编辑您的问题以附加它。 (如果它更长,你应该先缩短它。)并告诉我们你如何调用它(例如
make或make foo或make DEST=somedir)。
标签: directory makefile gnu-make vpath