Да, все, что делает Makefile, можно сделать вручную. В случае с исходниками дерева устройств ядра, они используют команды препроцессора C, даже если язык дерева устройств и компилятор их не поддерживают.
Что делает ядро, и что должны сделать и вы, так это пропустить исходный текст дерева устройств через препроцессор C и компилятор дерева устройств в последовательности, как показано ниже:
cpp -Iinclude -E -P -x assembler-with-cpp imx6dl-boardname.dts | dtc -I dts -O dtb -o imx6dl-boardname.dtb -
(Это команда, которую я использую сам, с очевидным замечанием, что имя платы изменено, чтобы отразить мое оборудование - я собрал это вместе из правил Makefile и сообщений об ошибках препроцессора)
Аргументы препроцессора:
-Iinclude
Источники дерева устройств ядра в основном #include
, который является путем относительно arch/arm/boot/dts/include
.
-E
означает только препроцесс, не уверен, что это необходимо при использовании команды cpp
-P
отключает комментарии номеров строк исходного текста, которые путают компилятор дерева устройств
-x assembler-with-cpp
заставляет препроцессор работать в определенном языковом режиме, что, я полагаю, помогает ему не запутаться в синтаксисе дерева устройств в том же файле, что и директивы препроцессора. Я использую его, потому что он был в Makefiles ядра.
imx6dl-boardname.dts
- это заполнитель, вы должны изменить его на имя вашего исходного файла дерева устройств верхнего уровня
Аргументы компилятора дерева устройств:
-I dts
указывает, что входной формат - текстовый источник дерева устройств-O dtb
указывает на создание бинарного блоба дерева устройств-o imx6dl-boardname. dtb
определяет имя файла, в который будет выведен результат, вы должны заменить его на нужное вам имя файла DTB. -
указывает, что входным файлом является stdin