new file mode 100755
@@ -0,0 +1,65 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: BSD-3-Clause
+# Copyright (c) 2024 Red Hat, Inc.
+
+"""Generate a version map file used by GNU linker."""
+
+import re
+import sys
+
+# From meson.build
+sym_export_regexp = re.compile(r"^RTE_EXPORT_SYMBOL\(([^,]+)\)$")
+# From rte_function_versioning.h
+sym_ver_regexp = re.compile(r"^RTE_VERSION_SYMBOL\(([^,]+), [^,]+, ([^,]+),")
+sym_default_regexp = re.compile(r"^RTE_DEFAULT_SYMBOL\(([^,]+), [^,]+, ([^,]+),")
+
+with open("../ABI_VERSION") as f:
+ abi = re.match("([0-9]+).[0-9]", f.readline()).group(1)
+
+symbols = {}
+
+for file in sys.argv[2:]:
+ with open(file, encoding="utf-8") as f:
+ for ln in f.readlines():
+ node = None
+ symbol = None
+ if sym_export_regexp.match(ln):
+ symbol = sym_export_regexp.match(ln).group(1)
+ elif sym_ver_regexp.match(ln):
+ node = sym_ver_regexp.match(ln).group(1)
+ symbol = sym_ver_regexp.match(ln).group(2)
+ elif sym_default_regexp.match(ln):
+ node = sym_default_regexp.match(ln).group(1)
+ symbol = sym_default_regexp.match(ln).group(2)
+
+ if not symbol:
+ continue
+
+ if not node:
+ node = abi
+ if node not in symbols:
+ symbols[node] = []
+ symbols[node].append(symbol)
+
+with open(sys.argv[1], "w") as outfile:
+ local_token = False
+ if abi in symbols:
+ outfile.writelines(f"DPDK_{abi} {{\n\tglobal:\n\n")
+ for symbol in sorted(symbols[abi]):
+ outfile.writelines(f"\t{symbol};\n")
+ outfile.writelines("\n")
+ if not local_token:
+ outfile.writelines("\tlocal: *;\n")
+ local_token = True
+ outfile.writelines("};\n")
+ del symbols[abi]
+ for key in sorted(symbols.keys()):
+ outfile.writelines(f"DPDK_{key} {{\n\tglobal:\n\n")
+ for symbol in sorted(symbols[key]):
+ outfile.writelines(f"\t{symbol};\n")
+ outfile.writelines("\n")
+ if not local_token:
+ outfile.writelines("\tlocal: *;\n")
+ local_token = True
+ outfile.writelines(f"}} DPDK_{abi};\n")
+ del symbols[key]
@@ -16,6 +16,7 @@ else
py3 = ['meson', 'runpython']
endif
echo = py3 + ['-c', 'import sys; print(*sys.argv[1:])']
+gen_version_map = py3 + files('gen-version-map.py')
list_dir_globs = py3 + files('list-dir-globs.py')
map_to_win_cmd = py3 + files('map_to_win.py')
sphinx_wrapper = py3 + files('call-sphinx-build.py')
@@ -5,8 +5,6 @@ if is_ms_compiler
subdir_done()
endif
-fs = import('fs')
-
# Defines the order of dependencies evaluation
subdirs = [
'common',
@@ -110,6 +110,7 @@ endif
default_cflags = machine_args
default_cflags += ['-DALLOW_EXPERIMENTAL_API']
default_cflags += ['-DALLOW_INTERNAL_API']
+default_cflags += ['-DRTE_EXPORT_SYMBOL(a)=']
if cc.has_argument('-Wno-format-truncation')
default_cflags += '-Wno-format-truncation'
@@ -254,6 +255,9 @@ foreach l:libraries
include_directories: includes,
dependencies: static_deps)
+ version_map = '@0@/@1@/version.map'.format(meson.current_source_dir(), l)
+ lk_deps = []
+
if not use_function_versioning or is_windows
# use pre-build objects to build shared lib
sources = []
@@ -262,10 +266,19 @@ foreach l:libraries
# for compat we need to rebuild with
# RTE_BUILD_SHARED_LIB defined
cflags += '-DRTE_BUILD_SHARED_LIB'
- endif
- version_map = '@0@/@1@/version.map'.format(meson.current_source_dir(), l)
- lk_deps = [version_map]
+ # POC: generate version.map if absent.
+ if not fs.is_file(version_map)
+ map_file = custom_target(libname + '_map',
+ command: [gen_version_map, '@OUTPUT@', '@INPUT@'],
+ input: sources,
+ output: '@0@_version.map'.format(libname))
+ version_map = map_file.full_path()
+ lk_deps += [map_file]
+ else
+ lk_deps += [version_map]
+ endif
+ endif
if is_ms_linker
def_file = custom_target(libname + '_def',
@@ -47,3 +47,4 @@ rte_net_make_rarp_packet(struct rte_mempool *mpool,
return mbuf;
}
+RTE_EXPORT_SYMBOL(rte_net_make_rarp_packet)
@@ -17,6 +17,7 @@ rte_eth_random_addr(uint8_t *addr)
addr[0] &= (uint8_t)~RTE_ETHER_GROUP_ADDR; /* clear multicast bit */
addr[0] |= RTE_ETHER_LOCAL_ADMIN_ADDR; /* set local assignment bit */
}
+RTE_EXPORT_SYMBOL(rte_eth_random_addr)
void
rte_ether_format_addr(char *buf, uint16_t size,
@@ -25,6 +26,7 @@ rte_ether_format_addr(char *buf, uint16_t size,
snprintf(buf, size, RTE_ETHER_ADDR_PRT_FMT,
RTE_ETHER_ADDR_BYTES(eth_addr));
}
+RTE_EXPORT_SYMBOL(rte_ether_format_addr)
static int8_t get_xdigit(char ch)
{
@@ -153,3 +155,4 @@ rte_ether_unformat_addr(const char *s, struct rte_ether_addr *ea)
rte_errno = EINVAL;
return -1;
}
+RTE_EXPORT_SYMBOL(rte_ether_unformat_addr)
@@ -306,6 +306,7 @@ rte_net_skip_ip6_ext(uint16_t proto, const struct rte_mbuf *m, uint32_t *off,
}
return -1;
}
+RTE_EXPORT_SYMBOL(rte_net_skip_ip6_ext)
/* parse mbuf data to get packet type */
uint32_t rte_net_get_ptype(const struct rte_mbuf *m,
@@ -601,3 +602,4 @@ uint32_t rte_net_get_ptype(const struct rte_mbuf *m,
return pkt_type;
}
+RTE_EXPORT_SYMBOL(rte_net_get_ptype)
@@ -417,6 +417,7 @@ void rte_net_crc_free(struct rte_net_crc *crc)
{
rte_free(crc);
}
+RTE_EXPORT_SYMBOL(rte_net_crc_free)
RTE_VERSION_SYMBOL(25, uint32_t, rte_net_crc_calc, (const void *data, uint32_t data_len,
enum rte_net_crc_type type)
deleted file mode 100644
@@ -1,23 +0,0 @@
-DPDK_25 {
- global:
-
- rte_eth_random_addr;
- rte_ether_format_addr;
- rte_ether_unformat_addr;
- rte_net_crc_calc;
- rte_net_crc_free;
- rte_net_crc_set_alg;
- rte_net_get_ptype;
- rte_net_make_rarp_packet;
- rte_net_skip_ip6_ext;
-
- local: *;
-};
-
-DPDK_26 {
- global:
-
- rte_net_crc_calc;
- rte_net_crc_set_alg;
-
-} DPDK_25;
@@ -13,10 +13,11 @@ project('DPDK', 'c',
meson_version: '>= 0.57'
)
+fs = import('fs')
+
# check for developer mode
developer_mode = false
if get_option('developer_mode').auto()
- fs = import('fs')
developer_mode = fs.exists('.git')
else
developer_mode = get_option('developer_mode').enabled()