tôi có thể nghĩ đến 3 lựa chọn:
Môi trường biến: Nếu bạn xây dựng từ dòng lệnh bạn có thể xuất một biến (export ENVMACRO=superfoo
) trước khi gọi xây dựng lệnh và sử dụng nó trong một tập tin cấu hình Xcode OTHER_CFLAGS=-DMACRO=$(ENVMACRO)
. Bạn cần định cấu hình mục tiêu với tệp .xcconfig
.
Chạy tạo bản dựng giai đoạn: Tập lệnh tùy chỉnh tạo tệp tiêu đề.
MACROVALUE=$(run-command-to-obtain-value)
echo "#define MACRO ($MACROVALUE)" > $(SRCROOT)/path/to/header.h
Trong các thử nghiệm của mình, bạn cần tệp tiêu đề trống để có thể biên dịch chính xác. Có các tùy chọn khác như sửa đổi tệp hiện có bằng cách sử dụng sed
hoặc bất kỳ lệnh nào khác.
Quy tắc xây dựng tùy chỉnh: Tập lệnh tùy chỉnh xử lý tệp đầu vào và tạo tệp đầu ra. Tương tự như Chạy tập lệnh pha xây dựng nhưng tốt hơn một chút vì nó sẽ chỉ chạy tập lệnh khi tệp đầu vào đã được sửa đổi. Ví dụ: tạo tệp .macro
và xử lý tệp để cập nhật tệp tiêu đề.
Trong Xcode> Nhắm mục tiêu> Quy tắc xây dựng, thêm quy tắc tùy chỉnh mới.
Process: *.macro
Custom Script:
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
Output file: $(SRCROOT)/Project.h
Project.macro
chứa cặp MACRO=one-liner-command
.Giống như hai ví dụ không có ý nghĩa:
COMMIT=git log --pretty=format:%h -n 1
BUILDYEAR=date +%Y
tập tin được tạo ra sẽ giống như sau:
// Do not edit
#define COMMIT @"c486178"
#define BUILDYEAR @"2011"
// Updated on Sat Oct 29 14:40:41 CEST 2011
Mỗi lần Project.macro
thay đổi, tiêu đề được tạo ra sẽ được cập nhật.
cảm ơn - tùy chọn thứ hai về cơ bản là những gì tôi đã làm - trong trường hợp của tôi, tôi muốn lệnh chạy ở mọi công trình. các nếp nhăn duy nhất là tôi không ghi vào tập tin tiêu đề thực tế nếu nội dung của nó không giống với nội dung mới được tạo ra (để tránh sự thay đổi phụ thuộc). tôi đặc biệt thích tùy chọn thứ ba. – michael