我的构建系统中有以下场景。
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 ...) 都没有反映在主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
include ........ #(More includes here)
TARGET = resmgrd
CMDSRCS = resmgr_cli.c \
resmgrlogshow.c \
# more source files here
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)
$(INSTALL) -m 755 $(TARGET) $(DEVOSSBINDIR)
安装命令:$(DEVOSBINDIR)/$(CMDHNDLR ) \
install-admin-cmds install-user-cmds
clean::
$(RM) $(OBJS) $(TARGET) $(SCRIPTS) $(RAWMAN) $(CMDHNDLR) $(ZIPMAN)