Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp4099210imu; Tue, 18 Dec 2018 09:03:03 -0800 (PST) X-Google-Smtp-Source: AFSGD/UGG08le/XQ4cBh0RVPcDyHKNQPgIM3f1jiofeHRES7DUIW6pBGw9NX3H1Bwf1/h4iOZHsH X-Received: by 2002:a17:902:20e9:: with SMTP id v38mr16305976plg.250.1545152583595; Tue, 18 Dec 2018 09:03:03 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1545152583; cv=none; d=google.com; s=arc-20160816; b=mNOdDAQheT86xN85g4nMGDJG6YjLwLlAVqM6qfD4IQ80WCcbe7arabBzpMLknejrtt HW8i846iAJZ75RIUvWSZvr1w4Ta1dwBkC4RdNGWVV2E7Bm8Bun140BlrlNAZVH963+11 4D6lrSshguRsWogpGNiDC0hs6V6AYHKKpKQs0/6NRHzMdwEiazLIzcZNzu2f/cN80ZhL py5K8vTLrYnJkjQz4RRJt5Sd3G+4vQmg3fGOtqmwNUHnb9WurR223AdFziz3j66o+4rm IlYe2kkEt9rlnEyYoRi8WeynvnQ5OCE8um5mganEsNBj+X8mIzqAijI/qDxx0WgJ8Lpd mepQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature; bh=wKfBD+1TWHumVfsMrPC4aOQgIX8YOMlpHV8EfXJQskI=; b=uaWHmt/3GJbbjNenQrd1m92fpMSqE1wq8cUTVVvKRuoAa5f21qOyGb8QEklmOuIb5K 7oSAF43brUa4u0ZgQwTQc2ysBJy9y00qiL6bmoWSZZ8bS7P966GqgQ3Sw7AZfZY5liQS uJWmNevjxsU94zEWh4/P9mppFE7TVFqdKSxr9uSObvzoKS6vwybNnkL/cErY7q8NRKiL 45LhTz1jOZYDO1DwSydHfYSWhAS052+tSPbH9Gcin3UxWucwSPCl1LHvjq2Ync8MgpP3 L0FSSqLtNXuJLph72jJgyx6D2H67DqwgO4qlbRHIh9qa/d9qns+RwUpGdkFuyzvDEN1V /mPw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@google.com header.s=20161025 header.b=NZRO0WBO; 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; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 64si11400091ply.372.2018.12.18.09.02.20; Tue, 18 Dec 2018 09:03:03 -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=@google.com header.s=20161025 header.b=NZRO0WBO; 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; dmarc=pass (p=REJECT sp=REJECT dis=NONE) header.from=google.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727121AbeLRRBC (ORCPT + 99 others); Tue, 18 Dec 2018 12:01:02 -0500 Received: from mail-pl1-f194.google.com ([209.85.214.194]:44515 "EHLO mail-pl1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726422AbeLRRBC (ORCPT ); Tue, 18 Dec 2018 12:01:02 -0500 Received: by mail-pl1-f194.google.com with SMTP id e11so7434734plt.11 for ; Tue, 18 Dec 2018 09:01:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20161025; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=wKfBD+1TWHumVfsMrPC4aOQgIX8YOMlpHV8EfXJQskI=; b=NZRO0WBOmXYaCt2QaGafqiwF560MwTfn8c9bS3YlTlZ9ETPzDCXoiucWxPUTIC8Dqv e+71xa9Ms4uoxIEVBNjUHuQ/e68465/EKuWyRUhRTId9vOInTl7W2ql2HWQz6ZhaY+he qV/Ki/qcDHvcjfiPnPyOHetRCmwR5PXsBoAfXWAYSydqLCLiPIIakO3RFud65WQf3yau +vPcUOOO1jQ04NBo49CRRWPH9ARxYP0uMdnZ2XMS3I0f/uc0tZYRvAwe/zNNztM7HTjo UZKN1JNG5/9VGQu1cTTMrM/RkGqXQ7iJtNurEetzIPXjbdHQWemq+NiJibYhvcKbW7VH OYsQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=wKfBD+1TWHumVfsMrPC4aOQgIX8YOMlpHV8EfXJQskI=; b=GTCvthriy+g+0CXq268Fa3PnubWdiLBDNwq+08TQorUP7LTl5BMR8U060AALr+Skvi c0T4BxxJruOF1doJVB9qUhFKzwRwG7IClzw4WZbvhEnymPuolr4+AjCHPJync10OOrfh pq3OX645zK6BD2SfFwlcQ43C8ojfR+ZoFKpGRpOM1QXYSs4pFyL8lpOGbNzJHCC7oVzH 24ytdcVZsBH+QN8brLesLBOI3vg5uAmpH2fyvRp4EXPL9OSbKmvt5A11SldSNAaZnjmU KYxwxJDCSDdlDGOJD+HepDS1B2L79Gfek6QORxPq5EmORTXIIXkpoEixn/AeHZYJYIz+ OK/w== X-Gm-Message-State: AA+aEWYUODuNT2gYOaYtuLQGW9W3njfY9YWzeZn2+5nuM0uy9riBXEyG 8X2T+R5GGJojKCZ0hIn9ItwPbw== X-Received: by 2002:a17:902:3064:: with SMTP id u91mr16785746plb.325.1545152461384; Tue, 18 Dec 2018 09:01:01 -0800 (PST) Received: from google.com ([2620:15c:17:4:f0b1:8ff5:16a0:5f15]) by smtp.gmail.com with ESMTPSA id e16sm20838794pfn.46.2018.12.18.09.00.59 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Tue, 18 Dec 2018 09:01:00 -0800 (PST) Date: Tue, 18 Dec 2018 09:00:55 -0800 From: Tom Roeder To: Masahiro Yamada Cc: Michal Marek , Linux Kbuild mailing list , Linux Kernel Mailing List Subject: Re: [PATCH] scripts: add a tool to produce a compile_commands.json file Message-ID: <20181218170055.GA7794@google.com> References: <20181206222318.218157-1-tmroeder@google.com> <20181217214022.GA38778@google.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.10.1 (2018-07-13) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Dec 18, 2018 at 11:17:35AM +0900, Masahiro Yamada wrote: > On Tue, Dec 18, 2018 at 8:21 AM Tom Roeder wrote: > > > > On Sat, Dec 15, 2018 at 06:37:49PM +0900, Masahiro Yamada wrote: > > > On Fri, Dec 7, 2018 at 7:24 AM Tom Roeder wrote: > > > > > > > > The LLVM/Clang project provides many tools for analyzing C source code. > > > > Many of these tools are based on LibTooling > > > > (https://clang.llvm.org/docs/LibTooling.html), which depends on a > > > > database of compiler flags. The standard container for this database is > > > > compile_commands.json, which consists of a list of JSON objects, each > > > > with "directory", "file", and "command" fields. > > > > > > > > Some build systems, like cmake or bazel, produce this compilation > > > > information directly. Naturally, Makefiles don't. However, the kernel > > > > makefiles already create ..o.cmd files that contain all the > > > > information needed to build a compile_commands.json file. > > > > > > > > So, this commit adds scripts/gen_compile_commands.py, which recursively > > > > searches through a directory for ..o.cmd files and extracts > > > > appropriate compile commands from them. It writes a > > > > compile_commands.json file that LibTooling-based tools can use. > > > > > > > > By default, gen_compile_commands.py starts its search in its working > > > > directory and (over)writes compile_commands.json in the working > > > > directory. However, it also supports --output and --directory flags for > > > > out-of-tree use. > > > > > > > > Note that while gen_compile_commands.py enables the use of clang-based > > > > tools, it does not require the kernel to be compiled with clang. E.g., > > > > the following sequence of commands produces a compile_commands.json file > > > > that works correctly with LibTooling. > > > > > > > > make defconfig > > > > make > > > > scripts/gen_compile_commands.py > > > > > > > > Also note that this script is written to work correctly in both Python 2 > > > > and Python 3, so it does not specify the Python version in its first > > > > line. > > > > > > > > For an example of the utility of this script: after running > > > > gen_compile_commands.json on the latest kernel version, I was able to > > > > use Vim + the YouCompleteMe pluging + clangd to automatically jump to > > > > definitions and declarations. Obviously, cscope and ctags provide some > > > > of this functionality; the advantage of supporting LibTooling is that it > > > > opens the door to many other clang-based tools that understand the code > > > > directly and do not rely on regular expressions and heuristics. > > > > > > > > Tested: Built several recent kernel versions and ran the script against > > > > them, testing tools like clangd (for editor/LSP support) and clang-check > > > > (for static analysis). Also extracted some test .cmd files from a kernel > > > > build and wrote a test script to check that the script behaved correctly > > > > with all permutations of the --output and --directory flags. > > > > > > > > Signed-off-by: Tom Roeder > > > > > > > > > I am fine with this, > > > but I have one question. > > > > > > The generated compile_commands.json > > > contains $(pound) > > > > To make sure we're talking about the same thing: the instances that I've > > seen of "#" occur in macro definitions in the "command" field in some of > > the JSON objects. For example, I see things like > > -D\"KBUILD_STR(s)=\\#s\". > > > > When I ran this tool against the latest kernel > (specifically, since commit 9564a8cf) > I saw the following in "command" field. > > -D\"BUILD_STR(s)=$(pound)s\" > > > I am not sure whether it is a problem or not. Thanks! I can reproduce this; I see this happening in, e.g., objtool's .cmd files. I guess I failed to test recent enough versions of the kernel or didn't notice this case. It looks like that commit changes the handling of the pound sign in .cmd files, so it's highly relevant. > > I do not care about this tool much. > I will queue up this patch shortly if it is OK with you. I'd like this tool to work properly on those files, so please don't queue up the patch yet. I'll get it to handle the "$(pound)" case and send a revised patch. > > > Thanks. > > > > > > > > How is it handled? > > > > The Python json module takes care of escaping the output to make a valid > > JSON string for the "command" field. The gen_compile_commands.py script > > doesn't take any special action for that or any other character in its > > output. > > > > > Should it be replaced with '\#' ? > > > > I don't think it needs to be changed, given my experience with this > > script and its testing so far: the output seems to work for me. However, > > are you running into problems due to the presence of this character or > > inadequate escaping? Please let me know, and I'd be happy to look into > > it. > > > > Tom > > > > -- > Best Regards > Masahiro Yamada