[CMake] I'm confused with Find*.cmake and *-config.cmake

Michael Wild themiwi at gmail.com
Mon Apr 19 16:20:56 EDT 2010


On 19. Apr, 2010, at 22:07 , Benoit Thomas wrote:

> Hello,
> 
> I'm using an external library which is already compiled. I have wrapped the library in a MyLib.cmake and use it in cmake as an imported library. It works fine, but since the include line uses relative path, it changes from projects to projects and in some case it looks just wrong.
> 
> I want to change this to something more like:
> 
> find_package (MyLib)
> include (MYLIB_CMAKE_FILE)
> # add_executable and stuff
> target_link_libraries (MyExe MyLib)
> 
> However, I'm not sure if I should create a FindMyLib.cmake file or MyLib-config.cmake. Both seems to eventually do the same, but I don't really understand what are the differences.
> 
> When I looked at some Find*.cmake file (FindSWIG for example) it has a UseSWIG.cmake file. Syntax looks like what I'm trying to achieve, but the none of the Use* files I've check create imported libray, so I guess this is not the way to go.
> 
> In the book, there is an example which seems to do more what I want and use *-config.cmake, which give something like
> 
> find_package (MyLib)
> # no include, since the MyLib-config.cmake already took care of the include
> # add_executable and stuff
> target_link_libraries (MyExe MyLib)
> 
> Part of what I don't understand is when a user use the find_package command, is he expecting to load a Find* file or a *-config file (or he doesn't care?), and is he expecting a specific behavior from each file, etc, etc... And would it be a surprise for the user if the find_package(MyLib) add a MyLib target into his project ? And is using find_package appropriate for this kind of situation and I got it all wrong :) ?
> 
> Bottom line, I'm looking for a way to write my projects so that if someone else with cmake experience look into them, it will feel like "common" cmake project (if such thing exists) and not something I'm the only one to understand...
> 
> (Sorry if this sound confusing)
> Ben.

Well, FindXXX.cmake modules are for non-native CMake software (i.e. not compiled and installed by CMake) and XXX-config.cmake modules are for CMake-based projects. So, if you are developing a software using CMake, you should create a XXX-config.cmake module for it which you install along with the binaries and other development files.

The UseXXX.cmake files are usually just convenience files containing additional macros/functions and set up some variables or add include_directories.


HTH

Michael



More information about the CMake mailing list