mogę myśleć z 3 opcji:
Środowisko zmienna: Jeśli budować z linii poleceń można wyeksportować zmienną (export ENVMACRO=superfoo
) przed wywołaniem polecenia kompilacji i użyć go w pliku konfiguracyjnym Xcode OTHER_CFLAGS=-DMACRO=$(ENVMACRO)
. Musisz skonfigurować cel za pomocą pliku .xcconfig
.
Wykonaj skrypt Utwórz fazę: Niestandardowy skrypt, który generuje plik nagłówkowy.
MACROVALUE=$(run-command-to-obtain-value)
echo "#define MACRO ($MACROVALUE)" > $(SRCROOT)/path/to/header.h
W moich testach potrzebny jest pusty plik nagłówkowy, aby można było poprawnie skompilować. Istnieją inne opcje, takie jak modyfikowanie istniejącego pliku za pomocą sed
lub dowolne inne polecenie.
Reguła niestandardowego budowania: Skrypt niestandardowy przetwarzający plik wejściowy i tworzący plik wyjściowy. Podobny do Wykonaj skrypt fazie budowy, ale nieco lepiej, ponieważ uruchomi skrypt tylko wtedy, gdy plik wejściowy został zmodyfikowany. Na przykład utwórz plik .macro
i przetwórz go, aby zaktualizować plik nagłówkowy.
W Xcode> Cel> Ustal reguły, dodaj nową regułę niestandardową.
Process: *.macro
Niestandardowy skrypt:
HEADER="${SRCROOT}/Config.h"
cd ${SRCROOT}
echo "// Do not edit" > $HEADER
cat "${INPUT_FILE_PATH}" | while read line
do
macro="`echo $line | cut -d= -f1`"
cmd="`echo $line | cut -d= -f2-`"
value=$($cmd)
echo "#define ${macro} @\"${value}\"" >> $HEADER
done
echo "// Updated on "`date` >> $HEADER
Pliki wyjściowe: $(SRCROOT)/Project.h
Project.macro
zawiera pary MACRO=one-liner-command
.Podobnie jak te dwa przykłady nie sensie
COMMIT=git log --pretty=format:%h -n 1
BUILDYEAR=date +%Y
Wygenerowany plik będzie wyglądać następująco:
// Do not edit
#define COMMIT @"c486178"
#define BUILDYEAR @"2011"
// Updated on Sat Oct 29 14:40:41 CEST 2011
Każdy czas Project.macro
zmiany wygenerowany nagłówek zostanie zaktualizowany.
dzięki - druga opcja jest w zasadzie tym, co zrobiłem - w moim przypadku chciałem, aby polecenie działało przy każdej kompilacji. jedyną wadą jest to, że nie piszę do faktycznego pliku nagłówkowego, jeśli jego zawartość nie jest identyczna z nowo wygenerowaną zawartością (aby uniknąć zmiany zależności). Szczególnie podoba mi się również trzecia opcja. – michael