Trying to fix a proper structure for driver tests in the hard world
of autotools:
Staticaly linked drivers fails with autotools as the linker would need the
"--whole-archive" option which autotools cannot handle.
This patch load an empty driver as a shared library (.so), and is the
result of a long series of trial and errors with autotools.

Signed-off-by: Christophe Milard <christophe.mil...@linaro.org>
---

Note: must be applied on top of:
 [API-NEXT PATCHv4 0/5] driver initialisation framework

Since V2: includes a needed change for V4 of "driver initialisation framework"
          Still problem with clang and ther -dlreopen Aututools option...
Since V1: updates for V4 of "driver initialisation framework"

Is this good enough to go in the test structure?
I assumed this is linux test, i.e. not platform dependent...
(based on the ARCH decision where we said all linux we consider have dlopen())
Fails with Clang:
clang: error: argument unused during compilation: '-dlreopen'

 test/common_plat/m4/configure.m4                   |  3 ++
 test/common_plat/validation/Makefile.inc           |  1 -
 test/common_plat/validation/drv/Makefile.am        |  1 +
 test/common_plat/validation/drv/drvinit/.gitignore |  3 ++
 .../common_plat/validation/drv/drvinit/Makefile.am | 27 ++++++++++
 test/common_plat/validation/drv/drvinit/drvinit.c  | 62 ++++++++++++++++++++++
 test/common_plat/validation/drv/drvinit/drvinit.h  | 24 +++++++++
 .../validation/drv/drvinit/drvinit_main.c          | 12 +++++
 .../validation/drv/drvinit/empty_driver.c          | 40 ++++++++++++++
 .../common_plat/validation/drv/drvinit/odp.conf.in |  8 +++
 .../validation/drv/drvinit/odp_conf_path.h.in      |  4 ++
 test/linux-generic/Makefile.am                     |  1 +
 12 files changed, 185 insertions(+), 1 deletion(-)
 create mode 100644 test/common_plat/validation/drv/drvinit/.gitignore
 create mode 100644 test/common_plat/validation/drv/drvinit/Makefile.am
 create mode 100644 test/common_plat/validation/drv/drvinit/drvinit.c
 create mode 100644 test/common_plat/validation/drv/drvinit/drvinit.h
 create mode 100644 test/common_plat/validation/drv/drvinit/drvinit_main.c
 create mode 100644 test/common_plat/validation/drv/drvinit/empty_driver.c
 create mode 100644 test/common_plat/validation/drv/drvinit/odp.conf.in
 create mode 100644 test/common_plat/validation/drv/drvinit/odp_conf_path.h.in

diff --git a/test/common_plat/m4/configure.m4 b/test/common_plat/m4/configure.m4
index 1fc350d..3ff90fb 100644
--- a/test/common_plat/m4/configure.m4
+++ b/test/common_plat/m4/configure.m4
@@ -33,4 +33,7 @@ AC_CONFIG_FILES([test/common_plat/Makefile
                 test/common_plat/validation/api/traffic_mngr/Makefile
                 test/common_plat/validation/drv/Makefile
                 test/common_plat/validation/drv/drvatomic/Makefile
+                test/common_plat/validation/drv/drvinit/Makefile
+                test/common_plat/validation/drv/drvinit/odp.conf
+                test/common_plat/validation/drv/drvinit/odp_conf_path.h
                 test/common_plat/validation/drv/drvshmem/Makefile])
diff --git a/test/common_plat/validation/Makefile.inc 
b/test/common_plat/validation/Makefile.inc
index ffba620..36c9899 100644
--- a/test/common_plat/validation/Makefile.inc
+++ b/test/common_plat/validation/Makefile.inc
@@ -8,7 +8,6 @@ COMMON_DIR = $(top_builddir)/test/common_plat/common
 AUTOMAKE_OPTIONS = nostdinc
 
 AM_CFLAGS += -I$(top_srcdir)/test/common_plat/common
-AM_LDFLAGS += -static
 
 LIBCUNIT_COMMON = $(COMMON_DIR)/libcunit_common.la
 LIBCPUMASK_COMMON = $(COMMON_DIR)/libcpumask_common.la
diff --git a/test/common_plat/validation/drv/Makefile.am 
b/test/common_plat/validation/drv/Makefile.am
index bcdb92e..1574f3d 100644
--- a/test/common_plat/validation/drv/Makefile.am
+++ b/test/common_plat/validation/drv/Makefile.am
@@ -1,4 +1,5 @@
 ODPDRV_MODULES = drvatomic \
+                drvinit \
                 drvshmem
 
 SUBDIRS = $(ODPDRV_MODULES)
diff --git a/test/common_plat/validation/drv/drvinit/.gitignore 
b/test/common_plat/validation/drv/drvinit/.gitignore
new file mode 100644
index 0000000..0d56fa9
--- /dev/null
+++ b/test/common_plat/validation/drv/drvinit/.gitignore
@@ -0,0 +1,3 @@
+drvinit_main
+odp_conf_path.h
+odp.conf
diff --git a/test/common_plat/validation/drv/drvinit/Makefile.am 
b/test/common_plat/validation/drv/drvinit/Makefile.am
new file mode 100644
index 0000000..622bbf3
--- /dev/null
+++ b/test/common_plat/validation/drv/drvinit/Makefile.am
@@ -0,0 +1,27 @@
+include ../Makefile.inc
+include $(top_srcdir)/platform/@with_platform@/Makefile.inc
+
+ABS_TEST_BUILDDIR = $(abs_top_builddir)/test/common_plat/validation/drv/drvinit
+
+noinst_LTLIBRARIES = libtestdrvinit.la
+libtestdrvinit_la_SOURCES = drvinit.c
+
+# the minimalist driver:
+lib_LTLIBRARIES = empty_driver.la
+empty_driver_la_SOURCES = empty_driver.c
+empty_driver_la_LDFLAGS = $(AM_LDFLAGS) -module -shared -export-dynamic \
+                         -avoid-version
+
+# the program trying to load the driver:
+# autotools ack: poking straight into .libs to find the ".so" file...
+# and hardcoding rpath...
+test_PROGRAMS = drvinit_main$(EXEEXT)
+drvinit_main_SOURCES = drvinit_main.c
+drvinit_main_LDADD = libtestdrvinit.la $(LIBCUNIT_COMMON) $(LIBODP)
+drvinit_main_LDFLAGS = $(AM_LDFLAGS) \
+                    -dlreopen $(ABS_TEST_BUILDDIR)/empty_driver.la
+
+# the odp configuration file for this test:
+check_DATA = odp.conf
+
+EXTRA_DIST = drvinit.h odp_conf_path.h
diff --git a/test/common_plat/validation/drv/drvinit/drvinit.c 
b/test/common_plat/validation/drv/drvinit/drvinit.c
new file mode 100644
index 0000000..c4152f7
--- /dev/null
+++ b/test/common_plat/validation/drv/drvinit/drvinit.c
@@ -0,0 +1,62 @@
+/* Copyright (c) 2016, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#define _POSIX_C_SOURCE 200112L  /* allowed?? UGLY! */
+#include <odp_drv.h>
+#include <odp_api.h>
+#include <odp_cunit_common.h>
+#include "drvinit.h"
+#include "odp_conf_path.h"
+#include <stdlib.h>
+#include <unistd.h>
+#include <libgen.h>
+#include <linux/limits.h>
+
+#define TEST_SKIPPED 77
+
+/*
+ * basic tests
+ */
+void drvinit_test_load(void)
+{
+       /* if we reaches so far, the global init is done, i.e.
+        * the driver was loaded. A loading failure would stop global_init() */
+       CU_PASS();
+}
+
+odp_testinfo_t drvinit_suite[] = {
+       ODP_TEST_INFO(drvinit_test_load),
+       ODP_TEST_INFO_NULL,
+};
+
+odp_suiteinfo_t drvinit_suites[] = {
+       {"Driver load", NULL, NULL, drvinit_suite},
+       ODP_SUITE_INFO_NULL,
+};
+
+int drvinit_main(int argc, char *argv[])
+{
+       int ret;
+
+       /* parse common options: */
+       if (odp_cunit_parse_options(argc, argv))
+               return -1;
+
+       /*
+        * sets the ODP_SYSCONFIG_FILE environment variable:
+        * the ODP_SYSCONFIG_FILE environment variable is used to force
+        * the odp configuration filename (hence not taking the defauld
+        * /etc/odp.conf.
+        * we force the configuration file to be taken from the local directory
+        */
+       setenv("ODP_SYSCONFIG_FILE", CONFIG_FILE, 1);
+
+       ret = odp_cunit_register(drvinit_suites);
+       if (ret == 0)
+               ret = odp_cunit_run();
+
+       return ret;
+}
diff --git a/test/common_plat/validation/drv/drvinit/drvinit.h 
b/test/common_plat/validation/drv/drvinit/drvinit.h
new file mode 100644
index 0000000..1c9f9a6
--- /dev/null
+++ b/test/common_plat/validation/drv/drvinit/drvinit.h
@@ -0,0 +1,24 @@
+/* Copyright (c) 2016, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#ifndef _ODP_TEST_DRVINIT_H_
+#define _ODP_TEST_DRVINIT_H_
+
+#include <odp_cunit_common.h>
+
+/* test functions: */
+void drvinit_test_load(void);
+
+/* test arrays: */
+extern odp_testinfo_t drvinit_suite[];
+
+/* test registry: */
+extern odp_suiteinfo_t drvinit_suites[];
+
+/* main test program: */
+int drvinit_main(int argc, char *argv[]);
+
+#endif
diff --git a/test/common_plat/validation/drv/drvinit/drvinit_main.c 
b/test/common_plat/validation/drv/drvinit/drvinit_main.c
new file mode 100644
index 0000000..2abfd20
--- /dev/null
+++ b/test/common_plat/validation/drv/drvinit/drvinit_main.c
@@ -0,0 +1,12 @@
+/* Copyright (c) 2016, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier:     BSD-3-Clause
+ */
+
+#include "drvinit.h"
+
+int main(int argc, char *argv[])
+{
+       return drvinit_main(argc, argv);
+}
diff --git a/test/common_plat/validation/drv/drvinit/empty_driver.c 
b/test/common_plat/validation/drv/drvinit/empty_driver.c
new file mode 100644
index 0000000..e7acb83
--- /dev/null
+++ b/test/common_plat/validation/drv/drvinit/empty_driver.c
@@ -0,0 +1,40 @@
+#include <odp_drv.h>
+
+static int probe(odpdrv_enumerated_dev_t *dev);
+static int remove(odpdrv_enumerated_dev_t *dev);
+
+static odpdrv_driver_t params = {
+       .name = "basic_driver",
+       .devios = {
+               {
+                       .devio_api_name = "pci_no_iommu",
+                       .devio_api_version = 1,
+               },
+               {
+                       .devio_api_name = "\0",
+               }
+       },
+       .probe = probe,
+       .remove = remove,
+};
+
+static void __attribute__ ((constructor)) basic_driver_init(void)
+{
+       odpdrv_driver_register(&params);
+}
+
+static int probe(odpdrv_enumerated_dev_t *dev)
+{
+       if (dev)
+               return 0;
+       else
+               return 1;
+}
+
+static int remove(odpdrv_enumerated_dev_t *dev)
+{
+       if (dev)
+               return 0;
+       else
+               return 1;
+}
diff --git a/test/common_plat/validation/drv/drvinit/odp.conf.in 
b/test/common_plat/validation/drv/drvinit/odp.conf.in
new file mode 100644
index 0000000..65688fe
--- /dev/null
+++ b/test/common_plat/validation/drv/drvinit/odp.conf.in
@@ -0,0 +1,8 @@
+#configuration related to modules:
+module = {
+       #listing the modules to be loaded:
+       #here, we just load an empty driver, making sure the loading works.
+       #Need to specify full path to be sure we load the right stuff=>.libs 
=>UGLY!
+       #modules = 
["@abs_top_builddir@/test/common_plat/validation/drv/drvinit/.libs/empty_driver.so"];
+       modules = ["empty_driver.so"];
+};
diff --git a/test/common_plat/validation/drv/drvinit/odp_conf_path.h.in 
b/test/common_plat/validation/drv/drvinit/odp_conf_path.h.in
new file mode 100644
index 0000000..ea62f78
--- /dev/null
+++ b/test/common_plat/validation/drv/drvinit/odp_conf_path.h.in
@@ -0,0 +1,4 @@
+/* setting the path to the odp configuration file needed for this test */
+#define CONFIG_FILE_DIR  "test/common_plat/validation/drv/drvinit/"
+#define CONFIG_FILE_NAME "odp.conf"
+#define CONFIG_FILE "@abs_top_builddir@" "/" CONFIG_FILE_DIR CONFIG_FILE_NAME
diff --git a/test/linux-generic/Makefile.am b/test/linux-generic/Makefile.am
index 888da5d..b0517db 100644
--- a/test/linux-generic/Makefile.am
+++ b/test/linux-generic/Makefile.am
@@ -35,6 +35,7 @@ TESTS = validation/api/pktio/pktio_run.sh \
        $(ALL_API_VALIDATION_DIR)/shmem/shmem_main$(EXEEXT) \
        $(ALL_API_VALIDATION_DIR)/system/system_main$(EXEEXT) \
        $(ALL_DRV_VALIDATION_DIR)/drvatomic/drvatomic_main$(EXEEXT) \
+       $(ALL_DRV_VALIDATION_DIR)/drvinit/drvinit_main$(EXEEXT) \
        $(ALL_DRV_VALIDATION_DIR)/drvshmem/drvshmem_main$(EXEEXT) \
        ring/ring_main$(EXEEXT)
 
-- 
2.7.4

Reply via email to