Hi Christian, some of this I knew, but didn't use it in the example because it wasn't necessary to illustrate my problem. Thank you for taking the time to explain this. That's awesome!
On 06.03.2015 14:24, Christian Hujer wrote: > Hi Markus, > > there are a few things you can improve about your little Makefile. > > Short: > * avoid '@' - instead use -s > * Use the built-in rules, they're good > * Follow the conventions of the built-in rules to make them work > * Declare non-file goals .PHONY > * Tell make about dependencies to make it run incrementally > * Add a clean rule to remote the stuff that make was building > > Long: > * I recommend to avoid '@' and use it only in rare cases. > Sooner or later you will have a Makefile which doesn't run as > expected, either by itself or because one of the commands that it > calls is hanging. > Then you will be thankful for the command echo. > You will not want to have to change the Makefile and remove the '@' on > all the recipes just in order to see what's going on. > > Instead, use the `-s` command line option. > With '-s' you can tell make that you're not interested in seeing > what's going on. > And if that's the usual case, you can define an environment variable like > this: > export MAKEFLAGS=-s > > See also https://www.gnu.org/software/make/manual/make.html#Echoing > > * Use the built-in rules, they're good. > An overview of the built-in rules can be seen here: > https://www.gnu.org/software/make/manual/make.html#Catalogue-of-Rules > So, make already knows how to compile C++ programs, you don't need to tell it. > Also, I find it useful to keep what to build (rules which specify > dependencies) and how (pattern-rules which specify recipes) separate > from each other. > > * Follow conventions of the built-in rules to make them work > The built-in rules expect that one of the object files has the same > basename as the binary that you are trying to build. > So, instead of building example from main.cpp, you would build example > from example.cpp. > This is a convention which is also there outside the world of make. > It's quite common practice to name the source file that contains main > after the intended program name. > > The following Makefile is sufficient to tell make to compile > example.cpp into example: > > all: example > > No further line is needed, make knows the rest by itself. > > * Declare non-file goals .PHONY > It's recommended to declare goals which do not exist as a file as .PHONY. > This prevents the Makefile from falling over in case the user creates > a file or directory with the same name as one of these goals. > > So, above all rule should actually look like this: > > .PHONY: all > all: example > > * Tell make about dependencies to make it run incrementally. > For example, if you run `make run`, it would fail unless you ran `make` first. > Why not tell make that if you want to `make run` and example doesn't > exist, that example needs to be made first? > > Change > run: > ./example > to > .PHONY: run > run: example > ./example > > Now make knows that if you want to run, it first has to build. > It would also rebuild in case example.cpp is newer than example. > > * Add a clean rule to remove the stuff that make was building. > > So here's your final Makefile: > .PHONY: all > all: example > > .PHONY: run > run: example > ./example > > .PHONY: clean > clean: > $(RM) example > > I hope this helps you in your future ventures with make. > > On Thu, Feb 26, 2015 at 6:33 PM, Markus Fischer <[email protected]> wrote: >> On 26.02.2015 13:20, David wrote: >>> Explained here: >>> https://www.gnu.org/software/make/manual/html_node/Echoing.html#Echoing >>> >>> Try changing that line in your makefile to: >>> <tab>@./example >>> >> >> Thanks, this got me on the right path. >> >> >> _______________________________________________ >> Help-make mailing list >> [email protected] >> https://lists.gnu.org/mailman/listinfo/help-make _______________________________________________ Help-make mailing list [email protected] https://lists.gnu.org/mailman/listinfo/help-make
