Push-Nachrichten von MacTechNews.de
Würden Sie gerne aktuelle Nachrichten aus der Apple-Welt direkt über Push-Nachrichten erhalten?
Forum>Entwickler>Universal Binary erzeugen mit gelinktem glib2 - Hilfe gesucht

Universal Binary erzeugen mit gelinktem glib2 - Hilfe gesucht

andreas_g
andreas_g07.09.1116:23
Liebe Entwickler-Gemeinde!

Ich möchte QEMU 0.15 aus den Quellen kompilieren. Es steht mir dazu folgendes System zu Verfügung:

PowerMac G4, Mac OS X 10.5.8 mit Xcode 3.1.3

QEMU benötigt seit Version 0.15 die Bibliothek glib2. Ich habe diese via fink installiert (Pakete glib2, glib2-dev, glib2-shlibs und zusätzlich pkgconfig). QEMU lässt sich mit dieser Konfiguration ohne Probleme kompilieren:

# ./configure --disable-darwin-user --disable-bsd-user --enable-cocoa --disable-guest-agent
# make

Nun aber das Problem:
Ich möchte ein Universal Binary erzeugen! Das wäre an sich kein Problem:

# ./configure --disable-darwin-user --disable-bsd-user --enable-cocoa --disable-guest-agent --extra-cflags="-arch i386"
# make

... und anschließend zusammenführen mit lipo.

Jedoch beklagt sich der Linker (berechtigterweise), dass einige der zu linkenden Bibliotheken (genauer gesagt all jene, die via fink installiert wurden, also alle zu glib2* zugehörigen) nicht für die entsprechende Architektur vorliegen.

Nun meine Frage: Wie bekomme ich eine Universal Binary Version dieser Bibliotheken?

Ich habe trotz längerer Suche keine Möglichkeit gefunden mit fink eine Universal Binary Bibliothek zu installieren.


Sollte sich das oben beschriebene Problem lösen lassen, hätte ich noch ein weiteres Anliegen:
Ich würde die gelinkten Bibliotheken gerne zusammen mit dem QEMU-Binary "transportieren" können. Daher wäre es praktisch, wenn das Programm die Bibliotheken aus seinem eigenen Pfad lesen würde.

Also z.B. anstelle von
/sw/lib/libgthread-2.0.0
aus
./libgthread-2.0.0

Der Weg über install_name_tool ist mir bekannt, allerdings wäre ich froh, wenn es etwas einfacheres/weniger umständliches gäbe.

Ich hoffe meine Ausführungen sind soweit verständlich.
Vielen Dank im Voraus für alle Tipps!
0

Kommentare

sierkb07.09.1117:16
UFO:AI: Talk:Compile for Mac:
UFO:AI
There are several severe problems with the instructions for compiling using Fink and Port when running mac OS X 10.5.5 Intel/Universal.

You can't build universal binaries using Fink. Period. Fink does not support them. If you must build universal binaries you have to follow the direction for using MacPorts (or figure out how to build all the dependencies as universal binaries - good luck.) --Tchristney 08:24, 17 December 2008 (UTC)

Möglicher Workaround:

MacOSXHints: Compile universal binaries by default UNIX

Und wenn Du dann in die Manpage-Datei ccub.man des dort angebotenen Sourcecodes für ccub reinschaust, dann steht da Folgendes drin:
In order to automate the compilation of universal binaries for ppc and
i386, the ccub command will automatically insert the required arguments
into a normal cc(1) command. The inserted arguments are "-isysroot
/Developer/SDKs/MacOSX10.4u.sdk -arch ppc -arch i386"
. If any of
the -M*, -S, -E, or -save-temps flags are given, then the additional
arguments are not inserted. If -isysroot is given on the command line,
then it will override the auto-inserted one; if additional -arch flags
are given on the command line, then those architectures will be added to
the binary. For example, ccub -arch ppc64 will create a universal binary
for i386, ppc, and ppc64. All original flags and arguments are passed
to /usr/bin/gcc after the inserted arguments (if any).

Normally, /usr/bin/cc and /usr/bin/gcc are both links to whichever
version of the GNU C compiler is the default compiler on this system.
It is possible for ccub to be linked to by /usr/bin/cc if all cc
compilations on this machine are to be universal by default. In this
case, you can run gcc to retain the original functionality, and cc to
get automatic universal binaries. Note that to install ccub in this
way, it should first be installed in some other directory on your
path, such as /usr/local/bin/ccub. Then remove the link /usr/bin/cc
with "sudo rm /usr/bin/cc", and make the link to ccub with "sudo ln -s
/usr/local/bin/ccub /usr/bin/cc".

There is also a c++ub program that operates the same way for c++/g++. It
also can be installed as /usr/bin/c++ so that global invocations of c++
will result in universal binaries.

Evtl. hilft es Dir also weiter, wenn Du zuerst diesen Wrapper ccub baust und installierst und damit die Compiler-Flags umbiegst bzw. setzt, wann immer der GCC aufgerufen wird. Und es dann nochmal mit Fink versuchst, welches, wenn es den GCC aufruft statt auf den GCC dann auf diesen Wrapper trifft.

Andere Möglichkeit: in 2 Durchgängen i386-Binaries und PPC-Binaries der Bibliotheken erstellen und diese dann pro Bibliothek mit lipo ($ man lipo) zu einem Universal Binary zusammenführen. Siehe dazu auch:

[Fink-users] Universal binaries from fink?

Möglicherweise ginge es auch, wenn Du in irgendeiner Konfigurationsdatei von Fink die Standard-Compiler-Flags in Richtung -isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch ppc -arch i386 abändern kannst. Doch das oben zuerst genannte UFO:AI-Zitat entmutigt mit seiner diesbzgl. Aussage.

Oder Du lässt von Fink ab und verwendest MacPorts . MacPorts kann das. Entweder über entsprechende Configure-Variablen zur Laufzeit oder fest ins jeweilige Portfile reingeschrieben oder fest als Default-Wert für die gesamte MacPorts-Installation in der MacPorts-Konfigurationsdatei /opt/local/etc/macports/macports.conf:

# CPU architecture to compile for. Defaults to i386 or ppc on Mac OS X 10.5
# and earlier, depending on the CPU type detected at runtime. On Mac OS X 10.6
# the default is x86_64 if the CPU supports it, i386 otherwise.
#build_arch i386

# CPU architectures to use for Universal Binaries (+universal variant)
universal_archs x86_64 i386
0
andreas_g
andreas_g08.09.1109:56
Vielen Dank für die ausführlichen Informationen!
Die MacPorts-Variante klingt recht vielversprechend. Werde das als Erstes testen.
0
andreas_g
andreas_g08.09.1118:01
Mit Macports hat es funktioniert!
Zuerst in der macports.config-Datei unter universal_archs x86_64 angefügt und dann

sudo port install glib2 +universal

Der PowerMac hat zwar ein paar Stunden gerechnet, aber schlussendlich war die Aktion erfolgreich!
Ich konnte die Bibliotheken als Universal Binary installieren und anschließend QEMU für ppc, i386 und x86_64 kompilieren.
Die einzelnen QEMU-Binaries (ppc, i386 und x86_64) konnte ich mit lipo zu einem Universal Binary zusammenfügen.

Schlussendlich habe ich noch etwas mühevoll via install_name_tool die Pfade der Bibliotheken auf das Verzeichnis von QEMU geändert und die Bibliotheken beigelegt. Ziel erreicht!

1000 Dank an sierkb für die Hilfe!
0

Kommentieren

Diese Diskussion ist bereits mehr als 3 Monate alt und kann daher nicht mehr kommentiert werden.