Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp3335176imu; Mon, 17 Dec 2018 18:19:34 -0800 (PST) X-Google-Smtp-Source: AFSGD/WiWhGDpgAip7wm6YivjSCjZfRwstpBv5jfxX2KiTgVGsbVaLlYQ4dO0Mu9ggUGBXiMDz+P X-Received: by 2002:a63:1d59:: with SMTP id d25mr14485869pgm.180.1545099574550; Mon, 17 Dec 2018 18:19:34 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1545099574; cv=none; d=google.com; s=arc-20160816; b=xKSeYiXoAUHX81EtFlrNKWPDoWnDkUqZAQAe0T82VpGNQ+o2VLupqEpIBDeEKIQiD6 AK9HTnhMGBg+xyy194/wcQNR1hMyS8xO54SyVtda8YiM14sRqtuByJ03h0bpyZr6znYi IDu8lIfeAOBdIwYkEP6uz0fcFcE0g78cjOh8k283AKn3UY8dNBqzJYMUPo0zFVP9BDVC 3pUVKJCkV2HFHY3XFGlMH1iIM9uV39ewejV9lrpsuncLcnL279wjKNrkZkm+bjDtULRO JA09TyINLDWLIcq1ywXyQXuPtJR9So1Ft+z76LbDZOvnSoszHY9xHtf/h0S89gEkVDqH YZmw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature:dkim-filter; bh=VzYyZlBs9l9a4wKUe+GOU2F9FqBEVqzHNMXtuwDeOwM=; b=EEqwJx+nwfDx6CznDUpe8oUDq4MaEB44y5ZvdViHp0OqeIP465uK2tH14XDGL3I1aF KBouaKj2cKNhQ/CMMHKwJdEde7s1PH/Zf51LAuQwm4+JEJQUW8K6ti0eilKICvgnti0v yth3YXZLbIyyKKCYWnsxOxiPzHH0vSp77dhPWjG6NUwY8pj5WMHMMvW6rgYoVbb814H9 2uFowV0ifRlYoVhPlNvmKckBqxRAkibRqhrVUdp5or7kCC0dfXDY7GxW2Ylj7bbiutyT j6cADW0Ra8JP/fZhmddl58BzuF6J7YTLVzrKM5VPRYJdN8GOupCZN/8bkwwv3eH50rmD YUpQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@nifty.com header.s=dec2015msa header.b=HMR5bTEU; 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 x10si3607128pgl.209.2018.12.17.18.19.18; Mon, 17 Dec 2018 18:19:34 -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=HMR5bTEU; 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 S1726420AbeLRCS3 (ORCPT + 99 others); Mon, 17 Dec 2018 21:18:29 -0500 Received: from conssluserg-06.nifty.com ([210.131.2.91]:40861 "EHLO conssluserg-06.nifty.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726295AbeLRCS2 (ORCPT ); Mon, 17 Dec 2018 21:18:28 -0500 Received: from mail-vk1-f172.google.com (mail-vk1-f172.google.com [209.85.221.172]) (authenticated) by conssluserg-06.nifty.com with ESMTP id wBI2IBtk004163; Tue, 18 Dec 2018 11:18:12 +0900 DKIM-Filter: OpenDKIM Filter v2.10.3 conssluserg-06.nifty.com wBI2IBtk004163 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nifty.com; s=dec2015msa; t=1545099492; bh=VzYyZlBs9l9a4wKUe+GOU2F9FqBEVqzHNMXtuwDeOwM=; h=References:In-Reply-To:From:Date:Subject:To:Cc:From; b=HMR5bTEUqaGe3jwKM9p4RShBtgirwR8HAGNfBHzi4ac2ANfX7V0T69/jk9Fa+R9T4 IoMBdNt18co1hUyT6imHxO1JH/OWU08AK6GOoRT5dsHhxlu18VJeuEAZf8dFMhGiAo rLn4TGXE2/qqcWvmr6F2ydqyzD09oEEwLieIKzttz8Zpe4QAux8MrWFEGjCCGoEZ0X 973PkJ0MJnFO0BiwxFG8OrcDcuSXZrPjL/UBJZuzqRCkI9Qqn5kI7jl4Ku7DJF6SP/ d83vF2g3TSZnYI/KoWAaB8C1k1ERq3FzdTJyhx4IGvkifcRHSY5tBp0RaGr1ydvv0e uF3jpRTXTdtlA== X-Nifty-SrcIP: [209.85.221.172] Received: by mail-vk1-f172.google.com with SMTP id 185so1658788vkc.3; Mon, 17 Dec 2018 18:18:12 -0800 (PST) X-Gm-Message-State: AA+aEWZdCWI4g5gg2RnmdNUVPyWo7XHLPRg7fNWQg0wHneQ4jZYYdKuP fZRwDc9RB1swQfyMNTp8BFsY/0KJTK3nrtWjGe4= X-Received: by 2002:a1f:4d47:: with SMTP id a68mr6764028vkb.34.1545099491241; Mon, 17 Dec 2018 18:18:11 -0800 (PST) MIME-Version: 1.0 References: <20181206222318.218157-1-tmroeder@google.com> <20181217214022.GA38778@google.com> In-Reply-To: <20181217214022.GA38778@google.com> From: Masahiro Yamada Date: Tue, 18 Dec 2018 11:17:35 +0900 X-Gmail-Original-Message-ID: Message-ID: Subject: Re: [PATCH] scripts: add a tool to produce a compile_commands.json file To: Tom Roeder Cc: Michal Marek , Linux Kbuild mailing list , Linux Kernel Mailing List Content-Type: text/plain; charset="UTF-8" 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 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. I do not care about this tool much. I will queue up this patch shortly if it is OK with you. 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