XCode: сборка diff до и после изменений исходного кода - PullRequest
1 голос
/ 08 мая 2011

Я хотел бы иметь возможность вносить изменения в проект Xcode (изменять исходный код, перемещать файлы в файловой системе, добавлять зависимости или библиотеки и т. Д.), А затем собирать его и сравнивать продукт сборки с тем перед внесением изменений, чтобы подтвердить, что они идентичны. Как мне это сделать?

Разбрасывание продуктов сборки не работает; Они разные каждый раз

Я пробовал использовать два разных продукта, построенных одинаково в разное время, и они различаются. А? Хм .. время сборки должно влиять на продукт сборки. Вот что я сделал:

В Xcode, после сборки продукта (Command + B), нажмите Command + 7, чтобы отобразить навигатор журнала. Затем нажмите «Build $ {PRODUCT_NAME}» в навигаторе. Затем в нижней части редактора разверните расшифровку стенограммы «Touch ...», щелкнув пузырь справа. Скопируйте последний путь к каталогу в стенограмме. Он должен выглядеть примерно так: /Users/${USER}/Library/Developer/Xcode/DerivedData/${PRODUCT_NAME}-abomilaxrsffqkeasoiwbfisjghq/Build/Products/Debug-iphonesimulator/${PRODUCT_NAME}.app Это путь к вашему продукту сборки. Затем откройте терминал и выполните что-то вроде:

# Change to the build product's directory.
cd /Users/${USER}/Library/Developer/Xcode/DerivedData/${PRODUCT_NAME}-abomilaxrsffqkeasoiwbfisjghq/Build/Products/Debug-iphonesimulator/

# Copy the build product to another directory, like your Desktop.
open .                               # if you prefer Finder
cp -R ${PRODUCT_NAME}.app ~/Desktop/ # or use Terminal

# Confirm the bundles are identical.
diff -r ${PRODUCT_NAME}.app ~/Desktop/${PRODUCT_NAME}.app

Теперь, сделайте Command + Shift + K в Xcode для очистки. Затем, соберите снова и запустите тот же diff выше. Они разные!

Как получить сборку, сгенерированную Xcode?

Итак, есть ли способ сравнить сборку, чтобы увидеть, отличаются ли они? Я нашел способ сделать это в ответе на вопрос здесь, но я забыл, где он находится, и не смог его найти.

Если сборка одинаковая, значит ли это, что продукты сборки тоже будут одинаковыми? Я так не думаю, потому что я думаю, что определенные настройки сборки влияют на то, как сборка компилируется в машинный код. Если да, то какие настройки сборки влияют на то, как сборка компилируется в машинный код. Таким образом, я могу просто подтвердить, что они идентичны до и после, и быть уверенным, что продукты идентичны (кроме их временных меток сборки).

1 Ответ

1 голос
/ 20 мая 2011

Использование diff не является хорошим инструментом для непосредственного сравнения двоичных файлов.

Сборка для всего двоичного файла

Внутри вашего Product.app должен быть файл, вероятно, просто названный "Product".Это настоящий исполняемый файл.Чтобы найти его, щелкните правой кнопкой мыши файл Product.app в группе Products и выберите «Показать в Finder».Пример местоположения: ~/Library/Developer/Xcode/DerivedData/Product-dqcwcdqvrxhcfzdkoovramlggzzg/Build/Products/Debug-iphoneos/Product.app/Product.

  $ file Product.app/Product
  Mach-O executable arm

Теперь вы хотите разобрать его.Вы можете сделать это с помощью инструмента объектов Mach-O, otool

 $ xcrun -sdk iphoneos otool -tv Product.app/Product

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

Сборка для одного файла

Если вам нужны только несколько файлов, они должны существовать в таком месте, как ~/Library/Developer/Xcode/DerivedData/Product-hdomilaxrhfpqkeanoiwbrirngqq/Build/Intermediates/Product.build/Debug-iphoneos/Product.build/Objects-normal/ в armv6 или armv7,Должна быть .o файловая версия ваших файлов C и Obj-C, и вы можете разбирать их по отдельности с помощью той же команды, что и выше.Например:

 $ xcrun -sdk iphoneos otool -tv AppDelegate.o

Насколько я знаю, XCode не оставляет промежуточные файлы сборки, хотя где-то может быть флаг, который заставит его сгенерировать их.

...