From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by dpdk.space (Postfix) with ESMTP id 0D143A05D3 for ; Tue, 26 Mar 2019 17:46:26 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 14AC71B437; Tue, 26 Mar 2019 17:46:25 +0100 (CET) Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by dpdk.org (Postfix) with ESMTP id C62691B275 for ; Tue, 26 Mar 2019 17:46:22 +0100 (CET) X-Amp-Result: UNSCANNABLE X-Amp-File-Uploaded: False Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 26 Mar 2019 09:46:21 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.60,273,1549958400"; d="scan'208";a="330859072" Received: from bricha3-mobl.ger.corp.intel.com ([10.237.221.35]) by fmsmga006.fm.intel.com with SMTP; 26 Mar 2019 09:46:18 -0700 Received: by (sSMTP sendmail emulation); Tue, 26 Mar 2019 16:46:17 +0000 Date: Tue, 26 Mar 2019 16:46:16 +0000 From: Bruce Richardson To: Jerin Jacob Kollanukkaran Cc: "pallavi.kadam@intel.com" , "thomas@monjalon.net" , "anand.rawat@intel.com" , "dev@dpdk.org" , "ranjit.menon@intel.com" , "jeffrey.b.shaw@intel.com" Message-ID: <20190326164616.GA512800@bricha3-MOBL.ger.corp.intel.com> References: <20190306041634.12976-1-anand.rawat@intel.com> <20190326060238.9884-1-anand.rawat@intel.com> <20190326060238.9884-4-anand.rawat@intel.com> <13f7c718448539712a6ba5024959b296143555e6.camel@marvell.com> <20190326105831.GA188340@bricha3-MOBL.ger.corp.intel.com> <5eeb911a2c8a3877f5ae110b88f56ba76df642de.camel@marvell.com> <20190326144047.GA472084@bricha3-MOBL.ger.corp.intel.com> <87b240a5d593cde091eefce55bb64dfe1ee7533c.camel@marvell.com> MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Disposition: inline In-Reply-To: <87b240a5d593cde091eefce55bb64dfe1ee7533c.camel@marvell.com> User-Agent: Mutt/1.11.2 (2019-01-07) Subject: Re: [dpdk-dev] [EXT] Re: [PATCH v5 3/8] kvargs: adding a module definition file X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Message-ID: <20190326164616.nTXhGUuOL-HxyOsNm1Hb2mugBORLm-f27kjQCgIFgCI@z> On Tue, Mar 26, 2019 at 03:35:36PM +0000, Jerin Jacob Kollanukkaran wrote: > On Tue, 2019-03-26 at 14:40 +0000, Bruce Richardson wrote: > > > It is painful due to the fact that, If it is windows ONLY file then > > > developer need to test on Windows as well as it may break Windows. > > > If it is a common file, at least, it will be tested on one > > > platform. > > > So responsibly wise it is a clean partition between windows eal > > > maintainers vs generic library maintainers. > > > > > Yes, good point. However, once we get some windows support into the > > main > > repo then there is the requirement not to break that, so some testing > > on > > windows before merge will prove necessary. Hopefully that can be done > > just > > via CI, rather than having maintainers/committers do so manually. > > > > > > have been submitted over the years which failed shared library > > > > build > > > > because map file updates were forgotten. > > > > > > > > However, my hope is that down the road we can have the def file > > > > generated from the map file (or potentially vice versa). Perhaps > > > > the > > > > meson python module could be used to allow us to script it a bit. > > > > > > Make sense. Do we want to support shared lib for Windows for the > > > first > > > version? or Can we live with static lib till we find a proper > > > solution. > > > I do believe the base Windows Helloworld support needs to added > > > this > > > release in main repo and add the subsequent features step by > > > step. I > > > would treat, shared lib as subsequent feature if it is not clean. > > > > > Yes, I did consider that possibility. However, turning off shared > > builds > > for windows is more of a hack than adding a definition file, since it > > involves more (temporary) changes to the meson.build for both lib and > > driver. If I get the chance, I'll see how complicated it might be to > > autogenerate them at build. Otherwise, I'd suggest keeping the .def > > files > > for now, since only 2 libraries are involved, but then we need to > > come up > > with a proper solution before the number of libraries compiled on > > windows > > goes above that initial 2. > > I am OK with a short term hack to get Window support for DPDK, Provided > it will be revisited before adding the next .def file. > Ok, some hacking has led to this as a possible approach to solve this. I've only tested this on linux to verify it creates something approximating a module definition file but not actually tried using it on windows. The nice thing about meson being based on python is that we are guaranteed to have a python3 interpreter available on whatever os we are running on. [Yes, I made the script python2 compatible too, though I probably didn't need to!] I've also included in this version an (untested) override option for EAL, to allow us to keep the .def file for EAL until we can export all the functions listed in the map file for it. Other libraries shouldn't need this, since they aren't as insanely big as EAL. /Bruce diff --git a/buildtools/map_to_def.py b/buildtools/map_to_def.py new file mode 100644 index 000000000..6c2f56c5d --- /dev/null +++ b/buildtools/map_to_def.py @@ -0,0 +1,30 @@ +#!/usr/bin/env python +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2019 Intel Corporation + +from __future__ import print_function +import sys +from os.path import dirname, basename, join, exists + +def main(args): + if not args[1].endswith('version.map') or not args[2].endswith('exports.def'): + return 1 + +# special case, allow override if an def file already exists alongside map file + override_file = join(dirname(args[1]), basename(args[2])) + if exists(override_file): + with open(override_file) as f_in: + functions = f_in.readlines() + else: +# generate def file from map file + with open(args[1]) as f_in: + functions = ["EXPORTS\n"] + \ + [ln[:-2] + '\n' for ln in sorted(f_in.readlines()) \ + if ln.startswith('\t') and ln.endswith(';\n') and ":" not in ln] + + with open(args[2], 'w') as f_out: + f_out.writelines(functions) + return 0; + +if __name__ == "__main__": + sys.exit(main(sys.argv)) diff --git a/buildtools/meson.build b/buildtools/meson.build index cdd38ed24..9ae2bc7c8 100644 --- a/buildtools/meson.build +++ b/buildtools/meson.build @@ -4,3 +4,4 @@ subdir('pmdinfogen') pmdinfo = find_program('gen-pmdinfo-cfile.sh') +map_to_def = files('map_to_def.py') diff --git a/buildtools/pmdinfogen/meson.build b/buildtools/pmdinfogen/meson.build index a219a8e96..938137300 100644 --- a/buildtools/pmdinfogen/meson.build +++ b/buildtools/pmdinfogen/meson.build @@ -1,7 +1,8 @@ # SPDX-License-Identifier: BSD-3-Clause # Copyright(c) 2017 Intel Corporation -pmdinfogen_inc = eal_inc +pmdinfogen_inc = [global_inc] +pmdinfogen_inc += include_directories('../../lib/librte_eal/common/include') pmdinfogen_inc += include_directories('../../lib/librte_pci') pmdinfogen = executable('pmdinfogen', 'pmdinfogen.c', diff --git a/lib/meson.build b/lib/meson.build index 99957ba7d..c4606e7f2 100644 --- a/lib/meson.build +++ b/lib/meson.build @@ -117,6 +117,12 @@ foreach l:libraries objs += static_lib.extract_all_objects(recursive: false) version_map = '@0@/@1@/rte_@2@_version.map'.format( meson.current_source_dir(), dir_name, name) + exports_def = 'rte_@0@_exports.def'.format(name) + def_file = custom_target(exports_def, + command: [python3, map_to_def, '@INPUT@', '@OUTPUT@'], + input: version_map, + output: exports_def, + build_by_default: true) shared_lib = shared_library(libname, sources, objects: objs, diff --git a/meson.build b/meson.build index 69833de82..81a9e93f7 100644 --- a/meson.build +++ b/meson.build @@ -8,6 +8,10 @@ project('DPDK', 'C', meson_version: '>= 0.47.1' ) +# get python available, using the python interpreter for running meson +pymod = import('python') +python3 = pymod.find_installation() + # set up some global vars for compiler, platform, configuration, etc. cc = meson.get_compiler('c') dpdk_conf = configuration_data() @@ -36,8 +40,8 @@ global_inc = include_directories('.', 'config', 'lib/librte_eal/common/include') subdir('config') # build libs and drivers -subdir('lib') subdir('buildtools') +subdir('lib') subdir('drivers') # build binaries and installable tools