Pagine

2012-01-11

Compilare per PowerPc con Xcode 4 - Aggiornato

E continuo con Xcode 4: con questa versione dello strumento di sviluppo, Apple ha deciso di far dismettere lo sviluppo di applicazioni per PowerPc; questo coincide con l'abbandono della piattaforma Rosetta (che permetteva appunto ai software per PowerPc di girare anche sui processori Intel) con l'arrivo di Lion.
Non è stato un abbandono improvviso: la coesistenza di Intel e Rosetta durava dal MacOSX 10.5. Tuttavia sappiamo che i Mac, anche se vecchi, possono ancora avere un loro utilizzo, per cui esiste ancora richiesta per software per PowerPc. Ma chi vuole rilasciare applicazioni Universal (cioè per entrambi i processori) ed contemporaneamente utilizzare le ultime versioni degli strumenti di sviluppo, deve adattarsi ad avere sia la versione 3 che la 4 di Xcode, installati sullo stesso computer (a meno di non dover dedicare un Mac apposta allo sviluppo con Xcode 3.
Ho già spiegato in un post precedente che comunque sono costretto a tenermi anche una versione di Xcode 3, almeno per costruire un nuovo progetto, per alcuni bachi presenti nella versione 4. Tuttavia, avere il 4 e dover usare il 3, non è proprio una cosa soddisfacente.
Dopo aver fatto un po' di ricerche, mi sono imbattuto quasi per caso nella soluzione, che riporto qui di seguito, giusto per avere tutto in un solo posto e per condividere quanto ho ottenuto. I siti che mi hanno suggerito come procedere sono soprattutto due: il primo è un post su Stackoverflow ed il secondo sul blog bdunagan; servono entrambi, in quanto alcune sono condizioni sono cambiate con le diverse versioni di Xcode 4.
Prima di cominciare: si tratta di operazioni da effettuare da terminale, in cui anche gli spazi potrebbero essere significativi, per cui consiglio il procedimento a chi si trova a suo agio nella shell di unix. In caso di errori potreste essere costretti a re-installare Xcode, per cui tenetevi pronto il file di installazione e fate comunque un backup prima di partire. Mi raccomando: non mi prendo responsabilità per eventuali danni!

Requisiti

- ultima versione di Xcode 3 (3.2.6);
- ultima versione di Xcode 4 (4.2.1); vedere in fondo per la 4.3;
- utente amministratore da cui eseguire tutti i comandi;
- Snow Leopard o Lion (io sono su 10.7, ma dovrebbe funzionare anche su 10.6).

Installazione Xcode 3, Xcode 4

I post suggeriscono di disinstallare Xcode (qualunque versione) e di partire installando Xcode 3 in una cartella diversa da quella di default, p.es. scegliendo /Xcode3; non installate i System Tools/Unix development. Fatto questo, installiamo Xcode 4, stavolta nella cartella /Developer, come da default; installate i System Tools: non indispensabili, ma saranno certamente utili in seguito. Personalmente, ho copiato la cartella della versione 3 da un backup di SnowLeopard e poi installando la 4.

Supporto al 10.5 (Leopard)

Potremmo copiare l'SDK del 10.5; ma per modificare solo l'indispensabile (e per risparmiare 300MB di spazio disco) è sufficiente mettere al suo posto un link. Dal terminale, andiamo nella cartella degli SDK della 4 e creiamo un link alla versione 3:
cd /Developer/SDKs
sudo ln -s /Xcode3/SDKs/MacOSX10.5.sdk
Verrà chiesta la password di amministratore (comando sudo). Per verificare che tutto sia a posto, facciamo una lista della cartella, con il comando ls -l ed otterremo:
lrwxr-xr-x  1 root  wheel   33  8 Gen 17:04 MacOSX10.5.sdk -> /Xcode32/SDKs/MacOSX10.5.sdk
drwxr-xr-x  7 root  wheel  238  4 Gen 22:37 MacOSX10.6.sdk
drwxr-xr-x  7 root  wheel  238 22 Set 08:34 MacOSX10.7.sdk
dove la prima riga ci indica il link alla corrispondete cartella di Xcode 3.
Se ora creiamo un nuovo progetto in Xcode 4, vedremo che è disponibile anche la 10.5 come versione base! L'abbiamo ottenuto tramite un link: se l'avessimo copiato, avremmo anche dovuto cambiare i permessi, che invece ora sono quelli giusti.

Supporto PPC per il GCC 4.2

Ora c'è solo più da attivare il supporto per PPC per il compilatore CGG 4.2. Questa parte può essere diversa a seconda della versione di Xcode 4 e dalla presenza o meno di Lion. Nel mio caso (Xcode 4.2.1 su Lion), è necessario impostare un altro link dopo essere passati nella posizione indicata:
cd /Developer/usr/libexec
sudo ln -s /Xcode3/usr/libexec/gcc gcc
Ora è necessario ancora un ultimo passaggio per attivare il default llvm, spostandosi nella cartella:
cd /Developer/usr/llvm-gcc-4.2/bin
sudo ln -s /Xcode3/usr/llvm-gcc-4.2/bin/powerpc-apple-darwin10-llvm-gcc-4.2 powerpc-apple-darwin11-llvm-gcc-4.2
dove abbiamo impostato un nuovo link all'Xcode 3, ma stavolta cambiando il nome in darwin11 ed il link si riferisce questa volta solo ad un file, non ad un'intera cartella.

Nel caso di SnowLeopard, non è necessario il link al gcc (penultimo passaggio), ma occorre invece sostituire (facendo un backup) il file as:
cd /Developer/usr/libexec/gcc/powerpc-apple-darwin10/4.2.1
sudo mv as as.bak
sudo ln -s /Xcode3/usr/bin/as
NOTA: quest'ultima parte è riportata dai siti precedenti e non è stata da me verificata, essendo già su Lion. Se qualcuno ha occasione di verificarla, può lasciare un commento, utile per chi si trova nella stessa condizione.

Ora, potete aprire Xcode 4, preparare un minimo software di prova; se non abbiamo usato funzioni deprecate, possiamo compilare anche per OSX 10.5, impostandolo come SDK di base; per compilare anche per PPC, occorre variare in due punti nei Build Settings dell'applicazione: alla voce Architectures e poi ancora alla voce Valid Architectures, un po' più sotto. In entrambi i casi, è consigliabile inserirlo solo per Release, in quanto come Debug può non essere necessario. Per entrambe le voci, cliccando sul valore si apre un menu, dal quale si sceglie Other...: nella tabella risultante si aggiunge la voce ppc.
Compiliamo il nostro programmino (azione Archive) e una volta estratta l'applicazione, selezioniamola e apriamo le sue proprietà dal Finder (cmd-I): vedremo che alla voce Tipo sarà riportata la scritta "Applicazione (Universal)". Eureka!
E se vogliamo particolari in più, possiamo usare il comando lipo da terminale:
lipo -info ~/Desktop/miaApp.app/Contents/MacOS/miaApp
che risponderà:
Architectures in the fat file: ~/Desktop/miaApp.app/Contents/MacOS/miaApp are: x86_64 i386 ppc7400
cioè: Intel 32/64bit e PowerPc!

Aggiornamento Xcode 4.3

Tutta la procedura indicata, sia supporto al 10.5 che la compilazione per ppc vale anche per la versione 4.3 di Xcode con però un'importante modifica: Xcode 4.3 è ora un'applicazione a tutti gli effetti, per cui tutti gli strumenti, compilatori, ecc... si trovano all'interno del pacchetto dell'applicazione. Quindi tutti i percorsi che prima partivano con /Developer/... ora devono tenere conto della nuova posizione:
/Applications/Xcode.app/Contents/...
Il tutto è complicato dal fatto che la nuova struttura interna di cartella è diversa da quella precedente esterna, per cui bisogna andarsele a cercare! In particolare: per attivare il supporto al 10.5, cioè per inserire il link all'SDK dell'Xcode 3, occorre spostarsi nella cartella:
cd /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs
sudo ln -s /Xcode3/SDKs/MacOSX10.5.sdk
L'inserimento del link per attire il gcc avviene invece con i seguenti comandi:
cd /Applications/Xcode.app/Contents/Developer/usr/libexec
sudo ln -s /Xcode3/usr/libexec/gcc gcc
mentre l'attivazione di llvm necessita dei seguenti:
cd /Applications/Xcode.app/Contents/Developer/usr/llvm-gcc-4.2/bin
sudo ln -s /Xcode3/usr/llvm-gcc-4.2/bin/powerpc-apple-darwin10-llvm-gcc-4.2 powerpc-apple-darwin11-llvm-gcc-4.2
dove notiamo che viene mantenuto darwin11, come per la versione 4.2.1.
Non posso verificare che la stessa cosa avvenga con Snow Leopard (sono su Lion), oltre tutto non sono sicuro che Xcode 4.3 possa esservi installato.

Nota

Sia per Xcode 4.2 che 4.3, in caso di aggiornamento tutte le modifiche sono perse! Quindi la procedura deve essere ripetuta.

2012-01-08

Xcode 4 e l'Help del progetto

Sempre a proposito di problemi di Xcode 4.2: la versione precedente aveva già collegato il menu Help, per cui bastava inserire le chiavi corrette nel file nomeProgetto.plist e si era a posto. Xcode 4 no!
Per fortuna, qui la soluzione è semplice: basta collegare la voce del menu Help nomeProgetto Help con il metodo showHelp del First Responder!
Facciamo per precauzione un Clean, compiliamo e... ecco che il menu Help è attivo e funzionante!
Naturalmente, ricordiamoci di inserire le chiavi CFBundleHelpBookName e CFBundleHelpBookFolder, che indicano il nome del file di partenza e della cartella in cui è inserito.

PS: tutto questo è riferito al metodo vecchio per registrare l'Aiuto, di default fino a MacOSX 10.5, ma supportato ancora anche in Lion.

2012-01-03

Core Data e Xcode 4.2

Ho incontrato questo problema recentemente: fino ad allora avevo usato Xcode 4 solo per aggiornare progetti nati su Xcode 3; ma da poco sono partito da zero con un nuovo progetto basato su Core Data. Ho provato e riprovato, re-installato da zero Xcode 4 dopo aver rimosso tutto con lo script da terminale consigliato da Apple, ma il risultato ora è definitivo: Un progetto Core Data nato su Xcode 4.2.1 non è completo e genera un'applicazione con i seguenti problemi:

I comandi Undo/Redo non funzionano

Le azioni di Undo e Redo, che Core Data fornisce in automatico, non sono disponibili; o meglio: lo stack di Undo/Redo viene mantenuto correttamente, ma le voci di menu sono sempre disabilitate. Ho provato a collegare il binding Enable al metodo canUndo dell'UndoManager: in effetti il menu si abilita, ma selezionandolo non succede nulla. L'ultimo tentativo è stato di collegare il menu ad una azione che chiamasse esplicitamente il metodo giusto:
[[self.managedObjectContext undoManager] undo]
Funziona, ma quando si va su un'altra finestra, per esempio con possibilità di editing testuale, quel menu continua (giustamente) a chiamare l'UndoManager di Core Data, rischiando seriamente il crash dell'applicazione e comunque ottenendo una cosa diversa.

Non è possibile nominare le azioni di Undo

Poca cosa, visto comunque che l'Undo non funziona...; comunque il messaggio
[[self.managedObjectContext undoManager] setActionName:@"Edit"]
non ha alcun effetto, anche se abilito il menu in qualche modo. Probabilmente è conseguenza del primo punto.

Il menu Save non è collegato all'azione SaveAction

Questo si risolve velocemente, collegando il menu all'IBAction; in Xcode 3 questo arrivava già pronto. Un volta collegato, il menu si abilita correttamente quando è necessario salvare i dati.

Il Persistent Store punta alla Libreria dell'utente, invece che all'Application Support

Anche questo potrebbe essere corretto in modo semplice: nel metodo dell'AppDelegate
- (NSURL *)applicationFilesDirectory
basta sostituire il parametro NSLibraryDirectory con NSApplicationSupportDirectory.

Il vero problema, non risolvibile per quanto ne so, è comunque quello del funzionamento dell'Undo; la prova del nove l'ho avuta riesumando Xcode 3, creando un progetto nuovo e poi aprendo lo stesso progetto da Xcode 4: tutto è tornato a funzionare!
Quindi per ora non gettate via Xcode 3; oltre tutto possono convivere entrambi sullo stesso hard disk (prima bisogna installare la versione 3 e poi la 4, altrimenti la cosa non funziona).

Ho posto il problema ad alcuni forum, ma non ho trovato risposte, nemmeno chiamando in aiuto Google; potrebbe anche essere un problema di concomitanza tra qualche baco e la versione italiana di Lion.
Se qualcuno ha notizie in proposito, lasciate un commento.
--------
Aggiornamento (dicembre 2012)
La versione attuale di Xcode ha finalmente risolto tutti i problemi elencati, escluso il mancato collegamento del menu Save; per fortuna questo è risolvibile impostando il collegamento mancante.
Nel frattempo, si sono rivelati altri bachi in Xcode, non certo al normale livello di qualità dei software Apple; per citarne uno, scordatevi di impostare una animazione usando l'interfaccia: non potrete più toglierla (se lo faccio, Xcode emette un ottimo errore e si chiude...)

2012-01-02

Inizio

Questo nuovo blog nasce il 2 gennaio 2012 semplicemente dall'esigenza di avere un quaderno di appunti su Cocoa e Objective-C, gli strumenti per la programmazione su MacOS X. Nessuna pretesa di completezza, ma solo un luogo in cui segnare i problemi incontrati e superati durante l'utilizzo di MacOS.
Esistono blog simili a migliaia, ma la stragrande maggioranza è in inglese, veramente pochi in italiano; spero che questo possa servire per diffondere ulteriormente queste conoscenze senza la barriera della lingua. Molti di questi problemi vengono spesso superati pescando dalla rete: in questi casi inserirò i link ai siti originali, sia per correttezza che per ricordare a me stesso dove ho trovato la soluzione.
Ogni lettore si senta libero di inserire commenti e suggerimenti, ampliando quindi le mie descrizioni. Eventuali commenti, a mio giudizio, offensivi o di spam verranno eliminati.
Buon Cocoa a tutti!