CMake add_custom_command / _target em diferentes diretórios para compilação cruzada

No CMake, estou tentando criar um projeto que inclua bibliotecas para várias arquiteturas de processadores diferentes, compiladas por diferentes cadeias de ferramentas. Para cada arquitetura, as bibliotecas estáticas são construídas em vários subdiretórios e, em seguida, coletadas em uma biblioteca compartilhada no diretório raiz. Até agora, não consegui descobrir isso.

O mais perto que eu cheguei até agora é usaradd_custom_command eadd_custom_target nos subdiretórios para produzir os arquivos .a e tente coletá-los em um .so no diretório raiz usandoadd_custom_command eadd_custom_target novamente. Mas se eu fizer a dependência .so apontar para a lista de saídas de comando personalizadas, o makefile diz "Nenhuma regra para criar ..." porque as saídas de comando personalizadas não são exportadas para fora do subdiretório. Por isso, tentei fazer com que a dependência .so aponte para a lista de destinos personalizados no subdiretório, e ela reclama que não conseguiu encontrar um arquivo com esse nome.

Para colocá-lo em forma de código, aqui está o que eu tenho em um subdiretório:

add_custom_command(OUTPUT subout.a COMMAND ${MYAR} ...)
add_custom_target(subout_target DEPENDS subout.a)

No diretório raiz, tentei o seguinte:

add_custom_command(OUTPUT my.so COMMAND ${MYLD} ... DEPENDS sub/subout.a)
add_custom_target(dll ALL DEPENDS my.so)

E recebo "Nenhuma regra para criar o alvo 'sub / subout.a', necessário por 'my.so'. Pare". O que faz sentido porqueadd_custom_command destinos não são exportados para fora de um diretório.

E eu tentei isso:

add_custom_command(OUTPUT my.so COMMAND ${MYLD} ... DEPENDS subout_target)
add_custom_target(dll ALL DEPENDS my.so)

Na verdade, isso fará com que o arquivo sub / subout.a seja gerado, mas ele morre, dizendo "Nenhuma regra para criar o destino 'subout_target' ..."

Eu acho que o que eu realmente quero é ser capaz de imitar oadd_library comportamento para várias arquiteturas diferentes. Mas, aparentemente, o CMake não quer que eu faça isso ... :)

Alguma ideia?

questionAnswers(2)

yourAnswerToTheQuestion