Skip to content
  • Martin Kelly's avatar
    tools: fix cross-compile var clobbering · 7ed1c190
    Martin Kelly authored
    Currently a number of Makefiles break when used with toolchains that
    pass extra flags in CC and other cross-compile related variables (such
    as --sysroot).
    
    Thus we get this error when we use a toolchain that puts --sysroot in
    the CC var:
    
      ~/src/linux/tools$ make iio
      [snip]
      iio_event_monitor.c:18:10: fatal error: unistd.h: No such file or directory
        #include <unistd.h>
                 ^~~~~~~~~~
    
    This occurs because we clobber several env vars related to
    cross-compiling with lines like this:
    
      CC = $(CROSS_COMPILE)gcc
    
    Although this will point to a valid cross-compiler, we lose any extra
    flags that might exist in the CC variable, which can break toolchains
    that rely on them (for example, those that use --sysroot).
    
    This easily shows up using a Yocto SDK:
    
      $ . [snip]/sdk/environment-setup-cortexa8hf-neon-poky-linux-gnueabi
    
      $ echo $CC
      arm-poky-linux-gnueabi-gcc -march=armv7-a -mfpu=neon -mfloat-abi=hard
      -mcpu=cortex-a8
      --sysroot=[snip]/sdk/sysroots/cortexa8hf-neon-poky-linux-gnueabi
    
      $ echo $CROSS_COMPILE
      arm-poky-linux-gnueabi-
    
      $ echo ${CROSS_COMPILE}gcc
      krm-poky-linux-gnueabi-gcc
    
    Although arm-poky-linux-gnueabi-gcc is a cross-compiler, we've lost the
    --sysroot and other flags that enable us to find the right libraries to
    link against, so we can't find unistd.h and other libraries and headers.
    Normally with the --sysroot flag we would find unistd.h in the sdk
    directory in the sysroot:
    
      $ find [snip]/sdk/sysroots -path '*/usr/include/unistd.h'
      [snip]/sdk/sysroots/cortexa8hf-neon-poky-linux-gnueabi/usr/include/unistd.h
    
    The perf Makefile adds CC = $(CROSS_COMPILE)gcc if and only if CC is not
    already set, and it compiles correctly with the above toolchain.
    
    So, generalize the logic that perf uses in the common Makefile and
    remove the manual CC = $(CROSS_COMPILE)gcc lines from each Makefile.
    
    Note that this patch does not fix cross-compile for all the tools (some
    have other bugs), but it does fix it for all except usb and acpi, which
    still have other unrelated issues.
    
    I tested both with and without the patch on native and cross-build and
    there appear to be no regressions.
    
    Link: http://lkml.kernel.org/r/20180107214028.23771-1-martin@martingkelly.com
    
    
    Signed-off-by: default avatarMartin Kelly <martin@martingkelly.com>
    Acked-by: default avatarMark Brown <broonie@kernel.org>
    Cc: Tejun Heo <tj@kernel.org>
    Cc: Li Zefan <lizefan@huawei.com>
    Cc: Johannes Weiner <hannes@cmpxchg.org>
    Cc: Linus Walleij <linus.walleij@linaro.org>
    Cc: "K. Y. Srinivasan" <kys@microsoft.com>
    Cc: Haiyang Zhang <haiyangz@microsoft.com>
    Cc: Stephen Hemminger <sthemmin@microsoft.com>
    Cc: Jonathan Cameron <jic23@kernel.org>
    Cc: Pali Rohar <pali.rohar@gmail.com>
    Cc: Richard Purdie <rpurdie@rpsys.net>
    Cc: Jacek Anaszewski <jacek.anaszewski@gmail.com>
    Cc: Pavel Machek <pavel@ucw.cz>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
    Cc: Robert Moore <robert.moore@intel.com>
    Cc: Lv Zheng <lv.zheng@intel.com>
    Cc: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Valentina Manea <valentina.manea.m@gmail.com>
    Cc: Shuah Khan <shuah@kernel.org>
    Cc: Mario Limonciello <mario.limonciello@dell.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    7ed1c190