[CMake] xcode project and static library dependencies

Nick Kledzik kledzik at apple.com
Mon Jan 17 21:02:58 EST 2011


On Jan 13, 2011, at 1:57 PM, Bill Hoffman wrote:
> On 1/13/2011 4:49 PM, Nick Kledzik wrote:
>> On Jan 13, 2011, at 12:41 PM, Bill Hoffman wrote:
>>> This is because Xcode provides no way to order static libraries as
>>> far as I can tell, or to repeat them.   Also, no way to depend on a
>>> static library or a file directly, forcing the makefile usage.
>>> This may have changed, so, if you can so native Xcode projects that
>>> can do the following we can change cmake:
>>> 
>>> - have a static library show up more than once on a link line
>> This is unnecessary.  Unlike most unix linkers, the Xcode linker
>> repeatedly iterators over all archives on the command line.  You
>> never need to add the same archive more than once on the command
>> line.
>> 
> That was not true when I implemented this the first time.  We have a test in CMake that counts on library ordering and it failed.
>> 
>>> - be able to specify the order of static libraries on the link
>>> line
>> The order that the libraries appear in the PBXFrameworksBuildPhase is
>> the order that they are passed to the linker.
>> 
> OK, sounds good...
>> 
>>> - be able to relink an executable when a static library that it
>>> depends on is rebuilt.
>> This is normal behavior for the Xccde build system.  If one target
>> depends on the product of another target, the build system follows
>> the chain and builds everything needed for the target requested to be
>> built.
> 
> If you can get all the CMake tests to pass with these changes, I would be very happy to get rid of the extra stuff.  It may have changed, but when I first did the implementation, it was required to do it the way it is. That said, I have not revisited this stuff since Xcode 1.5, so things may have changed for the better.
I have changes that cause cmake to produce an Xcode project in which the targets do not have the extra phases, and the dependencies are set up such that incremental builds work efficiently!

But I'm having some impedance mismatches between where Xcode want the build results to be and where cmake wants them.  Xcode (like many makefiles) has the concept of a normal build and an "install" build.  But when cmake runs it builds some test programs using the xcodebuild command line, but does not specify the "install" action but then expects to find the resulting executable in the install location.

I'm sure I could change TryCompileCode() to add "install" to the xcodebuild line, but it seems like lots of other cmake scripts will have the same expectations.  I playing with trying to get Xcode to always do an "install".  I tried creating xcode projects with the initial (not install) locations being where cmake wants them, but xcode seems to not do the internal dependency analysis properly when the intermediate results are not within BUILD_PRODUCTS_DIR.

What is the cmake model for where the results of a build go?

-Nick






More information about the CMake mailing list