Sim, qualquer coisa que o Makefile você pode fazer manualmente. No caso de origens de árvore de dispositivos do kernel, eles usam comandos do pré-processador C, mesmo que a linguagem e o compilador da árvore de dispositivos não os suportem.
O que o kernel faz, e você deve fazer também, é passar a origem da árvore de dispositivos através do pré-processador C e do compilador da árvore de dispositivos em sequência, assim:
cpp -Iinclude -E -P -x assembler-with-cpp imx6dl-boardname.dts | dtc -I dts -O dtb -o imx6dl-boardname.dtb -
(Este é o comando que eu mesmo uso, com a nota óbvia de que boardname é alterado para refletir meu hardware - eu o reuni a partir das regras do Makefile e das mensagens de erro do pré-processador)
Argumentos do pré-processador:
-
-Iinclude
A árvore de dispositivos de kernel origina principalmente#include <dt-bindings/interrupt-controller/irq.h>
, que é um caminho relativo aarch/arm/boot/dts/include
. -
-E
significa apenas pré-processamento, não tenho certeza se isso é necessário ao usar o comandocpp
-
-P
desativa os comentários do número da linha de origem, o que confunde o compilador da árvore de dispositivos -
-x assembler-with-cpp
força o pré-processador a ser executado em um determinado modo de linguagem, o que, suponho, ajuda a não ficar confuso com a sintaxe da árvore de dispositivos no mesmo arquivo das diretivas do pré-processador. Eu uso porque estava nos Makefiles do kernel. -
imx6dl-boardname.dts
é um marcador, você deve alterar isso para o nome do arquivo de origem da árvore de dispositivos de nível superior
Argumentos do compilador da árvore de dispositivos:
-
-I dts
especifica que o formato de entrada é uma fonte de árvore de dispositivo textual -
-O dtb
especifica criar um blob binário da árvore de dispositivos -
-o imx6dl-boardname.dtb
define o nome do arquivo para onde a saída vai, você deve substituí-lo pelo nome do arquivo DTB que você deseja. -
-
indica que o arquivo de entrada éstdin