{"id":43,"date":"2026-07-25T11:16:31","date_gmt":"2026-07-25T11:16:31","guid":{"rendered":"https:\/\/depon.net\/?p=43"},"modified":"2026-07-25T11:17:07","modified_gmt":"2026-07-25T11:17:07","slug":"burnsystems-make","status":"publish","type":"post","link":"https:\/\/depon.net\/?p=43","title":{"rendered":"BurnSystems.Make"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Viele Menschen schreiben ein Make-Tool, so habe ich es nun auch getan, allerdings nicht ganz vollst\u00e4ndig. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Mein Use-Case war es Pre-Build-Ereignisse in einen MSBuild-Bauprozess einzubauen. Dies konnte die Erzeugung einer kleinen Datei sein, der Aufruf des Typescript Compilers oder das Zusammenkopieren von Dateien. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zuvor hatte ich eine Mischung aus MSBuild-Kommandos und <a href=\"https:\/\/cakebuild.net\/\">Cake<\/a> genutzt. Gerade Cake finde ich sehr sch\u00f6n, da es auf der C#-Sprache selbst aufsetzt. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dass Cake bei jedem Kompilations-Vorgang erstmal das Cake-File kompiliert hatte, st\u00f6rt mich schon ein wenig, da je nach Rechner ein paar Sekunden verloren gehen. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Anforderungen an das neue Tool waren folgenderma\u00dfen. Insbesondere war es f\u00fcr mich wichtig, dass ich die M\u00e4chtigkeit von MSBuild nutzen kann, da ich nicht &#8216;yet another&#8217; Tool schreiben wollte. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Kurz gesagt: <a href=\"https:\/\/github.com\/mbrenn\/BurnSystems.Make\/blob\/main\/docs\/design.adoc\">https:\/\/github.com\/mbrenn\/BurnSystems.Make\/blob\/main\/docs\/design.adoc<\/a><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>MSBuild unterst\u00fctzt nur relativ umst\u00e4ndlich kompliziertere Build-Skripte.<\/li>\n\n\n\n<li>Cake m\u00f6chte jedes mal kompilieren und unterst\u00fctzt kein Syntax-Highlighting im build.cake file. <\/li>\n\n\n\n<li>Nuke wird l<a href=\"https:\/\/github.com\/nuke-build\/nuke\/discussions\/1564\">eider nicht mehr gepflegt<\/a>. Dieses Projekt sah auf dem ersten Blick einfach ideal aus. <\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Requirements<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The build process shall run on Windows and Linux<\/li>\n\n\n\n<li>The build process shall support C#, TypeScript and other Project Types.<\/li>\n\n\n\n<li>The build process will be integrated with MS Build.\n<ul class=\"wp-block-list\">\n<li>BSMake shall be callable on its own (and does not call MS Build).<\/li>\n\n\n\n<li>BSMake can be called from MSBuild to get advantage by all the MSBuild Features (e.g. incremental build, build dependency tree, etc)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>The configuration file shall be written in C#.<\/li>\n\n\n\n<li>The build process shall only execute steps in case the corresponding source files have been modified. This avoids a full recompilation and is called &#8216;incremental build&#8217;.<\/li>\n\n\n\n<li>The build process does not require a compilation step upon each build. It checks whether the configuration file has changed and will only perform the compilation in case it has been altered.<\/li>\n\n\n\n<li>The build process supports project-specific compilations which can be called individually. This means that every project can have its own build configuration and there is no need to integrate everything on solution-level.<\/li>\n\n\n\n<li>The solution-level can include its own build process which integrates all project-level builds. This can be done hierarchically.\n<ul class=\"wp-block-list\">\n<li>The solution-level does not define the order and priority of build steps explicitly since it calls MS Build on Solution (.slnx). The MS Build process there already knows the right order.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>The editor of Rider or Visual Studio shall support syntax-highlighting of the build files.<\/li>\n\n\n\n<li>The build process is required to be integrated into &#8216;dotnet tool&#8217; to allow easy installation.<\/li>\n\n\n\n<li>The build configuration files do not interfere with the project files and may not be compiled into the project files themselves<\/li>\n\n\n\n<li>The outputs or intermediate files of the build process are consolidated into one directory per project.<\/li>\n\n\n\n<li>The build process shall support different Configuration contexts (e.g. Debug \/ Release)<\/li>\n\n\n\n<li>All dynamically created artifacts of bsmake shall be cleanable by a simple call, so the next build process does not incldue any cached artifacts.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Resultat<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die Version 1.0.1 wurde eben ver\u00f6ffentlicht und unterst\u00fctzt ein einfaches Executable. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"205\" src=\"https:\/\/depon.net\/wp-content\/uploads\/2026\/07\/image-2-1024x205.png\" alt=\"\" class=\"wp-image-44\" srcset=\"https:\/\/depon.net\/wp-content\/uploads\/2026\/07\/image-2-1024x205.png 1024w, https:\/\/depon.net\/wp-content\/uploads\/2026\/07\/image-2-300x60.png 300w, https:\/\/depon.net\/wp-content\/uploads\/2026\/07\/image-2-768x154.png 768w, https:\/\/depon.net\/wp-content\/uploads\/2026\/07\/image-2.png 1512w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Dieses liegt im .bsmake-Verzeichnis<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Beim ersten Aufruf wird das File komplett kompiliert: <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"550\" src=\"https:\/\/depon.net\/wp-content\/uploads\/2026\/07\/image-3-1024x550.png\" alt=\"\" class=\"wp-image-45\" srcset=\"https:\/\/depon.net\/wp-content\/uploads\/2026\/07\/image-3-1024x550.png 1024w, https:\/\/depon.net\/wp-content\/uploads\/2026\/07\/image-3-300x161.png 300w, https:\/\/depon.net\/wp-content\/uploads\/2026\/07\/image-3-768x412.png 768w, https:\/\/depon.net\/wp-content\/uploads\/2026\/07\/image-3.png 1416w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Beim zweiten Aufruf als gecachete Version wiedergenutzt: <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"279\" src=\"https:\/\/depon.net\/wp-content\/uploads\/2026\/07\/image-4-1024x279.png\" alt=\"\" class=\"wp-image-46\" srcset=\"https:\/\/depon.net\/wp-content\/uploads\/2026\/07\/image-4-1024x279.png 1024w, https:\/\/depon.net\/wp-content\/uploads\/2026\/07\/image-4-300x82.png 300w, https:\/\/depon.net\/wp-content\/uploads\/2026\/07\/image-4-768x209.png 768w, https:\/\/depon.net\/wp-content\/uploads\/2026\/07\/image-4.png 1326w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Die Datei Primes.cs liegt dann im Projekt-Verzeichnis und wird vom Projekt-Kompilat dann verwendet. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Schnell und einfach. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Weitere Dokumentation unter: <a href=\"https:\/\/github.com\/mbrenn\/BurnSystems.Make\/blob\/main\/docs\/design.adoc\">https:\/\/github.com\/mbrenn\/BurnSystems.Make\/blob\/main\/docs\/design.adoc<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Viele Menschen schreiben ein Make-Tool, so habe ich es nun auch getan, allerdings nicht ganz vollst\u00e4ndig. Mein Use-Case war es Pre-Build-Ereignisse in einen MSBuild-Bauprozess einzubauen. Dies konnte die Erzeugung einer kleinen Datei sein, der Aufruf des Typescript Compilers oder das Zusammenkopieren von Dateien. Zuvor hatte ich eine Mischung aus MSBuild-Kommandos und Cake genutzt. Gerade Cake [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-43","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/depon.net\/index.php?rest_route=\/wp\/v2\/posts\/43","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/depon.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/depon.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/depon.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/depon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=43"}],"version-history":[{"count":2,"href":"https:\/\/depon.net\/index.php?rest_route=\/wp\/v2\/posts\/43\/revisions"}],"predecessor-version":[{"id":48,"href":"https:\/\/depon.net\/index.php?rest_route=\/wp\/v2\/posts\/43\/revisions\/48"}],"wp:attachment":[{"href":"https:\/\/depon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=43"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/depon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=43"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/depon.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=43"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}