From ffd99e3ed7e6a7af1138cf7f3185206f0dc79f74 Mon Sep 17 00:00:00 2001 From: Francisco Ryan Tolmasky I Date: Thu, 24 Sep 2009 01:11:46 -0700 Subject: [PATCH] Further jake work. Reviewed by me. --- AppKit/Jakefile | 97 +++++++++++++++++++ Foundation/Jakefile | 1 + .../objective-j/lib-js/objective-j.js | 2 +- .../objective-j/jake/applicationtask.js | 23 +++++ .../lib-js/objective-j/jake/bundletask.js | 61 ++++++++---- Objective-J/Jakefile | 6 +- Objective-J/Runtime/file.js | 2 +- 7 files changed, 169 insertions(+), 23 deletions(-) create mode 100644 AppKit/Jakefile create mode 100644 Objective-J/CommonJS/objective-j/lib-js/objective-j/jake/applicationtask.js diff --git a/AppKit/Jakefile b/AppKit/Jakefile new file mode 100644 index 000000000..d5a856967 --- /dev/null +++ b/AppKit/Jakefile @@ -0,0 +1,97 @@ +#!/usr/bin/env ruby + +var FILE = require("file"); + +require(FILE.absolute("../common.jake")); + + +$BUILD_PATH = FILE.join($BUILD_DIR, $CONFIGURATION, 'AppKit'); +$ENVIRONMENT_PRODUCT = FILE.join($ENVIRONMENT_FRAMEWORKS_DIR, 'AppKit'); + +$THEME_PRODUCT = FILE.join($BUILD_PATH, 'Resources', 'Aristo.blend'); +$ENVIRONMENT_THEME_PRODUCT = FILE.join($ENVIRONMENT_PRODUCT, 'Resources', 'Aristo.blend'); + +//AppKitFiles = FileList['**/*.j'].exclude('CoreGraphics/CGContextCanvas.j', 'CoreGraphics/CGContextVML.j', 'Themes/**', 'Tools/**') + +framework ("AppKit", function(AppKitTask) +{ + AppKitTask.setBuildIntermediatesPath(FILE.join($BUILD_DIR, "AppKit.build", $CONFIGURATION)) + AppKitTask.setBuildPath(FILE.join($BUILD_DIR, $CONFIGURATION)); + + AppKitTask.setIdentifier("com.280n.AppKit"); + AppKitTask.setLicense(BundleTask.License.LGPL_v2_1); + AppKitTask.setSources(FILE.glob("**/*.j").concat(FILE.glob("*.j")));//terrible! + AppKitTask.setResources(FILE.glob("Resources/*")); + AppKitTask.setPlatforms([BundleTask.Platform.Browser, BundleTask.Platform.CommonJS]); + AppKitTask.setFlattensSources(true); + + if ($CONFIGURATION === "Release") + AppKitTask.setCompilerFlags("-O"); + else + AppKitTask.setCompilerFlags("-DDEBUG -g"); +}); +/* +ObjectiveJ::BundleTask.new(:AppKit) do |t| + t.name = 'AppKit' + t.identifier = 'com.280n.AppKit' + t.version = '0.7.1' + t.author = '280 North, Inc.' + t.email = 'feedback @nospam@ 280north.com' + t.summary = 'AppKit classes for Cappuccino' + t.sources = AppKitFiles + t.resources = FileList['Resources/*'] + t.license = ObjectiveJ::License::LGPL_v2_1 + t.build_path = $BUILD_PATH + t.flag = '-DDEBUG -g' if $CONFIGURATION == 'Debug' + t.flag = '-O' if $CONFIGURATION == 'Release' + t.platforms = [ObjectiveJ::Platform::Browser, ObjectiveJ::Platform::Rhino] + t.type = ObjectiveJ::Bundle::Type::Framework +end*/ + +//# It would be nice to just have ENVIRONMENT_PRODUCT depend on THEME_PRODUCT, +//# but this would be a circular dependency because THEME_PRODUCT needs +//# ENVIRONMENT_PRODUCT up-to-date since it runs an objj application that uses +//# AppKit. +//file_d $ENVIRONMENT_PRODUCT => [:AppKit] do +// cp_r(File.join($BUILD_PATH, '.'), $ENVIRONMENT_PRODUCT) +//end + +//file_d $ENVIRONMENT_THEME_PRODUCT => $THEME_PRODUCT do +// cp_r(File.join($THEME_PRODUCT, '.'), $ENVIRONMENT_THEME_PRODUCT) +//end + +//ThemeFiles = FileList['Themes/Aristo/*'] + +//file_d $THEME_PRODUCT => ThemeFiles << $ENVIRONMENT_PRODUCT do +// File.popen("blend -d Themes/Aristo/ThemeDescriptors.j -o #{$THEME_PRODUCT} -R Themes/Aristo/Resources") do |blend| +// blend.sync = true +// +// while str = blend.gets +// puts str +// end +// end +// rake abort if ($? != 0) +//end + +task ("build", ["AppKit"]);//, $ENVIRONMENT_PRODUCT, $THEME_PRODUCT, $ENVIRONMENT_THEME_PRODUCT] + +subprojects = ["Tools"]; + +function subtasks(subprojects, taskNames) +{ + taskNames.forEach(function(aTaskName) + { + var subtaskName = taskNames + "_subprojects"; + + task (aTaskName, [subtaskName]); + + task (subtaskName, function() + { + subjake(subprojects, aTaskName); + }); + }); +} + +subtasks (subprojects, ["build", "clean", "clobber"]); + +//CLOBBER.include($ENVIRONMENT_PRODUCT) diff --git a/Foundation/Jakefile b/Foundation/Jakefile index a6bd966dd..4263828a2 100644 --- a/Foundation/Jakefile +++ b/Foundation/Jakefile @@ -18,6 +18,7 @@ framework ("Foundation", function(FoundationTask) FoundationTask.setLicense(BundleTask.License.LGPL_v2_1); FoundationTask.setSources(FILE.glob("**/*.j").concat(FILE.glob("*.j")));//terrible! FoundationTask.setResources(FILE.glob("Resources/*")); + FoundationTask.setFlattensSources(true); if ($CONFIGURATION === "Release") FoundationTask.setCompilerFlags("-O"); diff --git a/Objective-J/CommonJS/objective-j/lib-js/objective-j.js b/Objective-J/CommonJS/objective-j/lib-js/objective-j.js index 7add2575d..9c37b5e52 100644 --- a/Objective-J/CommonJS/objective-j/lib-js/objective-j.js +++ b/Objective-J/CommonJS/objective-j/lib-js/objective-j.js @@ -13,7 +13,7 @@ if (window.isRhino) { window.OBJJ_HOME = exports.OBJJ_HOME = file.resolve(module.path, ".."); var frameworksPath = file.resolve(window.OBJJ_HOME, "lib/", "Frameworks/"), - objectivejPath = file.resolve(frameworksPath, "Objective-J/", "rhino.platform/", "Objective-J.js"); + objectivejPath = file.resolve(frameworksPath, "Objective-J/", "CommonJS.platform/", "Objective-J.js"); window.OBJJ_INCLUDE_PATHS = [frameworksPath]; if (system.env["OBJJ_INCLUDE_PATHS"]) diff --git a/Objective-J/CommonJS/objective-j/lib-js/objective-j/jake/applicationtask.js b/Objective-J/CommonJS/objective-j/lib-js/objective-j/jake/applicationtask.js new file mode 100644 index 000000000..e3e01bcce --- /dev/null +++ b/Objective-J/CommonJS/objective-j/lib-js/objective-j/jake/applicationtask.js @@ -0,0 +1,23 @@ + +BundleTask = require("objective-j/jake/bundletask").BundleTask; + +function ApplicationTask(aName) +{ + ApplicationTask.apply(this, arguments); +} + +ApplicationTask.__proto__ = BundleTask; +ApplicationTask.prototype.__proto__ = BundleTask.prototype; + +ApplicationTask.prototype.packageTask = function() +{ + return "APPL"; +} + +exports.ApplicationTask = ApplicationTask; + +exports.application = function(aName, aFunction) +{ + // No .apply necessary because the parameters aren't variable. + return ApplicationTask.defineTask(aName, aFunction); +} \ No newline at end of file diff --git a/Objective-J/CommonJS/objective-j/lib-js/objective-j/jake/bundletask.js b/Objective-J/CommonJS/objective-j/lib-js/objective-j/jake/bundletask.js index 5e48733af..52592b0cc 100644 --- a/Objective-J/CommonJS/objective-j/lib-js/objective-j/jake/bundletask.js +++ b/Objective-J/CommonJS/objective-j/lib-js/objective-j/jake/bundletask.js @@ -25,13 +25,17 @@ function BundleTask(aName, anApplication) this._resources = null; this._identifier = null; this._version = 0.1; + this._compilerFlags = null; + this._flattensSources = false; this._productName = this.name(); this._buildIntermediatesPath = null; this._buildPath = FILE.cwd(); + this._replacedFiles = new objj_dictionary(); + // this._nib2cibFlags = []; // this.shouldnib } @@ -110,12 +114,6 @@ BundleTask.Platform = { "Browser" : "Browser" }; -BundleTask.PLATFORM_DIRECTORIES = { - "ObjJ" : "objj.platform", - "CommonJS" : "commonjs.platform", - "Browser" : "browser.platform" - }; - BundleTask.PLATFORM_DEFAULT_FLAGS = { "ObjJ" : [], "CommonJS" : ['-DPLATFORM_RHINO -DPLATFORM_COMMONJS'], @@ -221,6 +219,16 @@ BundleTask.prototype.compilerFlags = function() return this._compilerFlags; } +BundleTask.prototype.flattensSources = function() +{ + return this._flattensSources; +} + +BundleTask.prototype.setFlattensSources = function(/*Boolean*/ shouldFlattenSources) +{ + this._flattensSources = shouldFlattenSources; +} + BundleTask.prototype.setLicense = function(aLicense) { this._license = aLicense; @@ -263,7 +271,7 @@ BundleTask.prototype.buildIntermediatesProductPath = function() BundleTask.prototype.buildProductStaticPathForPlatform = function(aPlatform) { - return FILE.join(this.buildProductPath(), BundleTask.PLATFORM_DIRECTORIES[aPlatform], this.productName() + ".sj"); + return FILE.join(this.buildProductPath(), aPlatform + ".platform", this.productName() + ".sj"); } BundleTask.prototype.defineTasks = function() @@ -290,13 +298,12 @@ BundleTask.prototype.infoPlist = function() infoPlist.setValue("CPBundleIdentifier", this.identifier()); infoPlist.setValue("CPBundleVersion", this.version()); infoPlist.setValue("CPBundlePackageType", this.packageType()); + infoPlist.setValue("CPBundleReplacedFiles", this._replacedFiles); + infoPlist.setValue("CPBundlePlatforms", this.platforms()); + infoPlist.setValue("CPBundleExecutable", this.productName() + ".sj"); return infoPlist; /* - info_plist_path = File.join(build_path, 'Info.plist') - new_info_plist = { 'CPBundleName' => name, 'CPBundleIdentifier' => identifier, 'CPBundleInfoDictionaryVersion' => 6.0, 'CPBundleVersion' => version, 'CPBundlePackageType' => Bundle::Type.code_string(type) } - - new_info_plist['CPBundlePlatforms'] = platforms; if info_plist existing_info_plist = Plist::parse_xml(info_plist) @@ -474,20 +481,32 @@ BundleTask.prototype.defineStaticTask = function() { this.platforms().forEach(function(/*String*/ aPlatform) { - var staticPath = this.buildProductStaticPathForPlatform(aPlatform); + var sourcesPath = FILE.join(this.buildIntermediatesProductPath(), aPlatform + ".platform", ""), + staticPath = this.buildProductStaticPathForPlatform(aPlatform), + flattensSources = this.flattensSources(); filedir (staticPath, function(aTask) { - print("Creating static file..."); + print("Creating static file... " + staticPath); - FILE.write(staticPath, "@STATIC;1.0;", { charset:"UTF-8" }); + var fileStream = FILE.open(staticPath, "w+", { charset:"UTF-8" }); + + fileStream.write("@STATIC;1.0;"); aTask.prerequisites().forEach(function(aFilename) { // Our prerequisites will contain directories due to filedir. if (FILE.isFile(aFilename)) - OS.system("cat " + aFilename + " >> " + staticPath); + { + var relativePath = flattensSources ? FILE.basename(aFilename) : FILE.relative(sourcesPath, aFilename); + + // FIXME: We need to do this for now due to file.read adding newlines. Revert when fixed. + fileStream.write("p;" + relativePath.length + ";" + relativePath); + fileStream.write(FILE.read(aFilename, { mode:"b" }).decodeToString("UTF-8")); + } }, this); + + fileStream.close(); }); this.enhance([staticPath]); @@ -501,7 +520,8 @@ BundleTask.prototype.defineSourceTasks = function() if (!sources) return; - var compilerFlags = this.compilerFlags(); + var compilerFlags = this.compilerFlags(), + flattensSources = this.flattensSources(); if (!compilerFlags) compilerFlags = ""; @@ -512,20 +532,22 @@ BundleTask.prototype.defineSourceTasks = function() this.platforms().forEach(function(/*String*/ aPlatform) { var platformSources = sources, - platformBuildIntermediatesPath = FILE.join(this.buildIntermediatesProductPath(), BundleTask.PLATFORM_DIRECTORIES[aPlatform]), + sourcesPath = FILE.join(this.buildIntermediatesProductPath(), aPlatform + ".platform", ""), staticPath = this.buildProductStaticPathForPlatform(aPlatform), flags = BundleTask.PLATFORM_DEFAULT_FLAGS[aPlatform].join(" "); if (!Array.isArray(platformSources)) platformSources = platformSources[aPlatform]; + var replacedFiles = []; + platformSources.forEach(function(/*String*/ aFilename) { // if this file doesn't exist or isn't a .j file, don't preprocess it. if (!FILE.exists(aFilename) || FILE.extension(aFilename) !== '.j') return; - var compiledPlatformSource = FILE.join(platformBuildIntermediatesPath, FILE.basename(aFilename)); + var compiledPlatformSource = FILE.join(sourcesPath, FILE.basename(aFilename)); filedir (compiledPlatformSource, [aFilename], function() { @@ -535,7 +557,10 @@ BundleTask.prototype.defineSourceTasks = function() filedir (staticPath, [compiledPlatformSource]); + replacedFiles.push(flattensSources ? FILE.basename(aFilename) : FILE.relative(sourcesPath, aFilename)); }, this); + + this._replacedFiles.setValue(aPlatform, replacedFiles); }, this); /* list.each do |fileName| diff --git a/Objective-J/Jakefile b/Objective-J/Jakefile index 5fe66ea06..0ce84ef6f 100644 --- a/Objective-J/Jakefile +++ b/Objective-J/Jakefile @@ -14,7 +14,7 @@ $LICENSE_PRODUCT = FILE.join($PRODUCT, 'LICENSE') $LICENSE_FILE = FILE.join($HOME_DIR, 'Tools', 'Rake', 'lib', 'licenses', 'LGPL-v2.1') $BROWSER_FILE = FILE.join($PRODUCT, 'Objective-J.js') -$RHINO_FILE = FILE.join($PRODUCT, 'rhino.platform', 'Objective-J.js') +$RHINO_FILE = FILE.join($PRODUCT, 'CommonJS.platform', 'Objective-J.js') Files = ["Runtime/constants.js", "Runtime/utilities.js", "Runtime/json2.js", "Runtime/runtime.js", "Runtime/dictionary.js", "Runtime/plist.js", "Runtime/file.js", "Runtime/exception.js", "Runtime/preprocess.js", "Runtime/evaluate.js", "Runtime/bootstrap.js"]; //Files = new FileList("constants.js", "utilities.js", "json2.js", "runtime.js", "dictionary.js", "plist.js", "file.js", "exception.js", "preprocess.js", "evaluate.js", "bootstrap.js"); @@ -26,12 +26,12 @@ task ("build", [$BROWSER_FILE, $RHINO_FILE, $LICENSE_PRODUCT, $COMMONJS_PRODUCT, filedir ($BROWSER_FILE, Files, function(aTask) { - build_product(aTask.name(), platform_flags('browser', 'objj'));//ObjectiveJ::Platform::Browser, ObjectiveJ::Platform::ObjJ)) + build_product(aTask.name(), platform_flags('Browser', 'ObjJ')); }); filedir ($RHINO_FILE, Files, function(aTask) { - flags = platform_flags('rhino', 'objj');//ObjectiveJ::Platform::Rhino, ObjectiveJ::Platform::ObjJ) + flags = platform_flags('CommonJS', 'ObjJ'); flags += ' -DRHINO' build_product(aTask.name(), flags) diff --git a/Objective-J/Runtime/file.js b/Objective-J/Runtime/file.js index 2299e5f52..7c1059739 100644 --- a/Objective-J/Runtime/file.js +++ b/Objective-J/Runtime/file.js @@ -394,7 +394,7 @@ objj_search.prototype.didReceiveBundleResponse = function(aResponse) // FIXME: Is this the right approach? // Request the compiled file regardless of whether our current inquiry var directory = DIRECTORY(aResponse.filePath), - replacedFiles = dictionary_getValue(bundle.info, "CPBundleReplacedFiles"), + replacedFiles = dictionary_getValue(dictionary_getValue(bundle.info, "CPBundleReplacedFiles"), platform), index = 0, count = replacedFiles.length;