Ich bin gerade in cmake gekommen, weil ich anfing, an einem größeren Projekt zu arbeiten. Ich muss Modultests hinzufügen. Es gibt mehrere eingebettete Geräte, auf denen jeweils eigene Anwendungen ausgeführt werden.cmake für größeres Projekt mit gemeinsamem Code
Die meisten dieser Anwendungen teilen Code. So ist der Code in Module unterteilt. Das Problem ist, dass einige Module in den meisten anderen Modulen verwendet werden. Diese Module sind üblich, common-net und log.
Ein vereinfachtes Projekt (App) für ein Gerät hat folgende Struktur:
.
|-- CMakeLists.txt (for app)
|-- LICENSE
|-- app
| |-- inc
| | |-- appfile1.hpp
| | `-- appfile2.hpp
| `-- src
| |-- appfile1.cpp
| |-- appfile2.cpp
| `-- main.cpp
|-- comp
| |-- comp1
| | |-- CMakeLists.txt (for test)
| | |-- comp
| | | |-- CMakeLists.txt (for lib)
| | | |-- intf
| | | | |-- comp1file.hpp
| | | | `-- comp1file.hpp
| | | `-- src
| | | |-- comp1file.cpp
| | | `-- comp1file.cpp
| | `-- test
| | `-- src
| | `-- comp1testfile.cpp
| |-- comp2
| | |-- CMakeLists.txt (for test)
| | |-- comp
| | | |-- CMakeLists.txt (for lib)
| | | |-- inc
| | | | `-- comp2file1.hpp
| | | |-- intf
| | | | |-- comp2file2.hpp
| | | | |-- comp2file3.hpp
| | | | |-- comp2file4.hpp
| | | `-- src
| | | |-- comp2file1.cpp
| | | |-- comp2file2.cpp
| | | `-- comp2file3.cpp
| | `-- test
| | |-- inc
| | | `-- comp2testfile.hpp
| | `-- src
| | `-- comp2testfile.cpp
| |-- common
| | |-- CMakeLists.txt (for test)
| | `-- comp
| | |-- inc
| | | |-- commonfile1.hpp
| | | `-- commonfile2.hpp
| | `-- src
| | `-- commonfile1.cpp
| |-- common-net
| | |-- CMakeLists.txt (for test)
| | |-- comp
| | | |-- inc
| | | | |-- netfile1.hpp
| | | | |-- netfile2.hpp
| | | | |-- netfile3.hpp
| | | | |-- netfile4.hpp
| | | | |-- netfile5.hpp
| | | `-- src
| | | |-- netfile1.cpp
| | | |-- netfile2.cpp
| | | |-- netfile3.cpp
| | | |-- netfile4.cpp
| | | |-- netfile5.cpp
| | `-- test
| | |-- inc
| | | |-- nettestfile1.hpp
| | `-- src
| | |-- nettestfile1.cpp
| | |-- nettestfile2.cpp
| | |-- nettestfile3.cpp
| |-- comp3
| | |-- CMakeLists.txt (for test)
| | |-- comp
| | | |-- CMakeLists.txt (for lib)
| | | |-- intf
| | | | |-- comp3file1.hpp
| | | | `-- comp3file2.hpp
| | | `-- src
| | | `-- comp3file1.cpp
| | `-- test
| | `-- src
| | `-- comp3testfile1.cpp
| |-- log
| | `-- comp
| | |-- inc
| | | |-- logfile1.hpp
| | | |-- logfile2.hpp
| | |-- intf
| | | |-- logfile3.hpp
| | | |-- logfile4.hpp
| | `-- src
| | |-- logfile1.cpp
| | |-- logfile2.cpp
| | |-- logfile3.cpp
| | `-- logfile4.cpp
| |-- comp4
| | |-- CMakeLists.txt (for test)
| | |-- comp
| | | |-- CMakeLists.txt (for lib)
| | | |-- intf
| | | | |-- comp4file1.hpp
| | | | |-- comp4file2.hpp
| | | | |-- comp4file3.hpp
| | | `-- src
| | | |-- comp4file1.cpp
| | | |-- comp4file2.cpp
| | | `-- comp4file3.cpp
| | `-- test
| | |-- inc
| | | |-- comp4testfile1.hpp
| | | `-- comp4testfile2.hpp
| | `-- src
| | |-- comp4testfile1.cpp
| | |-- comp4testfile2.cpp
| | |-- comp4testfile3.cpp
| | |-- comp4testfile4.cpp
| | `-- comp4testfile5.cpp
|-- gcc-4.8.cmake
|-- gcc-4.9.cmake
`-- gcc-default.cmake
Ich weiß, dass es eine Menge „comp“ in ihm, aber die Namensgebung war nicht bis zu mir ..
Jede Komposition hat 2 CMakefiles: Die oberste Ebene besteht darin, eine Unit-Test-Executable zu erstellen, um das Modul zu testen. Die in comp ist eine Bibliothek zu machen. Damit kann es mit add_subdirectory in der App CMakefile verwendet werden.
Das Problem ist, dass viele Module von common, common-net und log abhängig sind. Derzeit werden diese Teile nicht als libs erstellt. Ich vermute, weil add_subdirectory Probleme gab, wenn es in mehreren Modulen verwendet wurde? Ist das sauber?
Dies führt zu: Jedes abhängige Modul enthält die gemeinsamen Header in der comp CMakefile. Auf der obersten Ebene (App CMakefile) werden die gemeinsamen Quellen der ausführbaren Datei hinzugefügt. Aber für jeden Modultest muss ich auch die gemeinsamen Quellen zu der ausführbaren Testdatei hinzufügen.
Das scheint mir seltsam und ich denke, etwas stimmt nicht. Aber ich weiß nicht, wie man es sauber löst?
Blick auf den Projektbaum und die Notwendigkeit, jedes Modul unabhängig zu testen. Ist der Ansatz, Quellen auf der obersten Ebene hinzuzufügen, in Ordnung oder wird das nicht getan?
Ty für den Link war eine sehr hilfreiche Lektüre. – rinn2883