get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 139292,
    "url": "http://patches.dpdk.org/api/patches/139292/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1713199543-30038-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": "<1713199543-30038-2-git-send-email-roretzla@linux.microsoft.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1713199543-30038-2-git-send-email-roretzla@linux.microsoft.com",
    "date": "2024-04-15T16:45:42",
    "name": "[v4,1/2] build: build only one library type on Windows",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "0d250b5e3ab881c3c506639060a0219ee54b0b96",
    "submitter": {
        "id": 2077,
        "url": "http://patches.dpdk.org/api/people/2077/?format=api",
        "name": "Tyler Retzlaff",
        "email": "roretzla@linux.microsoft.com"
    },
    "delegate": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1713199543-30038-2-git-send-email-roretzla@linux.microsoft.com/mbox/",
    "series": [
        {
            "id": 31743,
            "url": "http://patches.dpdk.org/api/series/31743/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=31743",
            "date": "2024-04-15T16:45:43",
            "name": "build and install only one library type on Windows",
            "version": 4,
            "mbox": "http://patches.dpdk.org/series/31743/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/139292/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/139292/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 76EF043E7C;\n\tMon, 15 Apr 2024 18:46:00 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 7C17B40684;\n\tMon, 15 Apr 2024 18:45:50 +0200 (CEST)",
            "from linux.microsoft.com (linux.microsoft.com [13.77.154.182])\n by mails.dpdk.org (Postfix) with ESMTP id 5283B4026C\n for <dev@dpdk.org>; Mon, 15 Apr 2024 18:45:46 +0200 (CEST)",
            "by linux.microsoft.com (Postfix, from userid 1086)\n id 577FB20FC5F7; Mon, 15 Apr 2024 09:45:45 -0700 (PDT)"
        ],
        "DKIM-Filter": "OpenDKIM Filter v2.11.0 linux.microsoft.com 577FB20FC5F7",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.microsoft.com;\n s=default; t=1713199545;\n bh=3V5I5oCKrMuxJ2g1wzw/YCHS+IW31uPtFvHrSYYw+L8=;\n h=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n b=rgIsmL8gs+nIJx0WVHqKkmStemRVyzGMupuHbz7o1fwufjQTAenXv41Vm/GrU6Y5B\n vkSwhX7P9HM7ssUOVrndN+5G/apEJDNU+34OZiG4eZ3BjAlgBM2QHV2OjsB/W8jt7j\n VjovWuVo5dTwxJa9Vdhl0E+IcAASBxUoBZGgydDc=",
        "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 v4 1/2] build: build only one library type on Windows",
        "Date": "Mon, 15 Apr 2024 09:45:42 -0700",
        "Message-Id": "<1713199543-30038-2-git-send-email-roretzla@linux.microsoft.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1713199543-30038-1-git-send-email-roretzla@linux.microsoft.com>",
        "References": "<1710445477-23848-1-git-send-email-roretzla@linux.microsoft.com>\n <1713199543-30038-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      |  4 +++\n config/meson.build   | 21 ++++++++++++++++\n drivers/meson.build  | 62 +++++++++++++++++++++------------------------\n examples/meson.build |  4 +++\n lib/meson.build      | 71 ++++++++++++++++++++++------------------------------\n 5 files changed, 87 insertions(+), 75 deletions(-)",
    "diff": "diff --git a/app/meson.build b/app/meson.build\nindex 21b6da2..d94378e 100644\n--- a/app/meson.build\n+++ b/app/meson.build\n@@ -104,6 +104,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..c74899e 100644\n--- a/config/meson.build\n+++ b/config/meson.build\n@@ -516,4 +516,25 @@ 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+    else\n+        # enable export / import of thread_local variables\n+        add_project_arguments('/experimental:tlsDllInterface', language: 'c')\n+        add_project_link_arguments('/experimental:tlsDllInterface', language: 'c')\n+    endif\n endif\ndiff --git a/drivers/meson.build b/drivers/meson.build\nindex 66931d4..92a85f8 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,39 @@ 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 = ['/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+        shared_dep = {}\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+        endif\n         static_dep = declare_dependency(\n                 include_directories: includes,\n                 dependencies: static_deps)\ndiff --git a/examples/meson.build b/examples/meson.build\nindex 8e8968a..9ca2cb9 100644\n--- a/examples/meson.build\n+++ b/examples/meson.build\n@@ -121,6 +121,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..f2894c6 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 = ['/def:' + def_file.full_path()]\n         else\n             lk_args = ['-Wl,--version-script=' + version_map]\n         endif\n@@ -304,23 +291,25 @@ 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+    shared_dep = {}\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+    endif\n \n     set_variable('shared_rte_' + name, shared_dep)\n     set_variable('static_rte_' + name, static_dep)\n",
    "prefixes": [
        "v4",
        "1/2"
    ]
}