2012-02-18 11 views
6

Ho appena aggiornato all'ultima versione di Xcode 4.3. Ho il mio plist.which è pre-elaborato e rispetto a 4.2 non sembra funzionare più.Xcode 4.3 - il preprocessore non funziona più per #define con "http: //"?

I set Info.plist other pre-processor flag -traditional (per essere in grado di saltare // considerato come un commento).

ho impostato

#define MYSERVER http://127.0.0.1:1234/ 

e nel mio plist

<key>myhost</key> 
    <string>MYSERVER</string> 

Quando controllo nel nuovo Xcode 4.3 vedo dentro NSDictionary *bundle = [[NSBundle mainBundle] infoDictionary];

myhost = "http:/ /127.0.0.1:1234/" 

Ho un trucco veloce per esso .

NSString *hack = [[[[NSBundle mainBundle] infoDictionary] objectForKey:@"myhost"] stringByReplacingOccurrencesOfString:@" " withString:@""]; 
    url = [NSURL URLWithString:hack]; 

Questo sta facendo la mia app che funziona ancora, ma mi piacerebbe avere una soluzione pulita. Qualche idea?

+0

Il commento nel bug clang indica che è stato risolto (https://llvm.org/bugs/show_bug.cgi?id=12035), ma a partire da Xcode 7.2 non funziona per me. La documentazione per '-traditional' è qui: https://developer.apple.com/library/mac/technotes/tn2175/_index.html –

risposta

3

Questo è in realtà un bug nel preprocessore di clang che viene fornito con Xcode 4.3 (clang 3.1) e influisce su tutte le pre-elaborazione, non solo su Info.plists. Ho registrato un errore (LLVM bug 12035, rdar: // 10883862).

Una soluzione per questo è forzare Xcode 4.3 a utilizzare llvm-gcc per la pre-elaborazione Info.plist invece che clang. L'unico modo che ho trovato finora è quello di riscrivere il link simbolico "cc" che viene utilizzato nella fase di pre-elaborazione Info.plist:

sudo ln -fs /usr/bin/llvm-gcc /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc

Per ripristinare questo hack, basta riscrivere di nuovo a clang: sudo ln -fs /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc

+0

Grazie per queste informazioni. Continuerò a guardare l'errore che hai registrato e spero che verrà risolto a breve. –

+0

Un'altra soluzione, che non richiede la sostituzione di cc symlink, consiste nel posizionare tutti i valori di espansione della macro Info.plist tra virgolette e tagliare le virgolette durante la lettura dei valori in fase di esecuzione. I valori citati saranno preservati dal preprocessore di clang. –

+0

grazie. È simile a (temporaneo) hack :-) 'NSString * hack = [[[NSBundle mainBundle] infoDictionary] objectForKey: @" myhost "] stringByReplacingOccurrencesOfString: @" "withString: @" "];' –

0

Si potrebbe considerare di ignorare il pre-processore e utilizzare PlistBuddy.

Qualcosa di simile nella fase di scrittura del costruire dovrebbe funzionare:

#!/bin/sh 

MYSERVER = 'http://127.0.0.1:1234/' 

/usr/libexec/PlistBuddy -c "Set :myhost ${MYSERVER}" path/to/Info.plist 

Si noti che se lo si fa sul ProejctName-Info.plist in una configurazione standard di Xcode, il file verrà contrassegnato come modificato di svn/github ogni volta che costruisci e in base alle tue esigenze potrebbe non essere l'ideale.

+0

grazie, ma ho più di qualche' # define' che utilizzo '#if definito .... 'per passare da un ambiente all'altro. Spostarsi su uno strumento diverso non sarà così semplice. –

Problemi correlati