diff --git a/Makefile b/Makefile index f5e7ca3..2ae6e06 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,24 @@ include dpf/Makefile.base.mk -all: cardinal deps dgl plugins gen +all: cardinal deps dgl plugins gen resources + +# -------------------------------------------------------------- +# Build config + +PREFIX ?= /usr/local +DESTDIR ?= +SYSDEPS ?= false + +# -------------------------------------------------------------- +# Check for system-wide dependencies + +# HAVE_LIBARCHIVE = $(shell pkg-config --exists libarchive && echo true) +# +# libjansson.a +# libsamplerate.a +# libspeexdsp.a +# libzstd.a # -------------------------------------------------------------- @@ -23,6 +40,9 @@ dgl: plugins: deps $(MAKE) all -C plugins +resources: cardinal gen + $(MAKE) resources -C plugins + ifneq ($(CROSS_COMPILING),true) gen: cardinal dpf/utils/lv2_ttl_generator @$(CURDIR)/dpf/utils/generate-ttl.sh diff --git a/dpf b/dpf index 1af66e4..1da1c81 160000 --- a/dpf +++ b/dpf @@ -1 +1 @@ -Subproject commit 1af66e49db01b5e2a5f90e85fe748c162bb83a48 +Subproject commit 1da1c811c765689790c8bf4290b2f6939f8046f3 diff --git a/plugins/Makefile b/plugins/Makefile index cad8731..7015dad 100644 --- a/plugins/Makefile +++ b/plugins/Makefile @@ -318,6 +318,55 @@ clean: rm -f $(TARGET) rm -rf $(BUILD_DIR) +# -------------------------------------------------------------- + +PLUGIN_LIST = $(subst /plugin.json,,$(wildcard */plugin.json)) +PLUGIN_RESOURCES += $(PLUGIN_LIST:%=../bin/Cardinal.lv2/resources/%) +PLUGIN_RESOURCES += $(PLUGIN_LIST:%=../bin/Cardinal.lv2/resources/PluginManifests/%.json) +ifeq ($(MACOS),true) +PLUGIN_RESOURCES += $(PLUGIN_LIST:%=../bin/Cardinal.vst/Contents/Resources/%) +PLUGIN_RESOURCES += $(PLUGIN_LIST:%=../bin/Cardinal.vst/Contents/Resources/PluginManifests/%.json) +else +PLUGIN_RESOURCES += $(PLUGIN_LIST:%=../bin/Cardinal.vst/resources/%) +PLUGIN_RESOURCES += $(PLUGIN_LIST:%=../bin/Cardinal.vst/resources/PluginManifests/%.json) +endif +PLUGIN_RESOURCES += $(PLUGIN_LIST:%=../bin/Cardinal.vst3/Contents/Resources/%) +PLUGIN_RESOURCES += $(PLUGIN_LIST:%=../bin/Cardinal.vst3/Contents/Resources/PluginManifests/%.json) + +resources: $(PLUGIN_RESOURCES) + +../bin/Cardinal.lv2/resources/%: %/res + -@mkdir -p "$(shell dirname $@)" + ln -sf $(abspath $<) $@ + +../bin/Cardinal.vst/resources/%: %/res + -@mkdir -p "$(shell dirname $@)" + ln -sf $(abspath $<) $@ + +../bin/Cardinal.vst/Contents/Resources/%: %/res + -@mkdir -p "$(shell dirname $@)" + ln -sf $(abspath $<) $@ + +../bin/Cardinal.vst3/Contents/Resources/%: %/res + -@mkdir -p "$(shell dirname $@)" + ln -sf $(abspath $<) $@ + +../bin/Cardinal.lv2/resources/PluginManifests/%.json: %/plugin.json + -@mkdir -p "$(shell dirname $@)" + ln -sf $(abspath $<) $@ + +../bin/Cardinal.vst/resources/PluginManifests/%.json: %/plugin.json + -@mkdir -p "$(shell dirname $@)" + ln -sf $(abspath $<) $@ + +../bin/Cardinal.vst/Contents/Resources/PluginManifests/%.json: %/plugin.json + -@mkdir -p "$(shell dirname $@)" + ln -sf $(abspath $<) $@ + +../bin/Cardinal.vst3/Contents/Resources/PluginManifests/%.json: %/plugin.json + -@mkdir -p "$(shell dirname $@)" + ln -sf $(abspath $<) $@ + # -------------------------------------------------------------- # Build commands diff --git a/src/CardinalPlugin.cpp b/src/CardinalPlugin.cpp index 689e513..91a33f7 100644 --- a/src/CardinalPlugin.cpp +++ b/src/CardinalPlugin.cpp @@ -72,23 +72,32 @@ struct Initializer { random::init(); ui::init(); - std::string resDir; - - if (const char* const bundlePath = plugin->getBundlePath()) - { - asset::systemDir = bundlePath; -#ifdef DISTRHO_OS_MAC - asset::systemDir += "/Contents/Resources"; -#endif - } - else + if (asset::systemDir.empty()) { - // Make system dir point to source code location as fallback - // TODO use /usr/share if on linux? if we count on it being installed.. - asset::systemDir = CARDINAL_PLUGIN_SOURCE_DIR DISTRHO_OS_SEP_STR "Rack" DISTRHO_OS_SEP_STR "res"; - } + if (const char* const bundlePath = plugin->getBundlePath()) + { + if (const char* const resourcePath = getResourcePath(bundlePath)) + { + asset::bundlePath = system::join(resourcePath, "PluginManifests"); + asset::systemDir = resourcePath; + } + } + + if (asset::systemDir.empty()) + { + // Make system dir point to source code location as fallback + // TODO use /usr/share if on linux? if we count on it being installed.. + asset::systemDir = CARDINAL_PLUGIN_SOURCE_DIR DISTRHO_OS_SEP_STR "Rack"; + + if (! system::isDirectory(system::join(asset::systemDir, "res"))) + { + asset::bundlePath = CARDINAL_PLUGIN_PREFIX "/share/Cardinal/Plugins"; + asset::systemDir = CARDINAL_PLUGIN_PREFIX "/share/Cardinal/Resources"; + } + } - asset::userDir = asset::systemDir; + asset::userDir = asset::systemDir; + } // Log environment INFO("%s %s v%s", APP_NAME.c_str(), APP_EDITION.c_str(), APP_VERSION.c_str()); diff --git a/src/Makefile b/src/Makefile index 8acc1cb..6f5f2ad 100644 --- a/src/Makefile +++ b/src/Makefile @@ -4,6 +4,13 @@ # Created by falkTX # +# -------------------------------------------------------------- +# Build config + +PREFIX ?= /usr/local +DESTDIR ?= +SYSDEPS ?= false + # -------------------------------------------------------------- # Project name, used for binaries @@ -150,10 +157,41 @@ SOURCE_DIR = $(CURDIR) endif BUILD_CXX_FLAGS += -DCARDINAL_PLUGIN_SOURCE_DIR='"$(SOURCE_DIR)"' +BUILD_CXX_FLAGS += -DCARDINAL_PLUGIN_PREFIX='"$(PREFIX)"' # -------------------------------------------------------------- # Enable all possible plugin types -all: jack lv2 vst2 vst3 +all: jack lv2 vst2 vst3 resources + +# -------------------------------------------------------------- + +CORE_RESOURCES = $(wildcard Rack/res/*) + +PLUGIN_RESOURCES += $(CORE_RESOURCES:%=../bin/Cardinal.lv2/resources/%) +ifeq ($(MACOS),true) +PLUGIN_RESOURCES += $(CORE_RESOURCES:%=../bin/Cardinal.vst/Contents/Resources/%) +else +PLUGIN_RESOURCES += $(CORE_RESOURCES:%=../bin/Cardinal.vst/resources/%) +endif +PLUGIN_RESOURCES += $(CORE_RESOURCES:%=../bin/Cardinal.vst3/Contents/Resources/%) + +resources: $(PLUGIN_RESOURCES) + +../bin/Cardinal.lv2/resources/%: Rack/res/% + -@mkdir -p "$(shell dirname $@)" + ln -sf $(abspath $<) $@ + +../bin/Cardinal.vst/resources/%: Rack/res/% + -@mkdir -p "$(shell dirname $@)" + ln -sf $(abspath $<) $@ + +../bin/Cardinal.vst/Contents/Resources/%: Rack/res/% + -@mkdir -p "$(shell dirname $@)" + ln -sf $(abspath $<) $@ + +../bin/Cardinal.vst3/Contents/Resources/%: Rack/res/% + -@mkdir -p "$(shell dirname $@)" + ln -sf $(abspath $<) $@ # -------------------------------------------------------------- diff --git a/src/dep.cpp b/src/dep.cpp index 25b2d76..ba12edb 100644 --- a/src/dep.cpp +++ b/src/dep.cpp @@ -87,14 +87,19 @@ static inline std::string& trim(std::string& s) { return s; } std::string system(std::string filename) { - return system::join(systemDir, trim(filename)); + return system::join(systemDir, bundlePath.empty() ? filename : trim(filename)); } std::string user(std::string filename) { - return system::join(userDir, trim(filename)); + return system(filename); } std::string plugin(plugin::Plugin* plugin, std::string filename) { - DISTRHO_SAFE_ASSERT_RETURN(plugin != nullptr, {}); - return system::join(systemDir, plugin->path, trim(filename)); + DISTRHO_SAFE_ASSERT_RETURN(plugin != nullptr, {}); + return system::join(systemDir, plugin->path, bundlePath.empty() ? filename : trim(filename)); +} +std::string pluginManifest(std::string dirname) { + if (bundlePath.empty()) + return system::join(systemDir, dirname, "plugin.json"); + return system::join(bundlePath, dirname + ".json"); } } }