Fix and clean up libcoap build 13/26213/2
authorMats Wichmann <mats@linux.com>
Fri, 6 Jul 2018 13:27:51 +0000 (07:27 -0600)
committerMats Wichmann <mats@linux.com>
Fri, 6 Jul 2018 14:09:20 +0000 (08:09 -0600)
Most signficant change: when upstream libcoap is used (always true for
Windows), do "git checkout" even if the desired tag is already in the
repo, this should fix the case where the checkout is not up to date but
the repo is, so no checkout is done.

Minor changes:

* The forked-coap case is moved to the top of if clauses for readability
  (before there might have been dozens of lines, then else: followed by
  two lines)
* A bug where PREFIX rather than LIBPREFIX was fetched from the
  construction environment is fixed.
* One of the config file names was simplified a bit.
* The Glob call to determine source files to build is now wrapped in a
  try block, the current Tizen SCons is so old it does not support the
  "exclude" attribute.
* A check for the Tizen case ("don't use git commands in sconscript")
  is added.
* Comment updates

Change-Id: Icec0d1a9c5cbf20f0adbc32745486333766234e7
Signed-off-by: Mats Wichmann <mats@linux.com>
extlibs/libcoap/SConscript

index 5e6796a..dcd3036 100644 (file)
@@ -41,14 +41,19 @@ libcoap_repo_url = 'https://github.com/dthaler/libcoap'
 #libcoap_repo_url    = 'https://github.com/obgm/libcoap'
 
 ######################################################################
-# Check for, and download or possibly update libcoap from git
+# Check for, and possibly update libcoap from git
 ######################################################################
 # The libcoap tag here must match the one in extlibs/libcoap/prep.sh.
 libcoap_version = 'IoTivity-1.4'
 libcoap_dir = os.path.join(src_dir, 'extlibs', 'libcoap', 'libcoap')
+
+# git commands
 libcoap_checkout_cmd = 'git clone ' + libcoap_repo_url + '.git extlibs/libcoap/libcoap -b ' + libcoap_version
 libcoap_update_cmd = 'git fetch --tags && git checkout -f ' + libcoap_version
+libcoap_tag_cmd = 'git tag -l ' + libcoap_version
+libcoap_sync_cmd = 'git checkout -f ' + libcoap_version
 libcoap_chdir_cmd = 'cd ' + libcoap_dir
+
 # define msg strings here so code sequence is readable
 err_nocoap = '''
 *********************************** Error: ************************************
@@ -56,16 +61,19 @@ err_nocoap = '''
 *     $ %s
 *******************************************************************************
 ''' % libcoap_checkout_cmd
+
 info_oldcoap = '''
 ******************************* Info: *****************************************
 * Your libCoAP repo is not up to date with the latest version we require (%s).
 *******************************************************************************
 ''' % libcoap_version
+
 info_updatingcoap = '''
 ******************************* Info: *****************************************
 * Automatically updating libcoap to version %s.
 *******************************************************************************
 ''' % libcoap_version
+
 info_updatecoap = '''
 ******************************* Info: *****************************************
 * Please update using the following commands:
@@ -73,6 +81,7 @@ info_updatecoap = '''
 *   %s
 *******************************************************************************
 ''' % (libcoap_chdir_cmd, libcoap_update_cmd)
+
 info_forkedcoap = '''
 ******************************* Info: *****************************************
 * Using FORKED copy of libCoap located in:
@@ -80,37 +89,42 @@ info_forkedcoap = '''
 *******************************************************************************
 '''
 
-if with_upstream_libcoap == '1'  and os.path.exists(libcoap_dir + '/.git/HEAD'):
-    # If using the github libcoap, check for correctness here
-    # Right now this script assumes the revision is a tag; not a branch or
+if with_upstream_libcoap == '0':
+    print(info_forkedcoap)
+else:
+    # If using the github libcoap, check for correct version
+    # Right now this script assumes the revision is a tag, not a branch or
     # an arbitrary commit. If this changes, update the check below, or else
     # the script will always conclude the repo is not up to date because a tag
     # with that name does not exist.
-    # Tizen uses its own process to prepare the libcoap repo in gbsbuild.sh
-    # and cannot use git during the build.  That process removes .git, 
-    # so we can safely proceed if it is present.
-    print('*** Checking for installation of libCoAP ***')
+    print('*** Checking for installation of libCoAP %s ***' % libcoap_version)
     if not os.path.exists(libcoap_dir):
         Exit(err_nocoap)
 
-    os.chdir(libcoap_dir)
-    out = subprocess.check_output('git tag -l ' + libcoap_version, shell=True).rstrip()
-
-    if libcoap_version not in SCons.Util.to_String(out):
-        print(info_oldcoap)
-        if libcoap_env.get('AUTOMATIC_UPDATE'):
-            print(info_updatingcoap)
-            try:
-                retcode = subprocess.call(libcoap_update_cmd, shell=True)
-                if retcode:
-                    Exit("libcoap: sync failed: " + str(retcode))
-            except OSError as e:
-                Exit("libcoap: execution failed: " + e)
-        else:
-            Exit(info_updatecoap)
-
-else:
-    print(info_forkedcoap)
+    # Tizen uses its own process to prepare the libcoap repo in gbsbuild.sh
+    # and cannot use git during the build. That process removes .git.
+    # Do the git checks only if .git is present.
+    if os.path.exists(libcoap_dir + '/.git/HEAD'):
+        start_dir = os.getcwd()
+        os.chdir(libcoap_dir)
+        out = subprocess.check_output(libcoap_tag_cmd, shell=True).rstrip()
+        if libcoap_version not in SCons.Util.to_String(out):
+            print(info_oldcoap)
+            if libcoap_env.get('AUTOMATIC_UPDATE'):
+                print(info_updatingcoap)
+                try:
+                    retcode = subprocess.call(libcoap_update_cmd, shell=True)
+                    if retcode:
+                        Exit("libcoap: update failed: " + str(retcode))
+                except OSError as e:
+                    Exit("libcoap: execution failed: " + e)
+            else:
+                Exit(info_updatecoap)
+        # to be pedantic, always checkout to the tag
+        retcode = subprocess.call(libcoap_sync_cmd, shell=True)
+        if retcode:
+            Exit("libcoap: checkout failed: " + str(retcode))
+        os.chdir(start_dir)
 
 ######################################################################
 # Build libCoAP
@@ -152,21 +166,22 @@ if env['CC'] == 'cl':
 ######################################################################
 # Source files and Target(s)
 ######################################################################
-config_h_file_path = os.path.join(src_dir, 'extlibs', 'libcoap', 'libcoap', 'include', 'coap', 'coap_config.h')
-if with_upstream_libcoap == '1':
+if with_upstream_libcoap == '0':
+    # For bring up purposes only, the forked version will live here.
+    libcoap_src_root = '#/resource/csdk/connectivity/lib/libcoap-4.1.1/'
+    libcoap_src = Glob(libcoap_src_root + '*.c')
+else:
+    # We need to generate a pair of headers to describe our config
+    coap_h_pc_file = os.path.join(libcoap_dir, 'include', 'coap', 'coap.h.in')
+    config_h_file = os.path.join(libcoap_dir, 'include', 'coap', 'coap_config.h')
     libcoap_env.PrependUnique(CPPPATH=['libcoap/include/coap'])
     libcoap_env.AppendUnique(CPPDEFINES=['WITH_UPSTREAM_LIBCOAP'])
-    libcoap_src_root = os.path.join(libcoap_dir, 'src')
-
-    # We need to generate coap.h from coap.h.in
-    coap_h_pc_file = os.path.join(libcoap_dir, 'include', 'coap', 'coap.h.in')
-    coap_h_output = os.path.join(libcoap_dir, 'include', 'coap', 'coap.h')
 
     # Generate coap_config.h
     target_arch = env.get('TARGET_ARCH')
-    lib_prefix = '' + str(libcoap_env.get('PREFIX'))
+    lib_prefix = '' + str(libcoap_env.get('LIBPREFIX'))
 
-    if not os.path.isfile(config_h_file_path) and env.GetOption not in ('clean', 'help'):
+    if not os.path.isfile(config_h_file) and env.GetOption not in ('clean', 'help'):
         conf = Configure(libcoap_env.Clone(LIBS=[]))
 
         config_h_header = '''
@@ -288,20 +303,15 @@ if with_upstream_libcoap == '1':
 
             conf.Finish()
 
-        # Generate the file
-        if os.path.exists(config_h_file_path):
-            os.remove(config_h_file_path)
-        with open(config_h_file_path, "w") as config_h_file:
-            config_h_file.write(config_h_header + config_h_body + config_h_footer)
+        with open(config_h_file, "w") as configfile:
+            configfile.write(config_h_header + config_h_body + config_h_footer)
 
     # Sanity check to ensure that the above block created the file.
-    if not os.path.exists(config_h_file_path) and not env.GetOption('clean'):
+    if not os.path.exists(config_h_file) and not env.GetOption('clean'):
         msg = "Error: coap_config.h file not created!"
         Exit(msg)
 
-    # We also need to generate coap.h from coap.h.in
-    coap_h_pc_file = os.path.join(libcoap_dir, 'include', 'coap', 'coap.h.in')
-    # substitution table:
+    # Generate coap.h from coap.h.in by substitution
     pc_vars = {
         '@PACKAGE_NAME@': lib_prefix + 'coap',
         '@PACKAGE_STRING@': lib_prefix + 'coap-' + libcoap_version,
@@ -311,15 +321,15 @@ if with_upstream_libcoap == '1':
     }
     libcoap_env.Substfile(coap_h_pc_file, SUBST_DICT=pc_vars)
 
-    # redefine root to be relative to current dir for Glob check
     libcoap_src_root = 'libcoap/src/'
-    libcoap_src = Glob(libcoap_src_root + '*.c',
-                       exclude=libcoap_src_root + 'coap_io_lwip.c')
-else:
-    # For bring up purposes only, the forked version will live here.
-    libcoap_src_root = '#/resource/csdk/connectivity/lib/libcoap-4.1.1/'
-    libcoap_src = Glob(libcoap_src_root + '*.c')
-
+    try:
+        libcoap_src = Glob(libcoap_src_root + '*.c',
+                           exclude=libcoap_src_root + 'coap_io_lwip.c')
+    except TypeError:   # very old SCons doesn't have 'exclude' in Glob
+        libcoap_src = Glob(libcoap_src_root + '*.c')
+        libcoap_src = [src for src in libcoap_src if 'coap_io_lwip.c' not in src.path]
+
+# finally ready to build:
 libcoap = libcoap_env.StaticLibrary('coap', libcoap_src, OBJPREFIX='libcoap_')
 
 # set for use by other scripts:
@@ -328,6 +338,5 @@ if with_upstream_libcoap == '1':
 else:
     env.AppendUnique(LIBCOAP_INC='#/resource/csdk/connectivity/lib/libcoap-4.1.1/include')
 
-Clean(libcoap, config_h_file_path)
 libcoap_env.InstallTarget([libcoap], 'coap')
 libcoap_env.UserInstallTargetLib(libcoap)