Target install path question

Andreas Pakulat apaku at gmx.de
Mon Sep 20 15:00:04 CEST 2010


On 20.09.10 14:25:25, Sebastian Trüg wrote:
> On 09/20/2010 01:04 PM, Andreas Pakulat wrote:
> > On 20.09.10 12:36:28, Sebastian Trüg wrote:
> >> Hi,
> >>
> >> is there a way to get the exact path of a target install path?
> >> If I have for example some installation rule like:
> >>
> >> install(TARGET foobar DESTINATION lib)
> >>
> >> I would like to use the path of the foobar lib in my FooBarConfig.cmake
> >> to set a variable FOOBAR_LIBRARIES.
> >> Is that possible without resorting to what the Akonadi version does, ie.
> >> construct a different path for each architecture?
> > 
> > I don't know what Akonadi does, but usually the config-files are installed
> > to <prefix>/lib<suffix>/cmake/<yourmodule> so you can easily get at the lib
> > or bin or share dir by using CMAKE_CURRENT_LIST_FILE variable and
> > extracting the path from that. Then use a static relative path from that
> > like "../../" (for lib<suffix>) or "../../bin|share" for bin/share.
> > 
> > Using some 'heuristics' like guessing architecture and using that is not
> > necessarily reliable as the person building the codebase can change all
> > details of the target path by using global cmake variables.
> > 
> > A quick look through the target properties list doesn't seem to indicate
> > there is any to extract the final install location. Generally though if you
> > have install(TARGET foobar DESTINATION lib) then it'll end up in
> > DESTDIR/<prefix>/lib. But I guess you're using some pre-defined variable(s)
> > which are platform-dependent?
> 
> no, I do not. But since the file extension differs between platforms I
> would need to have some heuristic unless cmake provides the full path.
> This is true for libs as well as for executables.
> 
> That is why Akonadi does the following which I would really like to avoid:
> 
> if(WIN32)
> if(MINGW)
>   set(AKONADI_COMMON_LIBRARIES
> "@AKONADI_LIB_DIR@/libakonadiprotocolinternals.dll.a")
> else(MINGW)
>   set(AKONADI_COMMON_LIBRARIES
> "@AKONADI_LIB_DIR@/akonadiprotocolinternals.lib")
> endif(MINGW)
> elseif(APPLE)
>   set(AKONADI_COMMON_LIBRARIES
> "@AKONADI_LIB_DIR@/libakonadiprotocolinternals.dylib")
> else()
>   set(AKONADI_COMMON_LIBRARIES
> "@AKONADI_LIB_DIR@/libakonadiprotocolinternals.so")
> endif()
> 
> Maybe I am missing something. I am trying to write a SopranoConfig.cmake
> which creates variables for the libraries and also the executables that
> are installed.

There are two ways:

a) Use find_library with HINTS and provide the calculated absolute path to
the lib directory (or bin) based off of the Config-file. The resulting
variable will contain the absolute filename of the library and the function
takes care of the platform-specifics.

b) use exported targets with INSTALL(TARGETS foo EXPORT myNameSpace) and
set the variables to the names of the import-targets.

KDevPlatform uses option b) so you could use that as example together with
the cmake manual (or ask here for more info).

Andreas

-- 
You will soon forget this.


More information about the Kde-buildsystem mailing list