Forum: Compiler & IDEs cmake target_include_directories geht nicht


von Vincent H. (vinci)


Lesenswert?

Grüß euch

Ich versuche gerade cmake zu lernen und hab aus diesem Grund ein kleines 
Demo-Projekt für einen Cortex-M4 aufgesetzt. Da sich bei cmake ja alles 
um Dependencies und das Einbinden von Libs usw. dreht würd ich gerne 
CMSIS als Abhängigkeit einbaun.

Nun bin ich soweit dass ich in 2x verschiedenen CMakeLists 2x Targets 
definiert hab:
1x executeable "stm32f4discovery"
1x library "CMSISDSP"

Die Abhängigkeit der beiden Targets untereinander ist wie folgt 
definiert:
1
target_link_libraries(stm32f4discovery PRIVATE CMSISDSP)

Weiters soll das CMSISDSP Target seine Header zur Verfügung stellen.
1
target_include_directories(
2
  CMSISDSP
3
  PUBLIC
4
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/CMSIS_5/CMSIS/Core/Include/
5
    $<INSTALL_INTERFACE:include>
6
  PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/CMSIS_5/CMSIS/Core/Include/
7
          ${CMAKE_CURRENT_SOURCE_DIR}/CMSIS_5/CMSIS/DSP/Include/)

Exakt der Teil funktioniert jedoch leider nicht. Versuche ich das 
Projekt zu compilieren, so beschwert sich make dass ein Header aus 
".../Core/Include" fehlt. Scheinbar versteh ich hier irgendwas nicht, 
ich dachte dass man via BUILD_INTERFACE den echten physischen Pfad zu 
den Header angibt und diese dann via INSTALL_INTERFACE in dem 
angegebenen Ordner "eingeklinkt" werden.

Das stm32f4discovery Target sollte also die Header in "../Core/Include" 
nutzen können?

Die CMAKE_CURRENT_SOURCE_DIR Variable hab ich bereits überprüft, die 
sollte eigentlich an die richtige Stelle zeigen? Das Compilieren des 
CMSISDSP Targets allein funktioniert auch.

Was ich abgesehn davon auch nicht verstehe ist wieso ich 
"../Core/Include" 2x einbinden muss? Lasse ich den Pfad in der PRIVATE 
Sektion weg, dann funktioniert auch der CMSISDSP Build nicht mehr...?


/edit
Achja und noch eine Frage hab ich. Sollten Compiler Einstellungen nicht 
genauso transient sein wie alles andere? Wenn ich etwa folgendes mach:
1
target_compile_options(stm32f4discovery
2
                       PUBLIC  ${ARCH}
3
                       PRIVATE $<$<CONFIG:DEBUG>:-Og>
4
                               ...)

Dann hab ich erwartet dass die "ARCH" flags auch im Library Build 
übernommen werden? Dem ist aber nicht so.

: Bearbeitet durch User
von Vincent H. (vinci)


Lesenswert?

Geh schleich dich oida...
1
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/CMSIS_5/CMSIS/Core/Include/

-->
1
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/CMSIS_5/CMSIS/Core/Include/>


Vielleicht sollte ma in diesen Cluster-Fuck von einem Meta-Buildsystem 
auch mal einen Syntaxcheck einbaun?

Und meine 2.Frage hab ich nun auch kapiert. Ja target_compile_options 
ist genauso "transient" wie alles andere auch, aber halt nur von unten 
nach oben und nicht von oben nach unten...

Das heißt dass globale Compiler Einstellungen via add_compile_options 
angelegt werden müssen weils anders nicht geht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.