我正在尝试构建 pdftk,这显然需要 gcj。由于它不在我的路径中,我可以将保存 gcj 的目录添加到我的路径中,或者在预制的 Makefile 中定义路径。
问题是我不知道:
a)gcj 在哪里,b)它是否存在于服务器上(至少以我可以添加到路径的方式)。
在我之前从源代码构建二进制文件的尝试中,这个问题不止一次出现,所以我希望我可以一次提出两个问题来解决我当前的问题并在未来避免这个问题......
有没有办法将我拥有读取/执行权限的所有内容添加到我的路径中?子问题,这是一个坏主意吗?
whereis
只搜索我的路径吗?是否有一些等效的方法可以查找我需要的文件/目录,而无需搜索整个主机并拒绝访问所有其他目录?有没有一种方法可以确定库/二进制文件是否绝对不可用,而只是不在我的路径中?
有没有办法告诉,特别是
gcc
如果gcj
可用?我可以将 gcj 编译到我的用户目录而不必用它编译所有 gcc 吗?
在构建二进制文件时,是否有一种(通用)方法来标记编译或生成文件以处理任何依赖项,因为它发现它们而不是简单地失败?
共享主机情况下的典型用户是否能够使用操作系统包库在用户级别获取包?
...出于安全原因,这是一个坏主意。
您可以将 locate (或在 OpenCSW的 findutils 中提供的 glocate)与允许使用正则表达式的 -r 选项一起使用:
glocate -r /gcj$
glocate 可以告诉你,假设
gupdatedb
最近运行过。最好的方法是扫描已安装的软件包。已安装文件的列表位于
/var/sadm/install/contents
.没试过,但你仍然需要经历很多麻烦。最好获取一个已经可用的 gcj 二进制文件。如果您必须自己编译它,那么最好使用现有的构建描述,例如这个.
我假设您正在考虑类似于 Gentoo 的emerge 的东西,它会在编译您想要的软件包之前下载并安装依赖包。这不容易做到;特别是如果您以普通用户的身份编译所有内容,因为您需要使用 chroot 环境。这是一个好主意,但不是微不足道的。
获取包裹是什么意思?如果您想要提取 .pkg 文件的内容,您可以使用 pkgtrans 命令,如下所示:
pkgtrans foo.pkg ./ all
但是,也可以执行类似pbuilder的操作,它会创建一个 chroot 环境,您也可以在其中进行编译作为包安装,都在主目录中。
回到 gcj 问题,我认为您需要指定 makefile 的构建时间依赖项,并依赖于包含 gcj 的包,在已知路径中,然后您可以在构建描述中使用该路径。
一般来说,如果您在共享主机中,编译软件包会很痛苦,最好找到一个可以安装和删除软件包并写入 /usr 的系统。
使用某种构建框架也是一个好主意,例如GAR,它可以做所有正确的事情并消除许多烦恼:它检查构建时间依赖关系、下载 tarball、验证校验和、提取、应用补丁(如果有),配置、构建、安装和制作包,您可以在单个 Makefile 中指定所有内容。学习使用这样的框架需要一些时间,但如果你倾向于自己构建包,花在学习上的时间会很快得到回报。
是的,出于安全原因,这是一个坏主意。恶意脚本或程序,或者一个简单的错误可能是一个真正的问题。
whereis
搜索明显的地方,如/bin
,/usr/bin
和其他。请参阅手册页文件部分locate
如果可用或其他方式,您可以使用find
:或者
1:没有人这样做 -> 坏主意。
2 + 3:肯定的方法是:
4:不知道。
5:可能,这显然是很多手工工作。
6:不。在 Makefile 中,您可以将任何通常包含 gcj 的目录附加到 PATH (您有根据的猜测)。这不会伤害任何人。
7:不,安装包由管理员决定。但您无需成为管理员即可将包中包含的文件提取到您的主目录:
进行此类减法后,该软件将很少可用(所有权错误、路径错误、库路径错误、配置文件路径错误、未执行安装脚本、未检查先决条件……)。这样的操作不仅在 Solaris 上也是可能的,在大多数其他 Unix/Linux 风格上也是可能的——使用它们的打包工具。