Sim*_*ott 8 gnu-make mkdir scratchbox
我有一个makefile,它通常创建目录:
$(Release_target_OBJDIR)/%.o: %.cpp
mkdir -p $(dir $@)
$(COMPILE.cpp) $< $(CFLAGS) $(INCLUDES) -o $@
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我在scratchbox2下运行它时,mkdir -p命令总是无声地失败.
我尝试了以下无效的kludge:
$(Release_target_OBJDIR)/%.o: %.cpp
mkdir $(dir $(dir $(dir $@)))
mkdir $(dir $(dir $@))
mkdir $(dir $@)
$(COMPILE.cpp) $< $(CFLAGS) $(INCLUDES) -o $@
Run Code Online (Sandbox Code Playgroud)
这输出:
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/
Run Code Online (Sandbox Code Playgroud)
...尾部斜杠阻止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 $@
Run Code Online (Sandbox Code Playgroud)
您可以mkdir用以下内容替换您的森林:
$(Release_target_OBJDIR)/%.o: %.cpp\n $(foreach d,$(subst /, ,${@D}),mkdir $d && cd $d && ):\n \xe2\x88\xb6\nRun Code Online (Sandbox Code Playgroud)\n\n这将创建一个像这样的 shell 命令:
\n\nmkdir projects && cd projects && mkdir htc && cd htc && mkdir arm && cd arm && :\nRun Code Online (Sandbox Code Playgroud)\n\n这对于每次编译都会运行。不是很优雅。您可以通过使用某种哨兵文件来优化它。例如:
\n\n$(Release_target_OBJDIR)/%.o: %.cpp ${Release_target_OBJDIR}/.sentinel\n \xe2\x88\xb6\n\n%/.sentinel:\n $(foreach d,$(subst /, ,$*),mkdir $d && cd $d && ):\n touch $@\nRun Code Online (Sandbox Code Playgroud)\n\n.sentinel在所有对象之前创建一次,并且是make -j友好的。mkdir -p事实上,即使对您有用,您也应该这样做(在这种情况下您将使用mkdir -p而不是$(foreach) 黑客解决方案)。
| 归档时间: |
|
| 查看次数: |
20965 次 |
| 最近记录: |