我有一个makefile,它执行通常的目录创建:
$(Release_target_OBJDIR)/%.o: %.cpp
mkdir -p $(dir $@)
$(COMPILE.cpp) $< $(CFLAGS) $(INCLUDES) -o $@不幸的是,当我在scratchbox2下运行这个命令时,mkdir -p命令总是默默地失败。
我尝试了以下不起作用的传说:
$(Release_target_OBJDIR)/%.o: %.cpp
mkdir $(dir $(dir $(dir $@)))
mkdir $(dir $(dir $@))
mkdir $(dir $@)
$(COMPILE.cpp) $< $(CFLAGS) $(INCLUDES) -o $@这一产出如下:
mkdir -p /home/foo/projects/htc/arm/obj/cbar/release/
mkdir -p /home/foo/projects/htc/arm/obj/cbar/release/
mkdir -p /home/foo/projects/htc/arm/obj/cbar/release/ ..。尾随斜杠阻止dir函数以我想要的方式剥离最后一个目录。
除了编写脚本或小型C应用程序来复制"-p“功能之外,还有人想在makefile中创建子目录吗?
如果没有-p选项,当makefile试图创建一个已经存在的目录时,mkdir将给出一个错误。我可以执行mkdir blah 2> /dev/null,但这样做可能会丢失其他错误消息。
有没有人想过为什么mkdir -p不能在scratchbox2下工作?
编辑
根据bobbogo的建议,我将其合并在一起。它看起来相当复杂,但似乎有效,即使在scratchbox2下也是如此。
# Generic variables for use in functions
comma:= ,
empty:=
space:= $(empty) $(empty)
# Make directory function
forlooprange = $(wordlist 1,$(words $1),1 2 3 4 5 6 7 8 9 10)
forloop = $(foreach n,$(call forlooprange,$1),$(call $2,$n,$3))
mkdirfunc0 = test -d $1 || mkdir $1;
mkdirfunc1 = $(call mkdirfunc0,/$(subst $(space),/,$(foreach n,$(wordlist 1,$1,$2),$n)))
mkdirfunc2 = $(call forloop,$1,mkdirfunc1,$1)
mkdirmain = $(call mkdirfunc2,$(subst /, ,$1))
.PRECIOUS: %/.sentinel
%/.sentinel:
$(call mkdirmain,$*)
touch $@发布于 2011-03-04 12:02:32
您可以告诉make忽略任何使用-命令返回的失败代码。
$(Release_target_OBJDIR)/%.o: %.cpp
-mkdir $(dir $(dir $(dir $@)))
-mkdir $(dir $(dir $@))
-mkdir $(dir $@)
$(COMPILE.cpp) $< $(CFLAGS) $(INCLUDES) -o $@(请注意,这并不能解决尾随斜杠问题。)
https://stackoverflow.com/questions/5193421
复制相似问题