For what it's worth, what we do here is have the executable search for a file named paths.cfg in the same directory it's located in, and read settings from that file to get the paths to load resources from. Then our CMake system is set up to create one paths.cfg when building, and another when installing. Of course, we use Qt which makes it easy both to get the executable location directory (which you mentioned you don't want to do), and to read a configuration file. Also, our installation is designed to be in a self-contained directory, e.g. /opt/Scalable/product; but in an installation to system directories, you wouldn't want to clutter /usr/bin with a paths.cfg file, so you would probably want to have a hard-coded system directory fallback compiled in to use if paths.cfg doesn't exist.
A possible hack that just occurred to me: maybe you could make use of the different RPATH by compiling a simple path configuration "plugin" - the executable would try to dlopen("mypaths.so") and if that's found call functions in the plugin to get the paths. The plugin would only be compiled in the build directory, and not installed. Of course, that would be totally non-portable to Windows. -- Daniel Schepler ________________________________________ From: CMake [cmake-boun...@cmake.org] on behalf of Dmitry Marakasov [amd...@amdmi3.ru] Sent: Sunday, November 29, 2015 6:10 PM To: cmake@cmake.org Subject: [CMake] Best way to handle application data path for local run vs. installation Hi! This question bugs me for a long time so I though maybe someone has a solution. I have a project which includes an application and some data for it. An application needs to know path to its data files, so I pass it via compiler definition: ADD_DEFINITIONS(-DDATADIR="...") The problem is that this path is different based on whether I want to run the application from build directory: ADD_DEFINITIONS(-DDATADIR="${PROJECT_SOURCE_DIR}/data") or want to install it systemwide: ADD_DEFINITIONS(-DDATADIR="${CMAKE_INSTALL_PREFIX}/share/myapp") I want my project to both run from build directory and to be installable systemwide, without the need to rebuild or specify extra options. - I don't want to make an applications search for its data relative to executable path - There's no cross-platform way to get an executable path - This will break when executable is moved or hardlinked - I don't want to try both paths, as this is error prone, as installed executable may pick data files from repository or vice versa - I don't want to make user specify additional cmake flags like -DSYSTEMWIDE_INSTALLATION or -DRUN_LOCALLY. - I don't want to use any wrapper scripts - I don't want to build two executables The best solution would be for cmake to fix path in executable file right after installation, something similar to what cmake does with rpaths. Or there could be a cross-platform way for executable to know whether it was installed which I've missed. Any ideas? -- Dmitry Marakasov . 55B5 0596 FF1E 8D84 5F56 9510 D35A 80DD F9D2 F77D amd...@amdmi3.ru ..: jabber: amd...@jabber.ru http://amdmi3.ru -- Powered by www.kitware.com Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Kitware offers various services to support the CMake community. For more information on each offering, please visit: CMake Support: http://cmake.org/cmake/help/support.html CMake Consulting: http://cmake.org/cmake/help/consulting.html CMake Training Courses: http://cmake.org/cmake/help/training.html Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Follow this link to subscribe/unsubscribe: http://public.kitware.com/mailman/listinfo/cmake -- Powered by www.kitware.com Please keep messages on-topic and check the CMake FAQ at: http://www.cmake.org/Wiki/CMake_FAQ Kitware offers various services to support the CMake community. For more information on each offering, please visit: CMake Support: http://cmake.org/cmake/help/support.html CMake Consulting: http://cmake.org/cmake/help/consulting.html CMake Training Courses: http://cmake.org/cmake/help/training.html Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html Follow this link to subscribe/unsubscribe: http://public.kitware.com/mailman/listinfo/cmake