-# BSD LICENSE
-#
-# Copyright(c) 2017 Intel Corporation.
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-#
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in
-# the documentation and/or other materials provided with the
-# distribution.
-# * Neither the name of Intel Corporation nor the names of its
-# contributors may be used to endorse or promote products derived
-# from this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-# set the machine type and cflags for it
-machine = get_option('machine')
-dpdk_conf.set('RTE_MACHINE', machine)
-add_project_arguments('-march=@0@'.format(machine), language: 'c')
-# some libs depend on maths lib
-add_project_link_arguments('-lm', language: 'c')
-dpdk_extra_ldflags += '-lm'
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2017-2019 Intel Corporation
+
+# check the OS is supported, rather than going any further
+supported_exec_envs = ['freebsd', 'linux', 'windows']
+exec_env = host_machine.system()
+if not supported_exec_envs.contains(exec_env)
+ error('unsupported system type "@0@"'.format(exec_env))
+endif
+
+# define a handy variable for checking which OS we have.
+# gives us "is_windows", "is_freebsd" and "is_linux"
+foreach env:supported_exec_envs
+ set_variable('is_' + env, exec_env == env)
+endforeach
+
+# MS linker requires special treatment.
+# TODO: use cc.get_linker_id() with Meson >= 0.54
+is_ms_linker = is_windows and (cc.get_id() == 'clang')
+
+# set the major version, which might be used by drivers and libraries
+# depending on the configuration options
+pver = meson.project_version().split('.')
+major_version = '@0@.@1@'.format(pver.get(0), pver.get(1))
+abi_version = run_command(find_program('cat', 'more'), abi_version_file,
+ check: true).stdout().strip()
+
+# Libraries have the abi_version as the filename extension
+# and have the soname be all but the final part of the abi_version.
+# e.g. v20.1 => librte_foo.so.20.1
+# sonames => librte_foo.so.20
+so_version = abi_version.split('.')[0]
+
+# extract all version information into the build configuration
+dpdk_conf.set('RTE_VER_YEAR', pver.get(0).to_int())
+dpdk_conf.set('RTE_VER_MONTH', pver.get(1).to_int())
+if pver.get(2).contains('-rc')
+ rc_ver = pver.get(2).split('-rc')
+ dpdk_conf.set('RTE_VER_MINOR', rc_ver.get(0).to_int())
+ dpdk_conf.set_quoted('RTE_VER_SUFFIX', '-rc')
+ dpdk_conf.set('RTE_VER_RELEASE', rc_ver.get(1).to_int())
+else
+ dpdk_conf.set('RTE_VER_MINOR', pver.get(2).to_int())
+ dpdk_conf.set_quoted('RTE_VER_SUFFIX', '')
+# for actual, non-rc releases, set the release value to 99 to ensure releases
+# have higher version numbers than their respective release candidates
+ dpdk_conf.set('RTE_VER_RELEASE', 99)
+endif
+
+pmd_subdir_opt = get_option('drivers_install_subdir')
+if pmd_subdir_opt.contains('<VERSION>')
+ pmd_subdir_opt = abi_version.join(pmd_subdir_opt.split('<VERSION>'))
+endif
+driver_install_path = join_paths(get_option('libdir'), pmd_subdir_opt)
+eal_pmd_path = join_paths(get_option('prefix'), driver_install_path)
+
+# driver .so files often depend upon the bus drivers for their connect bus,
+# e.g. ixgbe depends on librte_bus_pci. This means that the bus drivers need
+# to be in the library path, so symlink the drivers from the main lib directory.
+if not is_windows
+ meson.add_install_script('../buildtools/symlink-drivers-solibs.sh',
+ get_option('libdir'), pmd_subdir_opt)
+elif meson.version().version_compare('>=0.55.0')
+ # 0.55.0 is required to use external program with add_install_script
+ meson.add_install_script(py3,
+ files('../buildtools/symlink-drivers-solibs.py'),
+ get_option('libdir'), pmd_subdir_opt, get_option('bindir'))
+endif
+
+# init disable/enable driver lists that will be populated in different places
+disable_drivers = ''
+enable_drivers = ''
+
+platform = get_option('platform')
+
+# set the cpu_instruction_set and cflags for it
+if meson.is_cross_build()
+ 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
+
+# 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 cpu_instruction_set == 'generic'
+ if host_machine.cpu_family().startswith('x86')
+ # matches the old pre-meson build systems generic cpu_instruction_set
+ cpu_instruction_set = 'corei7'
+ elif host_machine.cpu_family().startswith('arm')
+ cpu_instruction_set = 'armv7-a'
+ elif host_machine.cpu_family().startswith('aarch')
+ # arm64 manages generic config in config/arm/meson.build
+ cpu_instruction_set = 'generic'
+ elif host_machine.cpu_family().startswith('ppc')
+ cpu_instruction_set = 'power8'
+ endif
+endif
+
+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=' + cpu_instruction_set
+ machine_args += '-mtune=' + cpu_instruction_set
+else
+ machine_args += '-march=' + cpu_instruction_set
+endif
+
+toolchain = cc.get_id()
+dpdk_conf.set_quoted('RTE_TOOLCHAIN', toolchain)
+dpdk_conf.set('RTE_TOOLCHAIN_' + toolchain.to_upper(), 1)
+
+dpdk_conf.set('RTE_ARCH_64', cc.sizeof('void *') == 8)
+dpdk_conf.set('RTE_ARCH_32', cc.sizeof('void *') == 4)
+
+if not is_windows
+ add_project_link_arguments('-Wl,--no-as-needed', language: 'c')
+endif
+
+# use pthreads if available for the platform
+if not is_windows
+ add_project_link_arguments('-pthread', language: 'c')
+ dpdk_extra_ldflags += '-pthread'
+endif
+
+# on some OS, maths functions are in a separate library
+if cc.find_library('m', required : false).found()
+ # some libs depend on maths lib
+ add_project_link_arguments('-lm', language: 'c')
+ dpdk_extra_ldflags += '-lm'
+endif
+
+if is_linux
+ link_lib = 'dl'
+else
+ link_lib = ''
+endif
+
+# if link_lib is empty, do not add it to project properties
+if link_lib != ''
+ add_project_link_arguments('-l' + link_lib, language: 'c')
+ dpdk_extra_ldflags += '-l' + link_lib
+endif