[v3,1/4] build: unblock the use of the MSVC compiler
Checks
Commit Message
Detect when MSVC toolset is available and tweak toolchain arguments
where the meson build system offers no abstraction.
Signed-off-by: Tyler Retzlaff <roretzla@linux.microsoft.com>
Acked-by: Bruce Richardson <bruce.richardson@intel.com>
---
buildtools/meson.build | 10 +++++++---
config/meson.build | 21 ++++++++++++++-------
config/x86/meson.build | 8 +++++---
lib/meson.build | 13 ++++++++++---
4 files changed, 36 insertions(+), 16 deletions(-)
Comments
On Tue, Apr 25, 2023 at 10:08 PM Tyler Retzlaff
<roretzla@linux.microsoft.com> wrote:
>
> Detect when MSVC toolset is available and tweak toolchain arguments
> where the meson build system offers no abstraction.
>
> Signed-off-by: Tyler Retzlaff <roretzla@linux.microsoft.com>
> Acked-by: Bruce Richardson <bruce.richardson@intel.com>
> ---
> buildtools/meson.build | 10 +++++++---
> config/meson.build | 21 ++++++++++++++-------
> config/x86/meson.build | 8 +++++---
> lib/meson.build | 13 ++++++++++---
> 4 files changed, 36 insertions(+), 16 deletions(-)
>
> diff --git a/buildtools/meson.build b/buildtools/meson.build
> index e1c600e..838c39f 100644
> --- a/buildtools/meson.build
> +++ b/buildtools/meson.build
> @@ -4,7 +4,9 @@
> pkgconf = find_program('pkg-config', 'pkgconf', required: false)
> check_symbols = find_program('check-symbols.sh')
I don't expect check-symbols.sh to work if objdump is not available.
> ldflags_ibverbs_static = find_program('options-ibverbs-static.sh')
> -objdump = find_program('objdump', 'llvm-objdump')
> +if cc.get_id() != 'msvc'
> + objdump = find_program('objdump', 'llvm-objdump')
> +endif
Looking at objdump users in meson, I only see the avx512 stuff.
The avx512 check is only called under a gcc check in
config/x86/meson.build, so I would move both definitions (and
potentially the script itself) under config/x86.
Something like:
https://patchwork.dpdk.org/project/dpdk/patch/20230811131024.2285366-1-david.marchand@redhat.com/
>
> python3 = import('python').find_installation(required: false)
> if python3.found()
> @@ -18,8 +20,10 @@ map_to_win_cmd = py3 + files('map_to_win.py')
> sphinx_wrapper = py3 + files('call-sphinx-build.py')
> get_cpu_count_cmd = py3 + files('get-cpu-count.py')
> get_numa_count_cmd = py3 + files('get-numa-count.py')
> -binutils_avx512_check = (py3 + files('binutils-avx512-check.py') +
> - [objdump] + cc.cmd_array())
> +if cc.get_id() != 'msvc'
> + binutils_avx512_check = (py3 + files('binutils-avx512-check.py') +
> + [objdump] + cc.cmd_array())
> +endif
>
> # select library and object file format
> pmdinfo = py3 + files('gen-pmdinfo-cfile.py') + [meson.current_build_dir()]
> diff --git a/config/meson.build b/config/meson.build
> index fa730a1..9a3f499 100644
> --- a/config/meson.build
> +++ b/config/meson.build
> @@ -16,7 +16,8 @@ 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')
> +is_ms_compiler = is_windows and (cc.get_id() == 'msvc')
> +is_ms_linker = is_windows and (cc.get_id() == 'clang' or is_ms_compiler)
>
> # set the major version, which might be used by drivers and libraries
> # depending on the configuration options
> @@ -130,11 +131,13 @@ dpdk_conf.set('RTE_MACHINE', cpu_instruction_set)
> machine_args = []
>
> # ppc64 does not support -march= at all, use -mcpu and -mtune for that
This comment can be moved in the block too.
> -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
> +if not is_ms_compiler
> + 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
> endif
>
> toolchain = cc.get_id()
> @@ -253,7 +256,11 @@ if cc.get_id() == 'clang' and dpdk_conf.get('RTE_ARCH_64') == false
> endif
>
> # add -include rte_config to cflags
> -add_project_arguments('-include', 'rte_config.h', language: 'c')
> +if is_ms_compiler
> + add_project_arguments('/FI', 'rte_config.h', language: 'c')
> +else
> + add_project_arguments('-include', 'rte_config.h', language: 'c')
> +endif
>
> # enable extra warnings and disable any unwanted warnings
> # -Wall is added by default at warning level 1, and -Wextra
> diff --git a/config/x86/meson.build b/config/x86/meson.build
> index 54345c4..11f0bcc 100644
> --- a/config/x86/meson.build
> +++ b/config/x86/meson.build
> @@ -25,9 +25,11 @@ if cc.has_argument('-mavx512f')
> endif
>
> # we require SSE4.2 for DPDK
Are there requirements we announce for MSVC builds?
In any case, please move this comment in the block.
> -if cc.get_define('__SSE4_2__', args: machine_args) == ''
> - message('SSE 4.2 not enabled by default, explicitly enabling')
> - machine_args += '-msse4'
> +if not is_ms_compiler
> + if cc.get_define('__SSE4_2__', args: machine_args) == ''
> + message('SSE 4.2 not enabled by default, explicitly enabling')
> + machine_args += '-msse4'
> + endif
> endif
>
> base_flags = ['SSE', 'SSE2', 'SSE3','SSSE3', 'SSE4_1', 'SSE4_2']
> diff --git a/lib/meson.build b/lib/meson.build
> index dc8aa4a..40c632a 100644
> --- a/lib/meson.build
> +++ b/lib/meson.build
> @@ -241,9 +241,16 @@ foreach l:libraries
> output: '@0@_exports.def'.format(libname))
> lk_deps += [def_file]
>
> - lk_args = ['-Wl,/def:' + def_file.full_path()]
> - if meson.version().version_compare('<0.54.0')
> - lk_args += ['-Wl,/implib:lib\\librte_' + l + '.dll.a']
> + if is_ms_compiler
> + lk_args = ['/def:' + def_file.full_path()]
> + if meson.version().version_compare('<0.54.0')
> + lk_args += ['/implib:lib\\librte_' + l + '.dll.a']
> + endif
> + else
> + lk_args = ['-Wl,/def:' + def_file.full_path()]
> + if meson.version().version_compare('<0.54.0')
> + lk_args += ['-Wl,/implib:lib\\librte_' + l + '.dll.a']
> + endif
> endif
> else
> if is_windows
> --
> 1.8.3.1
>
@@ -4,7 +4,9 @@
pkgconf = find_program('pkg-config', 'pkgconf', required: false)
check_symbols = find_program('check-symbols.sh')
ldflags_ibverbs_static = find_program('options-ibverbs-static.sh')
-objdump = find_program('objdump', 'llvm-objdump')
+if cc.get_id() != 'msvc'
+ objdump = find_program('objdump', 'llvm-objdump')
+endif
python3 = import('python').find_installation(required: false)
if python3.found()
@@ -18,8 +20,10 @@ map_to_win_cmd = py3 + files('map_to_win.py')
sphinx_wrapper = py3 + files('call-sphinx-build.py')
get_cpu_count_cmd = py3 + files('get-cpu-count.py')
get_numa_count_cmd = py3 + files('get-numa-count.py')
-binutils_avx512_check = (py3 + files('binutils-avx512-check.py') +
- [objdump] + cc.cmd_array())
+if cc.get_id() != 'msvc'
+ binutils_avx512_check = (py3 + files('binutils-avx512-check.py') +
+ [objdump] + cc.cmd_array())
+endif
# select library and object file format
pmdinfo = py3 + files('gen-pmdinfo-cfile.py') + [meson.current_build_dir()]
@@ -16,7 +16,8 @@ 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')
+is_ms_compiler = is_windows and (cc.get_id() == 'msvc')
+is_ms_linker = is_windows and (cc.get_id() == 'clang' or is_ms_compiler)
# set the major version, which might be used by drivers and libraries
# depending on the configuration options
@@ -130,11 +131,13 @@ 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
+if not is_ms_compiler
+ 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
endif
toolchain = cc.get_id()
@@ -253,7 +256,11 @@ if cc.get_id() == 'clang' and dpdk_conf.get('RTE_ARCH_64') == false
endif
# add -include rte_config to cflags
-add_project_arguments('-include', 'rte_config.h', language: 'c')
+if is_ms_compiler
+ add_project_arguments('/FI', 'rte_config.h', language: 'c')
+else
+ add_project_arguments('-include', 'rte_config.h', language: 'c')
+endif
# enable extra warnings and disable any unwanted warnings
# -Wall is added by default at warning level 1, and -Wextra
@@ -25,9 +25,11 @@ if cc.has_argument('-mavx512f')
endif
# we require SSE4.2 for DPDK
-if cc.get_define('__SSE4_2__', args: machine_args) == ''
- message('SSE 4.2 not enabled by default, explicitly enabling')
- machine_args += '-msse4'
+if not is_ms_compiler
+ if cc.get_define('__SSE4_2__', args: machine_args) == ''
+ message('SSE 4.2 not enabled by default, explicitly enabling')
+ machine_args += '-msse4'
+ endif
endif
base_flags = ['SSE', 'SSE2', 'SSE3','SSSE3', 'SSE4_1', 'SSE4_2']
@@ -241,9 +241,16 @@ foreach l:libraries
output: '@0@_exports.def'.format(libname))
lk_deps += [def_file]
- lk_args = ['-Wl,/def:' + def_file.full_path()]
- if meson.version().version_compare('<0.54.0')
- lk_args += ['-Wl,/implib:lib\\librte_' + l + '.dll.a']
+ if is_ms_compiler
+ lk_args = ['/def:' + def_file.full_path()]
+ if meson.version().version_compare('<0.54.0')
+ lk_args += ['/implib:lib\\librte_' + l + '.dll.a']
+ endif
+ else
+ lk_args = ['-Wl,/def:' + def_file.full_path()]
+ if meson.version().version_compare('<0.54.0')
+ lk_args += ['-Wl,/implib:lib\\librte_' + l + '.dll.a']
+ endif
endif
else
if is_windows