From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by mx.groups.io with SMTP id smtpd.web11.6291.1575533893968797692 for ; Thu, 05 Dec 2019 00:18:14 -0800 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: intel.com, ip: 192.55.52.136, mailfrom: bob.c.feng@intel.com) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Dec 2019 00:18:13 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.69,280,1571727600"; d="scan'208";a="214059955" Received: from shwdepsi1121.ccr.corp.intel.com ([10.239.158.47]) by orsmga006.jf.intel.com with ESMTP; 05 Dec 2019 00:18:12 -0800 From: "Bob Feng" To: devel@edk2.groups.io Subject: [Patch 0/4 V4] Enhance Incremental Build Date: Thu, 5 Dec 2019 16:18:03 +0800 Message-Id: <20191205081807.15092-1-bob.c.feng@intel.com> X-Mailer: git-send-email 2.20.1.windows.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit V4: Move .deps files to where corresponding .obj file locate V3: Change CLANG9 to CLANGPDB according to commit 14672c34bd V2: Fixed a bug in patch 4/4. Incremental build reduces the build time by only building the module that need to update. Edk2 Build system is a Makefile based build system. The incrememtal build ability is provided by the Make program. But Edk2 build tool need to generate correct makefile to have Make program do incremental build correctly. The current solution in build tool to support incremental build is that build tool find out the include file list for each source file of a module, and in module's makefile, build tool add the include file list as the source file's dependency. In this way Make program can decide if it need to rebuild a source code by checking its dependency. This solution has 2 shortcommings, one is the process of finding include list is slow, the other is this method can't handle case that a MACRO in #include statement so the related source file is always built. This patch provides another method to support incremental build. That is to use c preprocessor and trim tool to generate dependency files for the source file. This method will save much time in AutoGen phase and handle MACRO in #include correctly. For C files: 1. MSVS. cl.exe has a build option /showIncludes to display include files on stdout. Build tool captures that messages and generate dependency files, .deps files. 2. CLANG and GCC -MMD -MF build option are used to generate dependency files by preprocessor. Build tool updates the .deps files. For ASL files: 1. Trim find out all the included files, which are asl specific include format, and generate .trim.deps file. 2. ASL PP use c preprocessor to find out all included files with #include format and generate a .deps file 3. build tool updates the .deps file For ASM files (.asm, .s or .nasm): 1. Trim find out all the included files, which are asm specific include format, and generate .trim.deps file. 2. ASM PP use c preprocessor to find out all included files with #include format and generate a deps file 3. build tool updates the .deps file Build tool add "include" instruction for those deps files in the Makefile. This patch does not support RVCT tool chain for the BZ https://bugzilla.tianocore.org/show_bug.cgi?id=1750 Feng, Bob C (4): BaseTools: Add build option for dependency file generation BaseTools: Generate dependent files for ASL and ASM files BaseTools: Update build_rule.txt to generate dependent files. BaseTools: Enhance Basetool for incremental build BaseTools/Conf/build_rule.template | 94 ++++--- BaseTools/Conf/tools_def.template | 173 ++++++------ BaseTools/Source/Python/AutoGen/GenMake.py | 83 ++---- .../Source/Python/AutoGen/IncludesAutoGen.py | 255 ++++++++++++++++++ .../Source/Python/AutoGen/ModuleAutoGen.py | 23 ++ BaseTools/Source/Python/Trim/Trim.py | 115 ++++++-- BaseTools/Source/Python/build/build.py | 63 ++++- 7 files changed, 588 insertions(+), 218 deletions(-) create mode 100644 BaseTools/Source/Python/AutoGen/IncludesAutoGen.py -- 2.20.1.windows.1