Treebeard, der CMake-Generator

Baumbart in „Der Herr der Ringe“

In den letzten Jahren habe ich meine eigene CMake Generator „Treebeard“ wird verwendet, um größere Mengen an Dateien in einer CMake-Bibliothek oder einem CMake-Projekt zu platzieren. Das Tool wurde mittlerweile getestet und ist fehlerfrei einsetzbar. Deshalb biete ich es jetzt hier an. Es kann für bis zu 20 Dateien kostenlos genutzt werden, darüber hinaus ist für die Nutzung eine angemessene Lizenz erforderlich.

Vorteile

CMake bietet dem Softwareentwickler eine Reihe großer Vorteile:

  • CMake ist plattformunabhängig.
  • CMake kann für Desktop- oder eingebettete Software verwendet werden.
  • CMake ermöglicht eine modulare Softwareentwicklung, bei der Module unabhängig definiert werden, die in verschiedenen Projekten verwendet werden können.

Methode

Treebeard ist ein Tool, das die Verwendung von CMake einfacher macht. Es ist kein Ersatz für CMake und Kenntnisse der CMake-Befehle und der Sprachstruktur sind weiterhin erforderlich.

Beim Import externer Module stößt der Entwickler manchmal auf die Tatsache, dass die manuelle Konfiguration aller Pfade in CMake eine schwierige Angelegenheit ist. Es nimmt viel Zeit in Anspruch, eine CMakeLists.txt-Datei so zu schreiben, dass alle Quelldateien und Include-Pfade fehlerfrei verwendet werden können.

Nehmen Sie das folgende Beispiel. Angenommen, der Entwickler bei STMicroelectronics möchte den STM32L4-HAL-Treiber zu einem CMake-Projekt hinzufügen. Nach dem Herunterladen des Treibers von ST ist die folgende Ordnerstruktur sichtbar:

Insgesamt enthält der Treiber 238 Dateien. Wie können diese Dateien einfach als CMake-Bibliothek hinzugefügt werden? CMake bietet die Option einer „Wildcard“ an, diese Option ist jedoch nicht zu empfehlen! Es ist klüger, alle Dateien manuell zu benennen, als Grundlage für den Befehl „add_library …“.

Boombaard wurde entwickelt, um Gruppen von Dateien in Verzeichnissen nach Dateien zu durchsuchen, die in einer CMake-Struktur verwendet werden können. Boombaard kann beispielsweise eine Verzeichnisstruktur basierend auf einigen ausgewählten Dateien oder als gesamtes Verzeichnis mit allen Dateien oder alle Verzeichnisse rekursiv importieren – es übernimmt dann alles, was sich im Verzeichnis befindet. Boombaard bietet die Möglichkeit, nach Dateityp zu filtern und bestimmte Dateitypen zu blockieren.

Baumbart Mac OS
Baumbart-Generator (Mac OS

Die generierte CMakeLists.txt-Datei sieht dann folgendermaßen aus:

## Boombaard gegenereerd CMakelists add_library bestand
## Bestand gegenereerd op : 2020-09-14 10:58:53.
## (c)2001-2018 Copyright Kiwanda Embedded Systemen

set(LibNaam STM32L4xx_HAL_Driver)

# Het absolute pad voor dit bestand “CMakeLists.txt” is “/Users/Developer/STM32/HALLibraries/STM32Cube/Repository/STM32Cube_FW_L4_V1.16.0/Drivers/STM32L4xx_HAL_Driver/“ 

## Definieer de minimale cmake versie.
cmake_minimum_required(VERSION 2.8.10)


## GemPath is een gemeenschappelijk pad dat gevonden wordt onder de bron, inclusief en bibliotheek paden.
set(GemPath0 ${CMAKE_CURRENT_SOURCE_DIR}/Inc)
set(GemPath1 ${GemPath0}/Legacy)
set(GemPath2 ${CMAKE_CURRENT_SOURCE_DIR}/Src)
set(GemPath3 ${GemPath2}/Legacy)



## SourcePath is een gemeenschappelijk pad voor de bronbestanden.
set(SourcePath0 ${GemPath3})
set(SourcePath1 ${GemPath2})
set(SourcePath2 ${GemPath1})
set(SourcePath3 ${GemPath0})



## Dit gedeelte geeft de include directories voor de bronbestanden aan.
set(AlleIncludeDirs ${SourcePath2} ${SourcePath3} )
include_directories(${AlleIncludeDirs})


## Geef een lijst van alle bronbestanden met de juiste paden.
set(SRCS0 stm32l4xx_hal_can.c )
set(Addition0Path ${SourcePath0})
foreach(FN ${SRCS0})
	list(APPEND SRCS ${Addition0Path}/${FN})
endforeach(FN)

set(SRCS1 stm32l4xx_hal_adc_ex.c stm32l4xx_hal_adc.c stm32l4xx_hal_can.c stm32l4xx_hal_comp.c stm32l4xx_hal_cortex.c 
	stm32l4xx_hal_crc_ex.c stm32l4xx_hal_crc.c stm32l4xx_hal_cryp_ex.c stm32l4xx_hal_cryp.c stm32l4xx_hal_dac_ex.c 
	stm32l4xx_hal_dac.c stm32l4xx_hal_dcmi.c stm32l4xx_hal_dfsdm_ex.c stm32l4xx_hal_dfsdm.c stm32l4xx_hal_dma_ex.c 
	stm32l4xx_hal_dma.c stm32l4xx_hal_dma2d.c stm32l4xx_hal_dsi.c stm32l4xx_hal_exti.c stm32l4xx_hal_firewall.c 
	stm32l4xx_hal_flash_ex.c stm32l4xx_hal_flash_ramfunc.c stm32l4xx_hal_flash.c stm32l4xx_hal_gfxmmu.c stm32l4xx_hal_gpio.c 
	stm32l4xx_hal_hash_ex.c stm32l4xx_hal_hash.c stm32l4xx_hal_hcd.c stm32l4xx_hal_i2c_ex.c stm32l4xx_hal_i2c.c 
	stm32l4xx_hal_irda.c stm32l4xx_hal_iwdg.c stm32l4xx_hal_lcd.c stm32l4xx_hal_lptim.c stm32l4xx_hal_ltdc_ex.c 
	stm32l4xx_hal_ltdc.c stm32l4xx_hal_mmc_ex.c stm32l4xx_hal_mmc.c stm32l4xx_hal_nand.c stm32l4xx_hal_nor.c 
	stm32l4xx_hal_opamp_ex.c stm32l4xx_hal_opamp.c stm32l4xx_hal_ospi.c stm32l4xx_hal_pcd_ex.c stm32l4xx_hal_pcd.c 
	stm32l4xx_hal_pka.c stm32l4xx_hal_pssi.c stm32l4xx_hal_pwr_ex.c stm32l4xx_hal_pwr.c stm32l4xx_hal_qspi.c 
	stm32l4xx_hal_rcc_ex.c stm32l4xx_hal_rcc.c stm32l4xx_hal_rng_ex.c stm32l4xx_hal_rng.c stm32l4xx_hal_rtc_ex.c 
	stm32l4xx_hal_rtc.c stm32l4xx_hal_sai_ex.c stm32l4xx_hal_sai.c stm32l4xx_hal_sd_ex.c stm32l4xx_hal_sd.c 
	stm32l4xx_hal_smartcard_ex.c stm32l4xx_hal_smartcard.c stm32l4xx_hal_smbus.c stm32l4xx_hal_spi_ex.c stm32l4xx_hal_spi.c 
	stm32l4xx_hal_sram.c stm32l4xx_hal_swpmi.c stm32l4xx_hal_tim_ex.c stm32l4xx_hal_tim.c stm32l4xx_hal_tsc.c 
	stm32l4xx_hal_uart_ex.c stm32l4xx_hal_uart.c stm32l4xx_hal_usart_ex.c stm32l4xx_hal_usart.c stm32l4xx_hal_wwdg.c 
	stm32l4xx_hal.c stm32l4xx_ll_adc.c stm32l4xx_ll_comp.c stm32l4xx_ll_crc.c stm32l4xx_ll_crs.c stm32l4xx_ll_dac.c 
	stm32l4xx_ll_dma.c stm32l4xx_ll_dma2d.c stm32l4xx_ll_exti.c stm32l4xx_ll_fmc.c stm32l4xx_ll_gpio.c stm32l4xx_ll_i2c.c 
	stm32l4xx_ll_lptim.c stm32l4xx_ll_lpuart.c stm32l4xx_ll_opamp.c stm32l4xx_ll_pka.c stm32l4xx_ll_pwr.c 
	stm32l4xx_ll_rcc.c stm32l4xx_ll_rng.c stm32l4xx_ll_rtc.c stm32l4xx_ll_sdmmc.c stm32l4xx_ll_spi.c stm32l4xx_ll_swpmi.c 
	stm32l4xx_ll_tim.c stm32l4xx_ll_usart.c stm32l4xx_ll_usb.c stm32l4xx_ll_utils.c )
set(Addition1Path ${SourcePath1})
foreach(FN ${SRCS1})
	list(APPEND SRCS ${Addition1Path}/${FN})
endforeach(FN)


list(SORT SRCS)

add_library(${LibNaam} STATIC ${SRCS})

Diese Bibliothek kann jetzt einfach zu einem CMake-Projekt hinzugefügt werden:

Dieses Bild hat ein leeres Alt-Attribut; Der Dateiname lautet Screenshot-2020-09-14-at-11.09.29-1024x716.png
Die Boombaard-Datei wird in einem Softwareprojekt (Jetbrains CLion) verwendet.

Neben Bibliotheksdateien kann Boombaard auch andere CMake-Dateien generieren:

  • Projektdateien, die zum Generieren einer Desktop-Anwendung verwendet werden.
  • Include-Dateien, die mit dem CMake-Befehl „include“ verwendet werden sollen.

Verfügbarkeit

Treebeard ist in drei Sprachen verfügbar:

  • Niederländisch
  • Deutsch
  • Englisch

Das Programm kann unter heruntergeladen werden Downloads Seite und ist für Mac OS X, Windows 7 und höher (64 Bit) und Ubuntu Linux (64 Bit) verfügbar.

Treebeard ist in der kostenlosen Version auf eine maximale Anzahl von Dateien beschränkt, die verarbeitet werden können. Um das volle Potenzial von Treebeard auszuschöpfen, können Sie: Der Webshop verfügt über eine Lizenzwelches für Treebeard erworben werden kann.