ome-common 5.2.0-m2

- Main Page
- Namespaces
- Classes
- Files

- File List
- File Members

module.h
Go to the documentation of this file.
1 /*
2 * #%L
3 * OME-COMMON C++ library for C++ compatibility/portability
4 * %%
5 * Copyright © 2006 - 2015 Open Microscopy Environment:
6 * - Massachusetts Institute of Technology
7 * - National Institutes of Health
8 * - University of Dundee
9 * - Board of Regents of the University of Wisconsin-Madison
10 * - Glencoe Software, Inc.
11 * %%
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions are met:
14 *
15 * 1. Redistributions of source code must retain the above copyright notice,
16 * this list of conditions and the following disclaimer.
17 * 2. Redistributions in binary form must reproduce the above copyright notice,
18 * this list of conditions and the following disclaimer in the documentation
19 * and/or other materials provided with the distribution.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
25 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 * POSSIBILITY OF SUCH DAMAGE.
32 *
33 * The views and conclusions contained in the software and documentation are
34 * those of the authors and should not be interpreted as representing official
35 * policies, either expressed or implied, of any organization.
36 * #L%
37 */
38
46 #ifndef OME_COMMON_MODULE_H
47 # define OME_COMMON_MODULE_H
48
49 # include <ome/common/config.h>
50 # include <ome/common/filesystem.h>
51
52 namespace ome
53 {
54 namespace common
55 {
56
70 const boost::filesystem::path&
71 module_runtime_path(const std::string& dtype);
72
87 void
88 register_module_paths();
89
98 struct Module
99 {
101 std::string name;
104 std::string envvar;
107 std::string module_envvar;
110 std::string root_envvar;
113 boost::filesystem::path abspath;
115 boost::filesystem::path relpath;
117 boost::filesystem::path install_prefix;
119 boost::filesystem::path shlibpath;
121 boost::filesystem::path realpath;
126 boost::filesystem::path (*module_path)();
127
144 Module(const std::string& name,
145 const std::string& envvar,
146 const std::string& module_envvar,
147 const std::string& root_envvar,
148 const boost::filesystem::path& abspath,
149 const boost::filesystem::path& relpath,
150 const boost::filesystem::path& install_prefix,
151 const boost::filesystem::path& shlibpath,
152 boost::filesystem::path (*module_path)());
153 };
154
161 struct RegisterModule
162 {
164 std::string name;
166 bool registered;
167
186 RegisterModule(const std::string& name,
187 const std::string& envvar,
188 const std::string& module_envvar,
189 const std::string& root_envvar,
190 const boost::filesystem::path& abspath,
191 const boost::filesystem::path& relpath,
192 const boost::filesystem::path& install_prefix,
193 const boost::filesystem::path& shlibpath,
194 boost::filesystem::path (*module_path)());
195
201 ~RegisterModule();
202 };
203 }
204 }
205
206 // Set to include introspection functionality (used for registering
207 // paths; not for normal use).
208 #ifdef OME_COMMON_MODULE_INTROSPECTION
209
210 #ifdef OME_HAVE_DLADDR
211 #ifndef _GNU_SOURCE
212 # define _GNU_SOURCE 1
213 #endif
214 #include <dlfcn.h>
215 #endif // OME_HAVE_DLADDR
216
217 #ifdef _MSC_VER
218 # include <windows.h>
219 #endif
220
221 namespace
222 {
223
224 #ifdef OME_HAVE_DLADDR
225 Dl_info this_module;
226
227 __attribute__((constructor))
228 void
229 find_module(void)
230 {
231 if(!dladdr(reinterpret_cast<void *>(find_module), &this_module))
232 {
233 this_module.dli_fname = 0;
234 }
235 }
236
237 boost::filesystem::path
238 module_path()
239 {
240 if (this_module.dli_fname)
241 return canonical(boost::filesystem::path(this_module.dli_fname));
242 return boost::filesystem::path();
243 }
244 #elif _MSC_VER
245 HMODULE
246 find_module(void)
247 {
248 static bool found_module = false;
249 static HMODULE this_module;
250
251 if (!found_module)
252 {
253 if (!GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS |
254 GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT,
255 reinterpret_cast<LPCWSTR>(&find_module),
256 &this_module))
257 {
258 this_module = 0;
259 }
260 found_module = true;
261 }
262 return this_module;
263 }
264
265 boost::filesystem::path
266 module_path()
267 {
268 HMODULE this_module = find_module();
269 if (this_module)
270 {
271 WCHAR win_wide_path[MAX_PATH];
272 GetModuleFileNameW(this_module, win_wide_path, sizeof(win_wide_path));
273 return boost::filesystem::path(win_wide_path);
274 }
275 return boost::filesystem::path();
276 }
277 #else // No introspection available
278 boost::filesystem::path
279 module_path()
280 {
281 return boost::filesystem::path();
282 }
283 #endif // _MSC_VER
284 }
285 #endif // OME_COMMON_MODULE_INTROSPECTION
286
287 #endif // OME_COMMON_MODULE_H
288
289 /*
290 * Local Variables:
291 * mode:C++
292 * End:
293 */
ome::common::canonical
boost::filesystem::path canonical(const boost::filesystem::path &p, const boost::filesystem::path &base=boost::filesystem::current_path(), boost::system::error_code *ec=0)
Get a canonical path.
Definition: filesystem.h:105
ome::common::Module::realpath
boost::filesystem::path realpath
The detected path (used to cache search result).
Definition: module.h:121
ome::common::Module::root_envvar
std::string root_envvar
Name of the environment variable used to specify the installation root.
Definition: module.h:110
ome::common::RegisterModule::name
std::string name
Name of the path, e.g. "bin" or "ome-xml-schema".
Definition: module.h:164
ome::common::Module::abspath
boost::filesystem::path abspath
Absolute path (used when configured to use an absolute install path).
Definition: module.h:113
ome::common::module_runtime_path
const fs::path & module_runtime_path(const std::string &dtype)
Get the runtime installation prefix path for a module.
Definition: module.cpp:371
ome::common::Module::shlibpath
boost::filesystem::path shlibpath
Shared library path (used for relocatable installs).
Definition: module.h:119
ome::common::Module::name
std::string name
Name of the path, e.g. "bin" or "ome-xml-schema".
Definition: module.h:101
ome::common::Module::relpath
boost::filesystem::path relpath
Relative path (used for relocatable installs).
Definition: module.h:115
ome::common::Module::Module
Module(const std::string &name, const std::string &envvar, const std::string &module_envvar, const std::string &root_envvar, const boost::filesystem::path &abspath, const boost::filesystem::path &relpath, const boost::filesystem::path &install_prefix, const boost::filesystem::path &shlibpath, boost::filesystem::path(*module_path)())
Constructor.
Definition: module.cpp:272
ome::common::RegisterModule::registered
bool registered
Is the path registered in the path map?
Definition: module.h:166
filesystem.h
Boost.Filesystem compatibility.
ome
Definition: boolean.h:48
ome::common::Module
A run-time path for a given module.
Definition: module.h:98
ome::common::Module::module_path
boost::filesystem::path(* module_path)()
Function to obtain the absolute path of the module providing the path (from the shared library or DLL...
Definition: module.h:126
ome::common::RegisterModule::~RegisterModule
~RegisterModule()
Destructor.
Definition: module.cpp:315
ome::common::Module::module_envvar
std::string module_envvar
Name of the environment variable used to specify the module installation root.
Definition: module.h:107
ome::common::Module::envvar
std::string envvar
Name of the environment variable used to override the autodetected path.
Definition: module.h:104
ome::common::RegisterModule
Register a module to make it available to module_runtime_path().
Definition: module.h:161
ome::common::RegisterModule::RegisterModule
RegisterModule(const std::string &name, const std::string &envvar, const std::string &module_envvar, const std::string &root_envvar, const boost::filesystem::path &abspath, const boost::filesystem::path &relpath, const boost::filesystem::path &install_prefix, const boost::filesystem::path &shlibpath, boost::filesystem::path(*module_path)())
Constructor.
Definition: module.cpp:294
ome::common::Module::install_prefix
boost::filesystem::path install_prefix
Absolute installation path (used for non-relocatable installs).
Definition: module.h:117
ome::common::register_module_paths
void register_module_paths()
Register OME-Common module paths.
Definition: module.cpp:488