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 85B99A0A0F; Wed, 30 Jun 2021 15:09:16 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2825D40141; Wed, 30 Jun 2021 15:09:16 +0200 (CEST) Received: from lb.pantheon.sk (lb.pantheon.sk [46.229.239.20]) by mails.dpdk.org (Postfix) with ESMTP id 6FFCC40040 for ; Wed, 30 Jun 2021 15:09:14 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by lb.pantheon.sk (Postfix) with ESMTP id 528A3D2624; Wed, 30 Jun 2021 15:09:13 +0200 (CEST) X-Virus-Scanned: amavisd-new at siecit.sk Received: from lb.pantheon.sk ([127.0.0.1]) by localhost (lb.pantheon.sk [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Z7FceB9j7oFF; Wed, 30 Jun 2021 15:09:11 +0200 (CEST) Received: from service-node1.lab.pantheon.local (unknown [46.229.239.141]) by lb.pantheon.sk (Postfix) with ESMTP id 71F1BCF1DE; Wed, 30 Jun 2021 15:09:10 +0200 (CEST) From: =?UTF-8?q?Juraj=20Linke=C5=A1?= To: thomas@monjalon.net, david.marchand@redhat.com, bruce.richardson@intel.com, Honnappa.Nagarahalli@arm.com, Ruifeng.Wang@arm.com, ferruh.yigit@intel.com, jerinjacobk@gmail.com Cc: dev@dpdk.org, =?UTF-8?q?Juraj=20Linke=C5=A1?= Date: Wed, 30 Jun 2021 15:09:10 +0200 Message-Id: <1625058550-9567-1-git-send-email-juraj.linkes@pantheon.tech> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1618906101-2075-1-git-send-email-juraj.linkes@pantheon.tech> References: <1618906101-2075-1-git-send-email-juraj.linkes@pantheon.tech> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Subject: [dpdk-dev] [PATCH v6] build: use platform for generic and native builds 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" The current meson option 'machine' should only specify the ISA, which is not sufficient for Arm, where setting ISA implies other settings as well (and is used in Arm configuration as such). Use the existing 'platform' meson option to differentiate the type of the build (native/generic) and set ISA accordingly, unless the user chooses to override it with a new option, 'cpu_instruction_set'. The 'machine' option set the ISA in x86 builds and set native/default 'build type' in aarch64 builds. These two new variables, 'platform' and 'cpu_instruction_set', now properly set both ISA and build type for all architectures in a uniform manner. The 'machine' option also doesn't describe very well what it sets. The new option, 'cpu_instruction_set', is much more descriptive. Keep 'machine' for backwards compatibility. Signed-off-by: Juraj Linkeš --- config/arm/meson.build | 33 ++++++++++------- config/meson.build | 55 +++++++++++++++++++++-------- config/ppc/meson.build | 2 +- devtools/test-meson-builds.sh | 9 ++--- doc/guides/linux_gsg/build_dpdk.rst | 33 ++++++++++++++++- meson_options.txt | 10 +++--- 6 files changed, 104 insertions(+), 38 deletions(-) diff --git a/config/arm/meson.build b/config/arm/meson.build index 9b147c0b93..77ee5fabfc 100644 --- a/config/arm/meson.build +++ b/config/arm/meson.build @@ -380,19 +380,23 @@ if dpdk_conf.get('RTE_ARCH_32') machine_args += '-mfpu=neon' else # aarch64 build - soc = get_option('platform') + # for backwards compatibility: + # machine=native is the same behavior as platform=native + # machine=generic/default is the same as platform=generic + if machine != 'auto' + # cpu_instruction_set holds the proper value - native, generic or cpu + # the old behavior only distinguished between generic and native build + if cpu_instruction_set == 'generic' + soc = 'generic' + else + soc = 'native' + endif + else + soc = platform + endif soc_config = {} if not meson.is_cross_build() - if machine == 'generic' - # generic build - if soc != '' - error('Building for a particular platform is unsupported with generic build.') - endif - implementer_id = 'generic' - part_number = 'generic' - elif soc != '' - soc_config = socs.get(soc, {'not_supported': true}) - else + if soc == 'native' # native build # The script returns ['Implementer', 'Variant', 'Architecture', # 'Primary Part number', 'Revision'] @@ -406,6 +410,9 @@ else else error('Error when getting Arm Implementer ID and part number.') endif + else + # SoC build + soc_config = socs.get(soc, {'not_supported': true}) endif else # cross build @@ -437,7 +444,7 @@ else else error('Unsupported Arm implementer: @0@. '.format(implementer_id) + 'Please add support for it or use the generic ' + - '(-Dmachine=generic) build.') + '(-Dplatform=generic) build.') endif message('Arm implementer: ' + implementer_config['description']) @@ -452,7 +459,7 @@ else error('Unsupported part number @0@ of implementer @1@. ' .format(part_number, implementer_id) + 'Please add support for it or use the generic ' + - '(-Dmachine=generic) build.') + '(-Dplatform=generic) build.') endif # add/overwrite flags in the proper order diff --git a/config/meson.build b/config/meson.build index 017bb2efbb..77826452b4 100644 --- a/config/meson.build +++ b/config/meson.build @@ -65,43 +65,68 @@ endif disable_drivers = '' enable_drivers = '' -# set the machine type and cflags for it +platform = get_option('platform') + +# set the cpu_instruction_set and cflags for it if meson.is_cross_build() - machine = host_machine.cpu() + cpu_instruction_set = host_machine.cpu() else + cpu_instruction_set = get_option('cpu_instruction_set') machine = get_option('machine') + if machine != 'auto' + warning('The "machine" option is deprecated. ' + + 'Please use "cpu_instruction_set" instead.') + if cpu_instruction_set != 'auto' + error('Setting both "machine" and ' + + '"cpu_instruction_set" is unsupported.') + endif + cpu_instruction_set = machine + if cpu_instruction_set == 'default' + cpu_instruction_set = 'generic' + endif + endif +endif + +if platform == 'native' + if cpu_instruction_set == 'auto' + cpu_instruction_set = 'native' + endif +elif platform == 'generic' + if cpu_instruction_set == 'auto' + cpu_instruction_set = 'generic' + endif endif -# machine type 'generic' is special, it selects the per arch agreed common -# minimal baseline needed for DPDK. Machine type 'default' is also supported -# with the same meaning for backwards compatibility. +# cpu_instruction_set 'generic' is special, it selects the per arch agreed +# common minimal baseline needed for DPDK. cpu_instruction_set 'default' is +# also supported with the same meaning for backwards compatibility. # That might not be the most optimized, but the most portable version while # still being able to support the CPU features required for DPDK. # This can be bumped up by the DPDK project, but it can never be an # invariant like 'native' -if machine == 'default' or machine == 'generic' +if cpu_instruction_set == 'generic' if host_machine.cpu_family().startswith('x86') - # matches the old pre-meson build systems generic machine - machine = 'corei7' + # matches the old pre-meson build systems generic cpu_instruction_set + cpu_instruction_set = 'corei7' elif host_machine.cpu_family().startswith('arm') - machine = 'armv7-a' + cpu_instruction_set = 'armv7-a' elif host_machine.cpu_family().startswith('aarch') # arm64 manages generic config in config/arm/meson.build - machine = 'generic' + cpu_instruction_set = 'generic' elif host_machine.cpu_family().startswith('ppc') - machine = 'power8' + cpu_instruction_set = 'power8' endif endif -dpdk_conf.set('RTE_MACHINE', machine) +dpdk_conf.set('RTE_MACHINE', cpu_instruction_set) machine_args = [] # ppc64 does not support -march= at all, use -mcpu and -mtune for that if host_machine.cpu_family().startswith('ppc') - machine_args += '-mcpu=' + machine - machine_args += '-mtune=' + machine + machine_args += '-mcpu=' + cpu_instruction_set + machine_args += '-mtune=' + cpu_instruction_set else - machine_args += '-march=' + machine + machine_args += '-march=' + cpu_instruction_set endif toolchain = cc.get_id() diff --git a/config/ppc/meson.build b/config/ppc/meson.build index 4f7806bab1..adf49e1f42 100644 --- a/config/ppc/meson.build +++ b/config/ppc/meson.build @@ -12,7 +12,7 @@ dpdk_conf.set('RTE_ARCH_PPC_64', 1) # is used, resulting in a build failure. power9_supported = cc.has_argument('-mcpu=power9') if not power9_supported - machine = 'power8' + cpu_instruction_set = 'power8' machine_args = ['-mcpu=power8', '-mtune=power8'] dpdk_conf.set('RTE_MACHINE','power8') endif diff --git a/devtools/test-meson-builds.sh b/devtools/test-meson-builds.sh index daf817ac3e..7edbd6c717 100755 --- a/devtools/test-meson-builds.sh +++ b/devtools/test-meson-builds.sh @@ -223,12 +223,13 @@ done # test compilation with minimal x86 instruction set # Set the install path for libraries to "lib" explicitly to prevent problems # with pkg-config prefixes if installed in "lib/x86_64-linux-gnu" later. -generic_machine='nehalem' -if ! check_cc_flags "-march=$generic_machine" ; then - generic_machine='corei7' +generic_isa='nehalem' +if ! check_cc_flags "-march=$generic_isa" ; then + generic_isa='corei7' fi build build-x86-generic cc skipABI -Dcheck_includes=true \ - -Dlibdir=lib -Dmachine=$generic_machine $use_shared + -Dlibdir=lib -Dcpu_instruction_set=$generic_isa \ + $use_shared # 32-bit with default compiler if check_cc_flags '-m32' ; then diff --git a/doc/guides/linux_gsg/build_dpdk.rst b/doc/guides/linux_gsg/build_dpdk.rst index f78eef2517..204c63631d 100644 --- a/doc/guides/linux_gsg/build_dpdk.rst +++ b/doc/guides/linux_gsg/build_dpdk.rst @@ -89,7 +89,38 @@ to a regular "debug" build, you can either: * run ``meson configure -Dbuildtype=debug`` inside the build folder after the initial meson run. Other options are specific to the DPDK project but can be adjusted similarly. -To set the "max_lcores" value to 256, for example, you can either: +The "platform" option specifies a set a configuration parameters that will be +used. The valid values are: + +* ``-Dplatform=native`` will tailor the configuration to the build machine. + +* ``-Dplatform=generic`` will use configuration that works on all machines + of the same architecture as the build machine. + +* ``-Dplatform=`` will use configuration optimized for a particular + Arm SoC. Consult the "socs" dictionary in config/arm/meson.build to see which + SoC are supported. + +The instruction set will be set automatically by default according to these +rules: + +* ``-Dplatform=native`` sets "cpu_instruction_set" to "native", which + configures -march (x86_64), -mcpu (ppc), -mtune (ppc) to "native". + +* ``-Dplatform=generic`` sets "cpu_instruction_set" to "generic", which + configures -march (x86_64), -mcpu (ppc), -mtune (ppc) to a common + minimal baseline needed for DPDK. + +To override what instruction set will be used, set the "cpu_instruction_set" +parameter to the instruction set of your choice (such as "corei7", "power8", +etc.). + +"cpu_instruction_set" is not used in Arm builds, as setting the instruction set +without other parameters leads to inferior builds. The way to tailor Arm builds +is to build for an SoC using ``-Dplatform=`` mentioned above. + +The values determined by the "platform" parameter may be overwritten. For +example, to set the "max_lcores" value to 256, you can either: * pass ``-Dmax_lcores=256`` to meson when configuring the build folder initially diff --git a/meson_options.txt b/meson_options.txt index 56bdfd0f0a..0240a5da48 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -2,6 +2,8 @@ option('check_includes', type: 'boolean', value: false, description: 'build "chkincs" to verify each header file can compile alone') +option('cpu_instruction_set', type: 'string', value: 'auto', + description: 'Set the target machine ISA (instruction set architecture). Will be set according to the platform option by default.') option('developer_mode', type: 'feature', description: 'turn on additional build checks relevant for DPDK developers') option('disable_drivers', type: 'string', value: '', description: @@ -28,16 +30,16 @@ option('include_subdir_arch', type: 'string', value: '', description: 'subdirectory where to install arch-dependent headers') option('kernel_dir', type: 'string', value: '', description: 'Path to the kernel for building kernel modules. Headers must be in $kernel_dir or $kernel_dir/build. Modules will be installed in /lib/modules.') -option('machine', type: 'string', value: 'native', description: - 'set the target machine type or "generic", a build usable on all machines of the build machine architecture or "native", which lets the compiler pick the architecture of the build machine.') +option('machine', type: 'string', value: 'auto', description: + 'Alias of cpu_instruction_set.') option('max_ethports', type: 'integer', value: 32, description: 'maximum number of Ethernet devices') option('max_lcores', type: 'integer', value: 128, description: 'maximum number of cores/threads supported by EAL') option('max_numa_nodes', type: 'integer', value: 32, description: 'maximum number of NUMA nodes supported by EAL') -option('platform', type: 'string', value: '', description: - 'use configuration for a particular platform (such as a SoC).') +option('platform', type: 'string', value: 'native', description: + 'Platform to build, either "native", "generic" or an Arm SoC. Please refer to the Linux build guide for more information.') option('enable_trace_fp', type: 'boolean', value: false, description: 'enable fast path trace points.') option('tests', type: 'boolean', value: true, description: -- 2.20.1