<div dir="ltr"><div><font face="monospace, monospace">CMake build system for RTEMS</font></div><div><font face="monospace, monospace">============================</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Nickolay Semyonov <<a href="mailto:snob@wolpike.com">snob@wolpike.com</a>></font></div><div><font face="monospace, monospace">Version 0.5</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Why</font></div><div><font face="monospace, monospace">---</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">1. Use ninja as build tool to improve compile time performance.</font></div><div><font face="monospace, monospace">2. Get rid of Cygwin/MSYS on Windows. I.e. under Windows we need only compiler, </font></div><div><font face="monospace, monospace">cmake and ninja.</font></div><div><font face="monospace, monospace">3. Better dependencies tracking.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Introduction</font></div><div><font face="monospace, monospace">------------</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">- No changes to RTEMS source code were made</font></div><div><font face="monospace, monospace">- Only i386 currently supported. PowerPC (QoriQ) will be pushed in next days.</font></div><div><font face="monospace, monospace">- All checks 'really used in RTEMS code' are performed. I.e. we check for </font></div><div><font face="monospace, monospace">  functions, include files, prototypes, type sizes, etc.</font></div><div><font face="monospace, monospace">- 99% samples, sptests, libtests, tmtests, psxtests and psxtmtests are </font></div><div><font face="monospace, monospace">  compiled.</font></div><div><font face="monospace, monospace">- 4.11 branch was used. Can be easily adopted to 4.12.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Sample usage:</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  $ git clone -b cmake <a href="https://github.com/Wolpike/rtems">https://github.com/Wolpike/rtems</a> rtems-cmake</font></div><div><font face="monospace, monospace">  $ cd rtems-cmake</font></div><div><font face="monospace, monospace">  $ mkdir .build</font></div><div><font face="monospace, monospace">  $ cd .build</font></div><div><font face="monospace, monospace">  $ cmake -GNinja -DCMAKE_TOOLCHAIN_FILE=../cmake/cc/i386.cmake ..</font></div><div><font face="monospace, monospace">  $ ninja</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Samples will be in 'testsuites/samples'.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Technically we demonstrate that everything from current RTEMS build system can</font></div><div><font face="monospace, monospace">be done in CMake.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">We are interested in inclusion this in official RTEMS and are ready to provide</font></div><div><font face="monospace, monospace">support if required.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Comparison with Autotools</font></div><div><font face="monospace, monospace">-------------------------</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">It should be noted that currently autotools and cmake build different source </font></div><div><font face="monospace, monospace">code sets, so direct comparison is unfair. But I don't think numbers will </font></div><div><font face="monospace, monospace">change drastically.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Also on Windows, performance gap is much wider due to Cygwin/MSYS slowness.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">TODO: Windows benchmarks.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Tested on Macbook Pro, Retina, Mid 2012, 2,7 GHz Intel Core i7, 16GB.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">On all tests 'ninja' wass executed as 'ninja' without additional arguments.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Make was executed with '-j9'.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Configure line: </font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">  --target=i386-rtems \</font></div><div><font face="monospace, monospace">  --enable-rtemsbsp=pc386 \</font></div><div><font face="monospace, monospace">  --enable-cxx=yes \</font></div><div><font face="monospace, monospace">  BSP_PRESS_KEY_FOR_RESET=0 \</font></div><div><font face="monospace, monospace">  BSP_ENABLE_VGA=0</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">CMake: </font></div><div><font face="monospace, monospace">  "-DCMAKE_TOOLCHAIN_FILE=../cmake/cc/i386.cmake -GNinja -DBSP_ENABLE_VGA=OFF"</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">CMake "debug" addition: "-DCMAKE_BUILD_TYPE=Debug".</font></div><div><font face="monospace, monospace">CMake "release" addition: "-DCMAKE_BUILD_TYPE=Release"</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Complete testsuite build (--enable-tests)</font></div><div><font face="monospace, monospace">~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">- autotools bootstrap: 9m27.421s.</font></div><div><font face="monospace, monospace">- autotools configure: 0m12.043s.</font></div><div><font face="monospace, monospace">- autotools make: 5m15.640s</font></div><div><font face="monospace, monospace">- autotools make (without changes): 0m19.523s</font></div><div><font face="monospace, monospace">- autotools make clean: 0m4.509s</font></div><div><font face="monospace, monospace">- autotools make (after clean): 3m50.755s</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">- cmake: 0m7.470s</font></div><div><font face="monospace, monospace">- ninja (default): 0m43.871s</font></div><div><font face="monospace, monospace">- ninja (debug): 2m34.534s</font></div><div><font face="monospace, monospace">- ninja (release): 1m17.895s</font></div><div><font face="monospace, monospace">- ninja (without changes): 0m0.210s</font></div><div><font face="monospace, monospace">- ninja clean: 0m0.528s</font></div><div><font face="monospace, monospace">- ninja (after clean): 0m43.288s</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">After changing 'cpukit/score/include/rtems/system.h':</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">- autotools make: 3m46.446s</font></div><div><font face="monospace, monospace">- ninja (default): 0m40.253s</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">After changing 'cpukit/rtems/src/clockgettod.c' (real code change):</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">- autotools make: 0m20.993s (tests NOT rebuild !!!)</font></div><div><font face="monospace, monospace">- ninja (default): 0m7.871s (tests rebuilded)</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Only samples build from testsuite</font></div><div><font face="monospace, monospace">~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">- autotools configure: 0m12.043s.</font></div><div><font face="monospace, monospace">- autotools make: 1m30.290s</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">- cmake: 0m5.807s</font></div><div><font face="monospace, monospace">- ninja (default): 0m19.323s</font></div><div><font face="monospace, monospace">- ninja (debug): 0m32.176s</font></div><div><font face="monospace, monospace">- ninja (release): 0m31.434s</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Conclusion</font></div><div><font face="monospace, monospace">~~~~~~~~~~</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">- For automated CI with 'pull, bootstrap, configure, make' build cycle, 17.5x</font></div><div><font face="monospace, monospace">  time difference is sounding.</font></div><div><font face="monospace, monospace">- For 'normal' development 2.5x-5x time improvement is also nice.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Things not implemented</font></div><div><font face="monospace, monospace">----------------------</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">- 'managers' selection. Not sure about that. Never used this stuff. </font></div><div><font face="monospace, monospace">- RTEMS_MULTIPROCESSING support. Need instructions for testing.</font></div><div><font face="monospace, monospace">- RTEMS_SMP. On TODO list. Currently we don't have multicore systems in </font></div><div><font face="monospace, monospace">  production, but this can be emulated in qemu-i386 as I understand.</font></div><div><font face="monospace, monospace">- wrapup. High priority. Currently we don't combine RTEMS libraries in rtemscpu </font></div><div><font face="monospace, monospace">  and rtemsbsp. We don't like manual repacking process, but direct linking may</font></div><div><font face="monospace, monospace">  require changes in RTEMS source code.</font></div><div><font face="monospace, monospace">- Documentation. Low priority.</font></div><div><font face="monospace, monospace">- We generate 'exe' file as RTEMS_XXX_EXECUTABLE result. No 'nxe', 'ralf', </font></div><div><font face="monospace, monospace">  'bin' or other. It is assumed, that 'exe' file is passed directly to CI or </font></div><div><font face="monospace, monospace">  firmware making script.</font></div><div><font face="monospace, monospace">- ADA support. Need help with testing.</font></div><div><font face="monospace, monospace">- jffs2, zlib. On TODO list.</font></div><div><font face="monospace, monospace">- drvmgr. Need help with testing.</font></div><div><font face="monospace, monospace">- nfsclient. On TODO list, low priority.</font></div><div><font face="monospace, monospace">- tar tests. On TOOD list.</font></div><div><font face="monospace, monospace">- Building several BSP at once. This can be done. Low priority.</font></div><div><font face="monospace, monospace">- Makefile compatibility. This will be pushed in next days.</font></div><div><font face="monospace, monospace">- libdl. Need help with testing.</font></div><div><font face="monospace, monospace">- 'rel' files are dropped. They are needed for 'managers' and probably to </font></div><div><font face="monospace, monospace">  improve code locality. Currently no plans for support.</font></div><div><font face="monospace, monospace">- Consider using 'FeatureSummary' for RTEMS configuration options.</font></div><div><font face="monospace, monospace">- RTEMS_NEWLIB is always TRUE. I'm not sure if RTEMS can be compiled without </font></div><div><font face="monospace, monospace">  newlib.</font></div><div><font face="monospace, monospace">- native tools are not build. I.e. no bin2boot.</font></div><div><font face="monospace, monospace">- CPack support and RTEMS_C_EXECUTABLE recipe will be pushed in next days.</font></div><div><font face="monospace, monospace">- Support for Eclipse, QCreator and CLion project creation via CMake is not </font></div><div><font face="monospace, monospace">  tested. 100% includes won't show in project list. No plans to support this.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">P.S. I'm aware about 'waf' build system for RTEMS, but haven't checked. It </font></div><div><font face="monospace, monospace">would be interesting to compare performance.</font></div><div><br></div></div>