Persoonlijke speeltuin voor het vak Gevorderde Algoritmen (E765015)
- Deze repository bevat zeer waarschijnlijk fouten en onjuistheden!
Hoe werken met CMake projecten (tl;dr)
-
Bestanden toevoegen in
CMakeLists.txt
-
project genereren
./generate_makefile.sh
- Heeft internet nodig om googletest binnen te halen
- Maakt een map
build
aan met de nodige project-bestanden voor jouw IDE - Moet elke keer opnieuw worden uitgevoerd als je bestanden toegevoegd of verwijderd van het project (dus telkens na stap 1)
- Elke keer als je wil compileren
make
./unittest
- Zorg ervoor dat je hiervoor in de map
build
zit ./unittest
zorgt ervoor dat de unittesten worden uitgevoerd
- Als je een clean build wil doen
rm -rf build
- Begin dan opnieuw vanaf stap 2
Hoe werken met CMake projecten (uitgebreid)
Folder structuur
Elke labo folder heeft de volgende layout; bv. labo-6-samenhangende-componenten
├── CMakeLists.txt
├── CMakeLists.txt.in
├── componentengraaf.h
├── generate_makefile.sh
├── main.cpp
├── opgave
│ ├── graaf.h
│ ├── keten.cpp
│ ├── opgave06.html
│ ├── takkenlijst
│ └── woordenlijst
├── takkenlijst.txt
├── test_componentengraaf.cpp
└── woordenlijst.txt
- De folder
opgave
bevat de originele opgave van https://intranet.tiwi.ugent.be/ main.cpp
,componentengraaf.h
zijn de eigen codebestanden met de oplossingtakkenlijst.txt
,woordenlijst.txt
zijn input-bestanden voor de eigen codebestanden met de oplossingtest_componentengraaf.cpp
bevat de unittests voorcomponentengraaf.h
: deze tests worden uitgevoerd met het googletest framework (https://github.com/google/googletest)CMakeLists.txt
,CMakeLists.txt.in
,generate_makefile.sh
worden gebruikt om het project te builden en het project en tests te runnen
Eigen project maken
Om je eigen project te maken moet je in CMakeLists.txt
aangeven welke codebestanden bij het project horen:
set(SOURCES
# voeg hier alle cpp-bestanden toe nodig om het main-programma te compileren (indien aanwezig)
)
set(ADDITIONAL_INPUT_FILES
# voeg hier eventuele extra input bestanden toe die door het main-programma worden gebruikt
)
set(TEST_SOURCES
# voeg hier alle cpp-bestanden toe nodig om de googletest unittesten te compileren
)
set(ADDITIONAL_TEST_FILES
# voeg hier eventuele extra input bestanden toe die door de googletest-bestanden worden gebruikt
)
Bijvoorbeeld:
set(SOURCES
main.cpp
)
set(ADDITIONAL_INPUT_FILES
takkenlijst.txt
woordenlijst.txt
)
set(TEST_SOURCES
test_componentengraaf.cpp
)
set(ADDITIONAL_TEST_FILES
)
Telkens dit wordt aangepast, moet je het project opnieuw genereren.
Het project genereren en de code compileren
Het buildsysteem wordt gegenereerd door CMake (https://cmake.org/). CMake laat toe om afhankelijk van de wensen van de gebruiker build- of projectfiles te genereren voor jouw editor of buildsysteem naar keuze (make, Visual Studio, XCode, ...).
De volgende stappen genereren via CMake op linux een make project dat dan op de commandline kan worden uitgevoerd. Indien je een ander IDE of besturingssysteem gebruikt, kan je eenvoudig met behulp van CMake bv. een Visual Studio project op Windows genereren om zo te ontwikkelen (zie onderaan).
./generate_makefile.sh
De bestanden voor jouw IDE (de makefiles in ons geval) worden gegenereerd in de map build
. Deze map word zelf door ./generate_makefile.sh
aangemaakt.
Nu kan je na elke aanpassing in een code bestand telkens make
en ./unittest
uitvoeren in de map build
om te compileren en de unittests te runnen (make && ./unittest
doet dit in een enkel commando). De unittests zitten in een eigen executable genaamd unittest
.
Indien je het project compleet opnieuw van scratch wil builden, hoef je simpelweg de gegenereerde folder build
te verwijderen en de stappen in de lijst opnieuw uit te voeren. Let op dat ./generate_makefile.sh
een internet connectie nodig heeft om het googletest framework binnen te halen (voor make
en ./unittest
is dit niet nodig).
De commando's die je dus nodig hebt zijn:
./generate_makefile.sh
cd ./build
make
./unittest
Windows (Visual Studio)
CMake werkt ook op windows en genereert dat Visual Studio projecten (indien dat is geïnstalleerd). Je genereert dit als volgt:
- Maak zelf een
build
map aan - Ga naar de
build
map - Voer op de commandline
cmake ..
uit - open het gegenereerde .sln-bestand
- Eenmaal geopend duid je het subproject met jouw code als hoofdproject aan
Noot: het kan zijn dat de header files niet zijn opgenomen in het visual studio project. In dat geval kan je de .h-files ook toevoegen aan CMakeLists.txt
.
Extra: developpen met clang tools
Voor de gebruikers van (Neo)Vim, Emacs, Visual Studio Code, ... met clang tools wordt er een compile_commands.json
aangemaakt inclusief informatie voor het helpen bij formatting, intellisense, autocompletion voor zowel header- als cpp-files. Dit gebeurt via https://github.com/Sarcasm/compdb, wat wel zelf nog geïnstalleerd moet worden via pip (pip install compdb
).
ToDo's
2018-2019
- TBA
2017-2018
- Stroomnetwerken: statistieken genereren en probleem oplossen
- Boyer Moore 2e suffix en extra varianten 1e suffix implementeren
- Zoveel mogelijk linken naar de algemene libraries
2016-2017
Het is een puinhoop -> alles eens uitkuisen en zoveel mogelijk linken naar de algemene libraries