Changeset 7780
- Timestamp:
- 03/24/07 15:03:48 (20 months ago)
- Location:
- util/trunk/buildscripts
- Files:
-
- 1 removed
- 3 modified
-
build.js (modified) (9 diffs)
-
build.xml (modified) (1 diff)
-
internStrings.js (deleted)
-
jslib/buildUtil.js (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
util/trunk/buildscripts/build.js
r7779 r7780 1 1 //Main build script for Dojo 2 var buildTimerStart = (new Date()).getTime(); 2 3 3 4 load("jslib/logger.js"); … … 17 18 kwArgs.profileFile = "profiles/" + kwArgs.profile + ".profile.js"; 18 19 } 20 if(typeof kwArgs["internStrings"] == "undefined"){ 21 kwArgs.internStrings = true; 22 } 19 23 if(kwArgs["log"]){ 20 24 logger.level = logger[kwArgs["log"]]; … … 32 36 } 33 37 38 var buildTime = ((new Date().getTime() - buildTimerStart) / 1000); 39 logger.info("Build time: " + buildTime + " seconds"); 34 40 35 41 //********* Start clean ************ … … 50 56 //Get the list of module directories we need to process. 51 57 //They will be in the dependencies.prefixes array. 52 varprofileProperties = buildUtil.evalProfile(kwArgs.profileFile);53 var dependencies = profileProperties.dependencies;58 kwArgs.profileProperties = buildUtil.evalProfile(kwArgs.profileFile); 59 var dependencies = kwArgs.profileProperties.dependencies; 54 60 var prefixes = dependencies.prefixes; 55 61 var dojoPrefixPath = null; … … 64 70 var prefixPath = prefixes[i][1]; 65 71 72 //Set prefix path to the release location, so that 73 //build operations that depend/operate on it are using 74 //the release location. 75 prefixes[i][1] = kwArgs.releaseDir + "/" + prefixName; 76 66 77 //Save dojo for last. 67 78 if(prefixName == "dojo"){ … … 77 88 78 89 //FIXME: loadDependency list reparses profile file, but we've already done that. 90 logger.trace("Building dojo.js and layer files"); 79 91 var result = buildUtil.makeDojoJs(buildUtil.loadDependencyList(kwArgs.profileFile), kwArgs.version); 80 92 81 93 //Save the build layers. The first layer is dojo.js. 82 94 var layerLegalText = copyrightText + buildNoticeText; 95 var dojoReleaseDir = kwArgs.releaseDir + "/dojo/"; 83 96 for(var i = 0; i < result.length; i++){ 84 var fileName = kwArgs.releaseDir + "/dojo/"+ result[i].layerName;97 var fileName = dojoReleaseDir + result[i].layerName; 85 98 var fileContents = result[i].contents; 86 99 … … 93 106 94 107 //Save uncompressed file. 95 fileUtil.saveFile(fileName + ".uncompressed.js", layerLegalText + fileContents); 108 var uncompressedFileName = fileName + ".uncompressed.js"; 109 fileUtil.saveFile(uncompressedFileName, layerLegalText + fileContents); 96 110 97 111 //Save compressed file. … … 100 114 var compresedContents = buildUtil.optimizeJs(fileName, fileContents, layerLegalText, true); 101 115 fileUtil.saveFile(fileName, compresedContents); 116 117 //Intern strings if desired. 118 if(kwArgs.internStrings){ 119 logger.info("Interning strings for file: " + fileName); 120 var prefixes = dependencies["prefixes"] || []; 121 var skiplist = dependencies["internSkipList"] || []; 122 buildUtil.internTemplateStringsInFile(uncompressedFileName, dojoReleaseDir, prefixes, skiplist); 123 buildUtil.internTemplateStringsInFile(fileName, dojoReleaseDir, prefixes, skiplist); 124 } 102 125 } 103 126 … … 127 150 fileUtil.copyDir(prefixPath, releasePath, copyRegExp); 128 151 152 //Intern strings if desired. 153 if(kwArgs.internStrings){ 154 logger.info("Interning strings for: " + releasePath); 155 buildUtil.internTemplateStrings(kwArgs.profileProperties.dependencies, releasePath); 156 } 157 129 158 //FIXME: flatten bundles inside the directory 130 159 -
util/trunk/buildscripts/build.xml
r7741 r7780 338 338 <!-- end list-profile-deps task --> 339 339 340 <!-- clean task -->341 <target name="clean"342 description="removes release files">343 <delete dir="${release_dir}"/>344 </target>345 <!-- end clean task -->346 347 <!-- release task -->348 <target name="release" depends="-fix-config"349 description="builds a release">350 351 <echo level="info" taskName="release" message="Using version number: ${version} for the release."/>352 353 <antcall target="clean" />354 355 <copy todir="${release_dir}/${src}" includeEmptyDirs="false" preservelastmodified="true">356 <fileset dir="${root}/${src}">357 <include name="**" />358 <exclude name="**/*.swp" />359 <exclude name="**/.svn*" />360 </fileset>361 </copy>362 363 <copy todir="${release_dir}/tests" includeEmptyDirs="false" preservelastmodified="true">364 <fileset dir="${root}/tests">365 <include name="**" />366 <exclude name="**/*.swp" />367 <exclude name="**/.svn*" />368 </fileset>369 </copy>370 371 <antcall target="compress" />372 373 <!-- Run xdgen if it xdomain loading is wanted. -->374 <condition property="xdgenRun">375 <equals arg1="xdomain" arg2="${dojoLoader}"/>376 </condition>377 <antcall target="xdgenRelease"/>378 379 <copy overwrite="true" file="../iframe_history.html" todir="${release_dir}/" preservelastmodified="true" />380 381 <copy file="${root}/LICENSE" todir="${release_dir}/" preservelastmodified="true" />382 <copy file="${root}/README" todir="${release_dir}/" preservelastmodified="true" />383 </target>384 <!-- end release task -->385 386 <!-- compress task -->387 <target name="compress" depends="-fix-config, -set-profileFile"388 description="runs compression code over release JS files">389 <!-- Create the release dir if it doesn't exist. -->390 <mkdir dir="${release_dir}"/>391 392 <echo level="info" taskName="compress">profileFile: ${profileFile}</echo>393 394 <!-- Call the JS script that will generate the raw dojo.js file -->395 <java jar="./lib/custom_rhino.jar" failonerror="true" fork="true"396 logError="true">397 <arg value="makeDojoJs.js" />398 <arg value="${profileFile}" />399 <arg value="${release_dir}" />400 <arg value="source.__package__.js" />401 <arg value="${version}" />402 <sysproperty key="DOJO_LOADER" value="${dojoLoader}" />403 </java>404 405 <antcall target="-preload-resources">406 <param name="srcFile" value="${release_dir}/source.__package__.js" />407 <param name="dstFile" value="${release_dir}/source.__package__.js" />408 <param name="buildPrefix" value="dojo" />409 </antcall>410 411 <!--412 clobber requireLocalization statements. They need to be come no-ops since the resources413 are now prebuilt and also because we do not want dojo.js to trigger XHRs on load414 -->415 <replaceregexp match="dojo.requireLocalization\((.*?)\);"416 byline="true" flags="g" file="${release_dir}/source.__package__.js">417 <substitution expression=""/>418 </replaceregexp>419 420 <antcall target="-rhino-compress">421 <param name="srcFile" value="${release_dir}/source.__package__.js" />422 <param name="dstFile" value="${release_dir}/dojo.js" />423 </antcall>424 425 <antcall target="-no-rhino-compress">426 <param name="srcFile" value="${release_dir}/source.__package__.js" />427 <param name="dstFile" value="${release_dir}/dojo.js" />428 </antcall>429 430 <!-- add build notice -->431 <replaceregexp match="^" byline="false" replace="${build_notice}">432 <fileset dir="${release_dir}" includes="dojo.js"/>433 </replaceregexp>434 435 <!-- add copyright notice -->436 <replaceregexp match="^" byline="false" replace="${copyright}">437 <fileset dir="${release_dir}">438 <include name="**/*.js" />439 <include name="**/*.as" />440 <not>441 <contains text="copyright" casesensitive="no" />442 </not>443 </fileset>444 </replaceregexp>445 446 <delete file="${release_dir}/source.__package__.js"/>447 448 <!-- we copy over iframe_history.html here just in case this is a truly449 stand-alone build that isn't being kicked off via release -->450 <copy file="../iframe_history.html" todir="${release_dir}/" />451 452 <!-- copy our dojo.storage and dojo.flash SWFs -->453 <copy todir="${release_dir}/" preservelastmodified="true">454 <fileset dir="${root}/">455 <include name="**/*.swf" />456 <include name="*.jar" />457 </fileset>458 </copy>459 460 </target>461 <!-- end compress task -->462 463 <target name="-rhino-compress" unless="nostrip">464 <copy overwrite="true" file="${srcFile}" tofile="${dstFile}.uncompressed.js" />465 <java jar="./lib/custom_rhino.jar" failonerror="true" fork="true"466 logerror="true" output="${dstFile}">467 <arg value="-strict" />468 <arg value="-opt"/>469 <arg value="-1" />470 <arg value="-c" />471 <arg value="${srcFile}" />472 </java>473 </target>474 475 <target name="-no-rhino-compress"476 if="nostrip">477 <copy overwrite="true" file="${srcFile}" tofile="${dstFile}" />478 </target>479 480 340 <target name="-flatten-resources" depends="-set-profileFile" 481 341 description="loads all localization bundles in the build for a particular locale, flattens the object, and outputs a preloaded version"> -
util/trunk/buildscripts/jslib/buildUtil.js
r7775 r7780 98 98 load = function(uri){ 99 99 try{ 100 var text = removeComments((isWebBuild ? dojo._getText(uri) : readText(uri)));100 var text = removeComments((isWebBuild ? dojo._getText(uri) : fileUtil.readFile(uri))); 101 101 var requires = dojo._getRequiresAndProvides(text); 102 102 eval(requires.join(";")); … … 467 467 468 468 //Use new String to make sure we have a JS string (not a Java string) 469 //readText is from hostenv_rhino.js, so be sure to load Dojo before calling this function. 470 var profileText = new String(readText(profileFile)); 469 var profileText = new String(fileUtil.readFile(profileFile)); 471 470 //Get rid of CR and LFs since they seem to mess with the regexp match. 472 471 //Using the "m" option on the regexp was not enough. … … 687 686 } 688 687 689 if(bestPrefixPath == "" && resourceName.indexOf("dojo.") == 0){690 bestPrefix = "dojo";691 bestPrefixPath = "src/";692 }693 694 688 //Get rid of matching prefix from resource name. 695 689 resourceName = resourceName.replace(bestPrefix, ""); … … 712 706 } 713 707 714 715 function makeResourceUri(resourceName, templatePath, srcRoot, prefixes){ 708 buildUtil.makeResourceUri = function(resourceName, templatePath, srcRoot, prefixes){ 716 709 var bestPrefix = ""; 717 710 var bestPrefixPath = "" … … 751 744 } 752 745 753 buildUtil.internTemplateStrings = function(profileFile, loader, releaseDir, srcRoot){ 754 loader = loader || "default"; 755 releaseDir = releaseDir || "../release/dojo"; 756 srcRoot = srcRoot || "../"; 757 758 print("loader: " + loader); 759 print("releaseDir - " + releaseDir); 760 761 //Load Dojo so we can use readText() defined in hostenv_rhino.js. 762 //Also gives us the ability to use all the neato toolkit features. 763 djConfig={ 764 baseRelativePath: "../" 765 }; 766 load('../dojo.js'); 767 dojo.require("dojo.string.extras"); 768 dojo.require("dojo.i18n.common"); 769 dojo.require("dojo.json"); 770 771 //Find the bundles that need to be flattened. 772 load("buildUtil.js"); 773 774 var profile = buildUtil.evalProfile(profileFile); 775 var dependencies = profileFile.dependencies; 776 746 buildUtil.internTemplateStrings = function(dependencies, srcRoot){ 777 747 var prefixes = dependencies["prefixes"] || []; 778 //Make sure dojo is in the list.779 var dojoPath = releaseDir.replace(/^.*(\/|\\)release(\/|\\)/, "release/");780 781 748 var skiplist = dependencies["internSkipList"] || []; 782 783 //Intern strings for dojo.js784 buildUtil.internTemplateStringsInFile(loader, releaseDir + "/dojo.js", srcRoot, prefixes, skiplist);785 buildUtil.internTemplateStringsInFile(loader, releaseDir + "/dojo.js.uncompressed.js", srcRoot, prefixes, skiplist);786 787 //Intern strings for any other layer files.788 if(dependencies["layers"] && dependencies.layers.length > 0){789 for(var i = 0; i < dependencies.layers.length; i++){790 buildUtil.internTemplateStringsInFile(loader, releaseDir + "/" + dependencies.layers[i].name, srcRoot, prefixes, skiplist);791 }792 }793 749 794 750 //Intern strings for all files in widget dir (xdomain and regular files) 795 var fileList = fileUtil.getFilteredFileList(releaseDir + "/src/widget", 796 /\.js$/, true); 797 751 var fileList = fileUtil.getFilteredFileList(srcRoot, /\.js$/, true); 798 752 if(fileList){ 799 753 for(var i = 0; i < fileList.length; i++){ 800 buildUtil.internTemplateStringsInFile( loader, fileList[i], srcRoot, prefixes, skiplist)801 } 802 } 803 } 804 805 buildUtil.internTemplateStringsInFile = function( loader,resourceFile, srcRoot, prefixes, skiplist){806 var resourceContent = new String(readText(resourceFile));807 resourceContent = buildUtil.interningRegexpMagic( loader,resourceContent, srcRoot, prefixes, skiplist);808 fileUtil.save Utf8File(resourceFile, resourceContent);809 } 810 811 buildUtil.interningDojoUriRegExpString = "(((templatePath|templateCssPath)\\s*(=|:)\\s*)|dojo\\.uri\\.cache\\.allow\\(\\s*)dojo\\. uri\\.(dojo|module)?Uri\\(\\s*?[\\\"\\']([\\w\\.\\/]+)[\\\"\\'](([\\,\\s]*)[\\\"\\']([\\w\\.\\/]*)[\\\"\\'])?\\s*\\)";754 buildUtil.internTemplateStringsInFile(fileList[i], srcRoot, prefixes, skiplist); 755 } 756 } 757 } 758 759 buildUtil.internTemplateStringsInFile = function(resourceFile, srcRoot, prefixes, skiplist){ 760 var resourceContent = String(fileUtil.readFile(resourceFile)); 761 resourceContent = buildUtil.interningRegexpMagic(resourceContent, srcRoot, prefixes, skiplist); 762 fileUtil.saveFile(resourceFile, resourceContent); 763 } 764 765 buildUtil.interningDojoUriRegExpString = "(((templatePath|templateCssPath)\\s*(=|:)\\s*)|dojo\\.uri\\.cache\\.allow\\(\\s*)dojo\\.(module)?Uri\\(\\s*?[\\\"\\']([\\w\\.\\/]+)[\\\"\\'](([\\,\\s]*)[\\\"\\']([\\w\\.\\/]*)[\\\"\\'])?\\s*\\)"; 812 766 buildUtil.interningGlobalDojoUriRegExp = new RegExp(buildUtil.interningDojoUriRegExpString, "g"); 813 767 buildUtil.interningLocalDojoUriRegExp = new RegExp(buildUtil.interningDojoUriRegExpString); 814 768 815 //WARNING: This function assumes dojo.string.escapeString() has been loaded. 816 buildUtil.interningRegexpMagic = function(loader, resourceContent, srcRoot, prefixes, skiplist, isSilent){ 769 buildUtil.interningRegexpMagic = function(resourceContent, srcRoot, prefixes, skiplist){ 817 770 return resourceContent.replace(buildUtil.interningGlobalDojoUriRegExp, function(matchString){ 818 771 var parts = matchString.match(buildUtil.interningLocalDojoUriRegExp); … … 820 773 var filePath = ""; 821 774 var resourceNsName = ""; 822 if(parts[5] == "dojo"){ 823 if(parts[6].match(/(\.htm|\.html|\.css)$/)){ 824 if(!isSilent){ 825 print("Dojo match: " + parts[6]); 826 } 827 filePath = srcRoot + parts[6] 828 resourceNsName = "dojo:" + parts[6]; 829 } 775 776 logger.trace("Module match: " + parts[6] + " and " + parts[9]); 777 filePath = buildUtil.makeResourceUri(parts[6], parts[9], srcRoot, prefixes); 778 resourceNsName = parts[6] + ':' + parts[9]; 779 780 if(!filePath || buildUtil.isValueInArray(resourceNsName, skiplist)){ 781 logger.trace("Skip intern resource: " + filePath); 830 782 }else{ 831 if(!isSilent){ 832 print("Module match: " + parts[6] + " and " + parts[9]); 833 } 834 filePath = makeResourceUri(parts[6], parts[9], srcRoot, prefixes); 835 resourceNsName = parts[6] + ':' + parts[9]; 836 } 837 838 if(!filePath || buildUtil.isValueInArray(resourceNsName, skiplist)){ 839 if(filePath && !isSilent){ 840 print("Skip intern resource: " + filePath); 841 } 842 }else{ 843 if(!isSilent){ 844 print("Interning resource path: " + filePath); 845 } 846 //dojo.string.escapeString will add starting and ending double-quotes. 847 var jsEscapedContent = dojo.string.escapeString(new String(readText(filePath))); 783 logger.trace("Interning resource path: " + filePath); 784 //buildUtil.jsEscape will add starting and ending double-quotes. 785 var jsEscapedContent = buildUtil.jsEscape(new String(fileUtil.readFile(filePath))); 848 786 if(jsEscapedContent){ 849 787 if(matchString.indexOf("dojo.uri.cache.allow") != -1){ … … 885 823 } 886 824 825 buildUtil.jsEscape = function(/*string*/str){ 826 //summary: 827 // Adds escape sequences for non-visual characters, double quote and backslash 828 // and surrounds with double quotes to form a valid string literal. 829 // Take from the old dojo.string.escapeString code. 830 // Include it here so we don't have to load dojo. 831 return ('"' + str.replace(/(["\\])/g, '\\$1') + '"' 832 ).replace(/[\f]/g, "\\f" 833 ).replace(/[\b]/g, "\\b" 834 ).replace(/[\n]/g, "\\n" 835 ).replace(/[\t]/g, "\\t" 836 ).replace(/[\r]/g, "\\r"); // string 837 } 838 887 839 buildUtil.isValueInArray = function(/*Object*/value, /*Array*/ary){ 888 840 //summary: sees if value is in the ary array. Uses == to see if the