From 7cdc99ca50cfa23773ab37fbce09af38942cd8e1 Mon Sep 17 00:00:00 2001 From: Vlad Zolotarov Date: Thu, 26 Feb 2015 20:57:34 +0200 Subject: [PATCH] configure.py: Generate DPDK CFLAGS from DPDK's environment Creates a temp makefile that includes the mk/rte.vars.mk from DPDK SDK and prints MACHINE_CFLAGS. The value of MACHINE_CFLAGS is then added to args.user_cflags. Effectively the MACHINE_CFLAGS is a bunch of -DRTE_XXX macros and -march=native. Without these flags the compilation fails inside rte_memcpy.h in the upstream DPDK tree. This patch reverts the 04e0c5293b41bafdfc9d33ba45318d602aa9458b patch. Signed-off-by: Vlad Zolotarov --- configure.py | 42 ++++++++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/configure.py b/configure.py index 16687e05e1..c5025220dd 100755 --- a/configure.py +++ b/configure.py @@ -27,12 +27,6 @@ def get_flags(): if line.rstrip('\n').startswith('flags'): return re.sub(r'^flags\s+: ', '', line).split() -def has_avx(): - return 'avx' in get_flags() - -def has_avx2(): - return 'avx2' in get_flags() - def add_tristate(arg_parser, name, dest, help): arg_parser.add_argument('--enable-' + name, dest = dest, action = 'store_true', default = None, help = 'Enable ' + help) @@ -51,6 +45,35 @@ def apply_tristate(var, test, note, missing): return False return False +# +# dpdk_cflags - fetch the DPDK specific CFLAGS +# +# Run a simple makefile that "includes" the DPDK main makefile and prints the +# MACHINE_CFLAGS value +# +def dpdk_cflags (dpdk_target): + with tempfile.NamedTemporaryFile() as sfile: + dpdk_target = os.path.abspath(dpdk_target) + dpdk_target = re.sub(r'\/+$', '', dpdk_target) + dpdk_sdk_path = os.path.dirname(dpdk_target) + dpdk_target_name = os.path.basename(dpdk_target) + dpdk_arch = dpdk_target_name.split('-')[0] + + sfile.file.write(bytes('include ' + dpdk_sdk_path + '/mk/rte.vars.mk' + "\n", 'utf-8')) + sfile.file.write(bytes('all:' + "\n\t", 'utf-8')) + sfile.file.write(bytes('@echo $(MACHINE_CFLAGS)' + "\n", 'utf-8')) + sfile.file.flush() + + dpdk_cflags = subprocess.check_output(['make', '-f', sfile.name, + 'RTE_SDK=' + dpdk_sdk_path, + 'RTE_TARGET=' + dpdk_target_name, + 'RTE_ARCH=' + dpdk_arch]) + dpdk_cflags_str = dpdk_cflags.decode('utf-8') + dpdk_cflags_str = re.sub(r'\n+$', '', dpdk_cflags_str) + dpdk_cflags_final = '' + + return dpdk_cflags_str + def try_compile(compiler, source = '', flags = []): with tempfile.NamedTemporaryFile() as sfile: sfile.file.write(bytes(source, 'utf-8')) @@ -292,10 +315,9 @@ if args.with_osv: if args.dpdk_target: args.user_cflags = (args.user_cflags + - ' -DHAVE_DPDK -I' + - args.dpdk_target + '/include -Wno-error=literal-suffix -Wno-literal-suffix -Wno-invalid-offsetof -m64' + - ' -mavx' if has_avx() else '' + - ' -mavx2' if has_avx2() else '') + ' -DHAVE_DPDK -I' + args.dpdk_target + '/include ' + + dpdk_cflags(args.dpdk_target) + + ' -Wno-error=literal-suffix -Wno-literal-suffix -Wno-invalid-offsetof') libs += (' -L' + args.dpdk_target + '/lib ' + '-Wl,--whole-archive -lrte_pmd_bond -lrte_pmd_vmxnet3_uio -lrte_pmd_virtio_uio -lrte_pmd_i40e -lrte_pmd_ixgbe -lrte_pmd_e1000 -lrte_pmd_ring -Wl,--no-whole-archive -lrte_distributor -lrte_kni -lrte_pipeline -lrte_table -lrte_port -lrte_timer -lrte_hash -lrte_lpm -lrte_power -lrte_acl -lrte_meter -lrte_sched -lrte_kvargs -lrte_mbuf -lrte_ip_frag -lethdev -lrte_eal -lrte_malloc -lrte_mempool -lrte_ring -lrte_cmdline -lrte_cfgfile -lrt -lm -ldl')