device-dependent library updates for Yocto
[keystone-rtos/fault_mgmt.git] / build / buildlib.xs
index d6d3811864ea4c0f8926c127b7a2fb67fde2412c..f16e174e30e3af94cad0606300474bbf2aac659f 100644 (file)
@@ -78,6 +78,7 @@ function listAllFiles(ext, dir, recurse)
     return null;
 }
 
+
 function createMake(makefile)
 {
     /* Create the main make file */
@@ -109,8 +110,6 @@ function createMake(makefile)
 
       var file = xdc.module('xdc.services.io.File');
     
-      var xdcTargetType = java.lang.System.getenv("XDCTARGET");
-      var toolsBaseDir = java.lang.System.getenv("XDCCGROOT");   
       
       makefile.writeLine("\n# Output for prebuilt generated libraries");
       makefile.writeLine("export LIBDIR ?= ./lib");
@@ -193,13 +192,9 @@ function createMake(makefile)
       makefile.writeLine(".libraries:");
       
       makefile.writeLine("\n# Clean Rule");          
-      makefile.writeLine("clean:: clean_package");          
-      makefile.writeLine("# Clean Top Level Object Directory ");  
-      makefile.writeLine("clean_package:")
-      for each (var libdir in devices)
-      {         
-        makefile.writeLine("\t$(RMDIR) $(LIBDIR)/"+libdir.toString()+"/*/");  
-      }    
+      makefile.writeLine("clean:: clean_package");                  
+      makefile.writeLine("# Clean Top Level Object Directory ");          
+      makefile.writeLine("clean_package :\n\t$(RMDIR) $(LIBDIR)/*/");  
       makefile.writeLine("\t$(RMDIR) package/cfg");            
    }
    else
@@ -220,25 +215,50 @@ function createMake(makefile)
 function createLibMake(device, makelibname,targetname, objectPath)
 {
    var tooldir;
+   var cmdprefix;
+   var targetDir;
    var stringname=String(targetname).replace("(xdc.bld.ITarget.Module)","");
-   if(stringname.match("ARM11"))
-   {
-     tooldir="TI_ARM11_GEN_INSTALL_PATH"; 
-   }
-   else
-   {
-     tooldir="C6X_GEN_INSTALL_PATH";
-   }
+   
    switch(stringname)
    {
     case String(C66LE):
+      tooldir="C6X_GEN_INSTALL_PATH";
+      cmdprefix="";
+      targetDir="c66";
       targetname=C66LE;
       break;
     case String(C66BE):
+      tooldir="C6X_GEN_INSTALL_PATH";
+      cmdprefix="";
+      targetDir="c66";
       targetname=C66BE;
       break;
-
+    case String(A15LE):
+      tooldir="TOOLCHAIN_PATH_A15"; 
+      cmdprefix="CROSS_TOOL_PRFX";
+      targetDir="armv7";
+      targetname=A15LE;
+      break;
+    case String(A9LE):
+      tooldir="TOOLCHAIN_PATH_A9";
+      cmdprefix="CROSS_TOOL_PRFX";
+      targetDir="armv7";
+      targetname=A9LE;
+      break;
+    case String(A8LE):
+      tooldir="TOOLCHAIN_PATH_A8";
+      cmdprefix="CROSS_TOOL_PRFX";
+      targetDir="armv7";
+      targetname=A8LE;
+      break;
+    case String(M4LE):
+      tooldir="TOOLCHAIN_PATH_M4";
+      cmdprefix="";
+      targetDir="m4";
+      targetname=M4LE;
+      break;
    }
+
     var fileModule = xdc.module('xdc.services.io.File');
     try{
      var dstFile = new java.io.File(makelibname);
@@ -267,45 +287,82 @@ function createLibMake(device, makelibname,targetname, objectPath)
     libmakefile.writeLine("empty =");
     libmakefile.writeLine("space =$(empty) $(empty)");
          
-    if(stringname.match("ti.targets"))
+    if ((targetname.name == "A15F") || (targetname.name == "A9F") || (targetname.name == "A8F"))
     {
+    
+        if(stringname.match("gnu.targets"))
+        {
+            libmakefile.writeLine("CC = $("+tooldir+")/bin/$("+cmdprefix+")gcc");
+            libmakefile.writeLine("AC = $("+tooldir+")/bin/$("+cmdprefix+")as");    
+            libmakefile.writeLine("ARIN = $("+tooldir+")/bin/$("+cmdprefix+")ar");    
+            libmakefile.writeLine("LD = $("+tooldir+")/bin/$("+cmdprefix+")gcc");   
+        }
+        else
+        {
+            print("Error: Non-GNU targets are not currently supported ");
+            java.lang.System.exit(1);
 
-       var rtslibtemp = targetname.lnkOpts.suffix.toString().split("/");
-       var rtslib;
-       for(n=0;n<rtslibtemp.length;n++)
-       {
-          if(rtslibtemp[n].match(".lib"))
-          { 
-             rtslib=rtslibtemp[n];
-          }
-       }
-
-      libmakefile.writeLine("CC = $("+tooldir+")/bin/"+targetname.cc.cmd +" "+targetname.ccOpts.prefix+" "+targetname.cc.opts);
-      libmakefile.writeLine("AC = $("+tooldir+")/bin/"+targetname.asm.cmd +" "+targetname.asmOpts.prefix+" "+targetname.asm.opts);    
-      libmakefile.writeLine("ARIN = $("+tooldir+")/bin/"+targetname.ar.cmd +" "+targetname.ar.opts);    
-      libmakefile.writeLine("LD = $("+tooldir+")/bin/"+targetname.lnk.cmd +" "+targetname.lnk.opts);   
-      libmakefile.writeLine("RTSLIB = -l $("+tooldir+")/lib/"+rtslib);        
+        }
+       
+        libmakefile.writeLine("INCS = -I. -I$(strip $(subst ;, -I,$(subst $(space),\\$(space),$(INCDIR)))) -I$("+tooldir+")/include");
+        libmakefile.writeLine("OBJEXT = o"+targetname.suffix); 
+        libmakefile.writeLine("AOBJEXT = s"+targetname.suffix);     
+        libmakefile.writeLine("CFLAGS_INTERNAL = " +targetname.ccOpts.prefix+" "+targetname.cc.opts);
+        libmakefile.writeLine("ASFLAGS_INTERNAL = " +targetname.asmOpts.prefix+" "+targetname.asm.opts);
+        libmakefile.writeLine("ARFLAGS_INTERNAL = " +targetname.ar.opts);
+        libmakefile.writeLine("LNKFLAGS_INTERNAL = " +targetname.lnk.opts);
+        libmakefile.writeLine("INTERNALDEFS = -MD -MF $@.dep");
+        libmakefile.writeLine("INTERNALLINKDEFS = -o $@ -m $@.map");  /* TBD */
+        libmakefile.writeLine("OBJDIR =  $(LIBDIR)/" + device.toString() + "/" + targetDir +"/obj"); 
+    
     }
     else
     {
-      print("Error: Non-TI targets are not currently supported ");
-      java.lang.System.exit(1);
+  
+        if(stringname.match("ti.targets"))
+        {
 
-    }
+            var rtslibtemp = targetname.lnkOpts.suffix.toString().split("/");
+            var rtslib;
+            for(n=0;n<rtslibtemp.length;n++)
+            {
+                if(rtslibtemp[n].match(".lib"))
+                { 
+                    rtslib=rtslibtemp[n];
+                }
+            }
+
+            libmakefile.writeLine("CC = $("+tooldir+")/bin/"+targetname.cc.cmd);
+            libmakefile.writeLine("AC = $("+tooldir+")/bin/"+targetname.asm.cmd);    
+            libmakefile.writeLine("ARIN = $("+tooldir+")/bin/"+targetname.ar.cmd);    
+            libmakefile.writeLine("LD = $("+tooldir+")/bin/"+targetname.lnk.cmd);   
+            libmakefile.writeLine("RTSLIB = -l $("+tooldir+")/lib/"+rtslib);        
+        }
+        else
+        {
+            print("Error: Non-TI targets are not currently supported ");
+            java.lang.System.exit(1);
+
+        }
        
-    libmakefile.writeLine("INCS = -I. -I$(strip $(subst ;, -I,$(subst $(space),\\$(space),$(INCDIR))))");
-    libmakefile.writeLine("OBJEXT = o"+targetname.suffix); 
-    libmakefile.writeLine("AOBJEXT = s"+targetname.suffix);     
-    /* libmakefile.writeLine("INTERNALDEFS = -D"+stringname.replace(/\./g,"_")+" -Dxdc_target_types__=ti/targets/std.h -DMAKEFILE_BUILD -eo.$(OBJEXT) -ea.$(AOBJEXT) -fr=$(@D) -fs=$(@D) -ppa -ppd=$@.dep");*/
-    libmakefile.writeLine("INTERNALDEFS = -D"+stringname.replace(/\./g,"_")+"  -DMAKEFILE_BUILD -eo.$(OBJEXT) -ea.$(AOBJEXT) -fr=$(@D) -fs=$(@D) -ppa -ppd=$@.dep");
-    libmakefile.writeLine("INTERNALLINKDEFS = -o $@ -m $@.map");
-    libmakefile.writeLine("OBJDIR = $(LIBDIR)/" + device.toString() + "/obj");
+        libmakefile.writeLine("INCS = -I. -I$(strip $(subst ;, -I,$(subst $(space),\\$(space),$(INCDIR)))) -I$("+tooldir+")/include");
+        libmakefile.writeLine("OBJEXT = o"+targetname.suffix); 
+        libmakefile.writeLine("AOBJEXT = s"+targetname.suffix);     
+        libmakefile.writeLine("CFLAGS_INTERNAL = " +targetname.ccOpts.prefix+" "+targetname.cc.opts);
+        libmakefile.writeLine("ASFLAGS_INTERNAL = " +targetname.asmOpts.prefix+" "+targetname.asm.opts);
+        libmakefile.writeLine("ARFLAGS_INTERNAL = " +targetname.ar.opts);
+        libmakefile.writeLine("LNKFLAGS_INTERNAL = " +targetname.lnk.opts);
+        /* libmakefile.writeLine("INTERNALDEFS = -D"+stringname.replace(/\./g,"_")+" -Dxdc_target_types__=ti/targets/std.h -DMAKEFILE_BUILD -eo.$(OBJEXT) -ea.$(AOBJEXT) -fr=$(@D) -fs=$(@D) -ppa -ppd=$@.dep");*/
+        libmakefile.writeLine("INTERNALDEFS = -D"+stringname.replace(/\./g,"_")+"  -DMAKEFILE_BUILD -eo.$(OBJEXT) -ea.$(AOBJEXT) -fr=$(@D) -fs=$(@D) -ppa -ppd=$@.dep");
+        libmakefile.writeLine("INTERNALLINKDEFS = -o $@ -m $@.map");
+        libmakefile.writeLine("OBJDIR =  $(LIBDIR)/" + device.toString() + "/" + targetDir +"/obj"); 
+    }     
    
   return libmakefile;
+ return libmakefile;
 
 }
 
-function makeAddObjects(srcString, makefilename, srcfiles, flags,fileExt, targetName)
+function makeAddObjects(srcString, makefilename, srcfiles, flags,fileExt, targetName, objDir)
 {
   var  sourcestring = (srcString + fileExt).toString().toUpperCase();
   var  compileflagstring = sourcestring + "FLAGS";
@@ -340,8 +397,8 @@ function makeAddObjects(srcString, makefilename, srcfiles, flags,fileExt, target
  makefilename.writeLine(compileflagstring+" = "+compileflags +" \n");     
  makefilename.writeLine("# Make Rule for the "+srcString+" Files");  
  
- makefilename.writeLine(objectliststring +" = $(patsubst %."+fileExt+", $(OBJDIR)/%.$(OBJEXT), $(" + sourcestring + "))"); 
- makefilename.writeLine("\n$("+objectliststring+"): $(OBJDIR)/%.$(OBJEXT): %."+fileExt);   
+ makefilename.writeLine(objectliststring +" = $(patsubst %."+fileExt+", "+objDir+"/%.$(OBJEXT), $(" + sourcestring + "))"); 
+ makefilename.writeLine("\n$("+objectliststring+"): "+objDir+"/%.$(OBJEXT): %."+fileExt);   
  if(fileExt == "c")
  { 
    makefilename.writeLine("\t-@echo cl"+targetName.suffix +" $< ...");     
@@ -354,21 +411,33 @@ function makeAddObjects(srcString, makefilename, srcfiles, flags,fileExt, target
  
  if(fileExt == "c")
  {
-   makefilename.writeLine("\t$(RM) $@.dep");
-   makefilename.writeLine("\t$(CC) $("+compileflagstring+") $(INTERNALDEFS) $(INCS) -fc $< ");
-   makefilename.writeLine("\t-@$(CP) $@.dep $@.pp; \\");
-   makefilename.writeLine("         $(SED) -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\\\$$//' \\");
-   makefilename.writeLine("             -e '/^$$/ d' -e 's/$$/ :/' < $@.pp >> $@.dep; \\");
-   makefilename.writeLine("         $(RM) $@.pp ");
+   if ((targetName.name == "A15F") || (targetName.name == "A9F") || (targetName.name == "A8F"))
+   {
+    makefilename.writeLine("\t$(RM) $@.dep");
+    makefilename.writeLine("\t$(CC) $(CFLAGS_INTERNAL) $("+compileflagstring+") $(INTERNALDEFS) $(INCS) $< -o $@");
+   /* 
+    TBD
+   */
+   }
+   else
+   {
+    makefilename.writeLine("\t$(RM) $@.dep");
+    makefilename.writeLine("\t$(CC) $(CFLAGS_INTERNAL) $("+compileflagstring+") $(INTERNALDEFS) $(INCS) -fc $< ");
+    makefilename.writeLine("\t-@$(CP) $@.dep $@.pp; \\");
+    makefilename.writeLine("         $(SED) -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\\\$$//' \\");
+    makefilename.writeLine("             -e '/^$$/ d' -e 's/$$/ :/' < $@.pp >> $@.dep; \\");
+    makefilename.writeLine("         $(RM) $@.pp ");
+   }
  }
  else if(fileExt == "asm")
  {
-   makefilename.writeLine("\t$(AC) $("+compileflagstring+") $(INTERNALDEFS) $(INCS) -fa $< ");
+   makefilename.writeLine("\t$(AC) $(ASFLAGS_INTERNAL) $("+compileflagstring+") $(INTERNALDEFS) $(INCS) -fa $< ");
  }
  else if(fileExt == "sa")
  {
-   makefilename.writeLine("\t$(AC) $("+compileflagstring+") $(INTERNALDEFS) $(INCS) $< ");
+   makefilename.writeLine("\t$(AC) $(ASFLAGS_INTERNAL) $("+compileflagstring+") $(INTERNALDEFS) $(INCS) $< ");
  }
    makefilename.writeLine("\n#Create Empty rule for dependency");
    makefilename.writeLine("$("+objectliststring+"):"+makefilename.$private.fd);
    makefilename.writeLine(makefilename.$private.fd+":");
@@ -386,11 +455,50 @@ function makeAddObjects(srcString, makefilename, srcfiles, flags,fileExt, target
  *  Utility function which will build a specific library
  **************************************************************************/
 var makefilelocal;
-function buildLibrary (device, libOptions, libName, target, libFiles) 
+
+function buildLibrary (socName, isSoc, libOptions, libName, target, libFiles) 
 {
-    var lldFullLibraryPath = "./lib/" + device.toString() + "/" + libName;
-    var lldFullBuildPath = "./build/" + device.toString() + "/" + libName;
-    var lldFullLibraryPathMake = "$(LIBDIR)/" + device.toString() + "/" + libName;
+    var targetDir;
+    var objExtDir;
+    
+
+    if (target.name == "A15F")
+    {
+        targetDir = "armv7";
+    }
+    else if (target.name == "A9F")
+    {
+        targetDir = "armv7";
+    }
+    else if (target.name == "A8F")
+
+    {
+        targetDir = "armv7";
+    }
+    else if (target.name == "M4")
+    {
+        targetDir = "m4";
+    }
+    else
+    {
+        targetDir = "c66";
+    }
+    
+    /* Derive the operating system and soc names */
+    if (isSoc == "true") {
+        var libNameExp = libName+"."+socName;
+        targetDir = socName+"/"+targetDir;
+        objExtDir = "soc";
+    }
+    else  {
+        var libNameExp = libName;
+        objExtDir = "all";
+    }
+
+
+    var lldFullLibraryPath = "./lib/" + targetDir +"/" + libNameExp;
+    var lldFullBuildPath = "./build/" + targetDir +"/" + libNameExp;
+    var lldFullLibraryPathMake = "$(LIBDIR)/" + targetDir +"/" + libNameExp;
 
     /* Create Main make file in the root of package folder */
     makefilelocal = createMake(makefilelocal);
@@ -404,7 +512,7 @@ function buildLibrary (device, libOptions, libName, target, libFiles)
     makefilelocal.writeLine(libMake+": FORCE\n\t$(MAKE) -f "+lib+".mk $@");                                 
 
     /* Create Library make file in the lib folder */
-    var makefilelib= createLibMake(device, lib+".mk",target,objectPath);  
+    var makefilelib= createLibMake(socName, lib+".mk",target,objectPath);  
 
     /* Rule to clean library in main makefile */
     makefilelocal.writeLine("# Rule to clean "+libMake+" library");                                              
@@ -441,27 +549,26 @@ function buildLibrary (device, libOptions, libName, target, libFiles)
      }
     if(cfiles.length > 0)
     {                                                
-      makeAddObjects("COMMONSRC",makefilelib,cfiles,libOptions,"c",target);
+      makeAddObjects("COMMONSRC",makefilelib,cfiles,libOptions,"c",target, "$(OBJDIR)");
       librule += " $(COMMONSRCCOBJS)";                   
     }
     if(afiles.length > 0)
     {                                                
-      makeAddObjects("COMMONSRC",makefilelib,afiles,libOptions,"asm",target);
+      makeAddObjects("COMMONSRC",makefilelib,afiles,libOptions,"asm",target, "$(OBJDIR)");
       librule += " $(COMMONSRCASMOBJS)";                   
     }
     if(safiles.length > 0)
     {                                                
-      makeAddObjects("COMMONSRC",makefilelib,safiles,libOptions,"sa",target);
+      makeAddObjects("COMMONSRC",makefilelib,safiles,libOptions,"sa",target, "$(OBJDIR)");
       librule += " $(COMMONSRCSAOBJS)";                   
     }
 
     makefilelib.writeLine(librule);
     makefilelib.writeLine("\t@echo archiving $? into $@ ...");
-    makefilelib.writeLine("\tif [ ! -d $(LIBDIR)/" + device.toString() + " ]; then $(MKDIR) $(LIBDIR)/" + device.toString() + " ; fi;"); 
-               makefilelib.writeLine("\t$(ARIN) $@ $?");
-               makefilelib.close();   
+    makefilelib.writeLine("\tif [ ! -d $(LIBDIR)/" + targetDir + " ]; then $(MKDIR) $(LIBDIR)/" + targetDir + " ; fi;"); 
+    makefilelib.writeLine("\t$(ARIN) $(ARFLAGS_INTERNAL) $@ $?");
+    makefilelib.close();   
 
-    
     /* Create the Epilogue; which executes after all the builds are completed. 
      * This is used to generate the benchmark information for the built library. 
      * Also add the benchmarking information file to the package. */
@@ -472,59 +579,33 @@ function buildLibrary (device, libOptions, libName, target, libFiles)
     var tempFile = libFullName + ".xml";
     Pkg.makeEpilogue += ".libraries: " + libFullName +  "_size.txt\n";
     Pkg.makeEpilogue += libFullName +  "_size.txt: " + libFullName + "\n";
+    if ( java.lang.String(target.name).contains('66') )
+    {    
         Pkg.makeEpilogue += "\n\t $(C6X_GEN_INSTALL_PATH)/bin/ofd6x -x " + libFullName + " > " + tempFile;
         Pkg.makeEpilogue += "\n\t $(SECTTI) " + tempFile + " > " + libFullName +  "_size.txt";
         Pkg.makeEpilogue += "\n\t $(RM) " + tempFile + "\n\n";
+    }   
+    else if (target.name == "M4")
+    {
+        Pkg.makeEpilogue += "\n\t $(TOOLCHAIN_PATH_M4)/bin/armofd -x " + libFullName + " > " + tempFile;
+        Pkg.makeEpilogue += "\n\t $(SECTTI) " + tempFile + " > " + libFullName +  "_size.txt";
+        Pkg.makeEpilogue += "\n\t $(RM) " + tempFile + "\n\n";
+    }
+    else
+    {
+        Pkg.makeEpilogue += "\n\t $(TOOLCHAIN_PATH_A15)/bin/$(CROSS_TOOL_PRFX)size " + libFullName + " > " + libFullName + "_size.txt";
+    }                
     Pkg.otherFiles[Pkg.otherFiles.length++] = lldFullLibraryPath + ".a" + target.suffix + "_size.txt";
-    Pkg.otherFiles[Pkg.otherFiles.length++] = lldFullLibraryPath + ".a" + target.suffix + ".mk";
+    Pkg.otherFiles[Pkg.otherFiles.length++] = lldFullBuildPath + ".a" + target.suffix + ".mk";
+    Pkg.otherFiles[Pkg.otherFiles.length++] = lldFullLibraryPath + ".a" + target.suffix;
 
     /* We need to clean after ourselves; extend the 'clean' target to take care of this. */
-    Pkg.makeEpilogue += "clean::\n\t";
-    Pkg.makeEpilogue += "$(RM) " + lldFullLibraryPath + ".a" + target.suffix + "_size.txt\n\n";
+    Pkg.makeEpilogue += "\nclean::\n";
+    Pkg.makeEpilogue += "\t$(RM) " + lldFullBuildPath + ".a" + target.suffix + "_size.txt\n";    
+    Pkg.makeEpilogue += "\t$(RMDIR) " + "$(LIBDIR)/" + targetDir + "/ \n\n";
 
     return lib;
 }
 
-/**************************************************************************
- * FUNCTION NAME : createMiniPkg
- **************************************************************************
- * DESCRIPTION   :
- *  The function is responsible for creating the mini tar package
- *  The MINI package has the following files:- 
- *      - Driver Source Files. 
- *      - Header files (exported and internal driver files) 
- *      - Simple Makefiles. 
- **************************************************************************/
-function createMiniPkg(pkgName)
-{
-    /* Get the package Name. */
-    var packageRepository = xdc.getPackageRepository(Pkg.name);
-    var packageBase       = xdc.getPackageBase(Pkg.name);
-    var packageName       = packageBase.substring(packageRepository.length + 1);
-
-    /* Convert the Package name by replacing back slashes with forward slashes. This is required because
-     * otherwise with long names the tar is unable to change directory. */
-    var newPkgName = new java.lang.String(packageRepository);
-    var newPkgRep  = newPkgName.replace('\\', '/');
-
-    /* Step1: Create the MINI Package and add the simple Big and Little Endian Makefiles to the package */
-    Pkg.makeEpilogue += "release: mini_pkg\n";
-    Pkg.makeEpilogue += "mini_pkg:\n";
-    Pkg.makeEpilogue += "\t tar -C " + '"' + newPkgRep + '"' + " -cf packages/" + pkgName + "_mini.tar " +
-                        packageName + "simpleC66LE.mak " +
-                        packageName + "simpleC66BE.mak\n";
-
-    /* Step2: Add the exported header files to the package */
-    var includeFiles = listAllFiles (".h", ".", false);
-    for (var k = 0 ; k < includeFiles.length; k++)
-        Pkg.makeEpilogue += "\t tar -C " + '"' + newPkgRep + '"' + " -rf packages/" + pkgName + "_mini.tar " + 
-                        packageName + includeFiles[k] + "\n";
-
-    /* Step3: Add the driver source files to the package; the filter should have generated a source listing */
-    Pkg.makeEpilogue += "\t tar -C " + '"' + newPkgRep + '"' + " -T src.lst -rf packages/" + pkgName + "_mini.tar " + "\n";
-
-    /* Ensure that we clean up the mini package */
-    Pkg.makeEpilogue += "clean::\n";
-    Pkg.makeEpilogue += "\t $(RM) packages/" + pkgName + "_mini.tar\n";
-}
+