[cmake-developers] Improved support for using cmake-based libraries in non-cmake projects

Alexander Neundorf neundorf at kde.org
Mon Jul 18 15:43:39 EDT 2011


On Wednesday 06 July 2011, Alexander Neundorf wrote:
> On Monday 04 July 2011, Brad King wrote:
> > On 07/03/2011 12:23 PM, Alexander Neundorf wrote:
> > > On Monday 20 June 2011, Brad King wrote:
> > >> On 06/17/2011 05:09 PM, Alexander Neundorf wrote:
> > >>> I improved it somewhat, so IMO it is basically working now.
> > >>> There is now a branch UsingCMakeLikePkgConfig on stage.
> > >>> Would be nice if you could have a look.
> > >> 
> > >> The patch series is hard to follow because it adds and removes
> > >> some code/comments and adds a file too late.  Please edit the
> > >> topic with "git rebase -i" to clean it up and push again.
> > > 
> > > There is now a new branch UsingCMakeLikePkgConfig2 in the stage.
> > > It should have somewhat nicer commits.
> > 
> > Much easier, thanks.
> > 
> > > This is not yet ready to be merged, but it would be nice if it could
> > > get a review :-)
> > 
> > In the first commit "Make clLocalGenerator::GetTargetFlags() public"
> > please fix the typo "s/cl/cm/".
> > 
> > In the second commit "Add find-package mode, which does nothing yet"
> > I think we should use an enumeration for the mode rather than separate
> > ScriptMode and FindPackageMode booleans.  It does not make sense to
> > have both at once, so both flags can be replaced by a single enumeration
> > value.
> 
> I'll have a look.

Done. There is now an enum which can have the values SCRIPT_MODE, 
FIND_PACKAGE_MODE and NORMAL_MODE.

> > In the main commit, "Implement find-package mode of cmake", there are
> > some technical challenges remaining:
> > 
> > (1) The code
> > 
> >   # this is ugly, and not enough for the multilib-stuff I guess
> >   if(UNIX AND EXISTS /usr/lib64)
> >   
> >     set(CMAKE_SIZEOF_VOID_P 8)
> >   
> >   endif()
> > 
> > hints at this one.  Some FindXXX modules or XXXConfig.cmake files may
> > switch behavior off the target compiler and architecture.  Without
> > having a real enable_language() the files may not present accurate
> > information.  I don't think a full enable_language can be made to work
> > in this mode, at least not efficiently.  This problem may be a matter
> > of passing more arguments into the mode to tell it things like the
> > address size as necessary.
> 
> Yes. I'll add something.

Done.
So, CMAKE_SIZEOF_VOID_P can be given to the script from the outside via -D.
If this is not done, it checks for /usr/lib64. If found -> 64bit.
If it doesn't exist, it then does /usr/bin/file /usr/bin/file, and checks 
whether the output contains "64-bit". If so -> 64bit.
I think this should work for most cases.
For the remaining cases CMAKE_SIZEOF_VOID_P has to be given from the outside 
(which is a configure script so this shouldn't be a problem).

For the multiarch stuff: the script now uses the regexp as defined in 
Linux.cmake to check whether such a directory exists, and if so, uses the 
first one found.
If there are multiple matching directories, this value again has to be given 
from the outside.

I think both issues above should work for all one-architecture installations.
 
> > (2) In the case that the to-be-found package really does provide a
> > CMake package configuration file (FooConfig.cmake) then it may provide
> > the libraries as imported targets.  The Foo_LIBRARIES variable will
> > contain only the logical names and not any real path information.
> > You'll have to read one of the LOCATION_<CONFIG> properties from
> > such imported targets to get an actual file path.
> 
> This works already.
> I don't simply print the contents of the variable, but an executable target
> is added, and it links against the contents of the variable. Then cmake
> does all the rest and evaluates it, and generates a command line for the
> linker.

Yes, already works :-)

> > (3) This hunk:
> >  +  // free generic one if generated
> >  +//  this->SetGlobalGenerator(0); // setting 0-pointer is not possible
> >  +//  delete gg; // this crashes inside the cmake instance
> > 
> > will require further investigation and/or refactoring of existing
> > code to address.  Perhaps the changes can be included in the second
> > patch or an additional patch in the series.
> 
> I had a look.
> I could simply leave it as it is (and remove the comment), then the global
> generator which is created in this function will be deleted later on by the
> normal cmake dtor.
> 
> Or I can change cmake::SetGlobalGenerator() so that it accepts a 0-pointer
> in findpackage mode, and deletes the old global generator (and call
> SetGlobalGenerator(0) then).
> 
> I'd prefer the first solution, since it doesn't require code changes and
> there shouldn't be an actual problem.

As I said, I think it's ok.
 
> > (4) Tests should be added in another patch after this.  They can wait
> > until the rest has matured though so we know what to test ;)
> 
> Yes :-)

Yes.

Another question: the cmake.m4 is based on the m4-file for pkgconfig, which 
has the GPL header at the top. So, the cmake.m4 still has that header at the 
top.
Is this a problem ?
I don't know how the license of a file, which is installed by cmake, but not 
compiled-in nor used by cmake itself influences cmake.
I thought about asking e.g. on the autoconf list for help, but this is a GNU 
project, so I doubt they will want to help to write a file with a BSD 
license...

Alex



More information about the cmake-developers mailing list