Выражения в правиле сборки "Выходные файлы"?
Можете ли вы включить выражения в раздел "Выходные файлы" правила сборки в 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"? Я не понимаю.