Мой проект имеет глобальный каталог активов (/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