2016-05-04 18 views
1

Ich verwende ein externes Paket in cmake, das INTERFACE_SOURCES verwendet. Das bedeutet, wenn ich die importierte Bibliothek mit meinem Ziel verlinke, werden die Interface-Quelldateien automatisch zu meinem Ziel hinzugefügt. Wenn ich mein Ziel kompiliere, werden diese externen Dateien ebenfalls kompiliert.Wie setze ich Compile Flags für externe INTERFACE_SOURCES in CMake?

Das verursacht ein Problem für mich, da die externen Dateien kompilieren Warnungen verursachen. Ich möchte die Warnungen entfernen, indem ich beim Kompilieren der externen Dateien eine niedrigere Warnstufe festlege. Aber ich weiß nicht, wie ich das machen soll.

Das ist, was ich bis jetzt bekommen habe. Diese

# reduce the warning level for some files over which we have no control. 
macro(remove_warning_flags_for_some_external_files myTarget) 

    # blacklist of files that throw warnings 
    set(blackListedExternalFiles 
     static_qt_plugins.cpp 
    ) 

    get_target_property(linkedLibraries ${myTarget} LINK_LIBRARIES) 

    foreach(library ${linkedLibraries}) 

     get_property(sources TARGET ${library} PROPERTY INTERFACE_SOURCES) 

     foreach(source ${sources}) 

      get_filename_component(shortName ${source} NAME) 

      if(${shortName} IN_LIST blackListedExternalFiles) 

       # everything works until here 
       # does not work 
       get_source_file_property(flags1 ${source} COMPILE_FLAGS)  
       # does not work 
       get_property(flags2 SOURCE ${source} PROPERTY COMPILE_FLAGS) 

       # exchange flags in list, this I can do 

       # set flags to source file, do not know how to 

      endif() 

     endforeach() 
    endforeach() 
endmacro() 

ist, was diese tun sollte

  • durch alle verknüpften Bibliotheken gehen und die externen INTERFACE_SOURCES Quelldateien erhalten.
  • Überprüfen Sie für jede externe Quelldatei, ob es in der schwarzen Liste erscheint. Wenn dies der Fall ist, ändern Sie die Kompilierungsflags auf eine niedrigere Ebene.

Das Problem, das ich habe, ist mit Abrufen und Festlegen der Kompilierflags für diese INTERFACE_SOURCES. Die Aufrufe get_source_file_property() und get_property() geben nichts zurück.

Wie kann ich die Flags für diese Dateien bekommen und setzen, die scheinbar nicht zu meinem Ziel gehören, aber gleichzeitig kompiliert werden?

Antwort

1

Die get_source_file_property() und GET_PROPERTY() Anrufe Rückkehr nichts

COMPILE_FLAGS Eigenschaft der Quelldatei wird durch "Ziel" Befehle wie target_compile_options nicht geändert. Der finale Flaggensatz ist eine Mischung aus global + zielspezifisch + quellenspezifisch. Soweit ich weiß, gibt es keine Möglichkeit, das "Erben" von globalen oder Ziel-Flags zu deaktivieren.

Als Abhilfe können Sie Warnung durch Hinzufügen -w Option deaktivieren:

get_source_file_property(flags "${external_source}" COMPILE_FLAGS) 
if(NOT flags) 
    set(flags "") # convert "NOTFOUND" to "" if needed 
endif() 
set_source_files_properties(
    "${external_source}" 
    PROPERTIES 
    COMPILE_FLAGS "-w ${flags}" 
) 

Nur zur Information: How to set warning level in CMake?.

Für den Rekord: ursprünglich von issue #408.

+0

Vielen Dank für Ihre Hilfe. Die Datei schien also keine Flaggen zu haben. Ich dachte, das wäre ein Fehler. Einfach die Flaggen zu setzen, funktionierte zwar. – Knitschi