[Mono-osx] How to add mono/dumbarton as a bundled framework
Allan Hsu
allan at counterpop.net
Wed Oct 25 06:30:09 EDT 2006
Sorry I didn't get back to you when you sent me this question
yesterday, but, ironically, I was at the Mono developer's meeting in
Boston and there was no internet access:)
Here is how we do it at imeem:
We build our own universal version of Mono because there are a couple
problems right now with the current release builds of Mono for OS X.
Hopefully, after talking to Wade and Miguel this week (and some
followup work), we'll fix the current problems with linking against
the official builds as well as seeing what can be done about getting
official universal install packages. For now, if you're just testing,
you could probably just use one of the older platform-specific
release builds that links properly.
We include the Dumbarton framework project file in our main Xcode
project file, done by "add->existing files..." in the context menu
for the main project in "Groups & Files". It's important that you
either set your default build products folder in Xcode or manually
set the the build products folder in your project, the Dumbarton
project, and the Judy project inside Dumbarton all to the same folder.
In our release builds, we copy the Dumbarton framework and portions
of Mono into the application bundle. In order to fix the sorts of
linking problems you're experiencing, we use install_name_tool to
change the install names referenced by the application executable and
all of the dynamic librariesto @executable_path relative install
names. So instead of what you're trying to do, we link to the Mono
libraries in /Library/Frameworks/Mono/ and the included Dumbarton
framework project at build time, copy them into the application
bundle, and then rewrite the install names of the copied libraries.
The install_name_tool manpage explains how to use the tool in detail.
At runtime, you'll have to tell Dumbarton where to look for your
embedded version of Mono, otherwise the runtime will not look in your
application bundle for the GAC. This is the code that we use:
NSString *libraryPath = [[[NSBundle mainBundle] bundlePath]
stringByAppendingPathComponent:@"Contents/Libraries"];
NSString *monoRootPath = [libraryPath
stringByAppendingPathComponent:@"Mono"];
[DBMonoEnvironment setAssemblyRoot:[monoRootPath
stringByAppendingPathComponent:@"lib"]];
[DBMonoEnvironment setConfigDir:[monoRootPath
stringByAppendingPathComponent:@"etc"]];
We don't do anything with weak linking.
I hope this helps. I just returned from Boston a few hours ago and
I'm very tired, so I may have missed something. I've been meaning to
write some tools to make this process easier and include samples with
the Dumbarton example code, but I haven't gotten around to it yet.
-Allan
On Oct 25, 2006, at 2:04 AM, Eoin Norris wrote:
>
> This query is more for people who have used ObjectiveC# or Dumbarton.
>
> I have created an application that runs on my Intel box, talking via
> dumbarton to the mono layer , and back. Mono does the business code
> and all UI is in Cocoa.
>
> I need to get to beta test sometime next week - with external testers
> - and I need to either bite the bullet and bundle the frameworks
> within the bundle ( preferably a universal version) or just do it via
> an installer, installing the frameworks in /Library/Frameworks -
> which is ugly for the Mac.
>
> I thought I had a fair idea how to do this, however I ran into
> dumbarton problems.
>
> The developer documentation from apple suggests that you should build
> the frameworks within the project. This not what I want to do with
> the mono framework, specially as I am unsure how to build it.
>
> So for now I link against the mono 1.1.17.1 version ( which is intel
> only on my machine) without building it.
>
> So the final build phase is:
>
> 1) copy dumbarton.framework and mono.framework to the application
> bundle/contents/frameworks/ directory via a script
> 2) add -weak-link dumbarton and -weak-link mono to the linker flags
> 3) Change the mono specific linker flags ( which i dont really
> understand) to point to the bundled frameworks
>
> i.e. -L"$TARGET_BUILD_DIR/$FULL_PRODUCT_NAME/Contents/Frameworks/
> Mono.framework/Versions/Current/lib/pkgconfig/../../lib" and
> -L""$TARGET_BUILD_DIR/$FULL_PRODUCT_NAME/Contents/Frameworks/
> Mono.framework/Versions/Current/lib" -lmono -lm -lgmodule-2.0 -
> lgthread-2.0 -lglib-2.0 -lintl -liconv
>
> So that is the main target sorted I think, but I am not exactly sure.
> However I add Dumbarton as a bundled framework too, but do not build
> it either.
>
> On launching the result is :
>
> dyld: Library not loaded: /Library/Frameworks/Mono.framework/Versions/
> 1.1.17.1/lib/libmono.0.0.0.dylib
> Referenced from: /Library/Frameworks/Dumbarton.framework/Versions/
> A/Dumbarton
> Reason: image not found
>
> clearly a reference to the mono.framework from dumbarton. This gives
> rise to a circular problem, how do I build the dumbarton framework to
> point to a mono.framework ( weak-linked?) within a bundle which would
> not have been built yet, until after it the dumbarton framework is
> linked ( I think it is clear tha I have probably have to build
> dumbarton as part of my project.)
>
> Thanks in advance
>
> _______________________________________________
> Mono-osx mailing list
> Mono-osx at lists.ximian.com
> http://lists.ximian.com/mailman/listinfo/mono-osx
--
Allan Hsu <allan at counterpop dot net>
1E64 E20F 34D9 CBA7 1300 1457 AC37 CBBB 0E92 C779
More information about the Mono-osx
mailing list