3

在这种情况下,我将 c 与 autoconf 一起使用,但问题适用于其他地方。

我有一个运行时需要的 glade xml 文件,我必须告诉应用程序它在哪里。我正在使用 autoconf 在我的代码中定义一个指向“指定前缀目录”/app-name/glade 的变量。但这只有在安装应用程序后才开始起作用。如果我想在那之前运行程序怎么办?是否有标准方法来确定应检查哪些路径以获取应用程序数据?

谢谢


感谢您的回复。澄清一下,我不需要知道应用程序数据的安装位置(例如,通过在 /usr、usr/local 等中搜索),配置脚本可以做到这一点。问题更多的是确定该应用程序是否已安装。我想我会先检查安装位置,如果没有,然后检查“./src/foo.glade”。

4

4 回答 4

2

我认为如何定位此类数据没有任何标准方法。

我个人会以一种我有一个路径列表的方式进行操作,如果我可以从其中的任何一个中找到文件,我会找到它,并且该列表应该包含从 autoconf 和 CURRENTDIRECTORY+POSSIBLE_PREFIX 定义的 DATADIR+APPNAME 哪里前缀可能是构建根目录中的某个文件夹。

但无论如何,不​​要忘记将 autoconf 中的定义用于您的数据文件,这些定义使您的软件更易于打包(如 deb/rpm)

于 2009-06-08T21:43:31.923 回答
1

一般来说,这并没有规定应该如何完成,但 Debian 打包程序通常将应用程序数据安装在 /usr/share、/usr/lib 等的某个位置。他们还可以修补软件以使其从适当的位置读取。您可以查看Debian 政策以获取更多信息。

但是,我可以说几句话我是如何做到的。首先,我不希望在单个目录中找到文件;我首先创建一个目录列表,我在包装器中遍历fopen(). 这是我认为应该完成文件读取的顺序:

  • 当前目录(显然)
  • ~/.program-name
  • $(datadir)/program-name

$(datadir)是可以在 Makefile.am 中使用的变量。例子:

AM_CPPFLAGS = $(ASSERT_FLAGS) $(DEBUG_FLAGS) $(SDLGFX_FLAGS) $(OPENGL_FLAGS) -DDESTDIRS=\"$(prefix):$(datadir)/:$(datadir)/program-name/\"

这当然取决于您的输出configure以及您的configure.ac外观。

因此,只需制作一个将遍历位置并从这些目录中获取数据的包装器。类似于PATH变量的东西,除了你实现迭代。

写完这篇文章后,我注意到我需要清理我们在这个项目中的实现,但这可以作为一个好的开始。看看我们的Makefile.amfor using$(datadir)和我们的util.cppandutil.h一个简单的包装器 ( yatc_fopen())。我们也有yatc_find_file()一些第三方库正在做的情况fopen(),例如 SDL_image 或 libxml2。

于 2009-06-08T22:32:18.907 回答
0

如果程序是全局安装的:

/usr/share/app-name/glade.xml

如果您希望程序在不安装的情况下运行(即只需解压缩 tarball),请将其放在程序的目录中。

于 2009-06-08T21:11:38.507 回答
0

我认为没有放置文件的标准方法。我将它构建到程序中,并且不将其限制在一个位置。

这取决于需要对配置文件进行多少自定义。

我首先构建一个默认目录列表并遍历它们,直到找到 glade.xml 的实例并停止查找,或者找不到它并退出并出现错误。默认列表的合适候选者是 /etc、/usr/share/app-name、/usr/local/etc。

如果该文件被设计为可定制的,那么在查看默认目录之前,我有一个用户文件和路径列表并通过它们进行处理。如果它没有找到其中一个用户版本,那么我会查看默认目录列表。用户配置文件的良好候选者是 ~/.glade.xml 或 ~/.app-name/glade.xml 或 ~/.app-name/.glade.xml。

于 2009-06-08T21:59:36.710 回答