【发布时间】:2014-05-19 05:55:35
【问题描述】:
我的问题是,在我的 make 文件中,我想在构建之前为所有目标代码创建目录,但我找不到这样做的方法,而不会影响 make 的输出。另外,我想在一个地方而不是针对每个目标文件进行。
我试过这个:
build: setup exe.i686
setup:
mkdir -p obj
exe.i686: $(OBJS)
@echo 'Building target: $@'
@echo 'Invoking: GCC C++ Linker'
${GCC_LOCATION}/Linux/i686/bin/i686-pc-linux-gnu-g++ $(OBJS) -o "exe.i686" -L...
@echo 'Finished building target: $@'
@echo ' '
OBJS 是我所有的目标代码。如果我不先运行安装程序并且不存在 ./obj 目录,则构建将失败,因为在尝试构建目标代码时缺少目录。
为了清楚起见,这里是一个如何构建一个目标文件的示例:
./obj/Cell.o: ${CELL_ROOT}/main/cell/Cell/src/Cell.cc
@echo 'Building file: $<'
@echo 'Invoking: GCC C++ Compiler'
$(GCC_C++_BUILD) -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o "$@" "$<"
@echo 'Finished building: $<'
@echo ' '
我不想在与我的 make 文件相同的目录中构建目标代码。
现在到实际问题。当我第一次像这样构建目标“构建”时,一切正常:
make build
但是如果我再次构建它并且我的源代码中没有更新(目标代码是最新的)它的行为如下:
[7:37] [user1] [/local/repo/user1/project_x/test/bin] $ make build
mkdir -p obj
[7:37] [user1] [/local/repo/user1/project_x/test/bin] $
在这种情况下,我希望 make 像这样返回 nothing-to-be-done 字符串:
[7:37] [user1] [/local/repo/user1/project_x/test/bin] $ make build
make: Nothing to be done for `build'.
[7:41] [user1] [/local/repo/user1/project_x/test/bin] $
如果我不必依赖设置目标(添加到 .PHONY),就会出现这种情况。是为每个目标代码文件执行此操作的唯一选择吗?我想这是可能的,但我想尽可能避免这种情况,因为它会使 make 文件变得很混乱。至少在我看来。
谢谢
【问题讨论】:
-
只是提一下,自从我发现 scons 后——我快乐多了。我记得我与那些制作文件作斗争。我发现使用 scons 更容易。