summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ingen/wscript2
-rw-r--r--src/shared/runtime_paths.cpp83
-rw-r--r--src/shared/runtime_paths.hpp44
3 files changed, 129 insertions, 0 deletions
diff --git a/src/ingen/wscript b/src/ingen/wscript
index ad16dd35..50b6704d 100644
--- a/src/ingen/wscript
+++ b/src/ingen/wscript
@@ -10,4 +10,6 @@ def build(bld):
obj.uselib_local = 'libingen_module libingen_shared'
obj.inst_dir = bld.env()['BINDIRNAME']
autowaf.use_lib(bld, obj, 'GTHREAD GLIBMM REDLANDMM RAUL LV2CORE SLV2 INGEN LIBLO SOUP')
+
+ autowaf.build_wrapper(bld, 'ingen.in', obj)
diff --git a/src/shared/runtime_paths.cpp b/src/shared/runtime_paths.cpp
new file mode 100644
index 00000000..d122aba0
--- /dev/null
+++ b/src/shared/runtime_paths.cpp
@@ -0,0 +1,83 @@
+/* This file is part of Ingen.
+ * Copyright (C) 2008 Dave Robillard <http://drobilla.net>
+ *
+ * Ingen is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * Ingen is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <iostream>
+#include "runtime_paths.hpp"
+#include <glibmm/module.h>
+
+using namespace std;
+
+namespace Ingen {
+namespace Shared {
+
+static std::string bundle_path;
+
+
+/** Must be called once at startup, and passed a pointer to a function
+ * that lives in the 'top level' of the bundle (e.g. the executable).
+ * Passing a function defined in a module etc. will not work!
+ */
+void
+set_bundle_path_from_code(void* function)
+{
+ Dl_info dli;
+ dladdr(function, &dli);
+
+ char bin_loc[PATH_MAX];
+ realpath(dli.dli_fname, bin_loc);
+
+#ifdef BUNDLE
+ string bundle = bin_loc;
+ bundle = bundle.substr(0, bundle.find_last_of("/"));
+ bundle_path = bundle;;
+#endif
+}
+
+
+/** Return the absolute path of a 'resource' file.
+ */
+std::string
+data_file_path(const std::string& name)
+{
+ std::string ret;
+#ifdef BUNDLE
+ ret = bundle_path + "/" + INGEN_DATA_DIR + "/" + name;
+#else
+ ret = std::string(INGEN_DATA_DIR) + "/" + name;
+#endif
+ return ret;
+}
+
+
+/** Return the absolute path of a module (dynamically loaded shared library).
+ */
+std::string
+module_path(const std::string& name)
+{
+ std::string ret;
+#ifdef BUNDLE
+ ret = Glib::Module::build_path(bundle_path + "/" + INGEN_MODULE_DIR, name);
+#else
+ ret = Glib::Module::build_path(INGEN_MODULE_DIR, name);
+#endif
+ return ret;
+}
+
+
+} // namespace Ingen
+} // namespace Shared
+
diff --git a/src/shared/runtime_paths.hpp b/src/shared/runtime_paths.hpp
new file mode 100644
index 00000000..b8c28cce
--- /dev/null
+++ b/src/shared/runtime_paths.hpp
@@ -0,0 +1,44 @@
+/* This file is part of Ingen.
+ * Copyright (C) 2008 Dave Robillard <http://drobilla.net>
+ *
+ * Ingen is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * Ingen is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef INGEN_DATA_FILE_HPP
+#define INGEN_DATA_FILE_HPP
+
+#ifndef _GNU_SOURCE
+ #define _GNU_SOURCE
+#endif
+
+#include <dlfcn.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <limits.h>
+#include <string>
+#include "config.h"
+#include "shared/runtime_paths.hpp"
+
+namespace Ingen {
+namespace Shared {
+
+void set_bundle_path_from_code(void* function);
+
+std::string data_file_path(const std::string& name);
+std::string module_path(const std::string& name);
+
+} // namespace Ingen
+} // namespace Shared
+
+#endif // INGEN_DATA_FILE_HPP