(svn r1917) - Makefile: Revamped VERBOSE support, build mechanics changed.
authorpasky
Tue, 01 Mar 2005 01:14:27 +0000
changeset 1413 4a93d8682e11
parent 1412 189b1b7f98ed
child 1414 d7fa2709bf86
(svn r1917) - Makefile: Revamped VERBOSE support, build mechanics changed.
- VERBOSE has now greater effect, many previously hidden commands
are now shown on the terminal as they are executed. (Use $(Q)
instead of @ where the command should be shown if VERBOSE.)
- Compilation commands redundancy was eliminated.
- Compilation commands calling generalized so that the VERBOSE
support does not further entangle the code. The commands are now
all at a single place, before the targets in a "Build commands"
section.

Note that this changeset has a character of proposal. If you do not
like the direction it takes at all, feel free to revert it (probably
together with the previous VERBOSE patch). However, I believe it
improves the code by bringing the compilation commands to a single
place and it greatly improves the VERBOSE support, too (and makes it
much less intrusive).
Makefile
--- a/Makefile	Mon Feb 28 22:33:31 2005 +0000
+++ b/Makefile	Tue Mar 01 01:14:27 2005 +0000
@@ -683,6 +683,46 @@
 
 ##############################################################################
 #
+# Build commands
+#
+
+# If we are verbose, we will show commands prefixed by $(Q) (which acts as
+# @ in the non-verbose mode), and we will show the "real" cmds instead of
+# their quiet versions (which are used in the non-verbose mode).
+# Inspired by the Linux kernel build system.
+ifdef VERBOSE
+	Q =
+	quiet =
+else
+	Q = @
+	quiet = quiet_
+endif
+
+# Show the command (quiet or non-quiet version based on the assignment
+# just above) and then execute it.
+cmd = @$(if $($(quiet)cmd_$(1)),echo $($(quiet)cmd_$(1)) &&) $(cmd_$(1))
+
+
+# The build commands themselves. Note that if you omit the quiet version,
+# nothing will be shown in the non-verbose mode.
+
+quiet_cmd_compile_link = '===> Compiling and Linking $@'
+      cmd_compile_link = $(CC) $(BASECFLAGS) $(CDEFS) $< -o $@
+
+quiet_cmd_ttd_link = '===> Linking $@'
+      cmd_ttd_link = $(CC) $(LDFLAGS) $(TTDLDFLAGS) $(OBJS) $(LIBS) -o $@
+
+COMPILE_PARAMS=$(CFLAGS) $(CDEFS) -MD -c $< -o $@
+
+quiet_cmd_c_compile = '===> Compiling $<'
+      cmd_c_compile = $(CC) $(COMPILE_PARAMS)
+
+quiet_cmd_cxx_compile = '===> Compiling $<'
+      cmd_cxx_compile = $(CXX) $(COMPILE_PARAMS)
+
+
+##############################################################################
+#
 # Targets
 #
 
@@ -699,37 +739,31 @@
 
 endian.h: $(ENDIAN_CHECK)
 	@echo '===> Testing endianness'
-	@./$(ENDIAN_CHECK) > $@
+	$(Q)./$(ENDIAN_CHECK) > $@
 
 $(ENDIAN_CHECK): endian_check.c
-	@echo '===> Compiling and Linking $@'
-	@$(CC) $(BASECFLAGS) $(CDEFS) endian_check.c -o $@
+	$(call cmd,compile_link)
 
 
 $(TTD): table/strings.h $(OBJS) $(MAKE_CONFIG)
-	@if [ ! "$(VERBOSE)" ]; then \
-		echo '===> Linking $@'; \
-	else \
-		echo $(CC) $(LDFLAGS) $(TTDLDFLAGS) $(OBJS) $(LIBS) -o $@; \
-	fi
-	@$(CC) $(LDFLAGS) $(TTDLDFLAGS) $(OBJS) $(LIBS) -o $@
+	$(call cmd,ttd_link)
 
 $(OSX): $(TTD)
-	@rm -fr "$(OSXAPP)"
-	@mkdir -p "$(OSXAPP)"/Contents/MacOS
-	@mkdir -p "$(OSXAPP)"/Contents/Resources
-	@mkdir -p "$(OSXAPP)"/Contents/Data
-	@mkdir -p "$(OSXAPP)"/Contents/Lang
-	@echo "APPL????" > "$(OSXAPP)"/Contents/PkgInfo
-	@cp os/macos/openttd.icns "$(OSXAPP)"/Contents/Resources/openttd.icns
-	@os/macos/plistgen.sh "$(OSXAPP)" "$(REV)"
-	@cp os/macos/track_starter "$(OSXAPP)"/contents/macos
-	@ls os/macos | grep -q "\.class" || \
-	javac os/macos/OpenTTDMidi.java
-	@cp os/macos/OpenTTDMidi.class "$(OSXAPP)"/contents/macos
-	@cp data/* "$(OSXAPP)"/Contents/data/
-	@cp lang/*.lng "$(OSXAPP)"/Contents/lang/
-	@cp $(TTD) "$(OSXAPP)"/Contents/MacOS/$(TTD)
+	$(Q)rm -fr "$(OSXAPP)"
+	$(Q)mkdir -p "$(OSXAPP)"/Contents/MacOS
+	$(Q)mkdir -p "$(OSXAPP)"/Contents/Resources
+	$(Q)mkdir -p "$(OSXAPP)"/Contents/Data
+	$(Q)mkdir -p "$(OSXAPP)"/Contents/Lang
+	$(Q)echo "APPL????" > "$(OSXAPP)"/Contents/PkgInfo
+	$(Q)cp os/macos/openttd.icns "$(OSXAPP)"/Contents/Resources/openttd.icns
+	$(Q)os/macos/plistgen.sh "$(OSXAPP)" "$(REV)"
+	$(Q)cp os/macos/track_starter "$(OSXAPP)"/contents/macos
+	$(Q)ls os/macos | grep -q "\.class" || \
+	$(Q)       javac os/macos/OpenTTDMidi.java
+	$(Q)cp os/macos/OpenTTDMidi.class "$(OSXAPP)"/contents/macos
+	$(Q)cp data/* "$(OSXAPP)"/Contents/data/
+	$(Q)cp lang/*.lng "$(OSXAPP)"/Contents/lang/
+	$(Q)cp $(TTD) "$(OSXAPP)"/Contents/MacOS/$(TTD)
 
 $(endwarnings): $(64_bit_warnings)
 
@@ -738,51 +772,50 @@
 	$(warning If you see any bugs, include in your bug report that you use a 64 bit CPU)
 
 $(STRGEN): strgen/strgen.c endian.h
-	@echo '===> Compiling and Linking $@'
-	@$(CC) $(BASECFLAGS) $(CDEFS) -o $@ $<
+	$(call cmd,compile_link)
 
 table/strings.h: lang/english.txt $(STRGEN)
 	@echo '===> Generating $@'
-	@$(STRGEN)
+	$(Q)$(STRGEN)
 
 lang/%.lng: lang/%.txt $(STRGEN) lang/english.txt
 	@echo '===> Compiling language $(*F)'
-	@$(STRGEN) $(STRGEN_FLAGS) $< $(LANG_ERRORS)
+	$(Q)$(STRGEN) $(STRGEN_FLAGS) $< $(LANG_ERRORS)
 
 winres.o: ttd.rc
 	@echo '===> Compiling resource $<'
-	@windres -o $@ $<
+	$(Q)windres -o $@ $<
 
 ifdef MORPHOS
 release: all
-	@rm -fr "/t/openttd-$(RELEASE)-morphos.lha"
-	@mkdir -p "/t/"
-	@mkdir -p "/t/openttd-$(RELEASE)-morphos"
-	@mkdir -p "/t/openttd-$(RELEASE)-morphos/docs"
-	@mkdir -p "/t/openttd-$(RELEASE)-morphos/data"
-	@mkdir -p "/t/openttd-$(RELEASE)-morphos/lang"
-	@mkdir -p "/t/openttd-$(RELEASE)-morphos/scenario"
-	@cp -R $(TTD)                      "/t/openttd-$(RELEASE)-morphos/"
-	@cp data/*                         "/t/openttd-$(RELEASE)-morphos/data/"
-	@cp lang/*.lng                     "/t/openttd-$(RELEASE)-morphos/lang/"
-	@cp scenario/*                     "/t/openttd-$(RELEASE)-morphos/scenario/"
-	@cp readme.txt                     "/t/openttd-$(RELEASE)-morphos/docs/ReadMe"
-	@cp docs/console.txt               "/t/openttd-$(RELEASE)-morphos/docs/Console"
-	@cp COPYING                        "/t/openttd-$(RELEASE)-morphos/docs/"
-	@cp changelog.txt                  "/t/openttd-$(RELEASE)-morphos/docs/ChangeLog"
-	@cp known-bugs.txt				   "/t/openttd-$(RELEASE)-morphos/docs/known-bugs.txt"
-	@cp os/morphos/icons/openttd.info  "/t/openttd-$(RELEASE)-morphos/$(TTD).info"
-	@cp os/morphos/icons/docs.info     "/t/openttd-$(RELEASE)-morphos/docs.info"
-	@cp os/morphos/icons/drawer.info   "/t/openttd-$(RELEASE)-morphos.info"
-	@cp os/morphos/icons/document.info "/t/openttd-$(RELEASE)-morphos/docs/ReadMe.info"
-	@cp os/morphos/icons/document.info "/t/openttd-$(RELEASE)-morphos/docs/Console.info"
-	@cp os/morphos/icons/document.info "/t/openttd-$(RELEASE)-morphos/docs/COPYING.info"
-	@cp os/morphos/icons/document.info "/t/openttd-$(RELEASE)-morphos/docs/ChangeLog.info"
-	@strip --strip-all --strip-unneeded --remove-section .comment "/t/openttd-$(RELEASE)-morphos/$(TTD)"
-	@lha a -r "t:openttd-$(RELEASE)-morphos.lha" "t:openttd-$(RELEASE)-morphos"
-	@lha a    "t:openttd-$(RELEASE)-morphos.lha" "t:openttd-$(RELEASE)-morphos.info"
-	@rm -fr "/t/openttd-$(RELEASE)-morphos"
-	@rm -fr "/t/openttd-$(RELEASE)-morphos.info"
+	$(Q)rm -fr "/t/openttd-$(RELEASE)-morphos.lha"
+	$(Q)mkdir -p "/t/"
+	$(Q)mkdir -p "/t/openttd-$(RELEASE)-morphos"
+	$(Q)mkdir -p "/t/openttd-$(RELEASE)-morphos/docs"
+	$(Q)mkdir -p "/t/openttd-$(RELEASE)-morphos/data"
+	$(Q)mkdir -p "/t/openttd-$(RELEASE)-morphos/lang"
+	$(Q)mkdir -p "/t/openttd-$(RELEASE)-morphos/scenario"
+	$(Q)cp -R $(TTD)                      "/t/openttd-$(RELEASE)-morphos/"
+	$(Q)cp data/*                         "/t/openttd-$(RELEASE)-morphos/data/"
+	$(Q)cp lang/*.lng                     "/t/openttd-$(RELEASE)-morphos/lang/"
+	$(Q)cp scenario/*                     "/t/openttd-$(RELEASE)-morphos/scenario/"
+	$(Q)cp readme.txt                     "/t/openttd-$(RELEASE)-morphos/docs/ReadMe"
+	$(Q)cp docs/console.txt               "/t/openttd-$(RELEASE)-morphos/docs/Console"
+	$(Q)cp COPYING                        "/t/openttd-$(RELEASE)-morphos/docs/"
+	$(Q)cp changelog.txt                  "/t/openttd-$(RELEASE)-morphos/docs/ChangeLog"
+	$(Q)cp known-bugs.txt				   "/t/openttd-$(RELEASE)-morphos/docs/known-bugs.txt"
+	$(Q)cp os/morphos/icons/openttd.info  "/t/openttd-$(RELEASE)-morphos/$(TTD).info"
+	$(Q)cp os/morphos/icons/docs.info     "/t/openttd-$(RELEASE)-morphos/docs.info"
+	$(Q)cp os/morphos/icons/drawer.info   "/t/openttd-$(RELEASE)-morphos.info"
+	$(Q)cp os/morphos/icons/document.info "/t/openttd-$(RELEASE)-morphos/docs/ReadMe.info"
+	$(Q)cp os/morphos/icons/document.info "/t/openttd-$(RELEASE)-morphos/docs/Console.info"
+	$(Q)cp os/morphos/icons/document.info "/t/openttd-$(RELEASE)-morphos/docs/COPYING.info"
+	$(Q)cp os/morphos/icons/document.info "/t/openttd-$(RELEASE)-morphos/docs/ChangeLog.info"
+	$(Q)strip --strip-all --strip-unneeded --remove-section .comment "/t/openttd-$(RELEASE)-morphos/$(TTD)"
+	$(Q)lha a -r "t:openttd-$(RELEASE)-morphos.lha" "t:openttd-$(RELEASE)-morphos"
+	$(Q)lha a    "t:openttd-$(RELEASE)-morphos.lha" "t:openttd-$(RELEASE)-morphos.info"
+	$(Q)rm -fr "/t/openttd-$(RELEASE)-morphos"
+	$(Q)rm -fr "/t/openttd-$(RELEASE)-morphos.info"
 	@echo "Release archive can be found in RAM:t/ now."
 
 .PHONY: release
@@ -790,37 +823,37 @@
 
 ifdef OSX
 release: all
-	@mkdir -p "OpenTTD $(RELEASE)"
-	@mkdir -p "OpenTTD $(RELEASE)"/docs
-	@mkdir -p "OpenTTD $(RELEASE)"/scenario
-	@cp -R $(OSXAPP) "OpenTTD $(RELEASE)"/
-	@cp docs/OSX_where_did_the_package_go.txt "OpenTTD $(RELEASE)"/Where\ did\ the\ package\ go.txt
-	@cp readme.txt "OpenTTD $(RELEASE)"/docs/
-	@cp docs/README_if_game_crashed_on_OSX.txt "OpenTTD $(RELEASE)"/docs/readme\ if\ crashed\ on\ OSX.txt
-	@cp docs/console.txt "OpenTTD $(RELEASE)"/docs/
-	@cp COPYING "OpenTTD $(RELEASE)"/docs/
-	@cp changelog.txt "OpenTTD $(RELEASE)"/docs/
-	@cp docs/README_if_game_crashed_on_OSX.txt "OpenTTD $(RELEASE)"/docs/
-	@cp os/macos/*.webloc "OpenTTD $(RELEASE)"
-	@cp known-bugs.txt "OpenTTD $(RELEASE)"/known-bugs.txt
-	@cp scenario/* "OpenTTD $(RELEASE)"/scenario/
-	@/usr/bin/hdiutil create -ov -format UDZO -srcfolder "OpenTTD $(RELEASE)" openttd-"$(RELEASE)"-osx.dmg
-	@rm -fr "OpenTTD $(RELEASE)"
+	$(Q)mkdir -p "OpenTTD $(RELEASE)"
+	$(Q)mkdir -p "OpenTTD $(RELEASE)"/docs
+	$(Q)mkdir -p "OpenTTD $(RELEASE)"/scenario
+	$(Q)cp -R $(OSXAPP) "OpenTTD $(RELEASE)"/
+	$(Q)cp docs/OSX_where_did_the_package_go.txt "OpenTTD $(RELEASE)"/Where\ did\ the\ package\ go.txt
+	$(Q)cp readme.txt "OpenTTD $(RELEASE)"/docs/
+	$(Q)cp docs/README_if_game_crashed_on_OSX.txt "OpenTTD $(RELEASE)"/docs/readme\ if\ crashed\ on\ OSX.txt
+	$(Q)cp docs/console.txt "OpenTTD $(RELEASE)"/docs/
+	$(Q)cp COPYING "OpenTTD $(RELEASE)"/docs/
+	$(Q)cp changelog.txt "OpenTTD $(RELEASE)"/docs/
+	$(Q)cp docs/README_if_game_crashed_on_OSX.txt "OpenTTD $(RELEASE)"/docs/
+	$(Q)cp os/macos/*.webloc "OpenTTD $(RELEASE)"
+	$(Q)cp known-bugs.txt "OpenTTD $(RELEASE)"/known-bugs.txt
+	$(Q)cp scenario/* "OpenTTD $(RELEASE)"/scenario/
+	$(Q)/usr/bin/hdiutil create -ov -format UDZO -srcfolder "OpenTTD $(RELEASE)" openttd-"$(RELEASE)"-osx.dmg
+	$(Q)rm -fr "OpenTTD $(RELEASE)"
 
 nightly_build: all
-	@mkdir -p "OpenTTD_nightly_$(DATE)"
-	@mkdir -p "OpenTTD_nightly_$(DATE)"/docs
-	@cp -R $(OSXAPP) "OpenTTD_nightly_$(DATE)"/
-	@cp docs/OSX_where_did_the_package_go.txt "OpenTTD_nightly_$(DATE)"/Where\ did\ the\ package\ go.txt
-	@cp readme.txt "OpenTTD_nightly_$(DATE)"/docs/
-	@cp docs/README_if_game_crashed_on_OSX.txt "OpenTTD_nightly_$(DATE)"/docs/readme\ if\ crashed\ on\ OSX.txt
-	@cp docs/console.txt "OpenTTD_nightly_$(DATE)"/docs/
-	@cp COPYING "OpenTTD_nightly_$(DATE)"/docs/
-	@cp revisionlog.txt "OpenTTD_nightly_$(DATE)"/revisionlog.txt
-	@cp docs/README_if_game_crashed_on_OSX.txt "OpenTTD_nightly_$(DATE)"/docs/
-	@cp os/macos/*.webloc "OpenTTD_nightly_$(DATE)"/
-	@/usr/bin/hdiutil create -ov -format UDZO -srcfolder "OpenTTD_nightly_$(DATE)" openttd-nightly-"$(DATE)".dmg
-	@rm -fr "OpenTTD_nightly_$(DATE)"
+	$(Q)mkdir -p "OpenTTD_nightly_$(DATE)"
+	$(Q)mkdir -p "OpenTTD_nightly_$(DATE)"/docs
+	$(Q)cp -R $(OSXAPP) "OpenTTD_nightly_$(DATE)"/
+	$(Q)cp docs/OSX_where_did_the_package_go.txt "OpenTTD_nightly_$(DATE)"/Where\ did\ the\ package\ go.txt
+	$(Q)cp readme.txt "OpenTTD_nightly_$(DATE)"/docs/
+	$(Q)cp docs/README_if_game_crashed_on_OSX.txt "OpenTTD_nightly_$(DATE)"/docs/readme\ if\ crashed\ on\ OSX.txt
+	$(Q)cp docs/console.txt "OpenTTD_nightly_$(DATE)"/docs/
+	$(Q)cp COPYING "OpenTTD_nightly_$(DATE)"/docs/
+	$(Q)cp revisionlog.txt "OpenTTD_nightly_$(DATE)"/revisionlog.txt
+	$(Q)cp docs/README_if_game_crashed_on_OSX.txt "OpenTTD_nightly_$(DATE)"/docs/
+	$(Q)cp os/macos/*.webloc "OpenTTD_nightly_$(DATE)"/
+	$(Q)/usr/bin/hdiutil create -ov -format UDZO -srcfolder "OpenTTD_nightly_$(DATE)" openttd-nightly-"$(DATE)".dmg
+	$(Q)rm -fr "OpenTTD_nightly_$(DATE)"
 
 .PHONY: release nightly_build
 endif
@@ -843,10 +876,10 @@
 
 clean:
 	@echo '===> Cleaning up'
-	@rm -rf .deps *~ $(TTD) $(STRGEN) core table/strings.h $(LANGS) $(OBJS) endian.h $(ENDIAN_CHECK)
+	$(Q)rm -rf .deps *~ $(TTD) $(STRGEN) core table/strings.h $(LANGS) $(OBJS) endian.h $(ENDIAN_CHECK)
 
 mrproper: clean
-	@rm -rf $(MAKE_CONFIG)
+	$(Q)rm -rf $(MAKE_CONFIG)
 
 ifndef OSX
 ifndef MORPHOS
@@ -904,8 +937,8 @@
 # Export all variables set to subprocesses (a bit dirty)
 .EXPORT_ALL_VARIABLES:
 upgradeconf: $(MAKE_CONFIG)
-	@rm $(MAKE_CONFIG)
-	@$(MAKE) $(MAKE_CONFIG)
+	$(Q)rm $(MAKE_CONFIG)
+	$(Q)$(MAKE) $(MAKE_CONFIG)
 
 .PHONY: upgradeconf
 
@@ -924,21 +957,11 @@
 # therefore we do not need to watch deps.
 
 %.o: %.c $(MAKE_CONFIG) endian.h table/strings.h
-	@if [ ! "$(VERBOSE)" ]; then \
-		echo '===> Compiling $<'; \
-	else \
-		echo $(CC) $(CFLAGS) $(CDEFS) -c $< -o $@; \
-	fi
-	@$(CC) $(CFLAGS) $(CDEFS) -MD -c $< -o $@
+	$(call cmd,c_compile)
 	@mv $(<:%.c=%.d) $(<:%.c=.deps/%.d)
 
 %.o: %.cpp  $(MAKE_CONFIG) endian.h table/strings.h
-	@if [ ! "$(VERBOSE)" ]; then \
-		echo '===> Compiling $<'; \
-	else \
-		echo $(CXX) $(CFLAGS) $(CDEFS) -c $< -o $@; \
-	fi
-	@$(CXX) $(CFLAGS) $(CDEFS) -MD -c $< -o $@
+	$(call cmd,cxx_compile)
 	@mv $(<:%.c=%.d) $(<:%.c=.deps/%.d)
 
 # Silence stale header dependencies