lkml.org 
[lkml]   [2015]   [Jul]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [PATCH 14/39] perf tools: Auto detecting kernel build directory
    Em Thu, Jul 09, 2015 at 12:35:17PM +0000, Wang Nan escreveu:
    > This patch detects kernel build directory using a embedded shell
    > script 'kbuild_detector', which does this by checking existence 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.

    What is the advantage of doing this using a hardcoded shell script,
    pipes, etc? Why not plain use some asprintf() for the pathnames to be
    tested, then check those, etc in plain C?

    I have applied everything up to 13/39, provided some coments to the
    others, will continue later today/tomorrow.

    Pushing what I have to perf/ebpf in my tree,

    Ah, please try, in your csets, to add the CC entries for the people you
    CC when posting the patches to lkml, so that, when I pull from your
    tree and then push to Ingo, people get notified, i.e. to follow the
    style we use in tip/ branches.

    Right now I am cherry-picking, but at some point I would like to do
    direct pulls.

    Thanks,

    - Arnaldo

    > Signed-off-by: Wang Nan <wangnan0@hauwei.com>
    > ---
    > 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 dca16e7..2ca2bd6 100644
    > --- a/tools/perf/util/llvm-utils.c
    > +++ b/tools/perf/util/llvm-utils.c
    > @@ -204,6 +204,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)
    > {
    > @@ -211,6 +256,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;
    >
    > @@ -228,10 +274,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
    > @@ -252,6 +304,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
    > @@ -261,6 +314,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


    \
     
     \ /
      Last update: 2015-07-14 00:01    [W:4.068 / U:0.056 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site