From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mails.dpdk.org (mails.dpdk.org [217.70.189.124]) by inbox.dpdk.org (Postfix) with ESMTP id A212BA0524; Fri, 5 Feb 2021 16:27:25 +0100 (CET) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 1F3C640682; Fri, 5 Feb 2021 16:27:25 +0100 (CET) Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by mails.dpdk.org (Postfix) with ESMTP id 8735D4067B for ; Fri, 5 Feb 2021 16:27:22 +0100 (CET) IronPort-SDR: ECQn+4NOMxJ1KSqQeadbSDtHwFr/WErAXCvVWolr/QYreDgk/trtCMU7hrwauUV9b/b29hoq4f qf7/MLQrm6Zg== X-IronPort-AV: E=McAfee;i="6000,8403,9885"; a="266274708" X-IronPort-AV: E=Sophos;i="5.81,155,1610438400"; d="scan'208";a="266274708" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Feb 2021 07:27:20 -0800 IronPort-SDR: h0zFYSpa4iSirw+3Tib/XIROeqf7By/nilzyuazzXeUubje5/QlUF65ea4hPFP5RhKZr0aTVkt RS5K4ZBexNDw== X-IronPort-AV: E=Sophos;i="5.81,155,1610438400"; d="scan'208";a="393907464" Received: from bricha3-mobl.ger.corp.intel.com ([10.252.23.143]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-SHA; 05 Feb 2021 07:27:17 -0800 Date: Fri, 5 Feb 2021 15:27:13 +0000 From: Bruce Richardson To: Juraj =?utf-8?Q?Linke=C5=A1?= Cc: thomas@monjalon.net, Ruifeng.Wang@arm.com, Honnappa.Nagarahalli@arm.com, jerinjacobk@gmail.com, hemant.agrawal@nxp.com, ferruh.yigit@intel.com, aboyer@pensando.io, dev@dpdk.org, david.marchand@redhat.com, bluca@debian.org Message-ID: <20210205152713.GD1462@bricha3-MOBL.ger.corp.intel.com> References: <1612536397-18008-1-git-send-email-juraj.linkes@pantheon.tech> <1612537472-18192-1-git-send-email-juraj.linkes@pantheon.tech> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1612537472-18192-1-git-send-email-juraj.linkes@pantheon.tech> Subject: Re: [dpdk-dev] [RFC PATCH v4] build: kni cross-compilation support X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" On Fri, Feb 05, 2021 at 04:04:32PM +0100, Juraj Linkeš wrote: > The kni linux module is using a custom target for building, which > doesn't take into account any cross compilation arguments. The arguments > in question are ARCH, CROSS_COMPILE (for gcc, clang) and CC, LD (for > clang). Get those from the cross file and pass them to the custom > target. > > The user supplied path may not contain the 'build' directory, such as > when using cross-compiled headers, so only append that in the default > case (when no path is supplied in native builds) and use the unmodified > path from the user otherwise. Also modify the install path accordingly. > > Signed-off-by: Juraj Linkeš > --- Thanks, this all looks ok to me now, bar one very minor nit below. Doing a native build on my system with the running kernel also works fine. However, the bigger question is one of compatibility for this change. The current documentation for the kernel_dir option is: option('kernel_dir', type: 'string', value: '', description: 'Path to the kernel for building kernel modules. \ Headers must be in $kernel_dir/build. Modules will be installed \ in $DEST_DIR/$kernel_dir/extra/dpdk.') Obviously the description now needs an update to reflect the new use, but I'm not sure if changing the behaviour counts as an "ABI" change or not, and whether it needs to wait for a new LTS release. Any scripts that were compiling using e.g. kernel_dir='/lib/modules/' need to be changed to use kernel_dir='/lib/modules//build' instead. /Bruce > kernel/linux/kni/meson.build | 8 ++-- > kernel/linux/meson.build | 80 ++++++++++++++++++++++++++++++------ > 2 files changed, 71 insertions(+), 17 deletions(-) > > diff --git a/kernel/linux/kni/meson.build b/kernel/linux/kni/meson.build > index 07e0c9dae7..46b71c7418 100644 > --- a/kernel/linux/kni/meson.build > +++ b/kernel/linux/kni/meson.build > @@ -13,7 +13,7 @@ kni_sources = files( > custom_target('rte_kni', > input: kni_sources, > output: 'rte_kni.ko', > - command: ['make', '-j4', '-C', kernel_dir + '/build', > + command: ['make', '-j4', '-C', kernel_build_dir, > 'M=' + meson.current_build_dir(), > 'src=' + meson.current_source_dir(), > 'MODULE_CFLAGS=-include ' + meson.source_root() + '/config/rte_config.h' + > @@ -21,8 +21,8 @@ custom_target('rte_kni', > ' -I' + meson.source_root() + '/lib/librte_kni' + > ' -I' + meson.build_root() + > ' -I' + meson.current_source_dir(), > - 'modules'], > + 'modules'] + cross_args, > depends: kni_mkfile, > - install: true, > - install_dir: kernel_dir + '/extra/dpdk', > + install: install, > + install_dir: kernel_install_dir, > build_by_default: get_option('enable_kmods')) > diff --git a/kernel/linux/meson.build b/kernel/linux/meson.build > index 5c864a4653..7acb52944f 100644 > --- a/kernel/linux/meson.build > +++ b/kernel/linux/meson.build > @@ -3,25 +3,79 @@ > > subdirs = ['kni'] > > -# if we are cross-compiling we need kernel_dir specified > -if get_option('kernel_dir') == '' and meson.is_cross_build() > - error('Need "kernel_dir" option for kmod compilation when cross-compiling') > -endif > +kernel_build_dir = get_option('kernel_dir') > +install = not meson.is_cross_build() > +cross_args = [] > +kernel_install_dir = '' Minor nit, I'd have kernel_install_dir immediately after kernel_build_dir in the list above. > > -kernel_dir = get_option('kernel_dir') > -if kernel_dir == '' > - # use default path for native builds > +if not meson.is_cross_build() > + # native build > kernel_version = run_command('uname', '-r').stdout().strip() > - kernel_dir = '/lib/modules/' + kernel_version > + kernel_install_dir = '/lib/modules/' + kernel_version + '/extra/dpdk' > + if kernel_build_dir == '' > + # use default path for native builds > + kernel_build_dir = '/lib/modules/' + kernel_version + '/build' > + endif > + > + # test running make in kernel directory, using "make kernelversion" > + make_returncode = run_command('make', '-sC', kernel_build_dir, > + 'kernelversion').returncode() > + if make_returncode != 0 > + error('Cannot compile kernel modules as requested - are kernel headers installed?') > + endif > + > + # DO ACTUAL MODULE BUILDING > + foreach d:subdirs > + subdir(d) > + endforeach > + > + subdir_done() > endif > > -# test running make in kernel directory, using "make kernelversion" > -make_returncode = run_command('make', '-sC', kernel_dir + '/build', > - 'kernelversion').returncode() > -if make_returncode != 0 > - error('Cannot compile kernel modules as requested - are kernel headers installed?') > +# cross build > +# if we are cross-compiling we need kernel_build_dir specified > +if kernel_build_dir == '' > + error('Need "kernel_dir" option for kmod compilation when cross-compiling') > +endif > +cross_compiler = find_program('c').path() > +if cross_compiler.endswith('gcc') > + cross_prefix = run_command([py3, '-c', 'print("' + cross_compiler + '"[:-3])']).stdout().strip() > +elif cross_compiler.endswith('clang') > + cross_prefix = '' > + found_target = false > + # search for '-target' and use the arg that follows > + # (i.e. the value of '-target') as cross_prefix > + foreach cross_c_arg : meson.get_cross_property('c_args') > + if found_target and cross_prefix == '' > + cross_prefix = cross_c_arg > + endif > + if cross_c_arg == '-target' > + found_target = true > + endif > + endforeach > + if cross_prefix == '' > + error('Didn\'t find -target and its value in' + > + ' c_args in input cross-file.') > + endif > + linker = 'lld' > + foreach cross_c_link_arg : meson.get_cross_property('c_link_args') > + if cross_c_link_arg.startswith('-fuse-ld') > + linker = cross_c_link_arg.split('=')[1] > + endif > + endforeach > + cross_args += ['CC=@0@'.format(cross_compiler), 'LD=ld.@0@'.format(linker)] > +else > + error('Unsupported cross compiler: @0@'.format(cross_compiler)) > endif > > +cross_arch = host_machine.cpu_family() > +if host_machine.cpu_family() == 'aarch64' > + cross_arch = 'arm64' > +endif > + > +cross_args += ['ARCH=@0@'.format(cross_arch), > + 'CROSS_COMPILE=@0@'.format(cross_prefix)] > + > # DO ACTUAL MODULE BUILDING > foreach d:subdirs > subdir(d) > -- > 2.20.1 >