Linux 自动工具和带有普通Makefile的嵌套项目
这个问题延伸了这个问题 因此,我有一些项目在中有自己的Makefile(不是GNU自动工具) 模块/libfoo 我添加了SUBDIRS=include/jsonbox Makefile.am,它可以很好地编译,但只有在调用/configure和make from top dir时才可以 如果我创建了一个subdir,比如build,然后从中运行../configure,那么我在make过程中遇到了一个错误:Linux 自动工具和带有普通Makefile的嵌套项目,linux,autotools,makefile-project,Linux,Autotools,Makefile Project,这个问题延伸了这个问题 因此,我有一些项目在中有自己的Makefile(不是GNU自动工具) 模块/libfoo 我添加了SUBDIRS=include/jsonbox Makefile.am,它可以很好地编译,但只有在调用/configure和make from top dir时才可以 如果我创建了一个subdir,比如build,然后从中运行../configure,那么我在make过程中遇到了一个错误: Making all in modules/libfoo /bin/sh:
Making all in modules/libfoo
/bin/sh: line 17: cd: modules/libfoo: No such file or directory
make: *** [all-recursive] Error 1
有可能处理这件事吗?我需要几个不同拱门和CFLAG的构建目录
编辑:
如中所示,我在一个嵌套项目中创建了一个GNUmakefile.in。但它仍然不适用于VPATH:
Making all in modules/libfoo
make[1]: Entering directory `/home/galadog/test/build/moudles/libfoo'
GNUmakefile:2: Makefile: No such file or directory
make[1]: *** No rule to make target `Makefile'. Stop.
make[1]: Leaving directory `/home/galadog/test/build/moudles/libfoo'
make: *** [all-recursive] Error 1
Edit2
实际的Makefile可以在这里看到:
遗憾的是,如果没有以下两种方法,您就无法正确实现这一目标:
make distcheck
解决问题,而不支持实际构建
然而,有一种简单的方法可以用最少的工作量工作——将整个子树复制到构建目录。这不是一个很好的解决方案,但它会使子树构建正常工作:
SUBDIRS = modules/libfoo
# and possibly all other -recursive targets you'll be using
all-recursive: copy-libfoo
copy-libfoo:
mkdir -p modules
cp -R -H $(top_srcdir)/modules/libfoo modules/
但正如我所说,这很难看。上游生成文件仍然需要定义正确的自动生成目标(all
,install
等),因此在您的情况下,您最好在项目子目录中添加一个GNUmakefile
,如:
include Makefile
INSTALL:
这将提供一个虚拟目标,以避免***没有规则使目标“安装”
;也可能是这样。如果您想使用make DIST
,则使用EXTRA\u DIST
,但链接文档中已包含所有内容
老实说,你的处境很艰难。如果我是你,我要么干脆不使用这个项目,要么就忽略它,因为维护它比从头开始写同样的东西更难
第二个我会考虑的解决方案,一个正确的方法是在主代码< >文件>中复制Mag文件。
LIBRARIES = modules/libfoo/libfoo.a
modules_libfoo_libfoo_a_SOURCES = modules/libfoo/src/a.c # ...
# and possibly some...
EXTRA_DIST = # ...
遗憾的是,如果没有以下两种情况,您就无法正确实现这一目标:
make distcheck
解决问题,而不支持实际构建
然而,有一种简单的方法可以用最少的工作量工作——将整个子树复制到构建目录。这不是一个很好的解决方案,但它会使子树构建正常工作:
SUBDIRS = modules/libfoo
# and possibly all other -recursive targets you'll be using
all-recursive: copy-libfoo
copy-libfoo:
mkdir -p modules
cp -R -H $(top_srcdir)/modules/libfoo modules/
但正如我所说,这很难看。上游生成文件仍然需要定义正确的自动生成目标(all
,install
等),因此在您的情况下,您最好在项目子目录中添加一个GNUmakefile
,如:
include Makefile
INSTALL:
这将提供一个虚拟目标,以避免***没有规则使目标“安装”
;也可能是这样。如果您想使用make DIST
,则使用EXTRA\u DIST
,但链接文档中已包含所有内容
老实说,你的处境很艰难。如果我是你,我要么干脆不使用这个项目,要么就忽略它,因为维护它比从头开始写同样的东西更难
第二个我会考虑的解决方案,一个正确的方法是在主代码< >文件>中复制Mag文件。
LIBRARIES = modules/libfoo/libfoo.a
modules_libfoo_libfoo_a_SOURCES = modules/libfoo/src/a.c # ...
# and possibly some...
EXTRA_DIST = # ...
你能修改该子项目的Makefile吗?还是它是第三方Makefile?@michal gorny这是最坏的情况,但如果没有其他解决方案,我可以。你能为我们粘贴
Makefile
?也许它已经有了某种build dir/VPATH支持,但老实说,我对此表示怀疑。@MichałGóny看到更新的postCan您可以修改该子项目的Makefile还是第三方Makefile?@michal gorny这是最坏的情况,但如果没有其他解决方案,我可以。您可以为我们粘贴Makefile
?也许它已经有了某种build dir/VPATH支持,但老实说,我对此表示怀疑。@MichałGórny请参阅更新后的帖子,因此我添加了Makefile.am和configure.ac以与libtool一起使用。我认为这是唯一的解决办法,虽然很悲哀,但却是真的。不,这里不需要libtool。如果要构建共享库或使用LTLIBRARIES
,则需要libtool。Automake可以处理常规的库
本身。因此,我添加了Makefile.am和configure.ac以与libtool一起使用。我认为这是唯一的解决办法,虽然很悲哀,但却是真的。不,这里不需要libtool。如果要构建共享库或使用LTLIBRARIES
,则需要libtool。Automake可以自行处理常规库。