Signed-off-by: Sergey Madaminov <[email protected]>
Co-authored-by: William Tu <[email protected]>
Signed-off-by: William Tu <[email protected]>
---
build-aux/copy-file-from-build.py | 19 +
build-aux/extract-odp-netlink-h.py | 84 ++++
build-aux/extract-odp-netlink-macros-h.py | 58 +++
config.h.meson | 387 ++++++++++++++++++
include/meson.build | 30 ++
include/openvswitch/meson.build | 8 +
lib/dirs.c.in.meson | 113 ++++++
lib/meson.build | 460 ++++++++++++++++++++++
lib/openvswitch.map.in | 4 +
lib/sflow.map.in | 4 +
meson.build | 371 +++++++++++++++++
meson_options.txt | 2 +
ofproto/meson.build | 59 +++
ofproto/ofproto.map.in | 4 +
ovsdb/meson.build | 106 +++++
ovsdb/ovsdb.map.in | 4 +
python/ovs/meson.build | 24 ++
utilities/meson.build | 83 ++++
vswitchd/meson.build | 30 ++
vtep/meson.build | 71 ++++
vtep/vtep.map.in | 4 +
21 files changed, 1925 insertions(+)
create mode 100644 build-aux/copy-file-from-build.py
create mode 100755 build-aux/extract-odp-netlink-h.py
create mode 100755 build-aux/extract-odp-netlink-macros-h.py
create mode 100644 config.h.meson
create mode 100644 include/meson.build
create mode 100644 include/openvswitch/meson.build
create mode 100644 lib/dirs.c.in.meson
create mode 100644 lib/meson.build
create mode 100644 lib/openvswitch.map.in
create mode 100644 lib/sflow.map.in
create mode 100644 meson.build
create mode 100644 meson_options.txt
create mode 100644 ofproto/meson.build
create mode 100644 ofproto/ofproto.map.in
create mode 100644 ovsdb/meson.build
create mode 100644 ovsdb/ovsdb.map.in
create mode 100644 python/ovs/meson.build
create mode 100644 utilities/meson.build
create mode 100644 vswitchd/meson.build
create mode 100644 vtep/meson.build
create mode 100644 vtep/vtep.map.in
diff --git a/build-aux/copy-file-from-build.py
b/build-aux/copy-file-from-build.py
new file mode 100644
index 000000000..df6432634
--- /dev/null
+++ b/build-aux/copy-file-from-build.py
@@ -0,0 +1,19 @@
+import os
+import shutil
+import sys
+
+input_file = os.path.join(
+ os.getenv('MESON_BUILD_ROOT'),
+ os.getenv('MESON_SUBDIR'),
+ sys.argv[1])
+
+output_file = os.path.join(
+ os.getenv('MESON_SOURCE_ROOT'),
+ os.getenv('MESON_SUBDIR'),
+ sys.argv[2])
+
+print(input_file)
+print(output_file)
+print(os.path.dirname(output_file))
+os.makedirs(os.path.dirname(output_file), exist_ok=True)
+shutil.copyfile(input_file, output_file)
diff --git a/build-aux/extract-odp-netlink-h.py
b/build-aux/extract-odp-netlink-h.py
new file mode 100755
index 000000000..c4da0a344
--- /dev/null
+++ b/build-aux/extract-odp-netlink-h.py
@@ -0,0 +1,84 @@
+# This is a "python" script that transforms <linux/openvswitch.h> into a
+# form that is suitable for inclusion within the Open vSwitch tree on
+# both Linux and non-Linux systems including Windows.
+
+import re
+import sys
+
+banner = ("""/* -*- mode: c; buffer-read-only: t -*- */
+/* Generated automatically from <linux/openvswitch.h> -- do not modify! */
+
+
+
+""")
+
+win_defs = ('''
+#ifdef _WIN32
+#include "OvsDpInterfaceExt.h"
+#include "OvsDpInterfaceCtExt.h"
+#endif
+
+/* IPCT_* enums may not be defined in all platforms, so do not use them. */
+#define OVS_CT_EVENT_NEW (1 << 0) /* 1 << IPCT_NEW */
+#define OVS_CT_EVENT_RELATED (1 << 1) /* 1 << IPCT_RELATED */
+#define OVS_CT_EVENT_DESTROY (1 << 2) /* 1 << IPCT_DESTROY */
+#define OVS_CT_EVENT_REPLY (1 << 3) /* 1 << IPCT_REPLY */
+#define OVS_CT_EVENT_ASSURED (1 << 4) /* 1 << IPCT_ASSURED */
+#define OVS_CT_EVENT_PROTOINFO (1 << 5) /* 1 << IPCT_PROTOINFO */
+#define OVS_CT_EVENT_HELPER (1 << 6) /* 1 << IPCT_HELPER */
+#define OVS_CT_EVENT_MARK (1 << 7) /* 1 << IPCT_MARK */
+#define OVS_CT_EVENT_SEQADJ (1 << 8) /* 1 << IPCT_SEQADJ */
+#define OVS_CT_EVENT_SECMARK (1 << 9) /* 1 << IPCT_SECMARK */
+#define OVS_CT_EVENT_LABEL (1 << 10) /* 1 << IPCT_LABEL */
+
+#define OVS_CT_EVENTMASK_DEFAULT \\
+ (OVS_CT_EVENT_NEW | OVS_CT_EVENT_RELATED | OVS_CT_EVENT_DESTROY |\\
+ OVS_CT_EVENT_MARK | OVS_CT_EVENT_LABEL)
+
+
+''')
+
+header_template = sys.argv[1]
+with open(header_template, 'r') as f:
+ contents = f.readlines()
+
+# Add a header warning that this is a generated file. It might save somebody
+# some frustration (maybe even me!).
+contents.insert(0, banner)
+
+# Include platform extensions header file on Win32.
+contents.insert(len(contents) - 1, win_defs)
+
+contents = "".join(contents)
+
+# Avoid using reserved names in header guards.
+contents = re.sub("_LINUX_OPENVSWITCH_H", "ODP_NETLINK_H", contents)
+
+# Use OVS's own struct eth_addr instead of a 6-byte char array.
+contents = re.sub("<linux/types.h>", "\"openvswitch/types.h\"", contents)
+contents = re.sub("<linux/if_ether.h>", "<netinet/in.h>", contents)
+contents = re.sub("__u8\s+([a-zA-Z0-9_]*)\s*\[\s*ETH_ALEN\s*\]", "struct
eth_addr \\1", contents)
+
+# Transform IPv6 addresses from an array to struct in6_addr
+#
+# As a very special case, only transform member names with more than
+# one character because struct ovs_key_nsh has a member "__be32 c[4];"
+# that is not an IPv6 address.
+contents = re.sub("__be32\s+([a-zA-Z0-9_]{2,})\s*\[\s*4\s*\]", "struct
in6_addr \\1", contents)
+
+# Transform most Linux-specific __u<N> types into C99 uint<N>_t types,
+# and most Linux-specific __be<N> into Open vSwitch ovs_be<N>,
+# and use the appropriate userspace header.
+contents = re.sub("__u32", "uint32_t", contents)
+contents = re.sub("__u16", "uint16_t", contents)
+contents = re.sub("__u8", "uint8_t", contents)
+contents = re.sub("__be32", "ovs_be32", contents)
+contents = re.sub("__be16", "ovs_be16", contents)
+
+# Transform 64-bit Linux-specific types into Open vSwitch specialized
+# types for 64-bit numbers that might only be aligned on a 32-bit
+# boundary.
+contents = re.sub("__u64", "ovs_32aligned_u64", contents)
+contents = re.sub("__be64", "ovs_32aligned_be64", contents)
+
+print(contents)
diff --git a/build-aux/extract-odp-netlink-macros-h.py
b/build-aux/extract-odp-netlink-macros-h.py
new file mode 100755
index 000000000..8b57b235d
--- /dev/null
+++ b/build-aux/extract-odp-netlink-macros-h.py
@@ -0,0 +1,58 @@
+import mmap
+import re
+import sys
+
+hfile=sys.argv[1]
+
+# 'line_start' is the line number where the definition of the struct begin
+# 'line_end' is the line number where the definition of the struct ends
+def generate_fields_macros(struct_name):
+ with open(hfile, 'r') as f:
+ define_lines = []
+ found = False
+ for line in f:
+ if found:
+ tmp_line = re.sub(";.*", "", line)
+ fields = re.split("\s+", tmp_line)
+ if len(fields) == 5:
+ define_lines.append(" {offsetof(struct " + struct_name
+ ", " + fields[3] + "), sizeof(" + fields[1] + " " + fields[2] + ")}, \\")
+ elif len(fields) == 4:
+ define_lines.append(" {offsetof(struct " + struct_name
+ ", " + fields[2] + "), sizeof(" + fields[1] + ")}, \\")
+ else:
+ define_lines.append(" {0, 0}}")
+ break
+ elif re.search(r'\b' + struct_name + r'\b', line):
+ if "{" in line:
+ found = True
+ STRUCT = struct_name.upper()
+ define_line = "#define " + STRUCT + "_OFFSETOF_SIZEOF_ARR { \\"
+ print(define_line)
+ for define_line in define_lines:
+ print(define_line)
+ print()
+ print()
+
+preamble = ("""/* Generated automatically from <include/odp-netlink.h> -- do
not modify! */
+#ifndef ODP_NETLINK_MACROS_H
+#define ODP_NETLINK_MACROS_H
+
+""")
+
+print(preamble)
+
+generate_fields_macros("ovs_key_ethernet")
+generate_fields_macros("ovs_key_ipv4")
+generate_fields_macros("ovs_key_ipv6")
+generate_fields_macros("ovs_key_tcp")
+generate_fields_macros("ovs_key_udp")
+generate_fields_macros("ovs_key_sctp")
+generate_fields_macros("ovs_key_icmp")
+generate_fields_macros("ovs_key_icmpv6")
+generate_fields_macros("ovs_key_arp")
+generate_fields_macros("ovs_key_nd")
+generate_fields_macros("ovs_key_nd_extensions")
+
+epilogue = ("""
+#endif""")
+
+print(epilogue)
diff --git a/config.h.meson b/config.h.meson
new file mode 100644
index 000000000..3aaa1cbd6
--- /dev/null
+++ b/config.h.meson
@@ -0,0 +1,387 @@
+/* config.h.in. Generated from configure.ac by autoheader. */
+
+/* Define if building universal (internal helper macro) */
+#mesondefine AC_APPLE_UNIVERSAL_BUILD
+
+/* If the C compiler is GCC 4.7 or later, define to the return value of
+ __atomic_always_lock_free(1, 0). If the C compiler is not GCC or is an
+ older version of GCC, the value does not matter. */
+#mesondefine ATOMIC_ALWAYS_LOCK_FREE_1B
+
+/* If the C compiler is GCC 4.7 or later, define to the return value of
+ __atomic_always_lock_free(2, 0). If the C compiler is not GCC or is an
+ older version of GCC, the value does not matter. */
+#mesondefine ATOMIC_ALWAYS_LOCK_FREE_2B
+
+/* If the C compiler is GCC 4.7 or later, define to the return value of
+ __atomic_always_lock_free(4, 0). If the C compiler is not GCC or is an
+ older version of GCC, the value does not matter. */
+#mesondefine ATOMIC_ALWAYS_LOCK_FREE_4B
+
+/* If the C compiler is GCC 4.7 or later, define to the return value of
+ __atomic_always_lock_free(8, 0). If the C compiler is not GCC or is an
+ older version of GCC, the value does not matter. */
+#mesondefine ATOMIC_ALWAYS_LOCK_FREE_8B
+
+/* System uses the DPDK module. */
+#mesondefine DPDK_NETDEV
+
+/* Define to 1 if AF_XDP support is available and enabled. */
+#mesondefine HAVE_AF_XDP
+
+/* Define to 1 if you have the <atomic> header file. */
+#mesondefine HAVE_ATOMIC
+
+/* Define to 1 if you have backtrace(3). */
+#mesondefine HAVE_BACKTRACE
+
+/* Define to 1 if you have the <bits/floatn-common.h> header file. */
+#mesondefine HAVE_BITS_FLOATN_COMMON_H
+
+/* Define to 1 if you have the `clock_gettime' function. */
+#mesondefine HAVE_CLOCK_GETTIME
+
+/* define if the compiler supports basic C++11 syntax */
+#mesondefine HAVE_CXX11
+
+/* Define to 1 if you have the declaration of `malloc_trim', and to 0 if you
+ don't. */
+#mesondefine HAVE_DECL_MALLOC_TRIM
+
+/* Define to 1 if you have the declaration of `RTE_EAL_NUMA_AWARE_HUGEPAGES',
+ and to 0 if you don't. */
+#mesondefine HAVE_DECL_RTE_EAL_NUMA_AWARE_HUGEPAGES
+
+/* Define to 1 if you have the declaration of `RTE_LIBRTE_VHOST_NUMA', and to
+ 0 if you don't. */
+#mesondefine HAVE_DECL_RTE_LIBRTE_VHOST_NUMA
+
+/* Define to 1 if you have the declaration of `strerror_r', and to 0 if you
+ don't. */
+#mesondefine HAVE_DECL_STRERROR_R
+
+/* Define to 1 if you have the declaration of `sys_siglist', and to 0 if you
+ don't. */
+#mesondefine HAVE_DECL_SYS_SIGLIST
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#mesondefine HAVE_DLFCN_H
+
+/* Define to 1 if the C compiler and linker supports the GCC 4.0+ atomic
+ built-ins. */
+#mesondefine HAVE_GCC4_ATOMICS
+
+/* Define to 1 if you have the `getloadavg' function. */
+#mesondefine HAVE_GETLOADAVG
+
+/* Define to 1 if you have the `getmntent_r' function. */
+#mesondefine HAVE_GETMNTENT_R
+
+/* Define to 1 if pthread_setname_np() is available and takes 2 parameters
+ (like glibc). */
+/* MSR: fix this */
+#mesondefine HAVE_GLIBC_PTHREAD_SETNAME_NP
+/* #define HAVE_GLIBC_PTHREAD_SETNAME_NP 1 */
+/* Define to 1 if net/if_dl.h is available. */
+#mesondefine HAVE_IF_DL
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#mesondefine HAVE_INTTYPES_H
+
+/* Define to 1 if libcap-ng is available. */
+#mesondefine HAVE_LIBCAPNG
+
+/* Define to 1 if you have the `socket' library (-lsocket). */
+#mesondefine HAVE_LIBSOCKET
+
+/* Define to 1 if you have the <libunwind.h> header file. */
+#mesondefine HAVE_LIBUNWIND_H
+
+/* Define to 1 if you have the <linux/if_ether.h> header file. */
+#mesondefine HAVE_LINUX_IF_ETHER_H
+
+/* Define to 1 if you have the <linux/net_namespace.h> header file. */
+#mesondefine HAVE_LINUX_NET_NAMESPACE_H
+
+/* Define to 1 if you have the <linux/perf_event.h> header file. */
+#mesondefine HAVE_LINUX_PERF_EVENT_H
+
+/* Define to 1 if you have the <linux/types.h> header file. */
+#mesondefine HAVE_LINUX_TYPES_H
+
+/* Define to 1 if you have the <memory.h> header file. */
+#mesondefine HAVE_MEMORY_H
+
+/* Define to 1 if you have the `mlockall' function. */
+#mesondefine HAVE_MLOCKALL
+
+/* Define to 1 if you have the <mntent.h> header file. */
+#mesondefine HAVE_MNTENT_H
+
+/* Define to 1 if pthread_setname_np() is available and takes 3 parameters
+ (like NetBSD). */
+#mesondefine HAVE_NETBSD_PTHREAD_SETNAME_NP
+
+/* Define to 1 if Netlink protocol is available. */
+#mesondefine HAVE_NETLINK
+
+/* Define to 1 if you have the <net/if_mib.h> header file. */
+#mesondefine HAVE_NET_IF_MIB_H
+
+/* Define to 1 if struct nla_bitfield32 is available. */
+#mesondefine HAVE_NLA_BITFIELD32
+
+/* Define to 1 if OpenSSL is installed. */
+#mesondefine HAVE_OPENSSL
+
+/* Define to 1 if `posix_memalign' works. */
+#mesondefine HAVE_POSIX_MEMALIGN
+
+/* Define if compiler supports #pragma message directive */
+#mesondefine HAVE_PRAGMA_MESSAGE
+
+/* Define to 1 if you have the `pthread_set_name_np' function. */
+#mesondefine HAVE_PTHREAD_SET_NAME_NP
+
+/* Define to 1 if you have the `pthread_spin_lock' function. */
+#mesondefine HAVE_PTHREAD_SPIN_LOCK
+/* #define HAVE_PTHREAD_SPIN_LOCK 1 */
+/* Define to 1 if you have the <rte_config.h> header file. */
+#mesondefine HAVE_RTE_CONFIG_H
+
+/* Define to 1 if SCTP_CONNTRACK_HEARTBEAT_SENT is available. */
+#mesondefine HAVE_SCTP_CONNTRACK_HEARTBEATS
+
+/* Define to 1 if you have the `sendmmsg' function. */
+#mesondefine HAVE_SENDMMSG
+
+/* Define to 1 if you have the `statvfs' function. */
+#mesondefine HAVE_STATVFS
+
+/* Define to 1 if you have the <stdatomic.h> header file. */
+#mesondefine HAVE_STDATOMIC_H
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#mesondefine HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdio.h> header file. */
+#mesondefine HAVE_STDIO_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#mesondefine HAVE_STDLIB_H
+
+/* Define to 1 if you have the `strerror_r' function. */
+#mesondefine HAVE_STRERROR_R
+
+/* Define to 1 if you have the <strings.h> header file. */
+#mesondefine HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#mesondefine HAVE_STRING_H
+
+/* Define to 1 if you have the `strnlen' function. */
+#mesondefine HAVE_STRNLEN
+
+/* Define if strtok_r macro segfaults on some inputs */
+#mesondefine HAVE_STRTOK_R_BUG
+
+/* Define to 1 if `ifr_flagshigh' is a member of `struct ifreq'. */
+#mesondefine HAVE_STRUCT_IFREQ_IFR_FLAGSHIGH
+
+/* Define to 1 if `msg_len' is a member of `struct mmsghdr'. */
+#mesondefine HAVE_STRUCT_MMSGHDR_MSG_LEN
+
+/* Define to 1 if `sin6_scope_id' is a member of `struct sockaddr_in6'. */
+#mesondefine HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID
+
+/* Define to 1 if `st_mtimensec' is a member of `struct stat'. */
+#mesondefine HAVE_STRUCT_STAT_ST_MTIMENSEC
+
+/* Define to 1 if `st_mtim.tv_nsec' is a member of `struct stat'. */
+#mesondefine HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC
+
+/* Define to 1 if `firstuse' is a member of `struct tcf_t'. */
+#mesondefine HAVE_STRUCT_TCF_T_FIRSTUSE
+
+/* Define to 1 if the system has the type `struct timespec'. */
+#mesondefine HAVE_STRUCT_TIMESPEC
+
+/* Define to 1 if you have the <sys/statvfs.h> header file. */
+#mesondefine HAVE_SYS_STATVFS_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#mesondefine HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#mesondefine HAVE_SYS_TYPES_H
+
+/* Define to 1 if HAVE_TCA_MPLS_TTL is available. */
+#mesondefine HAVE_TCA_MPLS_TTL
+
+/* Define to 1 if TCA_PEDIT_KEY_EX_HDR_TYPE_UDP is available. */
+#mesondefine HAVE_TCA_PEDIT_KEY_EX_HDR_TYPE_UDP
+
+/* Define to 1 if TCA_POLICE_PKTRATE64 is available. */
+#mesondefine HAVE_TCA_POLICE_PKTRATE64
+
+/* Define to 1 if TCA_SKBEDIT_FLAGS is available. */
+#mesondefine HAVE_TCA_SKBEDIT_FLAGS
+
+/* Define to 1 if TCA_TUNNEL_KEY_ENC_TTL is available. */
+#mesondefine HAVE_TCA_TUNNEL_KEY_ENC_TTL
+
+/* Define to 1 if TCA_VLAN_PUSH_VLAN_PRIORITY is available. */
+#mesondefine HAVE_TCA_VLAN_PUSH_VLAN_PRIORITY
+
+/* Define to 1 if the C compiler and linker supports the C11 thread_local
+ macro defined in <threads.h>. */
+#mesondefine HAVE_THREAD_LOCAL
+
+/* Define to 1 if unbound is detected. */
+#mesondefine HAVE_UNBOUND
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#mesondefine HAVE_UNISTD_H
+
+/* Define to 1 if unwind is detected. */
+#mesondefine HAVE_UNWIND
+
+/* Define to 1 if you have the <valgrind/valgrind.h> header file. */
+#mesondefine HAVE_VALGRIND_VALGRIND_H
+
+/* Define to 1 if __virtio16 is available. */
+#mesondefine HAVE_VIRTIO_TYPES
+
+/* XDP need wakeup support detected in xsk.h. */
+#mesondefine HAVE_XDP_NEED_WAKEUP
+
+/* Define to 1 if the C compiler and linker supports the GCC __thread
+ extenions. */
+#mesondefine HAVE___THREAD
+
+/* Define to the sub-directory where libtool stores uninstalled libraries. */
+#mesondefine LT_OBJDIR
+
+/* Define to 1 if OpenSSL supports Server Name Indication (SNI). */
+#mesondefine OPENSSL_SUPPORTS_SNI
+
+/* Name of package */
+#mesondefine PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#mesondefine PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#mesondefine PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#mesondefine PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#mesondefine PACKAGE_TARNAME
+
+/* Define to the home page for this package. */
+#mesondefine PACKAGE_URL
+
+/* Define to the version of this package. */
+#mesondefine PACKAGE_VERSION
+
+/* Define to 1 if you have the ANSI C header files. */
+#mesondefine STDC_HEADERS
+
+/* Define to 1 if strerror_r returns char *. */
+#mesondefine STRERROR_R_CHAR_P
+
+/* Enable extensions on AIX 3, Interix. */
+#ifndef _ALL_SOURCE
+#mesondefine _ALL_SOURCE
+#endif
+/* Enable GNU extensions on systems that have them. */
+#ifndef _GNU_SOURCE
+#mesondefine _GNU_SOURCE
+#endif
+/* Enable threading extensions on Solaris. */
+#ifndef _POSIX_PTHREAD_SEMANTICS
+#mesondefine _POSIX_PTHREAD_SEMANTICS
+#endif
+/* Enable extensions on HP NonStop. */
+#ifndef _TANDEM_SOURCE
+#mesondefine _TANDEM_SOURCE
+#endif
+/* Enable general extensions on Solaris. */
+#ifndef __EXTENSIONS__
+#mesondefine __EXTENSIONS__
+#endif
+
+/* Version number of package */
+#mesondefine VERSION
+
+/* NUMA Aware vHost support detected in DPDK. */
+#mesondefine VHOST_NUMA
+
+/* System uses the Visual Studio build target. */
+#mesondefine VSTUDIO_DDK
+
+/* Define to 1 if building on WIN32. */
+#mesondefine WIN32
+
+/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
+ significant byte first (like Motorola and SPARC, unlike Intel). */
+#if defined AC_APPLE_UNIVERSAL_BUILD
+# if defined __BIG_ENDIAN__
+# define WORDS_BIGENDIAN 1
+# endif
+#else
+# ifndef WORDS_BIGENDIAN
+#mesondefine WORDS_BIGENDIAN
+# endif
+#endif
+
+/* Enable large inode numbers on Mac OS X 10.5. */
+#ifndef _DARWIN_USE_64_BIT_INODE
+# define _DARWIN_USE_64_BIT_INODE 1
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+#mesondefine _FILE_OFFSET_BITS
+
+/* Define for large files, on AIX-style hosts. */
+#mesondefine _LARGE_FILES
+
+/* Define to 1 if on MINIX. */
+#mesondefine _MINIX
+
+/* Define to 2 if the system does not provide POSIX.1 features except with
+ this defined. */
+#mesondefine _POSIX_1_SOURCE
+
+/* Define to 1 if you need to in order for `stat' and other things to work. */
+#mesondefine _POSIX_SOURCE
+
+/* MSR: fix this hack */
+#ifndef WIN32
+# ifndef _GNU_SOURCE
+# define _GNU_SOURCE 1
+# endif
+/* Define __USE_POSIX if you have the <bits/posix1_lim.h> header file
+ and you are on Linux (or other POSIX compliant OS) */
+/* #mesondefine __USE_POSIX */
+
+/* Define __USE_XOPEN if you have the <bits/xopen_lim.h> header file
+ and you are on Linux (or other POSIX compliant OS) */
+/* #mesondefine __USE_XOPEN */
+#endif
+
+/* MSR: fix this - move this to the build file itself */
+#ifdef WIN32
+#include "include/windows/windefs.h"
+#endif
+
+/* MSR: use meson checks to enable/disable this
+ and still not clear why it does not work on Linux
+ or maybe I should include this header only in Windows */
+#if defined(__clang__) && defined(WIN32)
+#include <intrin.h>
+#endif
+
+#mesondefine HAVE_THREAD_SAFETY
diff --git a/include/meson.build b/include/meson.build
new file mode 100644
index 000000000..65ac6b5e7
--- /dev/null
+++ b/include/meson.build
@@ -0,0 +1,30 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2021 VMware, Inc.
+
+include_odp_netlink_h = custom_target(
+ 'odp-netlink.h',
+ input : meson.project_source_root() +
'/datapath/linux/compat/include/linux/openvswitch.h',
+ output : 'odp-netlink.h',
+ command : [
+ prog_python,
+ meson.project_source_root() + '/build-aux/extract-odp-netlink-h.py',
+ '@INPUT@',
+ ],
+ capture : '@OUTPUT@',
+ env : python_env,
+)
+
+include_odp_netlink_macros_h = custom_target(
+ 'odp-netlink-macros.h',
+ input : include_odp_netlink_h,
+ output : 'odp-netlink-macros.h',
+ command : [
+ prog_python,
+ meson.project_source_root() +
'/build-aux/extract-odp-netlink-macros-h.py',
+ '@INPUT@',
+ ],
+ capture : '@OUTPUT@',
+ env : python_env,
+)
+
+subdir('openvswitch')
diff --git a/include/openvswitch/meson.build b/include/openvswitch/meson.build
new file mode 100644
index 000000000..e6365cbc3
--- /dev/null
+++ b/include/openvswitch/meson.build
@@ -0,0 +1,8 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2021 VMware, Inc.
+
+configure_file(
+ input : meson.project_source_root() + '/include/openvswitch/version.h.in',
+ output : 'version.h',
+ configuration : conf_version,
+)
diff --git a/lib/dirs.c.in.meson b/lib/dirs.c.in.meson
new file mode 100644
index 000000000..d3459ab2e
--- /dev/null
+++ b/lib/dirs.c.in.meson
@@ -0,0 +1,113 @@
+@BANNER@
+#line 2 "@srcdir@/lib/dirs.c.in.meson"
+/*
+ * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <config.h>
+#include "dirs.h"
+#include <stdlib.h>
+#include "ovs-thread.h"
+#include "util.h"
+
+struct directory {
+ const char *value; /* Actual value; NULL if not yet determined. */
+ const char *default_value; /* Default value. */
+ const char *var_name; /* Environment variable to override default. */
+ struct ovsthread_once once; /* Ensures 'value' gets initialized once. */
+};
+
+static const char *
+get_dir(struct directory *d)
+{
+ if (ovsthread_once_start(&d->once)) {
+ d->value = getenv(d->var_name);
+ if (!d->value || !d->value[0]) {
+ d->value = d->default_value;
+ }
+ ovsthread_once_done(&d->once);
+ }
+ return d->value;
+}
+
+const char *
+ovs_sysconfdir(void)
+{
+ static struct directory d = {
+ NULL, @sysconfdir@, "OVS_SYSCONFDIR", OVSTHREAD_ONCE_INITIALIZER
+ };
+
+ return get_dir(&d);
+}
+
+const char *
+ovs_pkgdatadir(void)
+{
+ static struct directory d = {
+ NULL, @pkgdatadir@, "OVS_PKGDATADIR", OVSTHREAD_ONCE_INITIALIZER
+ };
+
+ return get_dir(&d);
+}
+
+const char *
+ovs_rundir(void)
+{
+ static struct directory d = {
+ NULL, @RUNDIR@, "OVS_RUNDIR", OVSTHREAD_ONCE_INITIALIZER
+ };
+
+ return get_dir(&d);
+}
+
+const char *
+ovs_logdir(void)
+{
+ static struct directory d = {
+ NULL, @LOGDIR@, "OVS_LOGDIR", OVSTHREAD_ONCE_INITIALIZER
+ };
+
+ return get_dir(&d);
+}
+
+const char *
+ovs_dbdir(void)
+{
+ static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER;
+ static const char *dbdir;
+
+ if (ovsthread_once_start(&once)) {
+ dbdir = getenv("OVS_DBDIR");
+ if (!dbdir || !dbdir[0]) {
+ char *sysconfdir = getenv("OVS_SYSCONFDIR");
+
+ dbdir = (sysconfdir
+ ? xasprintf("%s/openvswitch", sysconfdir)
+ : @DBDIR@);
+ }
+ ovsthread_once_done(&once);
+ }
+ return dbdir;
+}
+
+const char *
+ovs_bindir(void)
+{
+ static struct directory d = {
+ NULL, @bindir@, "OVS_BINDIR", OVSTHREAD_ONCE_INITIALIZER
+ };
+
+ return get_dir(&d);
+}
diff --git a/lib/meson.build b/lib/meson.build
new file mode 100644
index 000000000..42e0bbfd6
--- /dev/null
+++ b/lib/meson.build
@@ -0,0 +1,460 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2021 VMware, Inc.
+
+lib_ovsdb_server_idl_c = custom_target(
+ 'ovsdb-server-idl.c',
+ input : lib_ovsdb_server_idl_ovsidl,
+ output : 'ovsdb-server-idl.c',
+ command : [
+ prog_python,
+ meson.project_source_root() + '/ovsdb/ovsdb-idlc.in',
+ 'c-idl-source',
+ '@INPUT@',
+ ],
+ capture : '@OUTPUT@',
+ env : python_env,
+)
+
+lib_ovsdb_server_idl_h = custom_target(
+ 'ovsdb-server-idl.h',
+ input : lib_ovsdb_server_idl_ovsidl,
+ output : 'ovsdb-server-idl.h',
+ command : [
+ prog_python,
+ meson.project_source_root() + '/ovsdb/ovsdb-idlc.in',
+ 'c-idl-header',
+ '@INPUT@',
+ ],
+ capture : '@OUTPUT@',
+ env : python_env,
+)
+
+lib_vswitch_idl_c = custom_target(
+ 'vswitch-idl.c',
+ input : lib_vswitch_idl_ovsidl,
+ output : 'vswitch-idl.c',
+ command : [
+ prog_python,
+ meson.project_source_root() + '/ovsdb/ovsdb-idlc.in',
+ 'c-idl-source',
+ '@INPUT@',
+ ],
+ capture : '@OUTPUT@',
+ env : python_env,
+)
+
+lib_vswitch_idl_h = custom_target(
+ 'vswitch-idl.h',
+ input : lib_vswitch_idl_ovsidl,
+ output : 'vswitch-idl.h',
+ command : [
+ prog_python,
+ meson.project_source_root() + '/ovsdb/ovsdb-idlc.in',
+ 'c-idl-header',
+ '@INPUT@',
+ ],
+ capture : '@OUTPUT@',
+ env : python_env,
+)
+
+#sources = files(
+# 'dpif-netdev-lookup-avx512-gather.c',
+# 'dpif-netdev-extract-avx512.c',
+# 'dpif-netdev-avx512.c',
+#)
+#
+#deps = []
+#
+#mapfile = '../openvswitchavx512.map'
+#vflag = '-Wl'.format(meson.current_source_dir(), mapfile)
+#openvswitchavx512 = library(
+# 'openvswitchavx512', sources,
+# dependencies : deps,
+# include_directories : global_inc,
+# c_args : [
+# '-mavx512f',
+# '-mavx512bw',
+# '-mavx512dq',
+# '-mbmi',
+# '-mbmi2',
+# '-fPIC',
+# ],
+# link_args : ['-Wl,--no-undefined', vflag],
+# link_depends : mapfile,
+# version : as_version,
+# soversion : as_soversion,
+#)
+#
+
+sources = files(
+ 'sflow_agent.c',
+ 'sflow_sampler.c',
+ 'sflow_poller.c',
+ 'sflow_receiver.c',
+)
+
+deps = []
+
+mapfile = meson.project_build_root() + '/sflow.map'
+vflag = '-Wl'.format(meson.current_source_dir(), mapfile)
+sflow = library(
+ 'sflow', sources,
+ dependencies : deps,
+ include_directories : global_inc,
+ link_args : ['-Wl,--no-undefined', vflag],
+ link_depends : mapfile,
+ version : as_version,
+ soversion : as_soversion,
+)
+
+# lib/meta-flow.inc
+lib_meta_flow_inc = custom_target(
+ 'meta-flow.inc',
+ input : meson.project_source_root() + '/include/openvswitch/meta-flow.h',
+ output : 'meta-flow.inc',
+ command : [
+ prog_python,
+ meson.project_source_root() + '/build-aux/extract-ofp-fields',
+ 'meta-flow',
+ '@INPUT@',
+ ],
+ capture : '@OUTPUT@',
+ env : python_env,
+)
+
+# lib/nx-match.inc
+lib_nx_match_inc = custom_target(
+ 'nx-match.inc',
+ input : meson.project_source_root() + '/include/openvswitch/meta-flow.h',
+ output : 'nx-match.inc',
+ command : [
+ prog_python,
+ meson.project_source_root() + '/build-aux/extract-ofp-fields',
+ 'nx-match',
+ '@INPUT@',
+ ],
+ capture : '@OUTPUT@',
+ env : python_env,
+)
+
+# lib/ofc-actions.inc1
+lib_ofp_actions_inc1 = custom_target(
+ 'ofp-actions.inc1',
+ input : meson.project_source_root() + '/lib/ofp-actions.c',
+ output : 'ofp-actions.inc1',
+ command : [
+ prog_python,
+ meson.project_source_root() + '/build-aux/extract-ofp-actions',
+ 'prototypes',
+ '@INPUT@',
+ ],
+ capture : '@OUTPUT@',
+ env : python_env,
+)
+
+# lib/ofc-actions.inc2
+lib_ofp_actions_inc2 = custom_target(
+ 'ofp-actions.inc2',
+ input : meson.project_source_root() + '/lib/ofp-actions.c',
+ output : 'ofp-actions.inc2',
+ command : [
+ prog_python,
+ meson.project_source_root() + '/build-aux/extract-ofp-actions',
+ 'definitions',
+ '@INPUT@',
+ ],
+ capture : '@OUTPUT@',
+ env : python_env,
+)
+
+# lib/ofp-errors.inc
+lib_ofp_errors_inc = custom_target(
+ 'ofp-errors.inc',
+ input : [
+ meson.project_source_root() + '/include/openvswitch/ofp-errors.h',
+ meson.project_source_root() + '/include/openflow/openflow-common.h',
+ ],
+ output : 'ofp-errors.inc',
+ command : [
+ prog_python,
+ meson.project_source_root() + '/build-aux/extract-ofp-errors',
+ '@INPUT0@',
+ '@INPUT1@',
+ ],
+ capture : '@OUTPUT@',
+ env : python_env,
+)
+
+# lib/ofp-msgs.inc
+lib_ofp_msgs_inc = custom_target(
+ 'ofp-msgs.inc',
+ input : [
+ meson.project_source_root() + '/include/openvswitch/ofp-msgs.h',
+ ],
+ output : 'ofp-msgs.inc',
+ command : [
+ prog_python,
+ meson.project_source_root() + '/build-aux/extract-ofp-msgs',
+ '@INPUT@',
+ 'lib/ofp-msgs.inc',
+ ],
+ capture : '@OUTPUT@',
+ env : python_env,
+)
+
+sources = files(
+ 'aes128.c',
+ 'backtrace.c',
+ 'bfd.c',
+ 'bundle.c',
+ 'byteq.c',
+ 'cfm.c',
+ 'classifier.c',
+ 'ccmap.c',
+ 'cmap.c',
+ 'colors.c',
+ 'command-line.c',
+ 'connectivity.c',
+ 'conntrack-icmp.c',
+ 'conntrack-tcp.c',
+ 'conntrack-tp.c',
+ 'conntrack-other.c',
+ 'conntrack.c',
+ 'coverage.c',
+ 'crc32c.c',
+ 'csum.c',
+ 'ct-dpif.c',
+ 'daemon.c',
+ 'db-ctl-base.c',
+ 'dummy.c',
+ 'dpctl.c',
+ 'dp-packet.c',
+ 'dpif-netdev-extract-study.c',
+ 'dpif-netdev-lookup.c',
+ 'dpif-netdev-lookup-autovalidator.c',
+ 'dpif-netdev-lookup-generic.c',
+ 'dpif-netdev.c',
+ 'dpif-netdev-private-dfc.c',
+ 'dpif-netdev-private-dpif.c',
+ 'dpif-netdev-private-extract.c',
+ 'dpif-netdev-perf.c',
+ 'dpif.c',
+ 'heap.c',
+ 'dynamic-string.c',
+ 'entropy.c',
+ 'fat-rwlock.c',
+ 'fatal-signal.c',
+ 'flow.c',
+ 'guarded-list.c',
+ 'hash.c',
+ 'hindex.c',
+ 'hmap.c',
+ 'hmapx.c',
+ 'id-pool.c',
+ 'if-notifier-manual.c',
+ 'ipf.c',
+ 'jhash.c',
+ 'json.c',
+ 'jsonrpc.c',
+ 'lacp.c',
+ 'learn.c',
+ 'learning-switch.c',
+ 'lockfile.c',
+ 'mac-learning.c',
+ 'match.c',
+ 'mcast-snooping.c',
+ 'memory.c',
+ 'meta-flow.c',
+ 'multipath.c',
+ 'namemap.c',
+ 'netdev-dummy.c',
+ 'netdev-offload.c',
+ 'netdev-vport.c',
+ 'netdev.c',
+ 'netlink.c',
+ 'nx-match.c',
+ 'object-collection.c',
+ 'odp-execute.c',
+ 'odp-util.c',
+ 'ofp-actions.c',
+ 'ofp-bundle.c',
+ 'ofp-connection.c',
+ 'ofp-ed-props.c',
+ 'ofp-errors.c',
+ 'ofp-flow.c',
+ 'ofp-group.c',
+ 'ofp-ipfix.c',
+ 'ofp-match.c',
+ 'ofp-meter.c',
+ 'ofp-monitor.c',
+ 'ofp-msgs.c',
+ 'ofp-packet.c',
+ 'ofp-parse.c',
+ 'ofp-port.c',
+ 'ofp-print.c',
+ 'ofp-prop.c',
+ 'ofp-protocol.c',
+ 'ofp-queue.c',
+ 'ofp-switch.c',
+ 'ofp-table.c',
+ 'ofp-util.c',
+ 'ofp-version-opt.c',
+ 'ofpbuf.c',
+ 'ovs-atomic-locked.c',
+ 'ovs-lldp.c',
+ 'ovs-numa.c',
+ 'ovs-rcu.c',
+ 'ovs-replay.c',
+ 'ovs-router.c',
+ 'ovs-thread.c',
+ 'ovsdb-cs.c',
+ 'ovsdb-data.c',
+ 'ovsdb-error.c',
+ 'ovsdb-idl.c',
+ 'ovsdb-map-op.c',
+ 'ovsdb-set-op.c',
+ 'ovsdb-condition.c',
+ 'ovsdb-parser.c',
+ 'ovsdb-session.c',
+ 'ovsdb-types.c',
+ 'ox-stat.c',
+ 'packets.c',
+ 'pcap-file.c',
+ 'perf-counter.c',
+ 'stopwatch.c',
+ 'poll-loop.c',
+ 'process.c',
+ 'pvector.c',
+ 'random.c',
+ 'rconn.c',
+ 'reconnect.c',
+ 'rstp.c',
+ 'rstp-state-machines.c',
+ 'seq.c',
+ 'sha1.c',
+ 'shash.c',
+ 'simap.c',
+ 'skiplist.c',
+ 'smap.c',
+ 'socket-util.c',
+ 'sort.c',
+ 'sset.c',
+ 'stp.c',
+ 'stream-fd.c',
+ 'stream-replay.c',
+ 'stream-tcp.c',
+ 'stream.c',
+ 'stdio.c',
+ 'string.c',
+ 'svec.c',
+ 'syslog-direct.c',
+ 'syslog-libc.c',
+ 'syslog-null.c',
+ 'table.c',
+ 'timer.c',
+ 'timeval.c',
+ 'tnl-neigh-cache.c',
+ 'tnl-ports.c',
+ 'netdev-native-tnl.c',
+ 'token-bucket.c',
+ 'tun-metadata.c',
+ 'unicode.c',
+ 'unixctl.c',
+ 'userspace-tso.c',
+ 'util.c',
+ 'uuid.c',
+ 'vconn-stream.c',
+ 'vconn.c',
+ 'vlan-bitmap.c',
+ 'vlog.c',
+ 'lldp/lldp.c',
+ 'lldp/lldpd.c',
+ 'lldp/lldpd-structs.c',
+ 'dpdk-stub.c',
+ 'async-append-null.c', # no POSIX_AIO
+ 'stream-nossl.c',
+ 'dns-resolve.h',
+ 'dns-resolve-stub.c',
+)
+
+if build_machine.system() == 'windows'
+ sources += files(
+ 'daemon-windows.c',
+ 'getopt_long.c',
+ 'getrusage-windows.c',
+ 'latch-windows.c',
+ 'route-table-stub.c',
+ 'if-notifier-stub.c',
+ 'stream-windows.c',
+ 'strsep.c',
+ 'dpif-netlink.c',
+ 'netdev-windows.c',
+ 'netlink-conntrack.c',
+ 'netlink-notifier.c',
+ 'netlink-socket.c',
+ 'wmi.c',
+ )
+endif
+
+if build_machine.system() == 'linux'
+ sources += files(
+ 'daemon-unix.c',
+ 'latch-unix.c',
+ 'signals.c',
+ 'socket-util-unix.c',
+ 'stream-unix.c',
+ 'dpif-netlink.c',
+ 'dpif-netlink-rtnl.c',
+ 'if-notifier.c',
+ 'netdev-linux.c',
+ 'netdev-offload-tc.c',
+ 'netlink-conntrack.c',
+ 'netlink-notifier.c',
+ 'netlink-socket.c',
+ 'rtnetlink.c',
+ 'route-table.c',
+ 'tc.c',
+ )
+endif
+
+sources += [
+ meson.project_build_root() + '/' + 'dirs.c',
+ lib_ovsdb_server_idl_c,
+ lib_ovsdb_server_idl_h,
+ lib_vswitch_idl_c,
+ lib_vswitch_idl_h,
+ include_odp_netlink_h,
+ include_odp_netlink_macros_h,
+]
+
+sources += [
+ lib_meta_flow_inc,
+ lib_nx_match_inc,
+ lib_ofp_actions_inc1,
+ lib_ofp_actions_inc2,
+ lib_ofp_errors_inc,
+ lib_ofp_msgs_inc,
+]
+
+deps = [ thread_dep ]
+
+if build_machine.system() == 'windows'
+ deps += windows_deps
+endif
+
+mapfile = meson.project_build_root() + '/openvswitch.map'
+vflag = '-Wl'.format(meson.current_source_dir(), mapfile)
+openvswitch = library(
+ 'openvswitch', sources,
+ dependencies : deps,
+ include_directories : global_inc,
+ link_args : ['-Wl,--no-undefined', vflag],
+ link_depends : mapfile,
+# link_with : openvswitchavx512,
+ version : as_version,
+ soversion : as_soversion,
+)
+
+#global_libs += openvswitchavx512
+global_libs += sflow
+global_libs += openvswitch
diff --git a/lib/openvswitch.map.in b/lib/openvswitch.map.in
new file mode 100644
index 000000000..0662ec806
--- /dev/null
+++ b/lib/openvswitch.map.in
@@ -0,0 +1,4 @@
+libopenvswitch_@SOVERSION@ {
+global:
+ *;
+};
diff --git a/lib/sflow.map.in b/lib/sflow.map.in
new file mode 100644
index 000000000..9956cf5fd
--- /dev/null
+++ b/lib/sflow.map.in
@@ -0,0 +1,4 @@
+libsflow_@SOVERSION@ {
+global:
+ *;
+};
diff --git a/meson.build b/meson.build
new file mode 100644
index 000000000..b750d8f2f
--- /dev/null
+++ b/meson.build
@@ -0,0 +1,371 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2021 VMware, Inc.
+
+# Meson Newer Version Justification
+# Version 0.56.0: enables 'project_build_root' for 'meson' object
+# Version 0.57.0: enables use of 'env' in 'custom_target'
+# Version 0.59.0: enables use of 'feed' in 'custom_target'
+
+project('openvswitch', 'C',
+ version: '2.16.90',
+ license: 'Apache2.0',
+ default_options: ['buildtype=release', 'default_library=static'],
+ meson_version: '>= 0.59.0'
+)
+
+as_version = meson.project_version()
+ver_arr = as_version.split('.')
+
+as_current_version = ver_arr[0]
+as_revision_version = ver_arr[1]
+as_age_version = ver_arr[2]
+
+as_soversion = '0'
+conf_soversion = configuration_data()
+conf_soversion.set('SOVERSION', as_soversion)
+
+cc = meson.get_compiler('c')
+
+prog_python = import('python').find_installation('python3')
+python_env = environment()
+python_env.set('PYTHONPATH', meson.project_source_root() + '/python')
+# Prevent creation of *.pyc files in 'python/build/__pycache__' directory
+python_env.set('PYTHONDONTWRITEBYTECODE', 'yes')
+cdata = configuration_data()
+
+if build_machine.system() == 'linux'
+ m_dep = cc.find_library('m', required : true)
+ thread_dep = dependency('threads', required : true)
+endif
+
+if build_machine.system() == 'windows'
+ if get_option('with-pthread') == 'optval'
+ error('"with-pthread" is a required option on Windows')
+ endif
+ win_pthread_path = get_option('with-pthread')
+ thread_dep = cc.find_library(
+ 'pthreadVC3-w32',
+ dirs : [
+ # Some may place DLL and LIB files under 'lib' subfolder
+ win_pthread_path,
+ win_pthread_path + '/lib',
+ ],
+ required : true,
+ )
+ windows_libs = [
+ 'Ws2_32', # Resolve symbols for Winsock
+ 'WbemUuid',
+ 'Shlwapi',
+ 'Iphlpapi',
+ ]
+ windows_deps = []
+ foreach w : windows_libs
+ windows_deps += cc.find_library(
+ w,
+ required : true,
+ )
+ endforeach
+endif
+
+check_headers = [
+ ['HAVE_BITS_FLOATN_COMMON_H', 'bits/floatn/common.h'],
+ ['HAVE_DLFCN_H', 'dlfcn.h'],
+ ['HAVE_INTTYPES_H', 'inttypes.h'],
+ ['HAVE_LIBUNWIND_H', 'libunwind.h'],
+ ['HAVE_LINUX_IF_ETHER_H', 'linux/if/ether.h'],
+ ['HAVE_LINUX_NET_NAMESPACE_H', 'linux/net/namespace.h'],
+ ['HAVE_LINUX_PERF_EVENT_H', 'linux/perf/event.h'],
+ ['HAVE_LINUX_TYPES_H', 'linux/types.h'],
+ ['HAVE_MEMORY_H', 'memory.h'],
+ ['HAVE_MNTENT_H', 'mntent.h'],
+ ['HAVE_NET_IF_MIB_H', 'net/if/mib.h'],
+ ['HAVE_NETLINK', 'linux/netlink.h'],
+ ['HAVE_RTE_CONFIG_H', 'rte/config.h'],
+ ['HAVE_STDATOMIC_H', 'stdatomic.h'],
+ ['HAVE_STDINT_H', 'stdint.h'],
+ ['HAVE_STDIO_H', 'stdio.h'],
+ ['HAVE_STDLIB_H', 'stdlib.h'],
+ ['HAVE_STRINGS_H', 'strings.h'],
+ ['HAVE_STRING_H', 'string.h'],
+ ['HAVE_SYS_STATVFS_H', 'sys/statvfs.h'],
+ ['HAVE_SYS_STAT_H', 'sys/stat.h'],
+ ['HAVE_SYS_TYPES_H', 'sys/types.h'],
+ ['HAVE_UNISTD_H', 'unistd.h'],
+ ['HAVE_VALGRIND_VALGRIND_H', 'valgrind/valgrind.h'],
+]
+
+foreach h : check_headers
+ if cc.has_header(h.get(1))
+ cdata.set(h.get(0), 1)
+ endif
+endforeach
+
+check_functions = [
+# check token ['HAVE_AF_XDP']
+# check token ['HAVE_ATOMIC']
+# check token ['HAVE_BACKTRACE']
+ ['HAVE_CLOCK_GETTIME', 'clock_gettime', '#include<time.h>', []],
+# check token ['HAVE_CXX11']
+# check token ['HAVE_DECL_MALLOC_TRIM']
+# check token ['HAVE_DECL_RTE_EAL_NUMA_AWARE_HUGEPAGES']
+# check token ['HAVE_DECL_RTE_LIBRTE_VHOST_NUMA']
+# check token ['HAVE_DECL_STRERROR_R']
+# check token ['HAVE_DECL_SYS_SIGLIST']
+# check token ['HAVE_GCC4_ATOMICS']
+ ['HAVE_GETLOADAVG', 'getloadavg', '#include<stdlib.h>', []],
+ ['HAVE_GETMNTENT_R', 'getmntent_r', '#include<mntent.h>', []],
+# check token ['HAVE_GLIBC_PTHREAD_SETNAME_NP']
+# check token ['HAVE_IF_DL']
+# check token ['HAVE_LIBCAPNG']
+# check token ['HAVE_LIBSOCKET']
+# check token ['HAVE_MLOCKALL']
+# check token ['HAVE_NETBSD_PTHREAD_SETNAME_NP']
+# check token ['HAVE_NETLINK']
+# check token ['HAVE_NLA_BITFIELD32']
+# check token ['HAVE_OPENSSL']
+ ['HAVE_POSIX_MEMALIGN', 'posix_memalign', '#include<stdlib.h>', []],
+# check token ['HAVE_PRAGMA_MESSAGE']
+ ['HAVE_PTHREAD_SET_NAME_NP', 'pthread_set_name_np', '#include<pthread.h>',
[]],
+# check token ['HAVE_PTHREAD_SPIN_LOCK']
+# check token ['HAVE_SCTP_CONNTRACK_HEARTBEATS']
+ ['HAVE_SENDMMSG', 'sendmmsg', '#include<sys/socket.h>', ['-D_GNU_SOURCE']],
+ ['HAVE_STATVFS', 'statvfs', '#include<sys/statvfs.h>', []],
+ ['HAVE_STRERROR_R', 'strerror_r', '#include<string.h>', []],
+# check token ['HAVE_STRNLEN']
+# check token ['HAVE_STRTOK_R_BUG']
+# check token ['HAVE_STRUCT_IFREQ_IFR_FLAGSHIGH']
+# check token ['HAVE_STRUCT_SOCKADDR_IN6_SIN6_SCOPE_ID']
+# check token ['HAVE_STRUCT_STAT_ST_MTIMENSEC']
+# check token ['HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC']
+# check token ['HAVE_STRUCT_TCF_T_FIRSTUSE']
+# check token ['HAVE_STRUCT_TIMESPEC']
+# check token ['HAVE_TCA_MPLS_TTL']
+# check token ['HAVE_TCA_PEDIT_KEY_EX_HDR_TYPE_UDP']
+# check token ['HAVE_TCA_POLICE_PKTRATE64']
+# check token ['HAVE_TCA_SKBEDIT_FLAGS']
+# check token ['HAVE_TCA_TUNNEL_KEY_ENC_TTL']
+# check token ['HAVE_TCA_VLAN_PUSH_VLAN_PRIORITY']
+# check token ['HAVE_THREAD_LOCAL']
+# check token ['HAVE_UNBOUND']
+# check token ['HAVE_UNWIND']
+# check token ['HAVE_VIRTIO_TYPES']
+# check token ['HAVE_XDP_NEED_WAKEUP']
+# check token ['HAVE___THREAD']
+]
+
+foreach f : check_functions
+ if cc.has_function(f.get(1), prefix : f.get(2), args : f.get(3))
+ cdata.set(f.get(0), 1)
+ endif
+endforeach
+
+check_structs = [
+ ['HAVE_NLA_BITFIELD32', 'value', 'struct nla_bitfield32',
'#include<linux/netlink.h>', []],
+ ['HAVE_STRUCT_MMSGHDR_MSG_LEN', 'msg_len', 'struct mmsghdr',
'#include<sys/socket.h>', ['-D_GNU_SOURCE']],
+]
+
+foreach s : check_structs
+ if cc.has_member(s.get(2), s.get(1), prefix : s.get(3), args : s.get(4))
+ cdata.set(s.get(0), 1)
+ endif
+endforeach
+
+cdata.set('PACKAGE_STRING', '"' + meson.project_name() + ' ' + as_version +
'"')
+cdata.set('VERSION', '"' + as_version + '"')
+
+if build_machine.system() == 'windows'
+ cdata.set('WIN32', 1)
+endif
+
+configure_file(input : 'config.h.meson',
+ output : 'config.h',
+ configuration : cdata)
+
+header_files = [
+ ['lib', 'string.h'],
+ ['lib', 'stdio.h'],
+]
+
+conf_headers = configuration_data()
+conf_headers.set('INCLUDE_NEXT', 'include_next')
+conf_headers.set_quoted('NEXT_STDIO_H', 'stdio.h')
+conf_headers.set_quoted('NEXT_STRING_H', 'string.h')
+
+foreach h : header_files
+ configure_file(
+ input : h.get(0) + '/' + h.get(1) + '.in',
+ output : h.get(1),
+ configuration : conf_headers,
+ )
+endforeach
+
+
+map_files = [
+ ['lib', 'sflow.map'],
+ ['lib', 'openvswitch.map'],
+ ['ovsdb', 'ovsdb.map'],
+ ['ofproto', 'ofproto.map'],
+ ['vtep', 'vtep.map'],
+]
+
+foreach m : map_files
+ configure_file(
+ input : m.get(0) + '/' + m.get(1) + '.in',
+ output : m.get(1),
+ configuration : conf_soversion,
+ )
+endforeach
+
+ovs_lib_version = '0'
+ovs_lib_revision = '0'
+ovs_lib_age = '0'
+
+conf_version = configuration_data()
+conf_version.set('PACKAGE_STRING', meson.project_name() + ' ' + as_version)
+conf_version.set('PACKAGE_VERSION', as_version)
+conf_version.set('LT_CURRENT', ovs_lib_version)
+conf_version.set('LT_REVISION', ovs_lib_revision)
+conf_version.set('LT_AGE', ovs_lib_age)
+
+subdir('include')
+
+# MSR: this is temporary hard-coded
+# though values are taken from the 'config.log'
+# however, most of it should be coming from
+# supplied options and have default values
+cin_processing = configuration_data()
+cin_processing.set('BANNER', '/* -*- mode: c; buffer-read-only: t -*- */') #
this a temporary hack and may break backwards compatability with autotools
+cin_processing.set('srcdir', meson.project_source_root())
+cin_processing.set_quoted('LOGDIR', '/var/log/openvswitch')
+cin_processing.set_quoted('RUNDIR', '/var/run/openvswitch')
+cin_processing.set_quoted('DBDIR', '/etc/openvswitch')
+cin_processing.set_quoted('bindir', '/bin')
+cin_processing.set_quoted('sysconfdir', '/etc')
+cin_processing.set_quoted('pkgdatadir', '/usr/share/openvswitch')
+
+subdir('python/ovs')
+
+c_in_files = [
+ ['lib', 'dirs.c'],
+]
+
+foreach cin : c_in_files
+ configure_file(
+ input : cin.get(0) + '/' + cin.get(1) + '.in.meson',
+ output : cin.get(1),
+ configuration : cin_processing,
+ )
+endforeach
+
+global_inc = include_directories(
+ '.',
+ 'include',
+ 'lib',
+)
+
+if build_machine.system() == 'windows'
+ global_inc = include_directories(
+ '.',
+ 'include',
+ 'lib',
+ 'include/windows',
+ 'datapath-windows/include',
+ # Some may place header files under 'include' subfolder
+ win_pthread_path,
+ win_pthread_path + '/include',
+ )
+endif
+
+global_libs = []
+
+add_project_arguments('-Wstrict-prototypes', language : 'c')
+add_project_arguments(
+ '-Wall',
+ '-Wextra',
+ '-Wno-sign-compare',
+ '-Wpointer-arith',
+ '-Wformat',
+ '-Wformat-security',
+ '-Wswitch-enum',
+ '-Wunused-parameter',
+ '-Wbad-function-cast',
+ '-Wcast-align',
+ '-Wstrict-prototypes',
+ '-Wold-style-definition',
+ '-Wmissing-prototypes',
+ '-Wmissing-field-initializers',
+ '-fno-strict-aliasing',
+ '-Wswitch-bool',
+ '-Wlogical-not-parentheses',
+ '-Wsizeof-array-argument',
+ '-Wshift-negative-value',
+# '-Qunused-arguments',
+ '-Wshadow',
+ '-Wno-null-pointer-arithmetic',
+# '-Warray-bounds-pointer-arithmetic',
+ language : 'c',
+)
+
+install_prefix = '/usr/local/'
+
+lib_ovsdb_server_idl_ovsidl = custom_target(
+ 'ovsdb-server-idl.ovsidl',
+ input : [
+ meson.project_source_root() + '/ovsdb/_server.ovsschema',
+ meson.project_source_root() + '/lib/ovsdb-server-idl.ann',
+ ],
+ output : 'ovsdb-server-idl.ovsidl',
+ command : [
+ prog_python,
+ meson.project_source_root() + '/ovsdb/ovsdb-idlc.in',
+ 'annotate',
+ '@INPUT0@',
+ '@INPUT1@',
+ ],
+ capture : '@OUTPUT@',
+ env : python_env,
+)
+
+lib_vswitch_idl_ovsidl = custom_target(
+ 'vswitch-idl.ovsidl',
+ input : [
+ meson.project_source_root() + '/vswitchd/vswitch.ovsschema',
+ meson.project_source_root() + '/lib/vswitch-idl.ann',
+ ],
+ output : 'vswitch-idl.ovsidl',
+ command : [
+ prog_python,
+ meson.project_source_root() + '/ovsdb/ovsdb-idlc.in',
+ 'annotate',
+ '@INPUT0@',
+ '@INPUT1@',
+ ],
+ capture : '@OUTPUT@',
+ env : python_env,
+)
+
+vtep_vtep_idl_ovsidl = custom_target(
+ 'vtep-idl.ovsidl',
+ input : [
+ meson.project_source_root() + '/vtep/vtep.ovsschema',
+ meson.project_source_root() + '/vtep/vtep-idl.ann',
+ ],
+ output : 'vtep-idl.ovsidl',
+ command : [
+ prog_python,
+ meson.project_source_root() + '/ovsdb/ovsdb-idlc.in',
+ 'annotate',
+ '@INPUT0@',
+ '@INPUT1@',
+ ],
+ capture : '@OUTPUT@',
+ env : python_env,
+)
+
+subdir('lib')
+subdir('ofproto')
+subdir('utilities')
+subdir('vtep')
+subdir('vswitchd')
+subdir('ovsdb')
+#subdir('datapath')
diff --git a/meson_options.txt b/meson_options.txt
new file mode 100644
index 000000000..2631b2669
--- /dev/null
+++ b/meson_options.txt
@@ -0,0 +1,2 @@
+option('with-pthread', type : 'string', value : 'optval',
+ description : 'Path to the POSIX threads API library for Windows')
diff --git a/ofproto/meson.build b/ofproto/meson.build
new file mode 100644
index 000000000..4f3b3fe21
--- /dev/null
+++ b/ofproto/meson.build
@@ -0,0 +1,59 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2021 VMware, Inc.
+
+ofproto_ipfix_entities_def = custom_target(
+ 'ipfix-entities.def',
+ input : meson.project_source_root() + '/ofproto/ipfix.xml',
+ output : 'ipfix-entities.def',
+ command : [
+ prog_python,
+ meson.project_source_root() + '/ofproto/ipfix-gen-entities',
+ '@INPUT@',
+ ],
+ capture : '@OUTPUT@',
+ env : python_env,
+)
+
+sources = files(
+ 'bond.c',
+ 'collectors.c',
+ 'connmgr.c',
+ 'fail-open.c',
+ 'in-band.c',
+ 'names.c',
+ 'netflow.c',
+ 'ofproto.c',
+ 'ofproto-dpif.c',
+ 'ofproto-dpif-ipfix.c',
+ 'ofproto-dpif-mirror.c',
+ 'ofproto-dpif-monitor.c',
+ 'ofproto-dpif-rid.c',
+ 'ofproto-dpif-sflow.c',
+ 'ofproto-dpif-trace.c',
+ 'ofproto-dpif-upcall.c',
+ 'ofproto-dpif-xlate.c',
+ 'ofproto-dpif-xlate-cache.c',
+ 'pinsched.c',
+ 'tunnel.c',
+ 'bundles.c',
+)
+
+sources += [
+ include_odp_netlink_h,
+ ofproto_ipfix_entities_def,
+]
+
+deps = []
+
+mapfile = meson.project_build_root() + '/ofproto.map'
+vflag = '-Wl'.format(meson.current_source_dir(), mapfile)
+ofproto = library(
+ 'ofproto', sources,
+ dependencies : deps,
+ include_directories : global_inc,
+ link_args : ['-Wl,--no-undefined', vflag],
+ link_depends : mapfile,
+ link_with : sflow,
+ version : as_version,
+ soversion : as_soversion,
+)
diff --git a/ofproto/ofproto.map.in b/ofproto/ofproto.map.in
new file mode 100644
index 000000000..46b86511b
--- /dev/null
+++ b/ofproto/ofproto.map.in
@@ -0,0 +1,4 @@
+libofproto_@SOVERSION@ {
+global:
+ *;
+};
diff --git a/ovsdb/meson.build b/ovsdb/meson.build
new file mode 100644
index 000000000..1f7299e10
--- /dev/null
+++ b/ovsdb/meson.build
@@ -0,0 +1,106 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2021 VMware, Inc.
+
+# ovsdb/_server.ovsschema.inc
+ovsdb__server_ovsschema_inc = custom_target(
+ '_server.ovsschema.inc',
+ input : meson.project_source_root() + '/ovsdb/_server.ovsschema',
+ output : '_server.ovsschema.inc',
+ command : [
+ prog_python,
+ meson.project_source_root() + '/build-aux/text2c',
+ ],
+ feed : true,
+ capture : '@OUTPUT@',
+ env : python_env,
+)
+
+sources = files(
+ 'column.c',
+ 'condition.c',
+ 'execution.c',
+ 'file.c',
+ 'jsonrpc-server.c',
+ 'log.c',
+ 'mutation.c',
+ 'ovsdb.c',
+ 'monitor.c',
+ 'query.c',
+ 'raft.c',
+ 'raft-private.c',
+ 'raft-rpc.c',
+ 'rbac.c',
+ 'replication.c',
+ 'relay.c',
+ 'row.c',
+ 'server.c',
+ 'storage.c',
+ 'table.c',
+ 'trigger.c',
+ 'transaction.c',
+ 'transaction-forward.c',
+ 'ovsdb-util.c',
+)
+
+deps = []
+
+mapfile = meson.project_build_root() + '/ovsdb.map'
+vflag = '-Wl'.format(meson.current_source_dir(), mapfile)
+ovsdb = library(
+ 'ovsdb', sources,
+ dependencies : deps,
+ include_directories : global_inc,
+ link_args : ['-Wl,--no-undefined', vflag],
+ link_depends : mapfile,
+ version : as_version,
+ soversion : as_soversion,
+)
+
+sources = files(
+ 'ovsdb-tool.c',
+)
+
+deps = []
+
+executable('ovsdb-tool', sources,
+ dependencies : deps,
+ include_directories : global_inc,
+ link_args : ['-Wl,--no-undefined'],
+ link_with : [ ovsdb, openvswitch ],
+ install : true,
+ install_dir: install_prefix / 'bin',
+)
+
+sources = files(
+ 'ovsdb-client.c',
+)
+
+deps = []
+
+executable('ovsdb-client', sources,
+ dependencies : deps,
+ include_directories : global_inc,
+ link_args : ['-Wl,--no-undefined'],
+ link_with : [ ovsdb, openvswitch ],
+ install : true,
+ install_dir: install_prefix / 'bin',
+)
+
+sources = files(
+ 'ovsdb-server.c',
+)
+
+sources += [
+ ovsdb__server_ovsschema_inc,
+]
+
+deps = []
+
+executable('ovsdb-server', sources,
+ dependencies : deps,
+ include_directories : global_inc,
+ link_args : ['-Wl,--no-undefined'],
+ link_with : [ ovsdb, openvswitch ],
+ install : true,
+ install_dir: install_prefix / 'sbin',
+)
diff --git a/ovsdb/ovsdb.map.in b/ovsdb/ovsdb.map.in
new file mode 100644
index 000000000..ef7c8dd0f
--- /dev/null
+++ b/ovsdb/ovsdb.map.in
@@ -0,0 +1,4 @@
+libovsdb_@SOVERSION@ {
+global:
+ *;
+};
diff --git a/python/ovs/meson.build b/python/ovs/meson.build
new file mode 100644
index 000000000..8bc28f35b
--- /dev/null
+++ b/python/ovs/meson.build
@@ -0,0 +1,24 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2021 VMware, Inc.
+
+conf_dirs_py = configuration_data()
+conf_dirs_py.set('LOGDIR', '/var/log/openvswitch')
+conf_dirs_py.set('RUNDIR', '/var/run/openvswitch')
+conf_dirs_py.set('DBDIR', '/etc/openvswitch')
+conf_dirs_py.set('bindir', '/bin')
+conf_dirs_py.set('pkgdatadir', '/usr/share/openvswitch')
+conf_dirs_py.set('variables', '@variables@')
+
+configure_file(
+ input : meson.project_source_root() + '/python/ovs/dirs.py.template',
+ output : 'dirs.py',
+ configuration : conf_dirs_py,
+)
+
+python_ovs_dirs_py = run_command(
+ prog_python,
+ meson.project_source_root() + '/build-aux/copy-file-from-build.py',
+ 'dirs.py',
+ 'dirs.py',
+ check : true,
+)
diff --git a/utilities/meson.build b/utilities/meson.build
new file mode 100644
index 000000000..49c7200d8
--- /dev/null
+++ b/utilities/meson.build
@@ -0,0 +1,83 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2021 VMware, Inc.
+
+sources = files(
+ 'ovs-appctl.c',
+)
+
+deps = []
+
+executable('ovs-appctl', sources,
+ dependencies : deps,
+ include_directories : global_inc,
+ link_args : ['-Wl,--no-undefined'],
+ link_with : openvswitch,
+ install : true,
+ install_dir: install_prefix / 'bin',
+)
+
+sources = files(
+ 'ovs-testcontroller.c',
+)
+
+if build_machine.system() == 'linux'
+ deps += m_dep
+endif
+
+executable('ovs-testcontroller', sources,
+ dependencies : deps,
+ include_directories : global_inc,
+ link_args : ['-Wl,--no-undefined'],
+ link_with : openvswitch,
+ install : true,
+ install_dir: install_prefix / 'bin',
+)
+
+sources = files(
+ 'ovs-dpctl.c',
+)
+
+sources += [
+ include_odp_netlink_h,
+]
+
+executable('ovs-dpctl', sources,
+ dependencies : deps,
+ include_directories : global_inc,
+ link_args : ['-Wl,--no-undefined'],
+ link_with : openvswitch,
+ install : true,
+ install_dir: install_prefix / 'bin',
+)
+
+sources = files(
+ 'ovs-ofctl.c',
+)
+
+sources += [
+ include_odp_netlink_h,
+]
+
+executable('ovs-ofctl', sources,
+ dependencies : deps,
+ include_directories : global_inc,
+ link_args : ['-Wl,--no-undefined'],
+ link_with : [ openvswitch, ofproto ],
+ install : true,
+ install_dir: install_prefix / 'bin',
+)
+
+sources = files(
+ 'ovs-vsctl.c',
+)
+
+sources += lib_vswitch_idl_h
+
+executable('ovs-vsctl', sources,
+ dependencies : deps,
+ include_directories : global_inc,
+ link_args : ['-Wl,--no-undefined'],
+ link_with : openvswitch,
+ install : true,
+ install_dir: install_prefix / 'bin',
+)
diff --git a/vswitchd/meson.build b/vswitchd/meson.build
new file mode 100644
index 000000000..b8e329854
--- /dev/null
+++ b/vswitchd/meson.build
@@ -0,0 +1,30 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2021 VMware, Inc.
+
+sources = files(
+ 'bridge.c',
+ 'ovs-vswitchd.c',
+ 'system-stats.c',
+ 'xenserver.c',
+)
+
+sources += [
+ include_odp_netlink_h,
+]
+
+sources += lib_vswitch_idl_h
+
+deps = []
+
+if build_machine.system() == 'linux'
+ deps += m_dep
+endif
+
+executable('ovs-vswitchd', sources,
+ dependencies : deps,
+ include_directories : global_inc,
+ link_args : ['-Wl,--no-undefined'],
+ link_with : [ openvswitch, ofproto, sflow ],
+ install : true,
+ install_dir: install_prefix / 'sbin',
+)
diff --git a/vtep/meson.build b/vtep/meson.build
new file mode 100644
index 000000000..abdae7eb0
--- /dev/null
+++ b/vtep/meson.build
@@ -0,0 +1,71 @@
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright(c) 2021 VMware, Inc.
+
+vtep_vtep_idl_c = custom_target(
+ 'vtep-idl.c',
+# input : meson.project_source_root() + '/vtep/vtep-idl.ovsidl',
+ input : vtep_vtep_idl_ovsidl,
+ output : 'vtep-idl.c',
+ command : [
+ prog_python,
+ meson.project_source_root() + '/ovsdb/ovsdb-idlc.in',
+ 'c-idl-source',
+ '@INPUT@',
+ ],
+ capture : '@OUTPUT@',
+ env : python_env,
+)
+
+vtep_vtep_idl_h = custom_target(
+ 'vtep-idl.h',
+# input : meson.project_source_root() + '/vtep/vtep-idl.ovsidl',
+ input : vtep_vtep_idl_ovsidl,
+ output : 'vtep-idl.h',
+ command : [
+ prog_python,
+ meson.project_source_root() + '/ovsdb/ovsdb-idlc.in',
+ 'c-idl-header',
+ '@INPUT@',
+ ],
+ capture : '@OUTPUT@',
+ env : python_env,
+)
+
+#sources = files(
+# 'vtep-idl.c',
+#)
+sources = [
+ vtep_vtep_idl_c,
+ vtep_vtep_idl_h,
+]
+
+deps = []
+
+mapfile = meson.project_build_root() + '/vtep.map'
+vflag = '-Wl'.format(meson.current_source_dir(), mapfile)
+vtep = library(
+ 'vtep', sources,
+ dependencies : deps,
+ include_directories : global_inc,
+ link_args : ['-Wl,--no-undefined', vflag],
+ link_depends : mapfile,
+ version : as_version,
+ soversion : as_soversion,
+)
+
+sources = files(
+ 'vtep-ctl.c',
+)
+
+sources += [
+ vtep_vtep_idl_h,
+]
+
+deps = []
+
+executable('vtep-ctl', sources,
+ dependencies : deps,
+ include_directories : global_inc,
+ link_args : ['-Wl,--no-undefined'],
+ link_with : [ vtep, openvswitch ],
+)
diff --git a/vtep/vtep.map.in b/vtep/vtep.map.in
new file mode 100644
index 000000000..e548586fc
--- /dev/null
+++ b/vtep/vtep.map.in
@@ -0,0 +1,4 @@
+libvtep_@SOVERSION@ {
+global:
+ *;
+};
--
2.25.1
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev