Embarking on this journey, I had several objectives in mind:
1. I wanted to develop C++ programs on Linux.
2. I wanted a systematic method for building those programs using Makefiles.
3. The method should work for non-trivially sized programs, i.e. programs whose code spans multiple directories and files.
4. I intended those programs to make use of libraries, that I will write myself and also obtain from other sources.
5. I wishes for a simple modular approach:
- Adding another component to a library or a program will follow a well defined procedure, with short and simple Makefiles.
- Likewise when one component wishes to include (make use of) another component.
6. I wished that header file dependencies are automatically discovered, instead of manually entered.
7. I wished that the method supported multiple independent build types for a given program, specifically, building both debug and release versions.
8. I wanted to call make from the source directory, and have the build performed in the appropriate directory, based on the build type.
Fortunately for me, others before me had one or more of these objectives in mind, too.
Thus, I combined ideas and code from multiple sources, and produced an example code to satisfy the above objectives.
I published the method and code on make-all.weebly.com
In the downloadable example, I demonstrate the building of a library (tinylib), and a project (tinyproj) that uses it.
The "heavy lifting" code, that builds these items, is encapsulated in a set of common helper Makefiles, thus leaving the top-level Makefiles small and simple to understand and edit.
I hope you find it useful!