我的项目有一个包含各种文件(图形,文本等)的全局资产目录(/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"
最佳答案
我最终选择的解决方案是在应用程序的Python部分进行决策。
有一个Python模块buildsystem.setup
,它在make install
期间未安装而不是。
利用这个事实,我可以简单地
def is_in_devmode():
try:
import ..buildsystem.setup
return True
except ImportError:
return False