我的项目有一个/usr/share/openage
包含各种文件(图形、文本等)的全局资产目录()和一个用户特定的资产目录(~/.openage
),允许用户覆盖一些全局资产/添加他们自己的。
我的理解是,在构建时,您将安装前缀传递给构建系统(例如./configure --install-prefix=/usr
),然后生成一个文件(例如configure.h
),该文件使安装前缀可用于代码(例如#define INSTALL_PREFIX="/usr"
)。然后代码将在INSTALL_PREFIX "share/openage"
. 到现在为止还挺好。
但是,当项目尚未安装时(对于我作为开发人员来说,99.9% 的情况都是如此),该目录/usr/share/openage
显然还不存在;相反,我想./assets
在当前目录中使用。更糟糕的是,如果安装的目录存在(例如,来自独立的早期安装),它可能与当前的开发版本不兼容。
同样,如果运行已安装的项目,我希望它使用用户的主目录(~/.openage
)作为用户资产目录,而在“devmode”中,它应该使用像“./userassets”这样的目录。
当考虑非 POSIX 平台时,情况会变得更糟。在 Windows 上,INSTALL_PREFIX
这是无用的,因为程序基本上可以安装在任何地方(程序只是使用当前工作目录还是作为资产目录?),我不知道 Mac 如何处理这个问题。
所以我的问题是:是否有普遍接受的“最好的方法”?当然,数百个项目(基本上每个具有资产目录的项目)都以一种或另一种方式处理了这个问题。
不幸的是,我什至不知道用谷歌搜索什么。我什至不知道如何标记这个问题。当前的想法(和相关问题)包括:
- 查找
openage_version
仅存在于源目录中的文件cwd
. 如果存在,则假定该项目当前已卸载。- 问题:即使在“开发模式”下,
cwd
也可能并不总是项目根目录。
- 问题:即使在“开发模式”下,
- 检查是否
readlink("/proc/self/exe")
以INSTALL_PREFIX
- 问题:特定于平台
- 问题:理论上,项目根目录可能在
/usr/myweirdhomedirectory/git/openage
- 强制开发者指定一个参数
--not-installed
,或者设置一个环境变量,OPENAGE_INSTALLED=0
- 问题:不方便
- 问题:使用错误的资产目录时忘记指定参数会导致混淆
- 在开发过程中,调用
./configure
不同的INSTALL_PREFIX
- 问题:为安装而构建项目时,建议
make test
在未安装项目时运行测试
- 问题:为安装而构建项目时,建议
- 前两个选项的组合:检查
dirname(readlink("proc/self/exe")) + "/openage_version"
- 问题:更加特定于平台
- 这似乎是迄今为止最强大的选择