Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754683AbbFLFk3 (ORCPT ); Fri, 12 Jun 2015 01:40:29 -0400 Received: from szxga02-in.huawei.com ([119.145.14.65]:11070 "EHLO szxga02-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753081AbbFLFgk (ORCPT ); Fri, 12 Jun 2015 01:36:40 -0400 From: Wang Nan To: , , , , , , , , , , CC: , , , , Subject: [RFC PATCH v7 26/37] perf tools: Auto detecting kernel build directory Date: Fri, 12 Jun 2015 05:35:34 +0000 Message-ID: <1434087345-127225-27-git-send-email-wangnan0@huawei.com> X-Mailer: git-send-email 1.8.3.4 In-Reply-To: <1434087345-127225-1-git-send-email-wangnan0@huawei.com> References: <1434087345-127225-1-git-send-email-wangnan0@huawei.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [10.107.197.200] X-CFilter-Loop: Reflected Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3586 Lines: 123 This patch detects kernel build directory using a embedded shell script 'kbuild_detector', which does this by checking existance of include/generated/autoconf.h. clang working directory is changed to kbuild directory if it is found, to help user use relative include path. Following patch will detect kernel include directory, which contains relative include patch so this workdir changing is needed. Users are allowed to set 'kbuild-dir = ""' manually to disable this checking. Signed-off-by: Wang Nan --- tools/perf/util/llvm-utils.c | 56 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) diff --git a/tools/perf/util/llvm-utils.c b/tools/perf/util/llvm-utils.c index c01decd..7b2217a 100644 --- a/tools/perf/util/llvm-utils.c +++ b/tools/perf/util/llvm-utils.c @@ -201,6 +201,51 @@ version_notice(void) ); } +static const char *kbuild_detector = +"#!/usr/bin/env sh\n" +"DEFAULT_KBUILD_DIR=/lib/modules/`uname -r`/build\n" +"if test -z \"$KBUILD_DIR\"\n" +"then\n" +" KBUILD_DIR=$DEFAULT_KBUILD_DIR\n" +"fi\n" +"if test -f $KBUILD_DIR/include/generated/autoconf.h\n" +"then\n" +" echo -n $KBUILD_DIR\n" +" exit 0\n" +"fi\n" +"exit -1\n"; + +static inline void +get_kbuild_opts(char **kbuild_dir) +{ + int err; + + if (!kbuild_dir) + return; + + *kbuild_dir = NULL; + + if (llvm_param.kbuild_dir && !llvm_param.kbuild_dir[0]) { + pr_debug("[llvm.kbuild-dir] is set to \"\" deliberately.\n"); + pr_debug("Skip kbuild options detection.\n"); + return; + } + + force_set_env("KBUILD_DIR", llvm_param.kbuild_dir); + force_set_env("KBUILD_OPTS",llvm_param.kbuild_opts); + err = read_from_pipe(kbuild_detector, + ((void **)kbuild_dir), + NULL); + if (err) { + pr_warning( +"WARNING:\tunable to get correct kernel building directory.\n" +"Hint:\tSet correct kbuild directory using 'kbuild-dir' option in [llvm]\n" +" \tsection of ~/.perfconfig or set it to \"\" to suppress kbuild\n" +" \tdetection.\n\n"); + return; + } +} + int llvm__compile_bpf(const char *path, void **p_obj_buf, size_t *p_obj_buf_sz) { @@ -208,6 +253,7 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf, char clang_path[PATH_MAX]; const char *clang_opt = llvm_param.clang_opt; const char *template = llvm_param.clang_bpf_cmd_template; + char *kbuild_dir = NULL; void *obj_buf = NULL; size_t obj_buf_sz; @@ -225,10 +271,16 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf, return -ENOENT; } + /* + * This is an optional work. Even it fail we can continue our + * work. Needn't to check error return. + */ + get_kbuild_opts(&kbuild_dir); + force_set_env("CLANG_EXEC", clang_path); force_set_env("CLANG_OPTIONS", clang_opt); force_set_env("KERNEL_INC_OPTIONS", NULL); - force_set_env("WORKING_DIR", "."); + force_set_env("WORKING_DIR", kbuild_dir ? : "."); /* * Since we may reset clang's working dir, path of source file @@ -249,6 +301,7 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf, goto errout; } + free(kbuild_dir); if (!p_obj_buf) free(obj_buf); else @@ -258,6 +311,7 @@ int llvm__compile_bpf(const char *path, void **p_obj_buf, *p_obj_buf_sz = obj_buf_sz; return 0; errout: + free(kbuild_dir); free(obj_buf); if (p_obj_buf) *p_obj_buf = NULL; -- 1.8.3.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/