get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/139275/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 139275,
    "url": "http://patches.dpdk.org/api/patches/139275/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1712962333-14355-2-git-send-email-roretzla@linux.microsoft.com/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<1712962333-14355-2-git-send-email-roretzla@linux.microsoft.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1712962333-14355-2-git-send-email-roretzla@linux.microsoft.com",
    "date": "2024-04-12T22:52:12",
    "name": "[v3,1/2] build: build only one library type on Windows",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "8280fed5ce1f5a7fdc83f245bc280b1675cbf527",
    "submitter": {
        "id": 2077,
        "url": "http://patches.dpdk.org/api/people/2077/?format=api",
        "name": "Tyler Retzlaff",
        "email": "roretzla@linux.microsoft.com"
    },
    "delegate": {
        "id": 310,
        "url": "http://patches.dpdk.org/api/users/310/?format=api",
        "username": "jerin",
        "first_name": "Jerin",
        "last_name": "Jacob",
        "email": "jerinj@marvell.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1712962333-14355-2-git-send-email-roretzla@linux.microsoft.com/mbox/",
    "series": [
        {
            "id": 31735,
            "url": "http://patches.dpdk.org/api/series/31735/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=31735",
            "date": "2024-04-12T22:52:12",
            "name": "build and install only one library type on Windows",
            "version": 3,
            "mbox": "http://patches.dpdk.org/series/31735/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/139275/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/139275/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 097A243E55;\n\tSat, 13 Apr 2024 00:52:25 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 8FB7D40263;\n\tSat, 13 Apr 2024 00:52:24 +0200 (CEST)",
            "from linux.microsoft.com (linux.microsoft.com [13.77.154.182])\n by mails.dpdk.org (Postfix) with ESMTP id 2A10F4014F\n for <dev@dpdk.org>; Sat, 13 Apr 2024 00:52:23 +0200 (CEST)",
            "by linux.microsoft.com (Postfix, from userid 1086)\n id 7916020F069B; Fri, 12 Apr 2024 15:52:22 -0700 (PDT)"
        ],
        "DKIM-Filter": "OpenDKIM Filter v2.11.0 linux.microsoft.com 7916020F069B",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com;\n s=default; t=1712962342;\n bh=U6/sxUiNT9K/hmt5/+SQbUVXnAOO+7g3DiEWW9vEERA=;\n h=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n b=Ye8YTe7Oc/ISCKbovrlENRboWtkQ+gzRfNf6JbtHG+rESb3PGL0FHa/19XFaetstm\n ++OKIcu89Yk1W3pbXa97kY18vgiX5RLaevnqsxYgZ9leWb36Uw2YSvrA9gtzQyhxxt\n 6nJtBeYbnqUTFr92V+nY5ez8lEl8D+d06kykJZfQ=",
        "From": "Tyler Retzlaff <roretzla@linux.microsoft.com>",
        "To": "dev@dpdk.org",
        "Cc": "Bruce Richardson <bruce.richardson@intel.com>,\n Harman Kalra <hkalra@marvell.com>,\n Tyler Retzlaff <roretzla@linux.microsoft.com>",
        "Subject": "[PATCH v3 1/2] build: build only one library type on Windows",
        "Date": "Fri, 12 Apr 2024 15:52:12 -0700",
        "Message-Id": "<1712962333-14355-2-git-send-email-roretzla@linux.microsoft.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1712962333-14355-1-git-send-email-roretzla@linux.microsoft.com>",
        "References": "<1710445477-23848-1-git-send-email-roretzla@linux.microsoft.com>\n <1712962333-14355-1-git-send-email-roretzla@linux.microsoft.com>",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "MSVC is the only compiler that can produce usable shared libraries for\nDPDK on Windows because of the use of exported TLS variables.\n\nDisable building of shared libraries with LLVM and MinGW so that\nremaining __declspec macros needed for the functional libraries built by\nMSVC can be used without triggering errors in LLVM and MinGW builds.\n\nFor Windows only install the default_library type to avoid confusion.\nWindows builds cannot build both shared and static in a single pass so\ninstall only the functional variant.\n\nSigned-off-by: Tyler Retzlaff <roretzla@linux.microsoft.com>\n---\n app/meson.build                       |  6 +++\n config/meson.build                    | 20 ++++++++++\n drivers/meson.build                   | 64 +++++++++++++++----------------\n drivers/net/octeontx/base/meson.build |  2 +-\n examples/meson.build                  |  6 +++\n lib/meson.build                       | 72 +++++++++++++++--------------------\n 6 files changed, 94 insertions(+), 76 deletions(-)",
    "diff": "diff --git a/app/meson.build b/app/meson.build\nindex 21b6da2..f4ed0f1 100644\n--- a/app/meson.build\n+++ b/app/meson.build\n@@ -46,6 +46,8 @@ default_cflags = machine_args + ['-DALLOW_EXPERIMENTAL_API']\n default_ldflags = []\n if get_option('default_library') == 'static' and not is_windows\n     default_ldflags += ['-Wl,--export-dynamic']\n+elif get_option('default_library') == 'shared' and is_ms_compiler\n+    default_ldflags += ['/experimental:tlsDllInterface']\n endif\n \n foreach app:apps\n@@ -104,6 +106,10 @@ foreach app:apps\n         link_libs = dpdk_static_libraries + dpdk_drivers\n     endif\n \n+    if is_windows and is_shared_enabled\n+        cflags += '-DRTE_BUILD_SHARED_LIB'\n+    endif\n+\n     exec = executable('dpdk-' + name,\n             sources,\n             c_args: cflags,\ndiff --git a/config/meson.build b/config/meson.build\nindex 8c8b019..e949240 100644\n--- a/config/meson.build\n+++ b/config/meson.build\n@@ -53,6 +53,9 @@ if is_ms_compiler\n \n     # enable statement expressions extension\n     add_project_arguments('/experimental:statementExpressions', language: 'c')\n+\n+    # enable export of thread_local variables\n+    add_project_arguments('/experimental:tlsDllInterface', language: 'c')\n endif\n \n # set the major version, which might be used by drivers and libraries\n@@ -516,4 +519,21 @@ if get_option('default_library') == 'both'\n  NOTE: DPDK always builds both shared and static libraries.  Please set\n  \"default_library\" to either \"static\" or \"shared\" to select default linkage\n  for apps and any examples.''')\n+elif get_option('default_library') == 'shared' and is_windows and not is_ms_compiler\n+    error( '''\n+ Unsupported value \"shared\" for \"default_library\" option.\n+\n+ NOTE: DPDK Windows shared is only supported when building with MSVC. Please set\n+ \"default_library\" to either \"static\" or use MSVC.''')\n+endif\n+\n+is_shared_enabled=true\n+install_static = true\n+install_shared = true\n+if is_windows\n+    install_static = get_option('default_library') == 'static'\n+    install_shared = get_option('default_library') == 'shared'\n+    if not is_ms_compiler or not install_shared\n+        is_shared_enabled = false\n+    endif\n endif\ndiff --git a/drivers/meson.build b/drivers/meson.build\nindex 66931d4..751a295 100644\n--- a/drivers/meson.build\n+++ b/drivers/meson.build\n@@ -208,6 +208,9 @@ foreach subpath:subdirs\n         enabled_drivers += name\n         lib_name = '_'.join(['rte', class, name])\n         cflags += '-DRTE_LOG_DEFAULT_LOGTYPE=' + '.'.join([log_prefix, name])\n+        if is_windows and is_shared_enabled\n+            cflags += '-DRTE_BUILD_SHARED_LIB'\n+        endif\n         if annotate_locks and cc.get_id() == 'clang' and cc.version().version_compare('>=3.5.0')\n             cflags += '-DRTE_ANNOTATE_LOCKS'\n             cflags += '-Wthread-safety'\n@@ -247,7 +250,7 @@ foreach subpath:subdirs\n                 include_directories: includes,\n                 dependencies: static_deps,\n                 c_args: cflags,\n-                install: true)\n+                install: install_static)\n \n         # now build the shared driver\n         version_map = '@0@/@1@/version.map'.format(meson.current_source_dir(), drv_path)\n@@ -271,48 +274,41 @@ foreach subpath:subdirs\n             endif\n         endif\n \n-        if is_windows\n-            if is_ms_linker\n+        if is_shared_enabled\n+            if is_ms_compiler\n                 def_file = custom_target(lib_name + '_def',\n                         command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'],\n                         input: version_map,\n                         output: '@0@_exports.def'.format(lib_name))\n                 lk_deps += [def_file]\n-\n-                lk_args = ['-Wl,/def:' + def_file.full_path()]\n-                if meson.version().version_compare('<0.54.0')\n-                    lk_args += ['-Wl,/implib:drivers\\\\lib' + lib_name + '.dll.a']\n-                endif\n+                lk_args = ['/experimental:tlsDllInterface', '/def:' + def_file.full_path()]\n             else\n-                mingw_map = custom_target(lib_name + '_mingw',\n-                        command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'],\n-                        input: version_map,\n-                        output: '@0@_mingw.map'.format(lib_name))\n-                lk_deps += [mingw_map]\n-\n-                lk_args = ['-Wl,--version-script=' + mingw_map.full_path()]\n+                lk_args = ['-Wl,--version-script=' + version_map]\n             endif\n-        else\n-            lk_args = ['-Wl,--version-script=' + version_map]\n         endif\n \n-        shared_lib = shared_library(lib_name, sources,\n-                objects: objs,\n-                include_directories: includes,\n-                dependencies: shared_deps,\n-                c_args: cflags,\n-                link_args: lk_args,\n-                link_depends: lk_deps,\n-                version: abi_version,\n-                soversion: so_version,\n-                install: true,\n-                install_dir: driver_install_path)\n-\n-        # create a dependency object and add it to the global dictionary so\n-        # testpmd or other built-in apps can find it if necessary\n-        shared_dep = declare_dependency(link_with: shared_lib,\n-                include_directories: includes,\n-                dependencies: shared_deps)\n+        if is_shared_enabled\n+            shared_lib = shared_library(lib_name, sources,\n+                    objects: objs,\n+                    include_directories: includes,\n+                    dependencies: shared_deps,\n+                    c_args: cflags,\n+                    link_args: lk_args,\n+                    link_depends: lk_deps,\n+                    version: abi_version,\n+                    soversion: so_version,\n+                    install: install_shared,\n+                    install_dir: driver_install_path)\n+\n+            # create a dependency object and add it to the global dictionary so\n+            # testpmd or other built-in apps can find it if necessary\n+            shared_dep = declare_dependency(link_with: shared_lib,\n+                    include_directories: includes,\n+                    dependencies: shared_deps)\n+\n+        else\n+            shared_dep = {}\n+        endif\n         static_dep = declare_dependency(\n                 include_directories: includes,\n                 dependencies: static_deps)\ndiff --git a/drivers/net/octeontx/base/meson.build b/drivers/net/octeontx/base/meson.build\nindex 8e5e8c1..a793c19 100644\n--- a/drivers/net/octeontx/base/meson.build\n+++ b/drivers/net/octeontx/base/meson.build\n@@ -10,7 +10,7 @@ sources = [\n depends = ['ethdev', 'mempool_octeontx']\n static_objs = []\n foreach d: depends\n-    if not is_variable('shared_rte_' + d)\n+    if not is_variable('static_rte_' + d)\n         subdir_done()\n     endif\n     static_objs += get_variable('static_rte_' + d)\ndiff --git a/examples/meson.build b/examples/meson.build\nindex 8e8968a..e08a169 100644\n--- a/examples/meson.build\n+++ b/examples/meson.build\n@@ -85,6 +85,8 @@ endif\n default_ldflags = dpdk_extra_ldflags\n if get_option('default_library') == 'static' and not is_windows\n     default_ldflags += ['-Wl,--export-dynamic']\n+elif is_ms_compiler\n+    default_ldflags += ['/experimental:tlsDllInterface']\n endif\n \n foreach example: examples\n@@ -121,6 +123,10 @@ foreach example: examples\n         continue\n     endif\n \n+    if is_windows and is_shared_enabled\n+        cflags += '-DRTE_BUILD_SHARED_LIB'\n+    endif\n+\n     if allow_experimental_apis\n         cflags += '-DALLOW_EXPERIMENTAL_API'\n     endif\ndiff --git a/lib/meson.build b/lib/meson.build\nindex 179a272..3b0f632 100644\n--- a/lib/meson.build\n+++ b/lib/meson.build\n@@ -235,6 +235,10 @@ foreach l:libraries\n         cflags += '-Wthread-safety'\n     endif\n \n+    if is_windows and is_shared_enabled\n+        cflags += '-DRTE_BUILD_SHARED_LIB'\n+    endif\n+\n     # first build static lib\n     static_lib = static_library(libname,\n             sources,\n@@ -242,11 +246,13 @@ foreach l:libraries\n             c_args: cflags,\n             dependencies: static_deps,\n             include_directories: includes,\n-            install: true)\n+            install: install_static)\n     static_dep = declare_dependency(\n             include_directories: includes,\n             dependencies: static_deps)\n \n+    dpdk_static_libraries = [static_lib] + dpdk_static_libraries\n+\n     if not use_function_versioning or is_windows\n         # use pre-build objects to build shared lib\n         sources = []\n@@ -260,33 +266,14 @@ foreach l:libraries\n     version_map = '@0@/@1@/version.map'.format(meson.current_source_dir(), l)\n     lk_deps = [version_map]\n \n-    if is_ms_linker\n-        def_file = custom_target(libname + '_def',\n-                command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'],\n-                input: version_map,\n-                output: '@0@_exports.def'.format(libname))\n-        lk_deps += [def_file]\n-\n+    if is_shared_enabled\n         if is_ms_compiler\n-            lk_args = ['/def:' + def_file.full_path()]\n-            if meson.version().version_compare('<0.54.0')\n-                lk_args += ['/implib:lib\\\\librte_' + l + '.dll.a']\n-            endif\n-        else\n-            lk_args = ['-Wl,/def:' + def_file.full_path()]\n-            if meson.version().version_compare('<0.54.0')\n-                lk_args += ['-Wl,/implib:lib\\\\librte_' + l + '.dll.a']\n-            endif\n-        endif\n-    else\n-        if is_windows\n-            mingw_map = custom_target(libname + '_mingw',\n+            def_file = custom_target(libname + '_def',\n                     command: [map_to_win_cmd, '@INPUT@', '@OUTPUT@'],\n                     input: version_map,\n-                    output: '@0@_mingw.map'.format(libname))\n-            lk_deps += [mingw_map]\n-\n-            lk_args = ['-Wl,--version-script=' + mingw_map.full_path()]\n+                    output: '@0@_exports.def'.format(libname))\n+            lk_deps += [def_file]\n+            lk_args = ['/experimental:tlsDllInterface', '/def:' + def_file.full_path()]\n         else\n             lk_args = ['-Wl,--version-script=' + version_map]\n         endif\n@@ -304,23 +291,26 @@ foreach l:libraries\n                 output: name + '.sym_chk')\n     endif\n \n-    shared_lib = shared_library(libname,\n-            sources,\n-            objects: objs,\n-            c_args: cflags,\n-            dependencies: shared_deps,\n-            include_directories: includes,\n-            link_args: lk_args,\n-            link_depends: lk_deps,\n-            version: abi_version,\n-            soversion: so_version,\n-            install: true)\n-    shared_dep = declare_dependency(link_with: shared_lib,\n-            include_directories: includes,\n-            dependencies: shared_deps)\n+    if is_shared_enabled\n+        shared_lib = shared_library(libname,\n+                sources,\n+                objects: objs,\n+                c_args: cflags,\n+                dependencies: shared_deps,\n+                include_directories: includes,\n+                link_args: lk_args,\n+                link_depends: lk_deps,\n+                version: abi_version,\n+                soversion: so_version,\n+                install: install_shared)\n+        shared_dep = declare_dependency(link_with: shared_lib,\n+                include_directories: includes,\n+                dependencies: shared_deps)\n \n-    dpdk_libraries = [shared_lib] + dpdk_libraries\n-    dpdk_static_libraries = [static_lib] + dpdk_static_libraries\n+        dpdk_libraries = [shared_lib] + dpdk_libraries\n+    else\n+        shared_dep = {}\n+    endif\n \n     set_variable('shared_rte_' + name, shared_dep)\n     set_variable('static_rte_' + name, static_dep)\n",
    "prefixes": [
        "v3",
        "1/2"
    ]
}