test suite reviews and discussions
 help / color / mirror / Atom feed
From: lihong <lihongx.ma@intel.com>
To: dts@dpdk.org
Cc: zhaoyan.chen@intel.com, lihong <lihongx.ma@intel.com>
Subject: [dts] [PATCH V1 5/7] framework: add meson build method and get apps name of current build type
Date: Tue,  7 Jul 2020 10:45:01 +0800	[thread overview]
Message-ID: <1594089903-26285-6-git-send-email-lihongx.ma@intel.com> (raw)
In-Reply-To: <1594089903-26285-1-git-send-email-lihongx.ma@intel.com>

Signed-off-by: lihong <lihongx.ma@intel.com>
---
 framework/dut.py          |   8 ++-
 framework/project_dpdk.py | 128 +++++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 127 insertions(+), 9 deletions(-)

diff --git a/framework/dut.py b/framework/dut.py
index 2545621..bef0d15 100644
--- a/framework/dut.py
+++ b/framework/dut.py
@@ -33,7 +33,7 @@ import os
 import re
 import time
 import settings
-from config import PortConf
+from config import PortConf,AppNameConf
 from settings import NICS, LOG_NAME_SEP
 from ssh_connection import SSHConnection
 from crb import Crb
@@ -78,6 +78,8 @@ class Dut(Crb):
         self.prefix_subfix = str(os.getpid()) + '_' + time.strftime("%Y%m%d%H%M%S", time.localtime())
         self.prefix_list = []
         self.hugepage_path = None
+        self.apps_name_conf = {}
+        self.apps_name = {}
 
     def filter_cores_from_crb_cfg(self):
         # get core list from crbs.cfg
@@ -388,6 +390,10 @@ class Dut(Crb):
         # initialize virtualization resource pool
         self.virt_pool = VirtResource(self)
 
+        # load app name conf
+        name_cfg = AppNameConf()
+        self.apps_name_conf = name_cfg.load_app_name_conf()
+
     def restore_interfaces(self):
         """
         Restore all ports's interfaces.
diff --git a/framework/project_dpdk.py b/framework/project_dpdk.py
index c0dfd59..040d070 100644
--- a/framework/project_dpdk.py
+++ b/framework/project_dpdk.py
@@ -33,7 +33,7 @@ import os
 import re
 
 from settings import NICS, load_global_setting, accepted_nic
-from settings import DPDK_RXMODE_SETTING, HOST_DRIVER_SETTING, HOST_DRIVER_MODE_SETTING
+from settings import DPDK_RXMODE_SETTING, HOST_DRIVER_SETTING, HOST_DRIVER_MODE_SETTING, HOST_BUILD_TYPE_SETTING
 from settings import HOST_SHARED_LIB_SETTING, HOST_SHARED_LIB_PATH
 from ssh_connection import SSHConnection
 from crb import Crb
@@ -73,6 +73,16 @@ class DPDKdut(Dut):
 
         self.set_driver_specific_configurations(drivername)
 
+        # get apps name of current build type
+        build_type = load_global_setting(HOST_BUILD_TYPE_SETTING)
+        if build_type not in self.apps_name_conf:
+            raise Exception('please config the apps name in app_name.cfg of build type:%s' % build_type)
+        self.apps_name = self.apps_name_conf[build_type]
+        # use the dut target directory instead of 'target' string in app name
+        for app in self.apps_name:
+            cur_app_path = self.apps_name[app].replace('target', self.target)
+            self.apps_name[app] = cur_app_path + ' '
+
         if not self.skip_setup:
             self.build_install_dpdk(target)
 
@@ -214,10 +224,58 @@ class DPDKdut(Dut):
                              "config/common_base", '#')
         self.send_expect("sed -i 's/CONFIG_RTE_EAL_IGB_UIO=n/CONFIG_RTE_EAL_IGB_UIO=y/g' "
                         "config/common_base", '#')
-        build_install_dpdk = getattr(self, 'build_install_dpdk_%s' % self.get_os_type())
+        build_type = load_global_setting(HOST_BUILD_TYPE_SETTING)
+        build_install_dpdk = getattr(self, 'build_install_dpdk_%s_%s' % (self.get_os_type(), build_type))
         build_install_dpdk(target, extra_options)
 
-    def build_install_dpdk_linux(self, target, extra_options):
+    def build_install_dpdk_linux_meson(self, target, extra_options):
+        """
+        Build DPDK source code on linux use meson
+        """
+        build_time = 900
+        target_info = target.split('-')
+        arch = target_info[0]
+        machine = target_info[1]
+        execenv = target_info[2]
+        toolchain = target_info[3]
+
+        default_library = 'static'
+        use_shared_lib = load_global_setting(HOST_SHARED_LIB_SETTING)
+        if use_shared_lib == 'true' and 'Virt' not in str(self):
+            default_library = 'shared'
+        if arch == 'i686':
+            # find the pkg-config path and set the PKG_CONFIG_LIBDIR environmental variable to point it
+            out = self.send_expect("find /usr -type d -name pkgconfig", "# ")
+            pkg_path = ''
+            default_cflags = self.send_expect("echo $CFLAGS", "# ")
+            default_pkg_config = self.send_expect("echo $PKG_CONFIG_LIBDIR", "# ")
+            res_path = out.split('\r\n')
+            for cur_path in res_path:
+                if 'i386' in cur_path:
+                    pkg_path = cur_path
+                    break
+            assert(pkg_path is not ''), "please make sure you env have the i386 pkg-config path"
+
+            self.send_expect("export CFLAGS=-m32", "# ")
+            self.send_expect("export PKG_CONFIG_LIBDIR=%s" % pkg_path, "# ")
+
+        self.send_expect("rm -rf " + target, "#")
+        out = self.send_expect("CC=%s meson --werror -Denable_kmods=True -Dlibdir=lib --default-library=%s %s" % (
+                        toolchain, default_library, target), "# ", build_time)
+        assert ("Error" not in out), "meson setup failed ..."
+
+        out = self.send_expect("ninja -C %s -j %d" % (target, self.number_of_cores), "# ", build_time)
+        assert ("Error" not in out), "ninja complie failed ..."
+
+        # copy kmod file to the folder same as make
+        out = self.send_expect("find ./%s/kernel/ -name *.ko" % target, "# ", verify=True)
+        self.send_expect("mkdir -p %s/kmod" % target, "# ")
+        if not isinstance(out, int) and len(out) > 0:
+            kmod = out.split('\r\n')
+            for mod in kmod:
+                self.send_expect("cp %s %s/kmod/" % (mod, target), "# ")
+
+    def build_install_dpdk_linux_makefile(self, target, extra_options):
         """
         Build DPDK source code on linux with specified target.
         """
@@ -241,7 +299,11 @@ class DPDKdut(Dut):
         assert ("Error" not in out), "Compilation error..."
         assert ("No rule to make" not in out), "No rule to make error..."
 
-    def build_install_dpdk_freebsd(self, target, extra_options):
+    def build_install_dpdk_freebsd_meson(self, target, extra_options):
+        # meson build same as linux
+        self.build_install_dpdk_linux_meson(target, extra_options)
+
+    def build_install_dpdk_freebsd_makefile(self, target, extra_options):
         """
         Build DPDK source code on Freebsd with specified target.
         """
@@ -312,7 +374,6 @@ class DPDKdut(Dut):
                     self.send_expect("mkdir -p ~/QMP", "# ")
                 self.session.copy_file_to('dep/QMP/qemu-ga-client', '~/QMP/')
                 self.session.copy_file_to('dep/QMP/qmp.py', '~/QMP/')
-
             self.kill_all()
 
             # enable core dump
@@ -395,10 +456,57 @@ class DPDKdut(Dut):
         """
         Build dpdk sample applications.
         """
-        build_dpdk_apps = getattr(self, 'build_dpdk_apps_%s' % self.get_os_type())
+        build_type = load_global_setting(HOST_BUILD_TYPE_SETTING)
+        build_dpdk_apps = getattr(self, 'build_dpdk_apps_%s_%s' % (self.get_os_type(), build_type))
         return build_dpdk_apps(folder, extra_options)
 
-    def build_dpdk_apps_linux(self, folder, extra_options):
+    def build_dpdk_apps_linux_meson(self, folder, extra_options):
+        """
+        Build dpdk sample applications on linux use meson
+        """
+        # icc compile need more time
+        if 'icc' in self.target:
+            timeout = 300
+        else:
+            timeout = 90
+
+        target_info = self.target.split('-')
+        arch = target_info[0]
+        if arch == 'i686':
+            # find the pkg-config path and set the PKG_CONFIG_LIBDIR environmental variable to point it
+            out = self.send_expect("find /usr -type d -name pkgconfig", "# ")
+            pkg_path = ''
+            default_cflags = self.send_expect("echo $CFLAGS", "# ")
+            default_pkg_config = self.send_expect("echo $PKG_CONFIG_LIBDIR", "# ")
+            res_path = out.split('\r\n')
+            for cur_path in res_path:
+                if 'i386' in cur_path:
+                    pkg_path = cur_path
+                    break
+            assert(pkg_path is not ''), "please make sure you env have the i386 pkg-config path"
+
+            self.send_expect("export CFLAGS=-m32", "# ", alt_session=True)
+            self.send_expect("export PKG_CONFIG_LIBDIR=%s" % pkg_path, "# ", alt_session=True)
+
+        folder_info = folder.split('/')
+        name = folder_info[-1]
+        if name not in self.apps_name:
+            raise Exception('Please config %s file path on conf/app_name.cfg' % name)
+
+        example = '/'.join(folder_info[folder_info.index('examples')+1:])
+        self.send_expect("cd %s/%s" % (self.base_dir, self.target), "# ", alt_session=True)
+        out = self.send_expect("meson configure -Dexamples=%s" % example, "# ", alt_session=True)
+        assert ("Error" not in out), "Compilation error..."
+        out = self.send_expect("ninja", "# ", timeout, alt_session=True)
+        assert ("Error" not in out), "Compilation error..."
+
+        # verify the app build in the config path
+        out = self.send_expect('ls %s' % self.apps_name[name], "# ", verify=True)
+        assert(isinstance(out, str)), 'please confirm %s app path and name in app_name.cfg' % name
+
+        return out
+
+    def build_dpdk_apps_linux_makefile(self, folder, extra_options):
         """
         Build dpdk sample applications on linux.
         """
@@ -414,7 +522,11 @@ class DPDKdut(Dut):
                                                          folder, extra_options),
                                 "# ", timeout)
 
-    def build_dpdk_apps_freebsd(self, folder, extra_options):
+    def build_dpdk_apps_freebsd_meson(self, folder, extra_options):
+        # meson build same as linux
+        self.build_dpdk_apps_linux_meson(folder, extra_options)
+
+    def build_dpdk_apps_freebsd_makefile(self, folder, extra_options):
         """
         Build dpdk sample applications on Freebsd.
         """
-- 
2.7.4


  parent reply	other threads:[~2020-07-07 10:16 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-07  2:44 [dts] [PATCH V1 0/7] meson build reference lihong
2020-07-07  2:44 ` [dts] [PATCH V1 1/7] executions: add build_type field in all executions cfg lihong
2020-07-07  2:44 ` [dts] [PATCH V1 2/7] conf: add configuration file of app_name.cfg lihong
2020-07-07  2:44 ` [dts] [PATCH V1 3/7] framework/config: get configuration information from app_name.cfg lihong
2020-07-07  2:45 ` [dts] [PATCH V1 4/7] framework: read and save the build_type from execution.cfg lihong
2020-07-07  2:45 ` lihong [this message]
2020-07-07  2:45 ` [dts] [PATCH V1 6/7] framework/pmd_output: replace the hard code app path with the configured app path lihong
2020-07-07  2:45 ` [dts] [PATCH V1 7/7] tests: " lihong
2020-07-07 10:20 ` [dts] [PATCH V1 0/7] meson build reference Xiao, QimaiX
2020-07-20  7:08 ` Tu, Lijuan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1594089903-26285-6-git-send-email-lihongx.ma@intel.com \
    --to=lihongx.ma@intel.com \
    --cc=dts@dpdk.org \
    --cc=zhaoyan.chen@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).