2016-10-13 11 views
2

Я прочитал несколько руководств и руководств о том, как создать XCode универсальную библиотеку. В основном вы добавляете совокупную цель с фазой сборки сценария bash для создания отдельных целей и липо их вместе.Фаза построения универсальной библиотеки XCode - Lipo не может найти файлы

У меня есть свой собственный небольшой скрипт (который работает из-за того, как я назвал свои цели), но по какой-то причине липо не может найти файлы;

fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: can't open input file: /Users/username/Projects/project/plugins/build/Release-iphoneos/libproject-plugins.a /Users/username/Projects/project/plugins/build/Release-macos/libproject-plugins.a (No such file or directory)

Однако, когда я

  1. Выполнить ту же самую команду Липо сразу после неудачной сборки, все работает и файлы найдены.
  2. Добавить логику bash в моем скрипте, чтобы дождаться создания файла, проблема сохраняется.
  3. Замените lipo в моем скрипте простым ls, файлы есть.

Так что я не уверен, что пошло не так, похоже, что xcodebuild создает файлы только после того, как называется липо (как я думал).

Сценарий;

targets=$(xcodebuild -list | sed -n '/Targets/,/^$/p' | grep -v -e 'Targets:\|all\|^$') 
target_results="" 

for target in $targets; do 
    xcodebuild ${ACTION} -target $target -configuration ${CONFIGURATION} 
    target_results="$target_results ${PROJECT_DIR}/build/${CONFIGURATION}-$target/libproject-plugins.a" 
done 

xcrun lipo -create "$target_results" -o "${PROJECT_DIR}/plugins-universal.a" 

ответ

0

Это проблема/ошибка bash.
Вы передаете все имена файлов в виде единственного аргумента в lipo, поэтому он будет искать один файл с именем /Users/username/Projects/project/plugins/build/Release-iphoneos/libproject-plugins.a /Users/username/Projects/project/plugins/build/Release-macos/libproject-plugins.a.

Вместо этого вы должны использовать массив для имен файлов.

  • Инициализировать его () вместо "".
  • Добавить элементы с +=(...) вместо ="$var ...".
  • Пропускайте каждый элемент отдельно до lipo с "${var[@]}" вместо "$var".

Применительно к вашему сценарию:

targets=$(xcodebuild -list | sed -n '/Targets/,/^$/p' | grep -v -e 'Targets:\|all\|^$'); 
target_results=(); 

for target in $targets; do 
    xcodebuild ${ACTION} -target $target -configuration ${CONFIGURATION}; 
    target_results+=("${PROJECT_DIR}/build/${CONFIGURATION}-$target/libproject-plugins.a"); 
done; 

xcrun lipo -create "${target_results[@]}" -o "${PROJECT_DIR}/plugins-universal.a"; 
0

Технически это не ответ на ваш вопрос. Но я хотел бы рекомендовать вам выбрать другой вариант того, что вы делаете, если вам действительно не нужна , для этого нужно.

Создание универсальных статических библиотек в этой моде - это очень старый способ делать что-то и, как вы выясните, сложный и довольно проблематичный, чтобы хорошо работать.

Более современный и гораздо более простой подход (ИМХО) - это создание структуры. XCode имеет шаблоны для фреймворков. Рамки легче работать и не требуют, чтобы вы делали какие-то беспорядки с несколькими целями, bash и lipo, как и вы.

Кроме того, вы можете использовать Carthage для управления ими в качестве зависимостей для других проектов с минимальными усилиями.