我有个插件的项目,我已经开发了几年里的插件与多种组合的[主要应用程序的版本,第3次缔约方图书馆版本、32位与64位].是否有一个(清洁)的方式使用autotools创建一个生成文件,建立所有版本的插件。

我可以告诉从略读通过的autotools文件,最接近什么我想是N独立的副本项目,每一个都有自己makefile。这似乎有点不理想的测试和发展作为(a)我们需要不断传播的代码变化的所有不同的副本以及(b)有一个很大的空间浪费在重复的项目,所以许多倍。是否有一个更好的办法?

编辑:

我已经滚动我自己的解决方案,同时在那里我有一个奇特的生成文件和一些perl脚本到追捕的各个第3方图书馆版本,等等。因此,我打开其他非autotools解决方案。对于其他建立的工具,我希望他们能够非常容易为最终用户安装。该工具也需要有足够的智能搜寻各种3rd方图书馆,头没有了大量的麻烦。我主要是在寻找一个linux解决方案,但一个也适用于Windows和/或Mac会的一个奖金。

有帮助吗?

解决方案

据我所知,你不能这样做。然而,是你坚持autotools?既 CMake 也不 SCons 一个选择吗?

其他提示

如果你的问题是:

我可以使用的autotools上的一些机器,以创建一个单一的普遍生成文件,将工作在所有其他的机器?

那么答案是"不"。该autotools甚至不让一个借口,在试图做到这一点。他们被设计包含便携式码,这将确定如何创造一个可行的生成文件的目标的机器。

如果你的问题是:

我可以使用的autotools配置的软件,需要运行在不同的机器,用不同版本的主要软件,该软件我插件适用,再加上各个第3方图书馆,更不要说32位vs64位问题?

那么答案是"是"。该autotools的设计是能够做到这一点。另外,他们的工作on Unix,Linux,mac os X,BSD。

我有一个程序,SQLCMD(其预期的微软的程序的同名由十年以上),其工作与IBM Informix数据库。它检测到的版本的客户软件(IBM Informix ESQL/C部分IBM Informix ClientSDK或CSDK)安装,以及它是否是32位或64位。它还检测的哪个版本的软件安装和调整其功能以提供支持的产品。它支持版本,已被释放的一段时期的大约17年。它是自动配-我有写一些autoconf宏Informix功能,而对于一些其他玩意儿(高分辨率时,存在/dev/stdin等)。但它是可行的。

另一方面,我不要尝试和释放一个生成文件符合所有客户机和环境;有太多可能性,是明智的。但autotools需要照顾的细节,对我来说(而我的用户)。他们所做的是:

./configure

这是更易于作出如何编辑makefile。(哦,对第一个10年来,该节目配置的。它是困难的人这样做,虽然我有很好的默认设置的。这就是为什么我搬到汽车配置:这使它更容易为人们安装。)


先生Fooz评论说:

我想要的东西之间。客户将使用多种版本和bitnesses的相同基础的应用程序在同一台机器在我的情况。我担心的不是跨汇编,例如建筑物的窗户的二进制文件在Linux。

你需要一个单独建立的插件的32位和64位的版本?(我会假设是的-但你可以让我感到吃惊。) 所以你需要提供一个机制,对用户来说

./configure --use-tppkg=/opt/tp/pkg32-1.0.3

(其中tppkg是一段代码,用于第三方软件包,并且位置是可指定由用户。) 但是,请铭记可用性:减少这些选项的用户 提供更好;对,不要硬代码的事情,应当是任择性的,诸如安装位置。通过各种手段看,在默认的地点-这是很好的。和默认的bittiness的东西你找到。也许如果你找到32位和64位的版本,然后你应该建立两个--这将需要精心建设,虽然。你总是可以echo"检查TP-包裹...",并指示你发现什么和你在哪里找到它。然后安装可以改变选择。确保你的文档'./configure --help'是什么选择;这是标准autotools的做法。

不要做任何事情的互动;configure script应该运行,报告它做什么。Perl Configure 脚本(注资本的信这是一个完全独立的自动配置系统)的一些深入的互动式配置系统的离开(这是可能的,主要是因为其遗产;如果重新开始,最有可能是非交互式).这种系统是更多的麻烦配置比的非交互式的。

截汇编是艰难的。我从来不需要这样做,谢天谢地。


先生Fooz还评论说:

谢谢你的额外评论。我在找一样的东西:

./configure --use-tppkg=/opt/tp/pkg32-1.0.3 --use-tppkg=/opt/tp/pkg64-1.1.2

在那里它会造成32-位和64位的目标在一个生成文件的电流平台。

嗯,我敢肯定它能够完成;我不那么肯定,这是值得做的通过比较两个单独的结构与运行一个完全重建之间。你可能会想到使用:

./configure --use-tppkg32=/opt/tp/pkg32-1.0.3 --use-tppkg64=/opt/tp/pkg64-1.1.2

这表明两个单独的目录。你必须决定如何你要做的建立,但想必你有两个子目录,如'obj-32'和'obj-64'用于储存的单独设定对象的文件。你也会安排你的生成文件沿线:

FLAGS_32 = ...32-bit compiler options...
FLAGS_64 = ...64-bit compiler options...

TPPKG32DIR = @TPPKG32DIR@
TPPKG64DIR = @TPPKG64DIR@

OBJ32DIR = obj-32
OBJ64DIR = obj-64

BUILD_32 = @BUILD_32@
BUILD_64 = @BUILD_64@

TPPKGDIR =
OBJDIR   =
FLAGS    =

all:    ${BUILD_32} ${BUILD_64}

build_32:
    ${MAKE} TPPKGDIR=${TPPKG32DIR} OBJDIR=${OBJ32DIR} FLAGS=${FLAGS_32} build

build_64:
    ${MAKE} TPPKGDIR=${TPPKG64DIR} OBJDIR=${OBJ64DIR} FLAGS=${FLAGS_64} build

build:  ${OBJDIR}/plugin.so

这个假设的插件将是一个共享的对象。这里的想法是,autotool将检测到的32位或64位安装用于第三方软件包,然后让替换。该BUILD_32宏将build_32如果32-位软件包需要和空,否则;该BUILD_64宏会处理类似。

当用户运行'make all',它将建立的build_32目标第一和build_64目标的下一步。建立build_32目标,它将重新运行 make 和配置标志,用于一个32位的建立。同样,建立build_64目标,它将重新运行 make 和配置标志,用于64位的建立。重要的是,所有标志的影响32-位vs64位的基础上设置调用递归的 make, 和规则建立的对象和图书馆被写入仔细,例如,规则汇编源的对象必须仔细地对象的文件中的正确目目录的使用的海湾合作委员会,例如,你将指定(在 .c.o 规则):

${CC} ${CFLAGS} -o ${OBJDIR}/$*.o -c $*.c

宏CFLAGS将包括${标志}价值,其中涉及位(例如, FLAGS_32 = -m32 和FLAGS_64=-m64, and so when building the 32-bit version,FLAGS=-m32would be included in theCFLAGS`宏。

剩余问题的autotools是作出如何确定的32位和64位的标志。如果最糟糕来到最糟糕的,你得写宏于你自己。然而,我期待(不具有研究它),你可以做到这一使用标准的设施从autotools套房。

除非你自己创建一个精心(甚至无情)对称的生成文件,它不可靠地工作。

我们尝试过了,它不工作!因此,我们现在使用的 SCons.

一些文章,以此主题: 12

编辑: 一些小的例子,为什么我爱SCons:

env.ParseConfig('pkg-config --cflags --libs glib-2.0')

与这一行代码你加入巧舌如簧的编制环境(env).并且不要忘记 用户指南 这只是伟大的学习SCons(你真的没必要知道蟒蛇!).为终端用户可以试试SCons与 PyInstaller 或者类似的东西。

和在比较 make, 你使用的蟒蛇,这样一个完整的编程语言!铭记这一点你可以做到的一切(或多或更少)。

你有没有考虑到使用一个单一的项目与多个建立目录?如果你automake项目是实现在一个恰当的方法(即:不喜欢的海湾合作委员会)

以下是可能的:

mkdir build1 build2 build3
cd build1
../configure $(YOUR_OPTIONS)
cd build2
../configure $(YOUR_OPTIONS2)
[...]

你能够通过不同结构的参数,如包括目录和编译器(交叉编译器即).

然后你可以甚至在一个单一的呼叫通过运行

make -C build1 -C build2 -C build3
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top