Automake-如何保持源代码树干净?


10

我有一个使用GNU自动工具构建自身的项目。我试图进行修改,以便自动工具在单独的目录中生成所有非版本控制文件,以便使源树中的临时文件保持清洁。任何人有任何想法如何做到这一点?


6
只需执行树外构建即可:stackoverflow.com/questions/1311231/…不幸的是,它仍然留下了一些残留物。有一天可以尝试CMake。
Vitor Py

3
那天到了,我花了不到一个小时的时间,从那丑陋的自拍文件切换到了cmake,这看起来要干净得多。
vorad 2011年

1
CMake比autoconf更干净:实际上,树外构建是进行CMake构建的最常见方法。不错的选择:)
Vitor Py

在源树顶部使用Makefile来控制cmake的构建过程是多么普遍?说make将运行mkdir -p build && cd build && cmake .. && make等等(不同的目标可能像make test等)。
vorad

罕见。CMake应该生成makefile,而不是相反!寻找一本名为Mastering CMake的书,或者在VTK或KDE的构建过程中查找真实的单词示例。CMake的一个很大的优势是在make之上:它还可以使用Visual Studio vcproj,nmake Makefile,XCode等来构建软件。KDE使用Shell脚本('kdebuild')启动构建过程-也许您想使用看一下。
Vitor Py

Answers:


2

自动工具包中有很多硬编码的相对路径和名称,这是有充分的理由的。最好的选择是总结输出,并将其标记为在版本控制中被忽略,例如在.cvsignore.hgignore或作为svn:ignoreattibute。一些RCS甚至可以递归地指定通配符。


4
除了这是1970年代的UNIX编程风格以外,没有一个充分的理由拥有这个硬编码的相对路径。
Lothar

2

解决方案:进行外源构建

  • 如评论中所建议,您可以进行源外构建。
  • 原理是:创建另一个目录,即“构建树”,从该目录运行配置脚本(具有相对或绝对路径)。

自动检查示例

例如,这将获取并构建GNU hello,并检查源代码树是否有一点变化。

源代码树准备

此部分获取并准备目录。

{
wget -S http://ftp.gnu.org/gnu/hello/hello-2.10.tar.gz
tar zxvf hello-2.10.tar.gz
mv hello-2.10 hello-2.10-pristine
tar zxvf hello-2.10.tar.gz
diff -urq hello-2.10 hello-2.10-pristine && echo "Before build, directories are identical."
cd hello-2.10
}

通用部分:在项目中重复使用

这部分可以与其他基于autoconf的项目一起使用。在运行之前,只需进入您的项目即可。当心:这会运行rm,如果小心使用变体,无论如何都要对您负责。

export MYPREFIX="${PWD}.installtree"
(
set -eu # abort on error
ls configure # make sure it aborts if not in correct directory
export SRCTREE="${PWD}"
export BUILDTREE="${PWD}.buildtree"
rm -rf "$BUILDTREE" "$MYPREFIX"
mkdir "$BUILDTREE" "$MYPREFIX"
cd "$BUILDTREE"
"${SRCTREE}"/configure --prefix="${MYPREFIX?}"
time make -k || time make
time make install
)

检查零件

这将检查构建是否完全是源外的。

{
ls "$MYPREFIX"/bin/hello && echo "Okay, build generated the target."
cd "$MYPREFIX"/..
diff -urq hello-2.10 hello-2.10-pristine && echo "No change at all. Perfect out-of-source build success."
}

在这里输出:

/tmp/hello-2.10.installtree/bin/hello
Okay, build generated the target.
No change at all. Perfect out-of-source build success.

奖励:非root用户安装

--prefix="${MYPREFIX?}"上面的部分是可选的。它允许您在帐户本地进行“安装”。如果要将传统的“ sudo make install”安装到系统范围内,则可以删除--prefix="${MYPREFIX?}"

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.