From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id 4C9EAA0350; Sun, 28 Jun 2020 16:20:09 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 1B2E31C435; Sun, 28 Jun 2020 16:20:08 +0200 (CEST) Received: from EUR01-DB5-obe.outbound.protection.outlook.com (mail-eopbgr150047.outbound.protection.outlook.com [40.107.15.47]) by dpdk.org (Postfix) with ESMTP id 9276E1C2F0 for ; Sun, 28 Jun 2020 16:20:06 +0200 (CEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Kg7mUrKNyvJi8m22uVTyXpoZk6CrYiJVyb4j7B6U7cWBkRi6dU+mmsFHkUv5as075xvKRrvkVAqijSzC+AAnzr4oRNb+xLPnE3cvMMO4Cj811ENagAMy8CBIF4RnsyJl17S5FI/HPmoopB1fm80CxZuowHFRjTfE0gQyiKlTrmuf9ut2SVZIbr3g1S1rHvwzNQfIeXM8olpyubk0GBary/iyaoDcOHKNWn5okHoAiR016HIQIdLfGvcUBPsKdXdmO5o3oWiQSMSaqrP98uRUcNAHJmS+V7R1LIfCqqCHQ/sJbwlAmXHm7KdGyy8PzS+HllSgaePZAKr/xcvktajl0w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=oPs03taghs99UAa2mTMo0RddnHadpCHTldAgC2bOox4=; b=mmj+2EwbClmAoYlFR8ZGz8MkoaTppCvyrPbhgcMLOA8GuvFVmgfjzuL6VErKC48rcg+FR4ADFoyEnSQ1v02sNnLIKljCLo+60Z00LVnUSdZh2Ht8pkQ6Vh0seZ3e90sIiiTkcIxoerI1mDaiphp2pSsjjNPuZPeopF7q5mOB4Lascn7YGqDTf/4E1mwvz9mr9GrwPOEgnY1ajd+OCu1EI5jYpEghHJLrGIcMzZ6DNteZw9ltHj83z9p9nHfP9CDkVb65NLJVT/U7LcyVUWtUqOzZIrrw5pCiXrc7RRhBm8e+P2Xv1hIVMQYhMNj8FTp2ftSg6uK9T4CZTJ1jh8H6LA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=mellanox.com; dmarc=pass action=none header.from=mellanox.com; dkim=pass header.d=mellanox.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=oPs03taghs99UAa2mTMo0RddnHadpCHTldAgC2bOox4=; b=uA6cL3gL2h6yekFxk80c17fnof/aZ3i/xxiAIbbsstnYq1lve41nOZzsB1+vk06U/wxjUILEQPDqEwHBe1XZxiKxGP8rwPjWoOVhmif1KoqNynp1AYQ/aM2ITTy65+pDVXoQu4U8w6x3/0GA+yXwwqHQgoHXIfTFN2w2+VzPinM= Received: from VI1PR05MB5872.eurprd05.prod.outlook.com (2603:10a6:803:de::17) by VI1PR05MB6078.eurprd05.prod.outlook.com (2603:10a6:803:de::12) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3131.23; Sun, 28 Jun 2020 14:20:04 +0000 Received: from VI1PR05MB5872.eurprd05.prod.outlook.com ([fe80::ec95:ae9e:77c8:63ae]) by VI1PR05MB5872.eurprd05.prod.outlook.com ([fe80::ec95:ae9e:77c8:63ae%6]) with mapi id 15.20.3131.026; Sun, 28 Jun 2020 14:20:04 +0000 From: Fady Bader To: Dmitry Kozlyuk , "dev@dpdk.org" CC: Dmitry Malloy , Narcisa Ana Maria Vasile , Tal Shnaiderman , Thomas Monjalon , Olivier Matz Thread-Topic: [PATCH 6/7] cmdline: support Windows Thread-Index: AQHWR0aFCEbk/DVALEKOOe452zdUwKjuG7zQ Date: Sun, 28 Jun 2020 14:20:04 +0000 Message-ID: References: <20200620210511.13134-1-dmitry.kozliuk@gmail.com> <20200620210511.13134-7-dmitry.kozliuk@gmail.com> In-Reply-To: <20200620210511.13134-7-dmitry.kozliuk@gmail.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: gmail.com; dkim=none (message not signed) header.d=none;gmail.com; dmarc=none action=none header.from=mellanox.com; x-originating-ip: [213.57.105.94] x-ms-publictraffictype: Email x-ms-office365-filtering-ht: Tenant x-ms-office365-filtering-correlation-id: 66ccb71c-7caf-49ea-394a-08d81b6e5a1e x-ms-traffictypediagnostic: VI1PR05MB6078: x-ld-processed: a652971c-7d2e-4d9b-a6a4-d149256f461b,ExtAddr x-ms-exchange-transport-forked: True x-microsoft-antispam-prvs: x-ms-oob-tlc-oobclassifiers: OLM:2582; x-forefront-prvs: 0448A97BF2 x-ms-exchange-senderadcheck: 1 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: 5/hbIOSSel4aI5NSGRG3toQj6Q71C3ihqltE1ty1UlDe2ECAbtNlF72vdExHQT0G5km3L9FljIFVCscfJLKawIp3qUom3aymuHGodzPlgGr6LpnFnJSMhLxBohyFh52GOgKfskerpK1nmq0WjZsRc/ALEIRXKnP5PXrqUWsfHY2xzy04xNbv6IRVB35VcHFnqaFDr/O7gcvG4NY23RdUDBpSC3k5CkbGpJH60ejW+TXtChLvCxNIYn5nQvOtnIYPpSRPZ/Q3XmJsuAPs2bpggB1v+42+vgkMirZROCWpuiQYoVeLk61a/A5mpII+biApRJRT6JnvemGFqfC0qtnwUQ== x-forefront-antispam-report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:VI1PR05MB5872.eurprd05.prod.outlook.com; PTR:; CAT:NONE; SFTY:; SFS:(4636009)(346002)(39860400002)(376002)(136003)(366004)(396003)(7696005)(66476007)(316002)(71200400001)(66556008)(33656002)(64756008)(66946007)(66446008)(52536014)(54906003)(110136005)(76116006)(4326008)(83380400001)(9686003)(5660300002)(478600001)(2906002)(8676002)(86362001)(53546011)(55016002)(186003)(6506007)(8936002)(26005)(30864003); DIR:OUT; SFP:1101; x-ms-exchange-antispam-messagedata: lZxLNoPFx4n7rxV2mmxiNSwlhamugYCq5NrArQ0+no3kXAqDyyP43fCKxkfquCUioXPdfodQtIl2HDhvAVoB+szeq5CqAu1xLL+QD4dmcwFPq4j39S3mxLQ/JyFS4/LetlHaF85YT84uYtT6H7daTjVVbFI/W/xzkIW1lS55+lH+Rh0yMsvrI1H5DiQo5JYEinK1UhLJpXOVwbpw9uVXWy0GSXgJ9FdVMjvgYaPiSoqryqCzOAHQ1GzHcgqTAH18p1d2UkNkMrg1TQAksuAq8I9huhltZKsUlmCLNOUpqEAQetlO6bBp8CFX3PTFujCDcfC/3veZad4jpwHUuvUbps2t5x3LDrXV7RyBZTOy7UWHobstpPsrHIefSl0Nl+uEpZYjBLAhlA4HXTpaGF2eM3oFNi6pLTvZrfp3QqRRW5PedLsQkKJdv+bZ6i9BfauyhiyMcl275ownRfGHVFKzboYja/k52C07OAPu4mkz2t0= Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: VI1PR05MB5872.eurprd05.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 66ccb71c-7caf-49ea-394a-08d81b6e5a1e X-MS-Exchange-CrossTenant-originalarrivaltime: 28 Jun 2020 14:20:04.3298 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: hjspUcuydR3BMo3fnahFPazkoWg9cUDRFgszQoh834xlSWQYUzpKzIdLvr6sNb4J2gF+r0K2Fz0fHIYkaAGJtA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR05MB6078 Subject: Re: [dpdk-dev] [PATCH 6/7] cmdline: support Windows X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 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" Hi Dmitry, I'm trying to run test-pmd on Windows and I ran into this error with cmdlin= e. The error log message is : In file included from ../app/test-pmd/cmdline_flow.c:23: ..\lib\librte_cmdline/cmdline_parse_num.h:24:2: error: 'INT64' redeclared a= s different kind of symbol INT64 In file included from C:/mingw-w64/x86_64/mingw64/x86_64-w64-mingw32/includ= e/winnt.h:150, from C:/mingw-w64/x86_64/mingw64/x86_64-w64-mingw32/includ= e/minwindef.h:163, from C:/mingw-w64/x86_64/mingw64/x86_64-w64-mingw32/includ= e/windef.h:8, from C:/mingw-w64/x86_64/mingw64/x86_64-w64-mingw32/includ= e/windows.h:69, from ..\lib/librte_eal/windows/include/rte_windows.h:22, from ..\lib/librte_eal/windows/include/pthread.h:20, from ..\lib/librte_eal/include/rte_per_lcore.h:25, from ..\lib/librte_eal/include/rte_errno.h:18, from ..\lib\librte_ethdev/rte_ethdev.h:156, from ../app/test-pmd/cmdline_flow.c:18: C:/mingw-w64/x86_64/mingw64/x86_64-w64-mingw32/include/basetsd.h:32:44: not= e: previous declaration of 'INT64' was here __MINGW_EXTENSION typedef signed __int64 INT64,*PINT64; The same error is for the other types defined in cmdline_numtype. This problem with windows.h is popping in many places and some of them are= =20 cmdline and test-pmd and librte_net.=20 We should find a way to exclude windows.h from the unneeded places, is ther= e any suggestions on how it can be done ? > -----Original Message----- > From: Dmitry Kozlyuk > Sent: Sunday, June 21, 2020 12:05 AM > To: dev@dpdk.org > Cc: Dmitry Malloy ; Narcisa Ana Maria Vasile > ; Fady Bader ; Tal > Shnaiderman ; Dmitry Kozlyuk > ; Thomas Monjalon ; > Olivier Matz > Subject: [PATCH 6/7] cmdline: support Windows >=20 > Implement terminal handling, input polling, and vdprintf() for Windows. >=20 > Because Windows I/O model differs fundamentally from Unix and there is no > concept of character device, polling is simulated depending on the underl= ying > inpue device. Supporting non-terminal input is useful for automated testi= ng. >=20 > Windows emulation of VT100 uses "ESC [ E" for newline instead of standard= "ESC > E", so a workaround is added. >=20 > Signed-off-by: Dmitry Kozlyuk > --- > config/meson.build | 2 + > lib/librte_cmdline/cmdline.c | 5 + > lib/librte_cmdline/cmdline_os_windows.c | 207 ++++++++++++++++++++++++ > lib/librte_cmdline/cmdline_private.h | 15 ++ > lib/librte_cmdline/cmdline_socket.c | 4 + > lib/librte_cmdline/cmdline_vt100.h | 4 + > lib/librte_cmdline/meson.build | 4 +- > lib/meson.build | 1 + > 8 files changed, 241 insertions(+), 1 deletion(-) create mode 100644 > lib/librte_cmdline/cmdline_os_windows.c >=20 > diff --git a/config/meson.build b/config/meson.build index d3f05f878..733= b5e310 > 100644 > --- a/config/meson.build > +++ b/config/meson.build > @@ -269,6 +269,8 @@ if is_windows > add_project_arguments('-D__USE_MINGW_ANSI_STDIO', > language: 'c') > endif >=20 > + add_project_link_arguments('-lws2_32', language: 'c') > + > # Contrary to docs, VirtualAlloc2() is exported by mincore.lib > # in Windows SDK, while MinGW exports it by advapi32.a. > if is_ms_linker > diff --git a/lib/librte_cmdline/cmdline.c b/lib/librte_cmdline/cmdline.c = index > 00b9e6b2e..c0ddb5f23 100644 > --- a/lib/librte_cmdline/cmdline.c > +++ b/lib/librte_cmdline/cmdline.c > @@ -13,9 +13,14 @@ > #include > #include > #include > +#include >=20 > #include >=20 > +#ifdef RTE_EXEC_ENV_WINDOWS > +#define write _write > +#endif > + > #include "cmdline.h" > #include "cmdline_private.h" >=20 > diff --git a/lib/librte_cmdline/cmdline_os_windows.c > b/lib/librte_cmdline/cmdline_os_windows.c > new file mode 100644 > index 000000000..9736f6531 > --- /dev/null > +++ b/lib/librte_cmdline/cmdline_os_windows.c > @@ -0,0 +1,207 @@ > +/* SPDX-License-Identifier: BSD-3-Clause > + * Copyright (c) 2020 Dmitry Kozlyuk > + */ > + > +#include > + > +#include > + > +#include "cmdline_private.h" > + > +/* Missing from some MinGW-w64 distributions. */ #ifndef > +ENABLE_VIRTUAL_TERMINAL_PROCESSING > +#define ENABLE_VIRTUAL_TERMINAL_PROCESSING 0x0004 #endif > + > +#ifndef ENABLE_VIRTUAL_TERMINAL_INPUT > +#define ENABLE_VIRTUAL_TERMINAL_INPUT 0x0200 #endif > + > +void > +terminal_adjust(struct terminal *oldterm) { > + HANDLE handle; > + DWORD mode; > + > + ZeroMemory(oldterm, sizeof(*oldterm)); > + > + /* Detect console input, set it up and make it emulate VT100. */ > + handle =3D GetStdHandle(STD_INPUT_HANDLE); > + if (GetConsoleMode(handle, &mode)) { > + oldterm->is_console_input =3D 1; > + oldterm->input_mode =3D mode; > + > + mode &=3D ~( > + ENABLE_LINE_INPUT | /* no line buffering */ > + ENABLE_ECHO_INPUT | /* no echo */ > + ENABLE_PROCESSED_INPUT | /* pass Ctrl+C to program > */ > + ENABLE_MOUSE_INPUT | /* no mouse events */ > + ENABLE_WINDOW_INPUT); /* no window resize events > */ > + mode |=3D ENABLE_VIRTUAL_TERMINAL_INPUT; > + SetConsoleMode(handle, mode); > + } > + > + /* Detect console output and make it emulate VT100. */ > + handle =3D GetStdHandle(STD_OUTPUT_HANDLE); > + if (GetConsoleMode(handle, &mode)) { > + oldterm->is_console_output =3D 1; > + oldterm->output_mode =3D mode; > + > + mode &=3D ~ENABLE_WRAP_AT_EOL_OUTPUT; > + mode |=3D ENABLE_VIRTUAL_TERMINAL_PROCESSING; > + SetConsoleMode(handle, mode); > + } > +} > + > +void > +terminal_restore(const struct terminal *oldterm) { > + if (oldterm->is_console_input) { > + HANDLE handle =3D GetStdHandle(STD_INPUT_HANDLE); > + SetConsoleMode(handle, oldterm->input_mode); > + } > + > + if (oldterm->is_console_output) { > + HANDLE handle =3D GetStdHandle(STD_OUTPUT_HANDLE); > + SetConsoleMode(handle, oldterm->output_mode); > + } > +} > + > +static int > +cmdline_is_key_down(const INPUT_RECORD *record) { > + return (record->EventType =3D=3D KEY_EVENT) && > + record->Event.KeyEvent.bKeyDown; > +} > + > +static int > +cmdline_poll_char_console(HANDLE handle) { > + INPUT_RECORD record; > + DWORD events; > + > + if (!PeekConsoleInput(handle, &record, 1, &events)) { > + /* Simulate poll(3) behavior on EOF. */ > + return (GetLastError() =3D=3D ERROR_HANDLE_EOF) ? 1 : -1; > + } > + > + if ((events =3D=3D 0) || !cmdline_is_key_down(&record)) > + return 0; > + > + return 1; > +} > + > +static int > +cmdline_poll_char_file(struct cmdline *cl, HANDLE handle) { > + DWORD type =3D GetFileType(handle); > + > + /* Since console is handled by cmdline_poll_char_console(), > + * this is either a serial port or input handle had been replaced. > + */ > + if (type =3D=3D FILE_TYPE_CHAR) > + return cmdline_poll_char_console(handle); > + > + /* PeekNamedPipe() can handle all pipes and also sockets. */ > + if (type =3D=3D FILE_TYPE_PIPE) { > + DWORD bytes_avail; > + if (!PeekNamedPipe(handle, NULL, 0, NULL, &bytes_avail, NULL)) > + return (GetLastError() =3D=3D ERROR_BROKEN_PIPE) ? 1 : -1; > + return bytes_avail ? 1 : 0; > + } > + > + /* There is no straightforward way to peek a file in Windows > + * I/O model. Read the byte, if it is not the end of file, > + * buffer it for subsequent read. This will not work with > + * a file being appended and probably some other edge cases. > + */ > + if (type =3D=3D FILE_TYPE_DISK) { > + char c; > + int ret; > + > + ret =3D _read(cl->s_in, &c, sizeof(c)); > + if (ret =3D=3D 1) { > + cl->repeat_count =3D 1; > + cl->repeated_char =3D c; > + } > + return ret; > + } > + > + /* GetFileType() failed or file of unknown type, > + * which we do not know how to peek anyway. > + */ > + return -1; > +} > + > +int > +cmdline_poll_char(struct cmdline *cl) > +{ > + HANDLE handle =3D (HANDLE)_get_osfhandle(cl->s_in); > + return cl->oldterm.is_console_input ? > + cmdline_poll_char_console(handle) : > + cmdline_poll_char_file(cl, handle); > +} > + > +ssize_t > +cmdline_read_char(struct cmdline *cl, char *c) { > + HANDLE handle; > + INPUT_RECORD record; > + KEY_EVENT_RECORD *key; > + DWORD events; > + > + if (!cl->oldterm.is_console_input) > + return _read(cl->s_in, c, 1); > + > + /* Return repeated strokes from previous event. */ > + if (cl->repeat_count > 0) { > + *c =3D cl->repeated_char; > + cl->repeat_count--; > + return 1; > + } > + > + handle =3D (HANDLE)_get_osfhandle(cl->s_in); > + key =3D &record.Event.KeyEvent; > + do { > + if (!ReadConsoleInput(handle, &record, 1, &events)) { > + if (GetLastError() =3D=3D ERROR_HANDLE_EOF) { > + *c =3D EOF; > + return 0; > + } > + return -1; > + } > + } while (!cmdline_is_key_down(&record)); > + > + *c =3D key->uChar.AsciiChar; > + > + /* Save repeated strokes from a single event. */ > + if (key->wRepeatCount > 1) { > + cl->repeated_char =3D *c; > + cl->repeat_count =3D key->wRepeatCount - 1; > + } > + > + return 1; > +} > + > +int > +cmdline_vdprintf(int fd, const char *format, va_list op) { > + int copy, ret; > + FILE *file; > + > + copy =3D _dup(fd); > + if (copy < 0) > + return -1; > + > + file =3D _fdopen(copy, "a"); > + if (file =3D=3D NULL) { > + _close(copy); > + return -1; > + } > + > + ret =3D vfprintf(file, format, op); > + > + fclose(file); /* also closes copy */ > + > + return ret; > +} > diff --git a/lib/librte_cmdline/cmdline_private.h > b/lib/librte_cmdline/cmdline_private.h > index 338d3d55c..1e05ec376 100644 > --- a/lib/librte_cmdline/cmdline_private.h > +++ b/lib/librte_cmdline/cmdline_private.h > @@ -5,7 +5,11 @@ > #ifndef _CMDLINE_PRIVATE_H_ > #define _CMDLINE_PRIVATE_H_ >=20 > +#ifdef RTE_EXEC_ENV_WINDOWS > +#include > +#else > #include > +#endif >=20 > #include >=20 > @@ -15,7 +19,14 @@ > #include >=20 > struct terminal { > +#ifndef RTE_EXEC_ENV_WINDOWS > struct termios termios; > +#else > + DWORD input_mode; > + DWORD output_mode; > + int is_console_input; > + int is_console_output; > +#endif > }; >=20 > /* Disable buffering and echoing, save previous settings to oldterm. */ = @@ -31,6 > +42,10 @@ struct cmdline { > struct rdline rdl; > char prompt[RDLINE_PROMPT_SIZE]; > struct terminal oldterm; > +#ifdef RTE_EXEC_ENV_WINDOWS > + char repeated_char; > + WORD repeat_count; > +#endif > }; >=20 > /* Check if a single character can be read from input. */ diff --git > a/lib/librte_cmdline/cmdline_socket.c b/lib/librte_cmdline/cmdline_socket= .c > index e73666f15..c5f483413 100644 > --- a/lib/librte_cmdline/cmdline_socket.c > +++ b/lib/librte_cmdline/cmdline_socket.c > @@ -16,6 +16,10 @@ > #include "cmdline_private.h" > #include "cmdline_socket.h" >=20 > +#ifdef RTE_EXEC_ENV_WINDOWS > +#define open _open > +#endif > + > struct cmdline * > cmdline_file_new(cmdline_parse_ctx_t *ctx, const char *prompt, const cha= r > *path) { diff --git a/lib/librte_cmdline/cmdline_vt100.h > b/lib/librte_cmdline/cmdline_vt100.h > index e33e67ed8..be9ae8e1c 100644 > --- a/lib/librte_cmdline/cmdline_vt100.h > +++ b/lib/librte_cmdline/cmdline_vt100.h > @@ -31,7 +31,11 @@ extern "C" { > #define vt100_multi_right "\033\133%uC" > #define vt100_multi_left "\033\133%uD" > #define vt100_suppr "\033\133\063\176" > +#ifndef RTE_EXEC_ENV_WINDOWS > #define vt100_home "\033M\033E" > +#else > +#define vt100_home "\033M\033[E" > +#endif > #define vt100_word_left "\033\142" > #define vt100_word_right "\033\146" >=20 > diff --git a/lib/librte_cmdline/meson.build b/lib/librte_cmdline/meson.bu= ild > index 5c9e8886d..5009b3354 100644 > --- a/lib/librte_cmdline/meson.build > +++ b/lib/librte_cmdline/meson.build > @@ -25,7 +25,9 @@ headers =3D files('cmdline.h', > 'cmdline_cirbuf.h', > 'cmdline_parse_portlist.h') >=20 > -if not is_windows > +if is_windows > + sources +=3D files('cmdline_os_windows.c') else > sources +=3D files('cmdline_os_unix.c') > endif >=20 > diff --git a/lib/meson.build b/lib/meson.build index 40e452025..5b72a2d9e > 100644 > --- a/lib/meson.build > +++ b/lib/meson.build > @@ -40,6 +40,7 @@ if is_windows > 'kvargs','eal', > 'ring', > 'mempool', 'mbuf', 'pci', 'net', > + 'cmdline', > ] # only supported libraries for windows endif >=20 > -- > 2.25.4