- One of the most popular build automation tools that are specially used on various *nix platforms.
- Build process is divided into various "Rules" which makes it very user friendly. Rules essentially contain dependency lists, files, targets, etc.
- Avoids rebuilding targets
- Has support for integrating with third party dependency builder tools, like Automake, from the GNU Project.
- Apart from the default makefile names, it supports non-standard makefile names using the -f or - - file flag option.
- Supports use of nested makefile usage.
- Supports optimized code compilation through various -O flags passed to the compiler through makefile.
Room for Improvement:
- Since builds targeted for a particular platform cannot be run on a different platform, "Make" doesn't have the inbuilt functionality of tailoring a build targeted to a platform. It relies on other tools like AutoConf for platform based build customizations.
- Recursive make might result in circular dependency.
- Make parsers don't follow the standard model, as parsing a makefile without reading it is not possible.
- Writing makefiles is not easy as it requires a basic knowledge of make syntax.
- One major weakness of the make is its limited support for “if” conditionals. Writing make commands involving AND, OR, etc. is very cumbersome.
- Make has no data types, other than strings. There is no Boolean type.
- Make’s reliability is very poor and is not suitable for larger or incremental builds.
- Not being able to list any dependency to make will lead to a compilation failure. Each and every dependency has to be declared explicitly.
- Editing target files during build has an unpredictable impact on the build.
- Due to buggy makefiles containing circular dependency, target files get rebuilt even though none of its targets have changed since the last build.
One of the best things about GNU Make is that, it is available on almost all Linux platforms. Once you know the basic syntax of the Make file, you can start writing your own makefiles. Because writing makefiles for bigger projects with circular dependency is a very complex task, it is recommended to use alternative build automation tools. It's highly popular for smaller projects of lesser complexity.