Dynamic lib selection and deployment
[anna.git] / SConstruct
index 8083387..e223dd8 100644 (file)
@@ -1,4 +1,5 @@
 import os
+import sys, select
 
 # Basic paths
 prefix = ARGUMENTS.get ('prefix', "/usr/local")
@@ -18,7 +19,27 @@ target_opt_bin = os.path.join (opt_bin, "anna")
 release = ARGUMENTS.get ('release', 0)
 
 # Environment
-env = Environment ()
+env = None
+rc = os.system("clang++ --version >/dev/null 2>/dev/null")
+if rc == 0: 
+  print "\nDetected clang++ installed in the system"
+  print "\nSelect compiler:\n  1. g++\n  2. clang++"
+  #option = raw_input("\nInput option [1]: ") or "1"
+  # Read with timeout:
+  print "\nInput option [1]: "
+  option = 1
+  i, o, e = select.select( [sys.stdin], [], [], 60 )
+  if (i): option = sys.stdin.readline().strip()
+  else: print "expired! using default ..."
+  if option == "2":
+    env = Environment(CXX = 'clang++')
+    env.Append (CCFLAGS = '-DIS_CLANG')
+    env.Append (CXXFLAGS = '-Wno-parentheses-equality')
+  else:
+    env = Environment()
+else:
+  env = Environment()
+
 #oracle_includes = os.environ["ORACLE_HOME"] + "/include"
 oracle_includes = "/usr/lib/oracle/12.1/client64/include"
         
@@ -42,7 +63,7 @@ libraries = []
 env.Append (CPPPATH = [source_include, usr_local_include, usr_include ])
 #env.Append (CCFLAGS = '-std=c++0x')
 # C++11 support:
-#env.Append (CXXFLAGS = '-std=c++11')
+env.Append (CXXFLAGS = '-std=c++11')
 
 env.Append (LIBS = [''])
 # scons -Q release=1
@@ -52,7 +73,7 @@ if int(release):
   env.Append (VARIANT = variant)
 else:
   variant='debug'
-  env.Append (CCFLAGS = '-g -O0 -D_DEBUG')
+  env.Append (CCFLAGS = '-g -O0')
   env.Append (LIBPATH = os.path.join (current_directory, variant))
   env.Append (VARIANT = variant)
 
@@ -67,6 +88,29 @@ for source in sources:
 
 env.Default (libraries)
 
+#
+## Run 'scons dynamic' to compile dynamic libraries
+#
+dynamic_list = []
+dynamic = os.path.join (current_directory, "dynamic")
+# Find SConstruct files:
+dynamics=[os.path.join(r,f) for r,d,fs in os.walk(dynamic) for f in fs if f.endswith('SConstruct')]
+for dynamic in dynamics:
+  ss = str (dynamic)
+  bn_ss = os.path.basename(ss)
+  if (bn_ss == "SConstruct"):
+    dynamic_program = SConscript (ss, exports='env')
+    if dynamic_program:
+      dynamic_list.extend (dynamic_program)
+      print dynamic_program [0]
+
+#Depends (dynamic_list, compile_library)
+   
+# In order to remove dynamics objects with 'scons -c' we need to default them at built ('scons') procedure:
+env.Default (dynamic_list)
+#env.Alias ('dynamic', dynamic_list)
+
+
 #
 ## Run 'scons example' to compile examples
 #
@@ -89,10 +133,10 @@ for example in examples:
 env.Default (example_list)
 #env.Alias ('example', example_list)
 
-
 #
 # Run 'scons test' to compile unit-tests
 #
+test_unit_result = None
 test_unit_list = []
 run_tests = []
 
@@ -124,26 +168,35 @@ env.Default (test_unit_list)
 #  only modified files:
 env.Alias('doc', env.Command('doc.dummy', [], 'cd docs/doxygen; doxygen'))
 
+# Installation aliases:
 #
-# Run 'sudo scons install' to install the suite:
-#
-#       'sudo scons install-include' for only headers
-#       'sudo scons install-lib'     for only libraries
-#       'sudo scons install-bin'     for only binaries
+#       'sudo scons install-include'         for only headers
+#       'sudo scons install-lib'             for only libraries
+#       'sudo scons install-include-and-lib' for headers & libraries
+#       'sudo scons install-example'         for only example binaries/resources
+#       'sudo scons install'                 to install the whole suite
 #
 # Run 'sudo scons uninstall' to uninstall the suite
 #
 # See http://www.scons.org/wiki/InstallTargets and http://www.scons.org/doc/production/HTML/scons-user/c2938.html
 install_include = env.Install (target_usr_local_include, Glob("include/anna/*"))
 install_lib =     env.Install (target_usr_local_lib, Glob("source/*/" + variant + "/*.a"))
+install_dynlib =  env.Install (target_usr_local_lib, Glob("dynamic/launcher/default/" + variant + "/*.so"))
 install_example = env.Install (target_opt_bin, Glob("example/*/*/" + variant + "/example_*"))
-#Default ('install')
-Depends (install_include, test_unit_result)
-Depends (install_lib, test_unit_result)
-Depends (install_example, test_unit_result)
+postinstall_example = env.Command('./example/postinstall.out', None, './example/postinstall.sh')
 
+#Default ('install')
+if test_unit_result:
+  Depends (install_include, test_unit_result)
+  Depends (install_lib, test_unit_result)
+  Depends (install_dynlib, test_unit_result)
+  Depends (install_example, test_unit_result)
+
+ii  = env.Alias('install-include', [target_usr_local_include])
+il  = env.Alias('install-lib',     [target_usr_local_lib])
+idl = env.Alias('install-dynlib',  [target_usr_local_lib])
 iil = env.Alias('install-include-and-lib', [target_usr_local_include, target_usr_local_lib])
-iex = env.Alias('install-example', target_opt_bin)
+iex = env.Alias('install-example', [target_opt_bin, postinstall_example])
 env.Alias('install', [iil, iex])
 
 env.Command ("uninstall", None, [ Delete(target_usr_local_include), Delete(target_usr_local_lib), Delete(target_opt_bin) ])