+# 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).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 = []