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 <[email protected]>
> ---
>  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
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to