views:

771

answers:

4

Hello, I'm working on a project which shall contain two targets. One for building a Framework to use in Mac development and another to create a static library to use in iPhone development.

In the common code it's no problem to #ifdef between the platforms, but I just can't get the targets and dependencies right.

The first question is, which base SDK to use? For example if I use Mac 10.5 i can't include the UIKit framework (it is marked red and doesn't show the header files if i expand it). Even if the target that actually links against it builds for iPhone OS..

The other question is, how about the Foundation.framework, or stuff like Security.framework? How to deal with them, as I can only include one of the versions (Mac or iPhone SDK)...

Anyone has an advice for me? I'd like to have a clean project structure and definitely the same codebase for both targets... Are configurations the way to go?

Thanks!

A: 

Can't you use the PIMPL idiom? And/or have a common header for both but use different implementation file based on the target architecture or SDK?

Henrik Hartz
+3  A: 

Probably the easiest (in terms of what you have to do) way of doing it is two projects (which you can wrap up as sub-projects of a dummy umbrella project if you like) which use the same sets of sources—one targeting Mac OS X, the other iPhone OS.

Alternatively, can you not create two separate targets within the same project, and alter the “Base SDK” from the “Build” tab of the “Get Info” window for each? I don't have Xcode in front of me to check, but I think it'll let you do this.

(Of course, with either approach, you can add a third target: a static library for the simulator, which will be useful when testing!)

Mo
That's exactly the problem. Having two targets with different Base SDKs where one is Mac OS X wont allow me to include the UIKit framework.And the problem with the Security framework which has the same name on both platforms also still exists. But the idea of the "umbrella project" might be okay.
stigi
+1  A: 

Just to let you know:

I ended up having one project with different targets for the different platforms. But I didn't include the framework I depend on in the targets itself, but rather added them to the Other Linker Flags build settings:

-framework Foundation -framework Security

You can check it out in the project I did on github.

stigi
+1  A: 

It's actually not that bad. Just create a second target of the appropriate type and then change the "Base SDK" build setting. Then make sure to add all the necessary files. If you want to build both at the same time, create an aggregate target. For a practical example see my project SSPromise.

Colin Barrett