From patchwork Tue Nov 20 01:05:27 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Masahiro Yamada X-Patchwork-Id: 151533 Delivered-To: patch@linaro.org Received: by 2002:a2e:299d:0:0:0:0:0 with SMTP id p29-v6csp3380723ljp; Mon, 19 Nov 2018 17:07:10 -0800 (PST) X-Google-Smtp-Source: AJdET5f65DzTMmx0WApy6DqzmPPeMDjZHsO30zDqqQtmSX2JRtqsC7tK5Um/odAl2JdhmGtkfW/3 X-Received: by 2002:a63:1157:: with SMTP id 23mr22414193pgr.245.1542676030818; Mon, 19 Nov 2018 17:07:10 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1542676030; cv=none; d=google.com; s=arc-20160816; b=Kd8I8XsHmTrbHgpMopdtt6wZBveSkyTbCxlgzpVdKTsoAgx3KNLxn3Oqa01KDUtLw0 IJL4nkdLDlXvNsm9kEyX8LKT7g7qcUiKgXZ+l8nbBVqFs5hL/b3ihyDs+tGdlR+kSIru TjfnpBnXFuwpGdT8nDwSAxkeFV47G7lNSDSTUnpFmENvYhqsilq98+ouZHEEce/Vw3+b 5FnaPbOSk28IfhVOg6r8tXHK9ZH8YYou5aLlFHX7nGDhl/qpKDXex06V6ygUcXrJMBWM g0M0xZiAXpAMKd29iUQKyETEAdhhLCbbQhLwnud9pTedU79JcJnzY3Wtf6OLnyse1yRR Tsfg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:dkim-filter; bh=NMzBvf7Uf/mcroQkxmHDTE9wi2Zk1t9cWFR9t5jzbfs=; b=NuLWeNRGuy7TODaxtx5IWUis7nw6jlQWmj9DaX6P6aRozXqH2U42A4YcUe5138YJLm XfRa0tXXgR5vNexFTQa7RQ7W4AknJNc3ugiJ8duIwV7UnVN4SNh4y4USahAExmWFO/Z3 h+fDXgi1wElvNo5f8bY8AaZiADMgsBTBcumzozC5524Ssl/6xsY1yxnjiVu3JSaHIKxQ GA0K3ifKSmmABa3qCXHDbGOMrX604Ex5YBrt9UgdzVY3tVDxt9+dvdV+xerurwPtIl/S ryYvSyVwweWtVqZanhSxVBNYs5ckd9yKqtVgdNFQy2KT9pqDaVXpsjtVssif1enR7YYm XRSA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@nifty.com header.s=dec2015msa header.b="UEo/OL5T"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p18si38502554pgb.469.2018.11.19.17.07.09; Mon, 19 Nov 2018 17:07:10 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@nifty.com header.s=dec2015msa header.b="UEo/OL5T"; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1732455AbeKTLdV (ORCPT + 32 others); Tue, 20 Nov 2018 06:33:21 -0500 Received: from conuserg-11.nifty.com ([210.131.2.78]:34065 "EHLO conuserg-11.nifty.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1732058AbeKTLdO (ORCPT ); Tue, 20 Nov 2018 06:33:14 -0500 Received: from pug.e01.socionext.com (p14092-ipngnfx01kyoto.kyoto.ocn.ne.jp [153.142.97.92]) (authenticated) by conuserg-11.nifty.com with ESMTP id wAK15ZEd029284; Tue, 20 Nov 2018 10:05:41 +0900 DKIM-Filter: OpenDKIM Filter v2.10.3 conuserg-11.nifty.com wAK15ZEd029284 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nifty.com; s=dec2015msa; t=1542675941; bh=NMzBvf7Uf/mcroQkxmHDTE9wi2Zk1t9cWFR9t5jzbfs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UEo/OL5T0IkD8dM6AYpu2WlSsebYq5WBxvpsz74pZwcfpSxJAyOR+s8U5ueThtKbq qbxfRCRqBXN/a38zfvxt1sA8qeEwQj5f76bk2HW0QEITeG43IcGmah9h7E/AMWpluP Hcd9vVpItWq8cZtbeoi5ZT/ylClPSbpb5tizeIZJw6rzhGU8/3EVp/WqQGFiygry89 HJY3EfgTYfgLJUa4tdqpZukBCvBFjRPauVJyKoX3rE40BqArs9/nIJ65lXmznDF6hc X9cbQOk1jOB4VLXcqciWuKkT3L6bZF3QvVFTKaVB0OROW2mFN0G0Y1CZiEEmUfx4qJ GZ9VFRpkFmOCg== X-Nifty-SrcIP: [153.142.97.92] From: Masahiro Yamada To: linux-kbuild@vger.kernel.org Cc: Sam Ravnborg , Nicolas Pitre , Rasmus Villemoes , Masahiro Yamada , Michal Marek , linux-kernel@vger.kernel.org Subject: [PATCH v2 6/9] kbuild: change if_changed_rule for multi-line recipe Date: Tue, 20 Nov 2018 10:05:27 +0900 Message-Id: <1542675930-21114-7-git-send-email-yamada.masahiro@socionext.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1542675930-21114-1-git-send-email-yamada.masahiro@socionext.com> References: <1542675930-21114-1-git-send-email-yamada.masahiro@socionext.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The 'define' ... 'endef' directive can describe a recipe that consists of multiple lines. For example, all: @echo hello @echo world ... can be written as: define greeting @echo hello @echo world endif all: $(greeting) This is useful to confine a series of shell commands into a single macro without losing readability. However, rule_cc_o_c and rule_as_o_S in scripts/Makefile.build are written like this (with a trailing semicolon in each cmd_*): define rule_cc_o_c [action1] ; \ [action2] ; \ [action3] ; endef All shell commands are concatenated with '; \' so that it looks like a single command from the Makefile point of view. This does not exploit the benefits of 'define' ... 'endef' form because a single shell command can be simply written, like this: rule_cc_o_c = \ [action1] ; \ [action2] ; \ [action3] ; I guess the intention for the command concatenation was to let the '@set -e' in if_changed_rule cover all the commands. We can improve the readability by moving '@set -e' to the 'cmd' macro. The combo of $(call echo-cmd,*) $(cmd_*) in rule_cc_o_c and rule_as_o_S have been replaced with $(call cmd,*). The trailing back-slashes have been removed. Here is a note about the performance: the commands in rule_cc_o_c and rule_as_o_S were previously executed all together in a single subshell, but now each line in a separate subshell. This means Make will spawn extra subshells [1]. I measured the build performance for x86_64_defconfig + CONFIG_MODVERSIONS + CONFIG_TRIM_UNUSED_KSYMS and I saw slight performance regression, but I believe code readability and maintainability wins. [1] Precisely, GNU Make may optimize this by executing the command directly instead of forking a subshell, if no shell special characters are found in the command line and omitting the subshell will not change the behavior. Signed-off-by: Masahiro Yamada --- Changes in v2: - Rewrite commit message more precisely, and mention about the build performance scripts/Kbuild.include | 6 ++---- scripts/Makefile.build | 22 +++++++++++----------- 2 files changed, 13 insertions(+), 15 deletions(-) -- 2.7.4 diff --git a/scripts/Kbuild.include b/scripts/Kbuild.include index 4b943f4..978d72b 100644 --- a/scripts/Kbuild.include +++ b/scripts/Kbuild.include @@ -215,7 +215,7 @@ echo-cmd = $(if $($(quiet)cmd_$(1)),\ echo ' $(call escsq,$($(quiet)cmd_$(1)))$(echo-why)';) # printing commands -cmd = @$(echo-cmd) $(cmd_$(1)) +cmd = @set -e; $(echo-cmd) $(cmd_$(1)) # Add $(obj)/ for paths that are not absolute objectify = $(foreach o,$(1),$(if $(filter /%,$(o)),$(o),$(obj)/$(o))) @@ -268,9 +268,7 @@ cmd_and_fixdep = \ # Usage: $(call if_changed_rule,foo) # Will check if $(cmd_foo) or any of the prerequisites changed, # and if so will execute $(rule_foo). -if_changed_rule = $(if $(strip $(any-prereq) $(arg-check) ), \ - @set -e; \ - $(rule_$(1)), @:) +if_changed_rule = $(if $(strip $(any-prereq) $(arg-check)), $(rule_$(1)), @:) ### # why - tell why a target got built diff --git a/scripts/Makefile.build b/scripts/Makefile.build index c23ee45..e445b3e 100644 --- a/scripts/Makefile.build +++ b/scripts/Makefile.build @@ -260,20 +260,20 @@ cmd_gen_ksymdeps = \ endif define rule_cc_o_c - $(call echo-cmd,checksrc) $(cmd_checksrc) \ - $(call cmd_and_fixdep,cc_o_c) \ - $(cmd_gen_ksymdeps) \ - $(cmd_checkdoc) \ - $(call echo-cmd,objtool) $(cmd_objtool) \ - $(cmd_modversions_c) \ - $(call echo-cmd,record_mcount) $(cmd_record_mcount) + $(call cmd,checksrc) + @$(call cmd_and_fixdep,cc_o_c) + $(call cmd,gen_ksymdeps) + $(call cmd,checkdoc) + $(call cmd,objtool) + $(call cmd,modversions_c) + $(call cmd,record_mcount) endef define rule_as_o_S - $(call cmd_and_fixdep,as_o_S) \ - $(cmd_gen_ksymdeps) \ - $(call echo-cmd,objtool) $(cmd_objtool) \ - $(cmd_modversions_S) + @$(call cmd_and_fixdep,as_o_S) + $(call cmd,gen_ksymdeps) + $(call cmd,objtool) + $(call cmd,modversions_S) endef # List module undefined symbols (or empty line if not enabled)