rm: keystone 2: add A15 library build for Keystone II devices.
[keystone-rtos/rm-lld.git] / build / buildlib.xs
1 /******************************************************************************\r
2  * FILE PURPOSE: Build Library Utilities\r
3  ******************************************************************************\r
4  * FILE NAME: buildlib.xs\r
5  *\r
6  * DESCRIPTION: \r
7  *  This file contains common routines that are used by the various RM \r
8  *  components.\r
9  *\r
10  * Copyright (C) 2012-2015, Texas Instruments, Inc.\r
11  *****************************************************************************/\r
12 \r
13 /**************************************************************************\r
14  * FUNCTION NAME : listAllFiles\r
15  **************************************************************************\r
16  * DESCRIPTION   :\r
17  *  Utility function which lists all files with a specific extension \r
18  *  present in a directory and any directory inside it.\r
19  **************************************************************************/\r
20 function listAllFiles(ext, dir, recurse)\r
21 {     \r
22     var srcFile = [];\r
23     var d;\r
24 \r
25     /* If recurse parameter is not specified we default to recursive search. */\r
26     if (recurse == null)\r
27         recurse = true;\r
28 \r
29     if (dir == undefined) \r
30           d = ".";\r
31     else \r
32       d = dir;\r
33 \r
34     /* Get access to the current directory. */\r
35     var file = new java.io.File(d);\r
36 \r
37     /* Check if the file exists and it is a directory. */\r
38     if (file.exists() && file.isDirectory()) \r
39     {\r
40         /* Get a list of all files in the specific directory. */\r
41         var fileList = file.listFiles();\r
42         for (var i = 0; i < fileList.length; i++) \r
43         {\r
44             /* Dont add the generated directory 'package' and any of its files \r
45              * to the list here. */\r
46             if (fileList[i].getName().matches("package") == false)\r
47             {\r
48                 /* Check if the detected file is a directory */\r
49                 if (fileList[i].isDirectory())\r
50                 {\r
51                     /* We will recurse into the subdirectory only if required to do so. */\r
52                     if (recurse == true)\r
53                     {\r
54                         /* Generate the directory Name in which we will recurse. */ \r
55                         var directoryName = d + "/" + fileList[i].getName();\r
56 \r
57                         /* Get a list of all files in this directory */\r
58                         var fileListing = listAllFiles (ext, directoryName, recurse);\r
59                         if (fileListing != null)\r
60                         {\r
61                             /* Return a list of all file names in the directory. */\r
62                             for (var j = 0 ; j < fileListing.length; j++) \r
63                                 srcFile[srcFile.length++] = fileListing[j];\r
64                         }\r
65                     }\r
66                 }\r
67                 else\r
68                 {\r
69                     /* This was a file. Check if the file name matches the extension */\r
70                     if (fileList[i].getName().endsWith(ext) == true)\r
71                         srcFile[srcFile.length++] = d + "/" + fileList[i].getName();\r
72                 }\r
73             }\r
74         }\r
75 \r
76         return srcFile;\r
77     }\r
78     return null;\r
79 }\r
80 \r
81 \r
82 function createMake(makefile)\r
83 {\r
84     /* Create the main make file */\r
85     var fileModule = xdc.module('xdc.services.io.File');\r
86     if(makefile==undefined)\r
87     {\r
88       try{\r
89           makefile = fileModule.open("makefile", "w");\r
90          } catch (ex)\r
91          {\r
92            print("makefile cannot be written to. Please check Writing Permissions.");\r
93            java.lang.System.exit(1);\r
94          }   \r
95     \r
96       Pkg.makePrologue += "\ninclude makefile\n"; \r
97          \r
98       Pkg.makeEpilogue += "\nclean::\n\t-$(RM)  makefile\n";\r
99       makefile.writeLine("#*******************************************************************************");\r
100       makefile.writeLine("#* FILE PURPOSE: Top level makefile for Creating Component Libraries");\r
101       makefile.writeLine("#*******************************************************************************");\r
102       makefile.writeLine("#* FILE NAME: makefile");\r
103       makefile.writeLine("#*");\r
104       makefile.writeLine("#* DESCRIPTION: Defines Compiler tools paths, libraries , Build Options ");\r
105       makefile.writeLine("#*");\r
106       makefile.writeLine("#*");\r
107       makefile.writeLine("#*******************************************************************************");\r
108       makefile.writeLine("#*");\r
109       makefile.writeLine("# (Mandatory) Specify where various tools are installed.");\r
110 \r
111       var file = xdc.module('xdc.services.io.File');\r
112     \r
113       \r
114       makefile.writeLine("\n# Output for prebuilt generated libraries");\r
115       makefile.writeLine("export LIBDIR ?= ./lib");\r
116       /* use sectti.exe from path */\r
117       makefile.writeLine("export SECTTI ?= sectti");\r
118 \r
119       /* Create INCDIR from XDCPATH */\r
120     \r
121       /* copy the environment array from the current environment */\r
122       var env   = java.lang.System.getenv();\r
123       var getxdcpath=String(java.lang.System.getenv("XDCPATH"));\r
124       getxdcpath= getxdcpath.replace(/\\/g,"/");\r
125       var keys  = env.keySet().toArray();\r
126       var key;\r
127       var stat={};\r
128       var env_j=[];\r
129       var listxdcpath = new Array();\r
130       for (var i = 0; i < keys.length; i++) {\r
131            key = String(keys[i]);\r
132            if((key.match("INSTALL_PATH")) || (key.match("INSTALLDIR")))\r
133            {\r
134              var keyPath=String(env.get(key));\r
135              keyPath=keyPath.replace(/\\/g,"/");\r
136              var file = xdc.module('xdc.services.io.File');\r
137              keyPath=file.getDOSPath(keyPath);\r
138              if(getxdcpath.toString().match(keyPath))\r
139              {\r
140                  listxdcpath.push({keyname: key,keypath: keyPath});\r
141                  while(getxdcpath.toString().match(keyPath))\r
142                  {\r
143                    getxdcpath=getxdcpath.toString().replace(keyPath,"$("+key+")");\r
144                  }\r
145              }\r
146            }\r
147     \r
148      }\r
149        var pkgroot="..";\r
150        for (var i = Pkg.name.split('.').length; i > 1; i--) {\r
151               pkgroot+="/..";\r
152           }\r
153         \r
154       makefile.writeLine("\n# ROOT Directory");        \r
155       makefile.writeLine("export ROOTDIR := "+pkgroot);\r
156     \r
157       makefile.writeLine("\n# INCLUDE Directory");\r
158       makefile.writeLine("export INCDIR := "+getxdcpath+";$(ROOTDIR)");       \r
159     \r
160       makefile.writeLine("\n# Common Macros used in make");  \r
161       makefile.writeLine("\nifndef RM");     \r
162       makefile.writeLine("export RM = rm -f");\r
163       makefile.writeLine("endif");        \r
164     \r
165       makefile.writeLine("\nifndef CP");     \r
166       makefile.writeLine("export CP = cp -p");    \r
167       makefile.writeLine("endif");    \r
168         \r
169       makefile.writeLine("\nexport MKDIR = mkdir -p");\r
170     \r
171       makefile.writeLine("\nifndef RMDIR");         \r
172       makefile.writeLine("export RMDIR = rm -rf");\r
173       makefile.writeLine("endif");        \r
174     \r
175       makefile.writeLine("\nifndef SED"); \r
176       makefile.writeLine("export SED = sed");    \r
177       makefile.writeLine("endif");    \r
178     \r
179       makefile.writeLine("\nifndef MAKE"); \r
180       makefile.writeLine("export MAKE = make");    \r
181       makefile.writeLine("endif");        \r
182 \r
183       makefile.writeLine("\n# PHONY Targets");                \r
184       makefile.writeLine(".PHONY: all clean cleanall ");    \r
185       \r
186       makefile.writeLine("\n# FORCE Targets");                \r
187       makefile.writeLine("FORCE: ");          \r
188       \r
189       makefile.writeLine("\n# all rule");                \r
190       makefile.writeLine("all: .executables");           \r
191       makefile.writeLine(".executables: .libraries");\r
192       makefile.writeLine(".libraries:");\r
193       \r
194       makefile.writeLine("\n# Clean Rule");          \r
195       makefile.writeLine("clean:: clean_package");                  \r
196       makefile.writeLine("# Clean Top Level Object Directory ");          \r
197       makefile.writeLine("clean_package:")\r
198       makefile.writeLine("\t$(RMDIR) $(LIBDIR)/*");  \r
199       makefile.writeLine("\t$(RMDIR) package/cfg");            \r
200    }\r
201    else\r
202    {\r
203      try{\r
204           makefile = fileModule.open("makefile", "a");\r
205          } catch (ex)\r
206          {\r
207            print("makefile cannot be written to. Please check Writing Permissions.");\r
208            java.lang.System.exit(1);\r
209          }  \r
210     \r
211     }\r
212 \r
213  return makefile;\r
214 }\r
215 \r
216 function createLibMake(device, makelibname,targetname, objectPath)\r
217 {\r
218    var tooldir;\r
219    var cmdprefix;\r
220    var targetDir;\r
221    var stringname=String(targetname).replace("(xdc.bld.ITarget.Module)","");\r
222    \r
223    switch(stringname)\r
224    {\r
225     case String(C66LE):\r
226       tooldir="C6X_GEN_INSTALL_PATH";\r
227       cmdprefix="";\r
228       targetDir="c66";\r
229       targetname=C66LE;\r
230       break;\r
231     case String(C66BE):\r
232       tooldir="C6X_GEN_INSTALL_PATH";\r
233       cmdprefix="";\r
234       targetDir="c66";\r
235       targetname=C66BE;\r
236       break;\r
237     case String(A15LE):\r
238       tooldir="TOOLCHAIN_PATH_A15"; \r
239       cmdprefix="CROSS_TOOL_PRFX";\r
240       targetDir="armv7";\r
241       targetname=A15LE;\r
242       break;\r
243     case String(A9LE):\r
244       tooldir="TOOLCHAIN_PATH_A9";\r
245       cmdprefix="CROSS_TOOL_PRFX";\r
246       targetDir="armv7";\r
247       targetname=A9LE;\r
248       break;\r
249     case String(A8LE):\r
250       tooldir="TOOLCHAIN_PATH_A8";\r
251       cmdprefix="CROSS_TOOL_PRFX";\r
252       targetDir="armv7";\r
253       targetname=A8LE;\r
254       break;\r
255     case String(M4LE):\r
256       tooldir="TOOLCHAIN_PATH_M4";\r
257       cmdprefix="";\r
258       targetDir="m4";\r
259       targetname=M4LE;\r
260       break;\r
261     case String(ARM11):\r
262       tooldir="TI_ARM11_GEN_INSTALL_PATH"; \r
263       break;\r
264    }\r
265 \r
266     var fileModule = xdc.module('xdc.services.io.File');\r
267     try{\r
268      var dstFile = new java.io.File(makelibname);\r
269      dstFile.getParentFile().mkdirs();    \r
270      libmakefile = fileModule.open(makelibname, "w");\r
271      /* Add to Archive list */\r
272     } catch (ex)\r
273     {\r
274      print(makelibname+" cannot be written to. Please check Writing Permissions.");\r
275      java.lang.System.exit(1);\r
276     }   \r
277     libmakefile.writeLine("#*******************************************************************************");\r
278     libmakefile.writeLine("#* FILE PURPOSE: Lower level makefile for Creating Component Libraries");\r
279     libmakefile.writeLine("#*******************************************************************************");\r
280     libmakefile.writeLine("#* FILE NAME: "+makelibname);\r
281     libmakefile.writeLine("#*");\r
282     libmakefile.writeLine("#* DESCRIPTION: Defines Source Files, Compilers flags and build rules");\r
283     libmakefile.writeLine("#*");\r
284     libmakefile.writeLine("#*");\r
285     libmakefile.writeLine("#*******************************************************************************");\r
286     libmakefile.writeLine("#");\r
287     libmakefile.writeLine("");\r
288     libmakefile.writeLine("#");\r
289     libmakefile.writeLine("# Macro definitions referenced below");\r
290     libmakefile.writeLine("#");\r
291     libmakefile.writeLine("empty =");\r
292     libmakefile.writeLine("space =$(empty) $(empty)");\r
293           \r
294     if ((targetname.name == "A15F") || (targetname.name == "A9F") || (targetname.name == "A8F"))\r
295     {\r
296     \r
297         if(stringname.match("gnu.targets"))\r
298         {\r
299             libmakefile.writeLine("CC = $("+tooldir+")/bin/$("+cmdprefix+")gcc");\r
300             libmakefile.writeLine("AC = $("+tooldir+")/bin/$("+cmdprefix+")as");    \r
301             libmakefile.writeLine("ARIN = $("+tooldir+")/bin/$("+cmdprefix+")ar");    \r
302             libmakefile.writeLine("LD = $("+tooldir+")/bin/$("+cmdprefix+")gcc");   \r
303         }\r
304         else\r
305         {\r
306             print("Error: Non-GNU targets are not currently supported ");\r
307             java.lang.System.exit(1);\r
308 \r
309         }\r
310         \r
311         libmakefile.writeLine("INCS = -I. -I$(strip $(subst ;, -I,$(subst $(space),\\$(space),$(INCDIR)))) -I$("+tooldir+")/include");\r
312         libmakefile.writeLine("OBJEXT = o"+targetname.suffix); \r
313         libmakefile.writeLine("AOBJEXT = s"+targetname.suffix);     \r
314         libmakefile.writeLine("CFLAGS_INTERNAL = " +targetname.ccOpts.prefix+" "+targetname.cc.opts);\r
315         libmakefile.writeLine("ASFLAGS_INTERNAL = " +targetname.asmOpts.prefix+" "+targetname.asm.opts);\r
316         libmakefile.writeLine("ARFLAGS_INTERNAL = " +targetname.ar.opts);\r
317         libmakefile.writeLine("LNKFLAGS_INTERNAL = " +targetname.lnk.opts);\r
318         libmakefile.writeLine("INTERNALDEFS = -MD -MF $@.dep");\r
319         libmakefile.writeLine("INTERNALLINKDEFS = -o $@ -m $@.map");  /* TBD */\r
320         libmakefile.writeLine("OBJDIR =  $(LIBDIR)/" + device.toString() + "/" + targetDir +"/obj"); \r
321     \r
322     }\r
323     else\r
324     {\r
325   \r
326         if(stringname.match("ti.targets"))\r
327         {\r
328 \r
329             var rtslibtemp = targetname.lnkOpts.suffix.toString().split("/");\r
330             var rtslib;\r
331             for(n=0;n<rtslibtemp.length;n++)\r
332             {\r
333                 if(rtslibtemp[n].match(".lib"))\r
334                 { \r
335                     rtslib=rtslibtemp[n];\r
336                 }\r
337             }\r
338 \r
339             libmakefile.writeLine("CC = $("+tooldir+")/bin/"+targetname.cc.cmd);\r
340             libmakefile.writeLine("AC = $("+tooldir+")/bin/"+targetname.asm.cmd);    \r
341             libmakefile.writeLine("ARIN = $("+tooldir+")/bin/"+targetname.ar.cmd);    \r
342             libmakefile.writeLine("LD = $("+tooldir+")/bin/"+targetname.lnk.cmd);   \r
343             libmakefile.writeLine("RTSLIB = -l $("+tooldir+")/lib/"+rtslib);        \r
344         }\r
345         else\r
346         {\r
347             print("Error: Non-TI targets are not currently supported ");\r
348             java.lang.System.exit(1);\r
349 \r
350         }\r
351         \r
352         libmakefile.writeLine("INCS = -I. -I$(strip $(subst ;, -I,$(subst $(space),\\$(space),$(INCDIR)))) -I$("+tooldir+")/include");\r
353         libmakefile.writeLine("OBJEXT = o"+targetname.suffix); \r
354         libmakefile.writeLine("AOBJEXT = s"+targetname.suffix);     \r
355         libmakefile.writeLine("CFLAGS_INTERNAL = " +targetname.ccOpts.prefix+" "+targetname.cc.opts);\r
356         libmakefile.writeLine("ASFLAGS_INTERNAL = " +targetname.asmOpts.prefix+" "+targetname.asm.opts);\r
357         libmakefile.writeLine("ARFLAGS_INTERNAL = " +targetname.ar.opts);\r
358         libmakefile.writeLine("LNKFLAGS_INTERNAL = " +targetname.lnk.opts);\r
359         /* 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");*/\r
360         libmakefile.writeLine("INTERNALDEFS = -D"+stringname.replace(/\./g,"_")+"  -DMAKEFILE_BUILD -eo.$(OBJEXT) -ea.$(AOBJEXT) -fr=$(@D) -fs=$(@D) -ppa -ppd=$@.dep");\r
361         libmakefile.writeLine("INTERNALLINKDEFS = -o $@ -m $@.map");\r
362         libmakefile.writeLine("OBJDIR =  $(LIBDIR)/" + device.toString() + "/" + targetDir +"/obj"); \r
363     }     \r
364    \r
365  return libmakefile;\r
366 \r
367 }\r
368 \r
369 function makeAddObjects(srcString, makefilename, srcfiles, flags,fileExt, targetName, objDir)\r
370 {\r
371   var  sourcestring = (srcString + fileExt).toString().toUpperCase();\r
372   var  compileflagstring = sourcestring + "FLAGS";\r
373   var  objectliststring = sourcestring + "OBJS";\r
374   /* List all the source files */\r
375   makefilename.writeLine("\n#List the "+srcString+" Files");  \r
376   makefilename.writeLine(sourcestring + "= \\");\r
377   for(var i=0;i<srcfiles.length-1;i++)\r
378   {\r
379     makefilename.writeLine("    "+srcfiles[i]+"\\");\r
380   }\r
381     makefilename.writeLine("    "+srcfiles[i]+"\n");\r
382     \r
383  /* Flags for the source files */\r
384  makefilename.writeLine("# FLAGS for the "+srcString+" Files"); \r
385  var compileflags="";\r
386  if(fileExt == "asm" && flags.aopts != undefined)\r
387  {\r
388    compileflags+=" "+flags.aopts;\r
389  }\r
390  else if((fileExt == "c" || fileExt == "sa")&& flags.copts != undefined)\r
391  {\r
392    compileflags+=" "+flags.copts;\r
393  } \r
394 \r
395  if(flags.incs != undefined)\r
396  {\r
397    compileflags+=" "+flags.incs;\r
398  }\r
399 \r
400 \r
401  makefilename.writeLine(compileflagstring+" = "+compileflags +" \n");     \r
402  makefilename.writeLine("# Make Rule for the "+srcString+" Files");  \r
403  \r
404  makefilename.writeLine(objectliststring +" = $(patsubst %."+fileExt+", "+objDir+"/%.$(OBJEXT), $(" + sourcestring + "))"); \r
405  makefilename.writeLine("\n$("+objectliststring+"): "+objDir+"/%.$(OBJEXT): %."+fileExt);   \r
406  if(fileExt == "c")\r
407  { \r
408    makefilename.writeLine("\t-@echo cl"+targetName.suffix +" $< ...");     \r
409  }\r
410  else\r
411  {\r
412    makefilename.writeLine("\t-@echo asm"+targetName.suffix +" $< ...");      \r
413  }\r
414  makefilename.writeLine("\tif [ ! -d $(@D) ]; then $(MKDIR) $(@D) ; fi;");           \r
415  \r
416  if(fileExt == "c")\r
417  {\r
418    if ((targetName.name == "A15F") || (targetName.name == "A9F") || (targetName.name == "A8F"))\r
419    {\r
420     makefilename.writeLine("\t$(RM) $@.dep");\r
421     makefilename.writeLine("\t$(CC) $(CFLAGS_INTERNAL) $("+compileflagstring+") $(INTERNALDEFS) $(INCS) $< -o $@");\r
422    /* \r
423     TBD\r
424    */\r
425    }\r
426    else\r
427    {\r
428     makefilename.writeLine("\t$(RM) $@.dep");\r
429     makefilename.writeLine("\t$(CC) $(CFLAGS_INTERNAL) $("+compileflagstring+") $(INTERNALDEFS) $(INCS) -fc $< ");\r
430     makefilename.writeLine("\t-@$(CP) $@.dep $@.pp; \\");\r
431     makefilename.writeLine("         $(SED) -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\\\$$//' \\");\r
432     makefilename.writeLine("             -e '/^$$/ d' -e 's/$$/ :/' < $@.pp >> $@.dep; \\");\r
433     makefilename.writeLine("         $(RM) $@.pp ");\r
434    }\r
435  }\r
436  else if(fileExt == "asm")\r
437  {\r
438    makefilename.writeLine("\t$(AC) $(ASFLAGS_INTERNAL) $("+compileflagstring+") $(INTERNALDEFS) $(INCS) -fa $< ");\r
439  }\r
440  else if(fileExt == "sa")\r
441  {\r
442    makefilename.writeLine("\t$(AC) $(ASFLAGS_INTERNAL) $("+compileflagstring+") $(INTERNALDEFS) $(INCS) $< ");\r
443  }\r
444  \r
445    makefilename.writeLine("\n#Create Empty rule for dependency");\r
446    makefilename.writeLine("$("+objectliststring+"):"+makefilename.$private.fd);\r
447    makefilename.writeLine(makefilename.$private.fd+":");\r
448    makefilename.writeLine("\n#Include Depedency for "+srcString+" Files");\r
449    makefilename.writeLine("ifneq (clean,$(MAKECMDGOALS))");\r
450    makefilename.writeLine(" -include $("+objectliststring+":%.$(OBJEXT)=%.$(OBJEXT).dep)");\r
451    makefilename.writeLine("endif");\r
452  \r
453 }\r
454 \r
455 /**************************************************************************\r
456  * FUNCTION NAME : buildLibrary\r
457  **************************************************************************\r
458  * DESCRIPTION   :\r
459  *  Utility function which will build a specific library\r
460  **************************************************************************/\r
461 var makefilelocal;\r
462 function buildLibrary (socName, isDmaSoc, isSoc, libOptions, libName, target, libFiles) \r
463 {\r
464     var targetDir;\r
465 \r
466     if (target.name == "A15F")\r
467     {\r
468         targetDir = "armv7";\r
469     }\r
470         else if (target.name == "A9F")\r
471     {\r
472         targetDir = "armv7";\r
473     }\r
474         else if (target.name == "A8F")\r
475     {\r
476         targetDir = "armv7";\r
477     }\r
478     else if (target.name == "M4")\r
479     {\r
480         targetDir = "m4";\r
481     }\r
482     else\r
483     {\r
484         targetDir = "c66";\r
485     }\r
486     \r
487     /* Derive the operating system and soc names */\r
488     if (isDmaSoc == "true") {\r
489         var libNameExp = libName+"."+socName+".dma";\r
490         targetDir = socName+"/"+targetDir;\r
491     }\r
492     else if (isSoc == "true") {\r
493         var libNameExp = libName+"."+socName;\r
494         targetDir = socName+"/"+targetDir;\r
495     }\r
496     else  {\r
497         var libNameExp = libName;\r
498     }\r
499         \r
500     var lldFullLibraryPath = "./lib/" + targetDir +"/" + libNameExp;\r
501     var lldFullBuildPath = "./build/" + targetDir +"/" + libNameExp;\r
502     var lldFullLibraryPathMake = "$(LIBDIR)/" + targetDir +"/" + libNameExp;\r
503 \r
504     /* Create Main make file in the root of package folder */\r
505     makefilelocal = createMake(makefilelocal);\r
506 \r
507     /* Write the rule to make library in main makefile */\r
508     lib = lldFullBuildPath+".a"+target.suffix;\r
509     libMake = lldFullLibraryPathMake+".a"+target.suffix;\r
510     var objectPath= "./package/"+lldFullBuildPath;\r
511     makefilelocal.writeLine("\n\n# Make rule to create "+libMake+" library");\r
512     makefilelocal.writeLine(".libraries: "+ libMake);\r
513     makefilelocal.writeLine(libMake+": FORCE\n\t$(MAKE) -f "+lib+".mk $@");                                 \r
514 \r
515     /* Create Library make file in the lib folder */\r
516     var makefilelib= createLibMake(socName, lib+".mk",target,objectPath);  \r
517 \r
518     /* Rule to clean library in main makefile */\r
519     makefilelocal.writeLine("# Rule to clean "+libMake+" library");                                              \r
520     makefilelocal.writeLine("clean ::\n\t$(RM) "+ libMake);                                          \r
521     librule="\n\n"+libMake+" :";\r
522 \r
523     /* Add files to be compiled */\r
524     /* Separate out the C and assembly files */\r
525     var cfiles= new Array();\r
526     var afiles= new Array();\r
527     var safiles= new Array();\r
528     for each(var srcFile in libFiles)\r
529     {\r
530         var srcFile=String(srcFile);\r
531         var dot = srcFile.lastIndexOf(".");\r
532         var extension = srcFile.substr(dot,srcFile.length);      \r
533         if(extension == ".c")\r
534         {\r
535           cfiles.push(srcFile);\r
536         }\r
537         else if(extension == ".sa")\r
538         {\r
539           safiles.push(srcFile);\r
540         }\r
541         else if(extension == ".asm")\r
542         {\r
543            afiles.push(srcFile);\r
544         }\r
545         else\r
546         {\r
547            print("ERROR: Unsupported file extension");\r
548            java.lang.System.exit(1);\r
549         }\r
550      }\r
551     if(cfiles.length > 0)\r
552     {                                                \r
553       makeAddObjects("COMMONSRC",makefilelib,cfiles,libOptions,"c",target, "$(OBJDIR)");\r
554       librule += " $(COMMONSRCCOBJS)";                   \r
555     }\r
556     if(afiles.length > 0)\r
557     {                                                \r
558       makeAddObjects("COMMONSRC",makefilelib,afiles,libOptions,"asm",target, "$(OBJDIR)");\r
559       librule += " $(COMMONSRCASMOBJS)";                   \r
560     }\r
561     if(safiles.length > 0)\r
562     {                                                \r
563       makeAddObjects("COMMONSRC",makefilelib,safiles,libOptions,"sa",target, "$(OBJDIR)");\r
564       librule += " $(COMMONSRCSAOBJS)";                   \r
565     }\r
566 \r
567     makefilelib.writeLine(librule);\r
568     makefilelib.writeLine("\t@echo archiving $? into $@ ...");\r
569     makefilelib.writeLine("\tif [ ! -d $(LIBDIR)/" + targetDir + " ]; then $(MKDIR) $(LIBDIR)/" + targetDir + " ; fi;"); \r
570     makefilelib.writeLine("\t$(ARIN) $(ARFLAGS_INTERNAL) $@ $?");\r
571                 makefilelib.close();   \r
572 \r
573     /* Create the Epilogue; which executes after all the builds are completed. \r
574      * This is used to generate the benchmark information for the built library. \r
575      * Also add the benchmarking information file to the package. */\r
576 \r
577     /* Put the temp file in object directory since javascript doesn't have a built in tmpname, \r
578      * and don't want --jobs=# with # > 1 to result in collisions */\r
579     var libFullName = lldFullLibraryPath + ".a" + target.suffix;\r
580     var tempFile = libFullName + ".xml";\r
581     Pkg.makeEpilogue += ".libraries: " + libFullName +  "_size.txt\n";\r
582     Pkg.makeEpilogue += libFullName +  "_size.txt: " + libFullName + "\n";\r
583     if ( java.lang.String(target.name).contains('66') )\r
584     {    \r
585         Pkg.makeEpilogue += "\n\t $(C6X_GEN_INSTALL_PATH)/bin/ofd6x -x " + libFullName + " > " + tempFile;\r
586         Pkg.makeEpilogue += "\n\t $(SECTTI) " + tempFile + " > " + libFullName +  "_size.txt";\r
587         Pkg.makeEpilogue += "\n\t $(RM) " + tempFile + "\n\n";\r
588     }   \r
589     else if (target.name == "M4")\r
590     {\r
591         Pkg.makeEpilogue += "\n\t $(TOOLCHAIN_PATH_M4)/bin/armofd -x " + libFullName + " > " + tempFile;\r
592         Pkg.makeEpilogue += "\n\t $(SECTTI) " + tempFile + " > " + libFullName +  "_size.txt";\r
593         Pkg.makeEpilogue += "\n\t $(RM) " + tempFile + "\n\n";\r
594     }\r
595     else\r
596     {\r
597         Pkg.makeEpilogue += "\n\t $(TOOLCHAIN_PATH_A15)/bin/$(CROSS_TOOL_PRFX)size " + libFullName + " > " + libFullName + "_size.txt";\r
598     }       \r
599     Pkg.otherFiles[Pkg.otherFiles.length++] = lldFullLibraryPath + ".a" + target.suffix + "_size.txt";\r
600     Pkg.otherFiles[Pkg.otherFiles.length++] = lldFullBuildPath + ".a" + target.suffix + ".mk";\r
601     Pkg.otherFiles[Pkg.otherFiles.length++] = lldFullLibraryPath + ".a" + target.suffix;\r
602 \r
603     /* We need to clean after ourselves; extend the 'clean' target to take care of this. */\r
604     Pkg.makeEpilogue += "\nclean::\n";\r
605     Pkg.makeEpilogue += "\t$(RM) " + lldFullBuildPath + ".a" + target.suffix + "_size.txt\n";    \r
606     Pkg.makeEpilogue += "\t$(RMDIR) " + "$(LIBDIR)/" + targetDir + "/ \n\n";\r
607 \r
608     return lib;\r
609 }\r
610 \r
611 /**************************************************************************\r
612  * FUNCTION NAME : createMiniPkg\r
613  **************************************************************************\r
614  * DESCRIPTION   :\r
615  *  The function is responsible for creating the mini tar package\r
616  *  The MINI package has the following files:- \r
617  *      - Driver Source Files. \r
618  *      - Header files (exported and internal driver files) \r
619  *      - Simple Makefiles. \r
620  **************************************************************************/\r
621 function createMiniPkg(pkgName)\r
622 {\r
623     /* Get the package Name. */\r
624     var packageRepository = xdc.getPackageRepository(Pkg.name);\r
625     var packageBase       = xdc.getPackageBase(Pkg.name);\r
626     var packageName       = packageBase.substring(packageRepository.length + 1);\r
627 \r
628     /* Convert the Package name by replacing back slashes with forward slashes. This is required because\r
629      * otherwise with long names the tar is unable to change directory. */\r
630     var newPkgName = new java.lang.String(packageRepository);\r
631     var newPkgRep  = newPkgName.replace('\\', '/');\r
632 \r
633     /* Step1: Create the MINI Package and add the simple Big and Little Endian Makefiles to the package */\r
634     Pkg.makeEpilogue += "release: mini_pkg\n";\r
635     Pkg.makeEpilogue += "mini_pkg:\n";\r
636     Pkg.makeEpilogue += "\t tar -C " + "\"" + newPkgRep + "\"" + " -cf packages/" + pkgName + "_mini.tar " + \r
637                         packageName + "simpleC66LE.mak " + packageName + "simpleC66BE.mak\n";\r
638                         \r
639 \r
640     /* Step2: Add the exported header files to the package */\r
641     var includeFiles = libUtility.listAllFiles (".h", ".", false);\r
642     for (var k = 0 ; k < includeFiles.length; k++)\r
643         Pkg.makeEpilogue += "\t tar -C " + "\"" + newPkgRep + "\"" + " -rf packages/" + pkgName + "_mini.tar " + \r
644                         packageName + includeFiles[k] + "\n";\r
645 \r
646     /* Step3: Add the internal header files to the package */\r
647     includeFiles = libUtility.listAllFiles (".h", "include", true);\r
648     for (var k = 0 ; k < includeFiles.length; k++)\r
649         Pkg.makeEpilogue += "\t tar -C " + "\"" + newPkgRep + "\"" + " -rf packages/" + pkgName + "_mini.tar " + \r
650                         packageName + includeFiles[k] + "\n";\r
651 \r
652     /* Step4: Add the PDSP firmware files to the package */\r
653     includeFiles = libUtility.listAllFiles (".h", "firmware", true);\r
654     for (var k = 0 ; k < includeFiles.length; k++)\r
655         Pkg.makeEpilogue += "\t tar -C " + "\"" + newPkgRep + "\"" + " -rf packages/" + pkgName + "_mini.tar " + \r
656                         packageName + includeFiles[k] + "\n";\r
657 \r
658     /* Step5: Add the device specific files to the package */\r
659     includeFiles = libUtility.listAllFiles (".c", "device", true);\r
660     for (var k = 0 ; k < includeFiles.length; k++)\r
661         Pkg.makeEpilogue += "\t tar -C " + "\"" + newPkgRep + "\"" + " -rf packages/" + pkgName + "_mini.tar " + \r
662                         packageName + includeFiles[k] + "\n";\r
663 \r
664     /* Step4: Add the driver source files to the package; the filter should have generated a source listing */\r
665     Pkg.makeEpilogue += "\t tar -C " + "\"" + newPkgRep + "\"" + " -T src.lst -rf packages/" + pkgName + "_mini.tar " + "\n";\r
666 \r
667     /* Ensure that we clean up the mini package */\r
668     Pkg.makeEpilogue += "clean::\n";\r
669     Pkg.makeEpilogue += "\t $(RM) packages/" + pkgName + "_mini.tar\n";\r
670 }\r
671 \r
672 \r