我怀疑手册实际上是在说我做错了什么,但我真的看不到解决方案;当 .c 文件和要构建的 .o 文件不在同一个目录中时,就会出现问题,并且 .c 文件对必须动态生成的 .h 文件具有自动依赖关系。该问题可能可以通过手动设置 .c 和 .h 文件之间的依赖关系来解决,但我想避免这种情况。
我有以下目录结构:
weird/
Jamfile
b.c
src/
a.c
c.c
src/ac 文件是这样的:
#include "src/a.h"
int main(int argc, char *argv[])
{
return 0;
}
bc 文件是这样的:
#include "src/b.h"
int main(int argc, char *argv[])
{
return 0;
}
src/cc 文件是这样的:
#include "c.h"
int main(int argc, char *argv[])
{
return 0;
}
Jamfile 是:
rule CreateHeader
{
Clean clean : $(1) ;
}
actions CreateHeader
{
echo "int x = 10;" > $(1)
}
Object a.o : src/a.c ;
Object b.o : b.c ;
Object c.o : src/c.c ;
CreateHeader src/a.h ;
CreateHeader src/b.h ;
CreateHeader src/c.h ;
以下命令正确创建 bo 和 src/bh:
jam b.o
下面的命令创建了src/ah,但是后来gcc创建ao失败了;原因很明显,ac 中的#include 提到了 src/ah,而实际上应该只是指 ah:
jam a.o
以下命令完全失败,甚至没有创建 ch;原因可能是 Jam 在分析 cc 时会生成对 ch 而不是 src/ch 的依赖,并且在 Jamfile 中没有生成 ch 的规则:
jam c.o
如果我在请求 co 之前明确要求生成 src/ch,则此命令可以正确编译:
jam src/c.h
jam c.o
在我看来,果酱 src/ch 不应该是必要的。这里有什么问题?查看Jam 手册以获取更多信息,特别是在标题文件扫描部分下。
在我接受答案后添加
我一直在对已接受答案的作者建议的结构进行一些试验,我将在此处发布结果。在此设置中,您可以键入:
jam app
并且应用程序将链接到 bin/app 下。不幸的是,我在设置 LOCATE_TARGET 时必须使用 UNIX 路径,我的理解是这并不是一个好的做法。
目录结构:
project/
Jamfile
src/
main.c
gen/
bin/
obj/
文件 Jamfile:
SubDir TOP ;
rule CreateHeader
{
MakeLocate $(1) : $(LOCATE_SOURCE) ;
Clean clean : $(1) ;
}
actions CreateHeader
{
BUILD_DATE=`date`
echo "char build_date[] = \"$BUILD_DATE\";" > $(1)
}
SEARCH_SOURCE = src ;
LOCATE_TARGET = bin/obj ;
SubDirHdrs gen ;
Object main.o : main.c ;
LOCATE_TARGET = bin ;
MainFromObjects app : main.o ;
LOCATE_SOURCE = gen ;
CreateHeader info.h ;
文件 src/main.c
src/main.c
#include <stdio.h>
#include "info.h"
int main(int argc, char *argv[])
{
printf("Program built with Jam on %s.\n", build_date);
return 0;
}