diff options
author | terminaldweller <devi@terminaldweller.com> | 2024-01-28 04:10:04 +0000 |
---|---|---|
committer | terminaldweller <devi@terminaldweller.com> | 2024-01-28 04:10:04 +0000 |
commit | 06b57fdb3da729ed3b63be4a030805b7e7099693 (patch) | |
tree | 6f5be8be19d4b79b650eca463c9fd8a885bc759c /mds/lazymakefiles.md | |
parent | new blog post (diff) | |
download | blog-06b57fdb3da729ed3b63be4a030805b7e7099693.tar.gz blog-06b57fdb3da729ed3b63be4a030805b7e7099693.zip |
added new blog entry
Diffstat (limited to 'mds/lazymakefiles.md')
-rw-r--r-- | mds/lazymakefiles.md | 46 |
1 files changed, 36 insertions, 10 deletions
diff --git a/mds/lazymakefiles.md b/mds/lazymakefiles.md index be71c46..735b40c 100644 --- a/mds/lazymakefiles.md +++ b/mds/lazymakefiles.md @@ -8,22 +8,26 @@ So I just decided to write a lazy makefile so I would never have to type in the First off, you can find the makefiles [here](https://github.com/bloodstalker/lazymakefiles). They are licensed under the Unlicense. And I'm using plural because there's one for C and one for C++.<br/> Now that we are done with the mandatory whimsical introduction, let's talk about the contents of the makefiles.<br/> There are also a couple of things to note:<br/> -* The makefiles have been written with gnu make in mind. -* Most targets will be fine with gcc but the full functionality is achieved by using clang.<br/> -* This is not a makefile 101. -* I'm not going to try to copy the makefile contents here line by line. You are expected to have the makefile open while reading this. -* I will be explaining some of the more, let's say, esoteric behaviours of make which can get the beginners confused. -* gnu make variables are considered macros by C/C++ standards. I will use the term "variable" since it's what the gnu make documents use. -* The makefiles are not supposed to be hands-off. I change bits here and there from project to project.<br/> -* The makefile recognizes the following extensions: `.c` and `.cpp`. If you use different extensions, change the makefile accordingly.<br/> + +- The makefiles have been written with gnu make in mind. +- Most targets will be fine with gcc but the full functionality is achieved by using clang.<br/> +- This is not a makefile 101. +- I'm not going to try to copy the makefile contents here line by line. You are expected to have the makefile open while reading this. +- I will be explaining some of the more, let's say, esoteric behaviours of make which can get the beginners confused. +- gnu make variables are considered macros by C/C++ standards. I will use the term "variable" since it's what the gnu make documents use. +- The makefiles are not supposed to be hands-off. I change bits here and there from project to project.<br/> +- The makefile recognizes the following extensions: `.c` and `.cpp`. If you use different extensions, change the makefile accordingly.<br/> ## The Macros + `TARGET` holds the target name. It uses the `?=` assignment operator so you can pass it a different value from a script, just in case.<br/> There are a bunch of varibales that you can assign on the terminal to replace the makefile's defaults. Among those there are some that are first getting a default value assigned and then get the `?=` assignemnt operator so you can assign them values from the terminal, e.g:<br/> + ```make CC=clang CC?=clang ``` + It looks a bit backwards but there is a reason for that. The reason why we need to do that is because those variables are called `implicit variables` in gnu make terminology. Implicit variables are already defined by your makefile even if you havent defined them so they get some special treatment.<br/> In order to assign them values from the terminal, we first assign them a value and then use the `?=` operator on them. We don't really need to assign the default value here again, but I felt like it would be more expressive to assign the default for a second time.<br/> @@ -34,66 +38,87 @@ The variable `BUILD_MODE` is used for the sanitizer builds of clang. `ADDSAN` wi ## Targets ### default + The default target is `all`. `all` depends on `TARGET`.<br/> ### all + `all` is an aggregate target. calling it will build, or rather, try to build everything(given your source-code's sitation, some targets might not make any sense).<br/> ### depend + `depend` depends on `.depend` which is a file generated by the makefile that holds the header dependencies. This is how we are making the makefile sensitive to header changes.<br/> The file's contents look like this:<br/> + ```make main.c:main.h myfile1.c:myfile1.h myfile2.h ``` + The inclusion directive is prefixed with a `-`. That's make lingo for ignore-if-error. My shell prompt has a `make -q` part in it so just `cd`ing into a folder will generate the `.depend` file for me.Lazy and Convinient.<br/> ### Objects + For the objects, there are three sets. You have the normal garden variety objects that end in `.o`. You get the debug enabled objects that end in `.odbg` and you get the instrumented objectes that are to be used for coverage that end in `.ocov`. I made the choice of having three distinct sets of objects since I personally sometimes struggle to remember whether the current objects are normal, debug or coverage. This way, I don't need to. That's the makefile's problem now.<br/> ### TARGET + Vanilla i.e. the dynamically-linked executable.<br/> ### TARGET-static + The statically-linked executable.<br/> ### TARGET-dbg + The dynamically-linked executble in debug mode.<br/> ### TARGET-cov + The instrumented-for-coverage executable, dynaimclly-linked.<br/> ### cov + The target generates the coverage report. it depend on `runcov` which itself, in turn, depends on `$(TARGET)-cov` so if you change `runcov` to how your executable should run, cov will handle rebuilding the objects and then running and generating the coverage report.<br/> ### covrep + The exact same as above but generates coverage report in a different format.<br/> ### ASM + Generates the assembly files for your objects, in intel style.<br/> ### SO + Will try to build your target as a shared object.<br/> ### A + Will try to build your target as an archive, i.e. static library.<br/> ### TAGS + Depends on the `tags` target, generates a tags file. The tags file includes tags from the header files included by your source as well.<br/> ### valgrind -Depends on `$(TARGET)` by default, runs valgrind with `--leak-check=yes`. You probably need to change this for the makefile to run your executable correctly.<br/> + +Depends on `$(TARGET)` by default, runs valgrind with `--leak-check=yes`. You probably need to change this for the makefile to run your executable correctly.<br/> ### format -Runs clang-format on all your source files and header files and **__EDITS THEM IN PLACE__**. Expects a clang format file to be present in the directory.<br/> + +Runs clang-format on all your source files and header files and \***\*EDITS THEM IN PLACE\*\***. Expects a clang format file to be present in the directory.<br/> ### js + Builds the target using emscripten and generates a javascript file.<br/> ### clean and deepclean + `clean` cleans almost everything. `deepclean` depends on `clean`. basically a two level scheme so you can have two different sets of clean commands.<br/> ### help + prints out the condensed version of what I've been trying to put into words.<br/> Well that's about it.<br/> @@ -343,6 +368,7 @@ help: ``` ## Cpp + ```make TARGET?=main SHELL=bash |