在这个例子中我使用c和autoconf,但问题适用于其他地方。
我有一个在运行时需要的glade xml文件,我必须告诉应用程序它在哪里。我正在使用autoconf在我的代码中定义一个指向“指定前缀目录”/ app-name / glade的变量。但是只有在安装应用程序后才能开始工作。如果我想在那之前运行程序怎么办?是否有标准方法来确定应检查应用程序数据的路径?
由于
感谢您的回复。为了澄清,我不需要知道应用程序数据的安装位置(例如,通过在/ usr,usr / local等中搜索),configure脚本会这样做。问题是更确定应用程序是否已安装。我想我会先检查安装位置,如果没有,那么请在“./src/foo.glade”中。
答案 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.cpp
和util.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。