在GNU / Linux系统上,我应该从哪里加载应用程序数据?

时间:2009-06-08 21:08:01

标签: linux autoconf glade

在这个例子中我使用c和autoconf,但问题适用于其他地方。

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

由于


感谢您的回复。为了澄清,我不需要知道应用程序数据的安装位置(例如,通过在/ usr,usr / local等中搜索),configure脚本会这样做。问题是更确定应用程序是否已安装。我想我会先检查安装位置,如果没有,那么请在“./src/foo.glade”中。

4 个答案:

答案 0 :(得分:2)

我认为没有任何标准方法可以找到这样的数据。

我个人这样做的方式是我有一个路径列表,如果我可以从其中任何一个找到该文件,我会找到该列表,该列表应该包含从autoconf和CURRENTDIRECTORY定义的DATADIR + APPNAME + POSSIBLE_PREFIX其中prefix可能是构建根目录中的某个文件夹。

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

答案 1 :(得分:1)

一般来说,这应该没有处方,但Debian打包程序通常会在/ usr / share,/ usr / lib等等的某处安装应用程序数据。他们还可以修补软件,使其从适当的位置读取。您可以查看Debian policy以获取更多信息。

但我可以说几句我是怎么做的。首先,我不希望在单个目录中找到该文件;我首先创建一个目录列表,我在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的外观。

所以,只需创建一个包装器,它将迭代这些位置并从这些dirs获取数据。像PATH变量之类的东西,除了你实现迭代。

写完这篇文章之后,我注意到我需要在this project中清理我们的实现,但它可以作为一个很好的开始。请查看我们的Makefile.am使用$(datadir)和我们的util.cpputil.h获取简单的包装器(yatc_fopen())。如果某些第三方库正在执行yatc_find_file(),我们也会fopen(),例如SDL_image或libxml2。

答案 2 :(得分:0)

如果程序是全局安装的:

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

如果您希望程序在未安装的情况下工作(即只提取tarball),请将其放在程序的目录中。

答案 3 :(得分:0)

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

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

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

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