[IOT-2014] linker changes for connectivity_abstraction
authorDan Mihai <Daniel.Mihai@microsoft.com>
Tue, 18 Apr 2017 13:26:19 +0000 (06:26 -0700)
committerDan Mihai <Daniel.Mihai@microsoft.com>
Tue, 2 May 2017 16:27:53 +0000 (16:27 +0000)
Windows currently has several different copies of
connectivity_abstraction code and data in a single process.
Other platforms are using a single copy of shared library
connectivity_abstraction, in each process/app.

It's better to avoid differences across platforms, because
otherwise changes tested on one platform might not work on
the other platforms.

Linker behavior unchanged by this patch:
----------------------------------------

1. On non-Windows platforms: IoTivity sample apps, and apps outside
   IoTivity, continue to link with connectivity_abstraction.

2. On Windows: IoTivity sample apps, and apps outside IoTivity,
   continue to link with octbstack.lib.

Linker behavior changed by this patch:
----------------------------------------

1. On all platforms: IoTivity-internal tests link with the static LIB
   connectivity_abstraction_internal.

2. On Windows: IoTivity sample apps, and apps outside IoTivity,
   no longer link directly with connectivity_abstraction.lib.
   They obtain access to connectivity_abstraction APIs by linking
   with octbstack.lib.

3. On Windows: Octbstack.dll links with the static LIB
   connectivity_abstraction_internal, and exports public
   connectivity_abstraction APIs.

Change-Id: I48667d08d5be48e828800da2807c030753beab16
Signed-off-by: Dan Mihai <Daniel.Mihai@microsoft.com>
Reviewed-on: https://gerrit.iotivity.org/gerrit/18981
Tested-by: jenkins-iotivity <jenkins@iotivity.org>
17 files changed:
resource/IPCA/samples/ElevatorServer/SConscript
resource/IPCA/src/SConscript
resource/c_common/ocrandom/test/SConscript
resource/csdk/connectivity/src/SConscript
resource/csdk/connectivity/test/SConscript
resource/csdk/security/provisioning/sample/SConscript
resource/csdk/security/provisioning/unittest/SConscript
resource/csdk/security/tool/SConscript
resource/csdk/security/unittest/SConscript
resource/csdk/stack/SConscript
resource/csdk/stack/samples/linux/OCSample/SConscript
resource/csdk/stack/samples/linux/SimpleClientServer/SConscript
resource/csdk/stack/samples/linux/secure/SConscript
resource/csdk/stack/test/SConscript
resource/examples/SConscript
resource/provisioning/unittests/SConscript
resource/unittests/SConscript

index 02dfbf7..a2144c1 100644 (file)
@@ -50,13 +50,21 @@ elevator_server_env.PrependUnique(CPPPATH = [
         ])
 
 elevator_server_env.AppendUnique(LIBPATH = [ipca_env.get('BUILD_DIR')])
+
 elevator_server_env.PrependUnique(LIBS = [
-        'oc',
-        'connectivity_abstraction',
         'coap',
         'octbstack'
         ])
 
+if target_os not in ['msys_nt', 'windows']:
+    elevator_server_env.PrependUnique(LIBS = [
+            'connectivity_abstraction'
+            ])
+
+elevator_server_env.PrependUnique(LIBS = [
+        'oc'
+        ])
+
 if elevator_server_env.get('SECURED') == '1':
     elevator_server_env.AppendUnique(CPPDEFINES = ['SECURED'])
     elevator_server_env.AppendUnique(LIBS = ['mbedtls', 'mbedx509','mbedcrypto', 'ocprovision'])
index 3ad2551..cdc163c 100644 (file)
@@ -61,12 +61,19 @@ else:
         ])
 
 ipca_lib_env.PrependUnique(LIBS = [
-        'oc',
-        'connectivity_abstraction',
         'coap',
         'octbstack'
         ])
 
+if target_os not in ['windows', 'msys_nt']:
+    ipca_lib_env.PrependUnique(LIBS = [
+            'connectivity_abstraction'
+            ])
+
+ipca_lib_env.PrependUnique(LIBS = [
+        'oc'
+        ])
+
 if ipca_env.get('SECURED') == '1':
     ipca_lib_env.PrependUnique(LIBS = [
             'mbedtls',
index b492052..bc0150c 100644 (file)
@@ -37,7 +37,6 @@ randomtest_env.PrependUnique(CPPPATH = [
                '../../logger/include',
                '../../../oc_logger/include',
                ])
 randomtest_env.PrependUnique(LIBS = ['uuid'])
 
 randomtest_env.PrependUnique(CPPPATH = ['../include'])
index 19615c7..eb14075 100644 (file)
@@ -163,18 +163,19 @@ if connectivity_env.get('SECURED') == '1':
 # c_common calls into mbedcrypto.
 connectivity_env.AppendUnique(LIBS = ['mbedcrypto'])
 
+calib_internal = connectivity_env.StaticLibrary('connectivity_abstraction_internal', connectivity_env.get('CA_SRC'))
+calib = Flatten(calib_internal)
+
 if ca_os in ['android', 'tizen', 'linux', 'yocto']:
     connectivity_env.AppendUnique(LIBS = ['coap'])
     if ca_os != 'android':
         connectivity_env.AppendUnique(LIBS = ['rt'])
     static_calib = connectivity_env.StaticLibrary('connectivity_abstraction', connectivity_env.get('CA_SRC'))
     shared_calib = connectivity_env.SharedLibrary('connectivity_abstraction', connectivity_env.get('CA_SRC'))
-    calib = Flatten([static_calib, shared_calib])
-elif ca_os in ['msys_nt', 'windows']:
-    connectivity_env.AppendUnique(LIBS = ['coap', 'mswsock', 'ws2_32', 'iphlpapi', 'logger'])
-    calib = connectivity_env.StaticLibrary('connectivity_abstraction', connectivity_env.get('CA_SRC'))
-else:
-    calib = connectivity_env.StaticLibrary('connectivity_abstraction', connectivity_env.get('CA_SRC'))
+    calib += Flatten([static_calib, shared_calib])
+elif ca_os not in ['msys_nt', 'windows']:
+    static_calib = connectivity_env.StaticLibrary('connectivity_abstraction', connectivity_env.get('CA_SRC'))
+    calib += Flatten(static_calib)
 
 connectivity_env.InstallTarget(calib, 'connectivity_abstraction')
 connectivity_env.UserInstallTargetLib(calib, 'connectivity_abstraction')
index 7d134a3..caa6d17 100644 (file)
@@ -50,11 +50,21 @@ catest_env.PrependUnique(CPPPATH = [
                 '#/resource/oc_logger/include',
                ])
 
-catest_env.PrependUnique(LIBS = ['octbstack_internal',
-                                 'ocsrm',
-                                 'routingmanager',
-                                 'connectivity_abstraction',
-                                 'coap'])
+catest_env.PrependUnique(LIBS = ['coap'])
+
+if target_os not in ['msys_nt', 'windows']:
+    # ssladapter_test.cpp #includes ca_adapter_net_ssl.c! That results in
+    # "multiple definition" linker errors, when trying to link with
+    # connectivity_abstraction_internal here.
+    catest_env.PrependUnique(LIBS = ['connectivity_abstraction'])
+else:
+    catest_env.PrependUnique(LIBS = ['connectivity_abstraction_internal'])
+
+catest_env.PrependUnique(LIBS = [
+                'octbstack_internal',
+                'ocsrm',
+                'routingmanager',
+                ])
 
 if target_os not in ['arduino', 'darwin', 'ios', 'msys_nt', 'windows']:
     catest_env.AppendUnique(LIBS=['rt'])
index 9206b09..dce2135 100644 (file)
@@ -48,7 +48,12 @@ if target_os not in ['msys_nt', 'windows']:
 else:
        provisioning_sample_env.AppendUnique(LIBPATH = [os.path.join(env.get('BUILD_DIR'), 'resource', 'csdk')])
 
-provisioning_sample_env.PrependUnique(LIBS = ['oc', 'octbstack', 'connectivity_abstraction', 'coap'])
+provisioning_sample_env.PrependUnique(LIBS = ['coap'])
+
+if target_os not in ['msys_nt', 'windows']:
+    provisioning_sample_env.PrependUnique(LIBS = ['connectivity_abstraction'])
+
+provisioning_sample_env.PrependUnique(LIBS = ['oc', 'octbstack'])
 
 if target_os not in ['msys_nt', 'windows']:
        provisioning_sample_env.PrependUnique(LIBS = ['oc_logger', 'ocpmapi', 'ocsrm'])
index ce00995..fbdb5fd 100644 (file)
@@ -65,7 +65,7 @@ sptest_env.PrependUnique(LIBS = [   'ocpmapi_internal',
                                     'ocsrm',
                                     'routingmanager',
                                     'oc_logger_internal',
-                                    'connectivity_abstraction',
+                                    'connectivity_abstraction_internal',
                                     'coap'])
 
 if sptest_env.get('SECURED') == '1':
@@ -83,7 +83,7 @@ if target_os in ['msys_nt', 'windows']:
     sptest_env.AppendUnique(LIBS = ['sqlite3'])
 else:
     if target_os in ['linux', 'tizen']:
-        sptest_env.ParseConfig('pkg-config --cflags --libs sqlite3')
+        sptest_env.ParseConfig('pkg-config --cflags --libs sqlite3 gobject-2.0 gio-2.0 glib-2.0')
 
 ######################################################################
 # Source files and Targets
index b24d97b..2fc9e9d 100644 (file)
@@ -56,15 +56,15 @@ if target_os not in ['darwin', 'msys_nt', 'windows']:
     tools_env.PrependUnique(LIBS = ['octbstack', 'ocsrm', 'm'])
 else:
     if target_os in ['darwin']:
-        tools_env.AppendUnique(LIBS = ['octbstack'])
+        tools_env.AppendUnique(LIBS = ['octbstack', 'connectivity_abstraction'])
     else:
         # This IoTivity-internal app calls non-Public APIs, so link with LIBS intended
         # for IoTivity-internal tests (such as octbstack_internal).
-        tools_env.AppendUnique(LIBS = ['octbstack_internal'])
+        tools_env.AppendUnique(LIBS = ['octbstack_internal', 'connectivity_abstraction_internal'])
         if target_os in ['windows']:
             tools_env.AppendUnique(LIBS = ['sqlite3'])
     tools_env.AppendUnique(LIBS = ['coap', 'mbedtls', 'mbedx509', 'mbedcrypto',
-                                   'ocsrm', 'routingmanager', 'connectivity_abstraction'])
+                                   'ocsrm', 'routingmanager'])
 
 tools_env.PrependUnique(LIBS = ['cjson'])
 
index d2f1de1..5119cad 100644 (file)
@@ -60,7 +60,7 @@ srmtest_env.PrependUnique(LIBS = [
         'ocsrm',
         'routingmanager',
         'oc_logger_internal',
-        'connectivity_abstraction',
+        'connectivity_abstraction_internal',
         'coap'
         ])
 
@@ -80,7 +80,7 @@ else:
     srmtest_env.AppendUnique(CPPDEFINES = ['HAVE_LOCALTIME_R'])
 
     if target_os in ['linux', 'tizen']:
-        srmtest_env.ParseConfig('pkg-config --cflags --libs sqlite3')
+        srmtest_env.ParseConfig('pkg-config --cflags --libs sqlite3 gobject-2.0 gio-2.0 glib-2.0')
 
 ######################################################################
 # Source files and Targets
index 13f6c49..7cd8486 100644 (file)
@@ -103,7 +103,13 @@ if env.get('SECURED') == '1':
 liboctbstack_env.AppendUnique(LIBS = ['mbedcrypto'])
 
 if target_os in ['android', 'linux', 'tizen', 'msys_nt', 'windows']:
-    liboctbstack_env.PrependUnique(LIBS = ['connectivity_abstraction'])
+    if target_os not in ['windows', 'msys_nt']:
+        liboctbstack_env.PrependUnique(LIBS = ['connectivity_abstraction'])
+    else:
+        # On Windows, apps don't link directly with connectivity_abstraction.
+        # connectivity_abstraction is linked inside octbstack.dll and apps
+        # import its APIs by linking with octbstack.lib.
+        liboctbstack_env.PrependUnique(LIBS = ['connectivity_abstraction_internal'])
 
     if with_ra_ibb:
         liboctbstack_env.AppendUnique(LIBS = liboctbstack_env['RALIBS'], LIBPATH = liboctbstack_env['RALIBPATH'], RPATH = liboctbstack_env['RARPATH'])
index de9ed7d..fc358d3 100644 (file)
@@ -21,6 +21,8 @@
 Import('stacksamples_env')
 ocsample_env = stacksamples_env.Clone()
 
+target_os = stacksamples_env.get('TARGET_OS')
+
 ######################################################################
 # Build flags
 ######################################################################
@@ -29,10 +31,15 @@ ocsample_env.PrependUnique(CPPPATH = [
     '#/resource/csdk/stack/include',
 ])
 
+if target_os not in ['msys_nt', 'windows']:
+    ocsample_env.PrependUnique(LIBS = [
+        'connectivity_abstraction',
+    ])
+
 ocsample_env.PrependUnique(LIBS = [
     'octbstack',
-    'connectivity_abstraction'
 ])
+
 if ocsample_env.get('SECURED') == '1':
        if ocsample_env.get('WITH_TCP') == True:
                ocsample_env.AppendUnique(LIBS = ['mbedtls', 'mbedx509','mbedcrypto'])
index e5e864c..d827b34 100644 (file)
@@ -54,8 +54,12 @@ if 'g++' in compiler:
 
 samples_env.AppendUnique(RPATH=[samples_env.get('BUILD_DIR')])
 
-samples_env.PrependUnique(
-    LIBS=['octbstack', 'ocsrm', 'connectivity_abstraction', 'coap'])
+samples_env.PrependUnique(LIBS=['coap'])
+
+if target_os not in ['msys_nt', 'windows']:
+    samples_env.PrependUnique(LIBS=['connectivity_abstraction'])
+
+samples_env.PrependUnique(LIBS=['octbstack', 'ocsrm'])
 
 if target_os in ['darwin']:
     samples_env.AppendUnique(LIBS=['routingmanager'])
index 2085ffe..b49042e 100644 (file)
@@ -42,10 +42,12 @@ if target_os not in ['windows']:
        samples_env.Append(LINKFLAGS = ['-Wl,--no-as-needed'])
 
 if target_os in ['windows', 'msys_nt']:
-       samples_env.PrependUnique(LIBS = ['ocsrm', 'ws2_32', 'iphlpapi'])
+       samples_env.PrependUnique(LIBS = ['coap', 'ocsrm'])
 else:
-       samples_env.PrependUnique(LIBS = ['m'])
-samples_env.PrependUnique(LIBS = ['octbstack', 'connectivity_abstraction', 'coap'])
+       samples_env.PrependUnique(LIBS = ['connectivity_abstraction', 'coap', 'm'])
+
+samples_env.PrependUnique(LIBS = ['octbstack'])
+
 if samples_env.get('SECURED') == '1':
        samples_env.AppendUnique(LIBS = ['mbedtls', 'mbedx509','mbedcrypto'])
 
index fcd8e65..ed77e6e 100644 (file)
@@ -49,7 +49,7 @@ stacktest_env.PrependUnique(CPPPATH = [
 stacktest_env.PrependUnique(LIBS = ['octbstack_internal',
                                     'ocsrm',
                                     'routingmanager',
-                                    'connectivity_abstraction',
+                                    'connectivity_abstraction_internal',
                                     'coap',
                                     ])
 
@@ -67,6 +67,8 @@ if target_os in ['msys_nt', 'windows']:
     stacktest_env.AppendUnique(CCFLAGS=['/W4', '/WX'])
 else:
     stacktest_env.PrependUnique(LIBS = ['m'])
+    if target_os in ['tizen', 'linux']:
+        stacktest_env.ParseConfig("pkg-config --cflags --libs gobject-2.0 gio-2.0 glib-2.0")
 
 ######################################################################
 # Source files and Targets
index 2ba666e..65a2344 100644 (file)
@@ -46,7 +46,10 @@ examples_env.AppendUnique(CPPPATH = [
 
 examples_env.AppendUnique(RPATH = [examples_env.get('BUILD_DIR')])
 examples_env.PrependUnique(LIBS = ['coap'])
-examples_env.AppendUnique(LIBS = ['connectivity_abstraction'])
+
+if target_os not in ['msys_nt', 'windows']:
+    examples_env.AppendUnique(LIBS = ['connectivity_abstraction'])
+
 examples_env.AppendUnique(LIBS = ['octbstack'])
 examples_env.AppendUnique(LIBS = ['oc'])
 
index 5d826d9..948a6dc 100755 (executable)
@@ -62,7 +62,7 @@ if target_os in ['windows']:
 
     provisiontests_env.AppendUnique(LIBS = ['sqlite3'])
 elif target_os in ['tizen', 'linux']:
-    provisiontests_env.ParseConfig('pkg-config --cflags --libs sqlite3')
+    provisiontests_env.ParseConfig('pkg-config --cflags --libs sqlite3 gobject-2.0 gio-2.0 glib-2.0')
 
 provisiontests_env.PrependUnique(LIBS = [
         'ocprovision',
@@ -71,7 +71,7 @@ provisiontests_env.PrependUnique(LIBS = [
         'octbstack_internal',
         'routingmanager',
         'oc_logger_internal',
-        'connectivity_abstraction',
+        'connectivity_abstraction_internal',
         'coap',
         'ocsrm'
         ])
index 3f8ea9b..cd35ddc 100644 (file)
@@ -53,7 +53,7 @@ if target_os in ['windows']:
     unittests_env.AppendUnique(CPPPATH = ['#extlibs/boost/boost'])
     unittests_env.AppendUnique(LIBS = ['sqlite3'])
 elif target_os in ['linux', 'tizen']:
-    unittests_env.ParseConfig('pkg-config --cflags --libs sqlite3')
+    unittests_env.ParseConfig('pkg-config --cflags --libs sqlite3 gobject-2.0 gio-2.0 glib-2.0')
 
 unittests_env.PrependUnique(LIBS = [
         'oc',
@@ -61,7 +61,7 @@ unittests_env.PrependUnique(LIBS = [
         'ocsrm',
         'routingmanager',
         'oc_logger_internal',
-        'connectivity_abstraction',
+        'connectivity_abstraction_internal',
         'coap',
         ])