2010-01-28 4 views
6

In CMake versuche ich ein Projekt zu erstellen, das Bibliotheken für mehrere verschiedene Prozessorarchitekturen enthält, die von verschiedenen Toolchains kompiliert wurden. Für jede Architektur werden statische Bibliotheken in mehreren Unterverzeichnissen erstellt und dann in einer gemeinsam genutzten Bibliothek im Stammverzeichnis gesammelt. Bisher konnte ich das nicht herausfinden.CMake add_custom_command/_target in verschiedenen Verzeichnissen für die Kreuzkompilierung

Der nächstgelegene ich so weit gekommen sind, ist add_custom_command und add_custom_target in Unterverzeichnisse zu verwenden, um die .a-Dateien zu erzeugen, und dann versuchen, sie in eine .so im Stammverzeichnis wieder mit add_custom_command und add_custom_target zu sammeln. Aber wenn ich den .so Abhängigkeit Punkt in der Liste der benutzerdefinierten Befehlsausgänge machen, sagt die Make-Datei „Keine Regel zu machen ...“, weil die benutzerdefinierten Befehlsausgänge werden nicht aus dem Unterverzeichnis exportiert. Also habe ich versucht, den .so Abhängigkeit Punkt auf die Liste der benutzerdefinierten Ziele im Unterverzeichnis zu machen, und es beklagt, dass es keine Datei mit diesem Namen finden kann.

Um es in Codeform zu setzen, hier ist das, was ich in einem Unterverzeichnis haben:

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

im Stammverzeichnis, habe ich versucht, dies:

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

Und ich bekomme „Keine Regel make target 'sub/subout.a', benötigt von 'my.so'. Stop. " Das macht Sinn, weil add_custom_command Ziele nicht aus einem Verzeichnis exportiert werden.

Und ich versuchte dies:

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

Dies wird tatsächlich die Unter/subout.a Datei verursachen erzeugt werden, aber dann stirbt es und sagte: „Keine Regel Ziel‚subout_target‘zu machen ...“

denke ich, was ich wirklich möchte in der Lage ist, das add_library Verhalten für mehrere unterschiedliche Architekturen zu imitieren. Aber anscheinend hat CMake nicht wollen, dass ich das tun ... :)

Irgendwelche Ideen?

Antwort

7

Ich nehme an, Sie brauchen add_dependencies verwenden Abhängigkeiten zwischen Zielen mit add_custom_target definiert zu definieren. Die Option DEPENDS dient zum Angeben von Abhängigkeiten auf Dateiebene in benutzerdefinierten Regeln, jedoch nicht auf Abhängigkeiten auf Zielebene.

Zum Beispiel, Befehl generiert .obj Datei als Ausgabe verwendet DEPENDS, um es zu spezifizieren, hängt von .cpp Datei. Ein Ziel kann auch von einer einzelnen Datei abhängig sein, nicht nur von anderen Zielen. Verwenden Sie daher für die Abhängigkeiten auf Dateiebene die Option DEPENDS, aber add_dependencies für die Zielebene.

+1

Das hat es total behoben. Vielen Dank. Du hast mir eine Menge Frustration erspart. – boiler96

+1

Ich bin froh und willkommen! – mloskot

1

Spot On!

add_dependencies mir erlaubt, die letzte Abhängigkeit ‚link‘ zwischen add_custom_target erstellt Zielen zu erstellen, und add_custom_target erzeugt die add_custom_command benötigt Ziele zu bekommen wirklichen Inhalt in der Make-Datei zu erstellen, das heißt, My add_custom_command würde nicht ausgegeben zu den Makefiles erzeugen, wenn die OUTPUT ‚s aus dem add_custom_command als Abhängigkeiten in dem add_custom_target angegeben wurden Befehl.

Dann werden die add_custom_command zu bekommen 's in der richtigen Reihenfolge auszuführen, hatte ich die Zielnamen in der add_custom_target definiert zu verwenden ist, als Abhängigkeiten in denadd_dependencies. HINWEIS: Die OUTPUT ‚s in den angegebenen add_custom_command und add_custom_target Befehle hatten in separaten zitiert Pfaden angegeben werden, das heißt:

add_custom_command(OUTPUT "out1 out2 out3" ...) # WRONG! 
add_custom_target(CUSTOMTARG1 "out1 out2 out3") # WRONG! 

add_custom_command(OUTPUT "out1" "out2" "out3" ...) # RIGHT! 
add_custom_target(CUSTOMTARG1 "out1" "out2" "out3") # RIGHT! 

Wenn ich habe nicht sie in separaten zitiert Pfaden, Das Makefile hat die Ausgaben jedes Mal erstellt, unabhängig davon, ob sie existierten oder nicht!

+0

make interpretierte wahrscheinlich "out1 out2 out3" als einzelne Datei mit Leerzeichen im Namen. Da Ihre Regel diese Datei nicht erzeugt, wird make sie immer ausführen. – Penz