这是我之前的问题的后续内容:SO 4403861,因为建议的解决方案打破了依赖关系,使makefile无用.我无法弄清楚为什么.
我正在使用gnu make 3.82我有一个规则,如果已经创建了obj目录:
objdir:=../obj
$(objdir)/%.o: %.C
$(COMPILE) -MM -MT$(objdir)/$(notdir $@) $< -o $(DEPDIR)/$(notdir $(basename $<).d )
$(COMPILE) -o $(objdir)/$(notdir $@ ) -c $<
Run Code Online (Sandbox Code Playgroud)
但是,如果obj目录不存在,则make失败.我希望make能够根据需要自动创建../obj,所以我添加了我认为非常简单的内容:
$(objdir)/%.o: %.C $(objdir)
$(COMPILE) -MM -MT$(objdir)/$(notdir $@) $< -o $(DEPDIR)/$(notdir $(basename $<).d )
$(COMPILE) -o $(objdir)/$(notdir $@ ) -c $<
$(objdir):
if [ ! -d $(objdir) ] ; then mkdir $(objdir) ; fi
Run Code Online (Sandbox Code Playgroud)
当我这样做时,每次都要强制编译.为什么?除非没有目录,否则不应该发生mkdir?为什么这个简单的改变破坏了依赖?
我正在研究一些在ARM上运行的裸机嵌入式代码,因此必须处理整个ARM与THUMB模式的区别.当前构建系统使用静态模式规则来确定是以ARM还是THUMB模式编译文件.
$(ACOBJS) : %.o : %.c
@echo
$(CC) -c $(CFLAGS) $(AOPT) -I . $(IINCDIR) $< -o $@
$(TCOBJS) : %.o : %.c
@echo
$(CC) -c $(CFLAGS) $(TOPT) -I . $(IINCDIR) $< -o $@
Run Code Online (Sandbox Code Playgroud)
其中ACOBJS是应该处于ARM模式的输出对象列表,对于TCOBJS和Thumb模式是相同的.这些列表是以通常的方式从源列表创建的
ACOBJS = $(ACSRC:.c=.o)
TCOBJS = $(TCSRC:.c=.o)
Run Code Online (Sandbox Code Playgroud)
目前,这导致构建中的目标文件散布在源树上,我并不特别希望这样.我一直试图在树构建中设置它,但却无法使其工作.我不一定需要充分利用树构建工作,但我希望至少能够使用输出目录,在该目录下所有中间文件最终都会运行.在这些限制条件下实现这一目标的最佳策略是什么?
我正在考虑的一个选项是使用automake或整个autotools工具链来构建一个makefile.这似乎支持创建我想要的makefile类型,但看起来有点矫枉过正.设计用于便携式构建的自动工具和裸机嵌入式系统之间似乎存在固有的阻抗不匹配,其中主机元组之类的东西由目标微观元素决定.
我想在 make 退出时执行一个 shell 命令,不管它构建的是什么目标。似乎 make 没有办法直接做到这一点。但是,这里有一个在启动时执行 shell 命令的示例,无论目标如何:
是否有任何类似的 hack 在退出前执行一次 shell 命令?我可以将命令放在每个目标的底部,但是 a) 它会被执行多次,并且 b) 这很丑陋且难以管理。
我希望通过制作一个相当通用的makefile来为自己节省一些精力,这个makefile将为我提供相对简单的C++项目,只需对makefile进行最少的修改.
到目前为止,我已经得到它所以它将使用.cpp同一目录中的所有文件和指定的子目录,将所有这些放在子目录中的匹配结构中obj,并将生成的文件放在另一个名为的子目录中bin.几乎是我想要的.
但是,尝试获取它以便创建所需的obj和bin目录(如果它们不存在)提供了跨平台工作的尴尬 - 具体来说,我只是测试Windows 7和Ubuntu(不记得版本),我无法让它同时在两者上工作.
窗户误读mkdir -p dir并创建一个-p目录,显然这两个平台使用\,并/分别为路径分隔符-并且使用了错误的一个,当我得到的错误.
以下是makefile的一些相关部分:
# Manually edited directories (in this example with forward slashes)
SRC_DIR = src src/subdir1 src/subdir2
# Automagic object directories + the "fixed" bin directory
OBJ_DIR = obj $(addprefix obj/,$(SRC_DIR))
BIN_DIR = bin
# Example build target
debug: checkdirs $(BIN)
# At actual directory creation
checkdirs: $(BIN_DIR) $(OBJ_DIR)
$(BIN_DIR):
@mkdir $@
$(OBJ_DIR):
@mkdir -p $@
Run Code Online (Sandbox Code Playgroud)
在过去一周左右我已经阅读了这些内容(主要是关于Stack Overflow),所以如果碰巧是我正在关注一些可怕的不良做法或任何这种性质,请告诉我. …
我正在使用gnu Make 3.82并且有一个恼人的问题.
我有一个规则设置目录之间的依赖关系.
OBJDIR=../obj
$(objdir)/%.o: %.C
$(COMPILE) -MM -MT$(objdir)/$(notdir $@) $< -o $(DEPDIR)/$(notdir $(basename $<).d )
$(COMPILE) -o $(objdir)/$(notdir $@ ) -c $<
Run Code Online (Sandbox Code Playgroud)
为此,obj目录必须存在.我想将mkdir目录作为先决条件
$(objdir)/%.o: %.C $(objdir)
$(COMPILE) -MM -MT$(objdir)/$(notdir $@) $< -o $(DEPDIR)/$(notdir $(basename $<).d )
$(COMPILE) -o $(objdir)/$(notdir $@ ) -c $<
$(objdir):
mkdir $(objdir)
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为它在目录存在时失败然后make停止我尝试shell
if [ ! -d $(objdir) ] ; then \
mkdir $(objdir) \
fi
Run Code Online (Sandbox Code Playgroud)
但显然我有些不对劲.这样做的最佳方法是什么?