Boombaard de CMake generator

Boombaard in “The lord of the rings”

De afgelopen jaren heb ik mijn eigen CMake generator “Boombaard” gebruikt om grotere hoeveelheden bestanden in een CMake bibliotheek of project te plaatsen. De tool is inmiddels doorgetest en zonder fouten goed bruikbaar. Ik bied hem daarom nu hier aan. Hij is tot 20 bestanden gratis te gebruiken, daar boven is een schappelijke licentie nodig om hem te gebruiken.

Voordelen

CMake biedt een aantal grote voordelen voor de software ontwikkelaar:

  • CMake is platformonafhankelijk.
  • CMake kan worden gebruikt voor desktop of embedded software.
  • CMake maakt modulaire softwareontwikkeling mogelijk waarbij modules onafhankelijk worden gedefinieerd welke in verschillende projecten kunnen worden gebruikt.

Werkwijze

Boombaard is een tool die het gebruik van CMake eenvoudiger maakt. Het is geen vervanging van CMake, en kennis van de CMake commando’s en taalstructuur is nog steeds noodzakelijk.

Bij de import van externe modules loopt de ontwikkelaar soms tegen het feit aan, dat het handmatig configureren van alle paden bij CMake een lastige zaak is. Het kost veel tijd om een CMakeLists.txt bestand zodanig te schrijven dat alle bronbestanden en include paden zonder fouten kunnen worden gebruikt.

Neem het volgende voorbeeld. Stel dat de ontwikkelaar bij STMicroelectronics de STM32L4 HAL driver wil toevoegen aan een CMake project. Na download van de driver van ST is een volgende mapstructuur te zien :

In totaal bevat de driver 238 bestanden. Hoe zijn deze bestanden nu op een eenvoudige manier toe te voegen als een CMake bibliotheek? CMake biedt de optie van een “wildcard” aan, maar dit is een mogelijkheid die afgeraden wordt! Het is verstandiger om alle bestanden handmatig ten noemen als basis voor het “add_library …” commando.

Boombaard is ingericht om groepen bestanden in directories te doorzoeken op zoek naar bestanden die in een CMake struktuur kunnen worden gebruikt. Boombaard kan bijvoorbeeld een directory structuur importeren op basis van enkele gekozen bestanden, of als gehele directory met alle bestanden, of alle directories op een recursieve manier – het neemt dan alles mee dat zich in de directory bevindt. Boombaard biedt daar bij de mogelijkheid om te filteren op type bestand alsmede een blokkade op te werpen voor bepaald soort bestanden.

Boombaard Mac OS X
Boombaard Generator (Mac OS X)

Het gegenereerde CMakeLists.txt bestand ziet er dan als volgt uit :

## 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})

Deze bibliotheek kan nu eenvoudig worden toegevoegd aan een CMake project:

Deze afbeelding heeft een leeg alt-attribuut; de bestandsnaam is Schermafbeelding-2020-09-14-om-11.09.29-1024x716.png
Het Boombaard bestand wordt gebruikt in een software projekt (Jetbrains CLion)

Naast bibliotheek bestanden kan Boombaard ook andere CMake bestanden genereren:

  • Project bestanden die gebruikt worden een desktop applicatie te genereren.
  • Include bestanden, te gebruiken met het CMake “include” commando.

Beschikbaarheid

Boombaard is beschikbaar in drie talen:

  • Nederlands
  • Deutsch
  • English

Het programma kan worden gedownload vanaf de Downloads pagina en is beschikbaar voor Mac OS X,Windows 7 en hoger (64 bit) en Ubuntu Linux (64 bit).