使用Makefile将新的源代码文件添加到Postgresql

时间:2011-12-04 11:38:37

标签: postgresql gcc makefile

我正在为Postgresql中的存储管理器模块添加一些功能。 我已经在smgr文件夹中添加了几个源文件,并且我可以让Make系统将它们的名称添加到smgr文件夹内的Makefile中的OBJS列表中。 (即当我添加A.c时,我会将A.o添加到OBJS列表中。)

这很好用。现在我正在尝试将新文件hdfs_test.c添加到项目中。这个文件的问题是它在编译命令中需要一些额外的指令(-I和-L指令)。

gcc命令是:

gcc hdfs_test.c -I/HDFS_HOME/hdfs/src/c++/libhdfs -I/usr/lib/jvm/default-java/include -L/HDFS_HOME/hdfs/src/c++/libhdfs -L/HDFS_HOME/build/c++/Linux-i386-32/lib -L/usr/lib/jvm/default-java/jre/lib/i386/server -ljvm -lhdfs -o hdfs_test

因此,简单地将hdfs_test.o添加到OBJS列表不起作用。 我尝试编辑Makefile看起来像这样:

OBJS = md.o smgr.o smgrtype.o A.o B.o hdfs_test.o

MyRule1 : hdfs_test.c
gcc tati.c -c -I/diskless/taljab1/Workspace/HDFS_Append/hdfs/src/c++/libhdfs -I/usr/lib/jvm/default-java/include -L/diskless/taljab1/Workspace/HDFS_Append/hdfs/src/c++/libhdfs -L/diskless/taljab1/Workspace/HDFS_Append/build/c++/Linux-i386-32/lib -L/usr/lib/jvm/default-java/jre/lib/i386/server -ljvm -lhdfs

但它没有成功,我不断收到错误消息,试图编译hdfs_test.c而不包括指令。

如何强制Make为hdfs_test.c包含我的编译指令?

由于

1 个答案:

答案 0 :(得分:2)

您不需要在编译时传递-l-L,只能在链接时传递。在编译时,只需要-I(包含路径)指令来帮助编译器找到任何额外的头文件。

您应该将源文件编译为.o文件,与其他文件相同。然后在调用链接器以创建-L可执行文件时,将-lpostgres指令添加到链接命令行。这意味着您需要在src/backend/storage/smgr/Makefile中编辑的所有内容都是添加输出对象的OBJS行,如下所示。删除自定义规则,这是不必要的也是不正确的。

只需将额外的库添加到$(LIBS)制作变量中,然后通过-L$(LDFLAGS)路径添加到src/Makefile.globalsrc/Makefile.globalconfigure生成src/Makefile.global.in,因此您实际上需要修改configure的行为以添加您的包含,库路径和库。也不要直接编辑configure;修改configure.in并使用autoconf重新生成。

是的,GNU Autotools有时也被称为autohell。有点......有趣......有时候合作,并且在做简单事情时可能会有很多间接性。