Выражения в правиле сборки "Выходные файлы"?

Можете ли вы включить выражения в раздел "Выходные файлы" правила сборки в XCode? Например:

$(DERIVED_FILE_DIR)$(echo "/dynamic/dir")/$(INPUT_FILE_BASE).m

В частности, при переводе файлов Java с помощью j2objc полученные файлы сохраняются в подпапках на основе пакетов Java (например, $(DERIVED_FILE_DIR)/com/google/Class.[hm]). Это без использования --no-package-directories, который я не могу использовать из-за повторяющихся имен файлов в разных пакетах.

Проблема в Выходных файлах, потому что XCode не знает, как искать выходной файл в правильном местоположении. Расположение по умолчанию $(DERIVED_FILE_DIR)/$(INPUT_FILE_BASE).m, но мне нужно выполнить подстановку строки, чтобы вставить правильный путь. Однако любое выражение добавлено как $(expression) игнорируется, как никогда не было.

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

2 ответа

К сожалению, поддержка сборки Xcode довольно примитивна (по сравнению, скажем, с make, которая на треть с лишним года старше:-). Один из вариантов - разделить исходный код Java, чтобы два класса с одинаковыми именами находились в разных подпроектах. Если вы затем используете разные префиксы для каждого подпроекта, имена будут устранены.

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

Для меня второй вариант работает (Xcode 7.3.x) - в точку. Мое правило не для Java, а для Google Protobuf, и я попытался сохранить ту же иерархию (как и иерархию пакетов Java) в сгенерированном коде, как и в исходных файлах.proto. Действительно, файлы (.pb.cc и.pb.h) были созданы, как и ожидалось, с их иерархиями в каталоге Build/Intermediates/myProject.build/Debug/DerivedSources.

Тем не менее, XCode обычно знает, что нужно продолжить и скомпилировать сгенерированный вывод в текущую цель - но это ломается, так как он ищет только файлы в фактическом ${DERIVED_FILE} - а не в подкаталогах внизу.

Не могли бы вы объяснить лучше "Выходные файлы преобразуются в SCRIPT_OUTPUT_FILE_X"? Я не понимаю.

Другие вопросы по тегам