【发布时间】:2011-03-14 18:52:48
【问题描述】:
我希望通过制作一个相当通用的 makefile 来为我节省一些精力,该文件将为我整理相对简单的 C++ 项目,只需对 makefile 进行最少的修改。
到目前为止,我已经得到它,因此它将使用同一目录和指定子目录中的所有 .cpp 文件,将所有这些文件放在 obj 子目录中的匹配结构中,并将生成的文件放在另一个名为的子目录中bin。差不多就是我想要的。
但是,尝试获取它以便创建所需的 obj 和 bin 目录(如果它们不存在)会为跨平台工作提供尴尬 - 具体来说,我只是在 Windows 7 和 Ubuntu 上进行测试(可以不记得版本),我不能让它同时在两者上工作。
Windows 误读了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 $@
这是我在过去一周左右从我一直在阅读的东西(主要是在 StackOverflow 上)整理出来的,所以如果碰巧我正在遵循一些可怕的不良做法或任何类似性质的东西,请告诉我。
简而言之:
是否有一种简单的方法可以通过单个 makefile 以提供尽可能多的可移植性的方式创建目录?
【问题讨论】:
-
“那些不懂 auto{make} 的人注定要重新发明它,很糟糕。”您可以使用一行 Makefile.am 来做到这一点。请注意,我实际上不建议您跳到 automake,但请注意,这些问题已经常得到解决。最终,您可能会转向已经为您解决这些问题的工具,而 automake 就是这样一种工具。
-
@William 很公平。这与任何事情一样都是一个学习练习(在此之前,我对 makefile 的理解非常少 - 之前几乎所有东西都是通过 IDE 的 make-it-work-for-you 魔法构建的)。听我说,我的目标是一些对于 makefile 来说太深的东西,所以当我有更多时间可用时,也许我会将 automake 添加到我的“要查看的东西”列表中。
标签: cross-platform makefile portability