mirror of
https://github.com/cappuccino/cappuccino.git
synced 2026-09-27 12:47:42 +00:00
New: Support to compile deep structured project in the web browser
A Cappuccino project has always needed to have a flat file structure to be able to compile from source in the web browser. A new dictionary can be added to the project's Info.plist with the key 'CPFileTranslationDictionary'. It should contain all the path translations in the project to allow the Browser to find out where in the file structure the source files are. Check in the AppKit framework for an example. Also, a include list can be added in the Info.plist for the key 'CPCompileIncludeFileArray'. The file in the list will be included by a '#include' statement for each file that is compiled in this project A last new feature is to add macros in the 'OBJJ_COMPILER_FLAGS' global variable. It is usually declared in the index.html file. It is done with the format '-Dmacroname[=macrodefinition]'. An updated Info.plist file in the AppKit framework will allow the AppKit to compile from the source in the web browser. The following things is needed to get this to work: 1. Replace the AppKit folder in your project's Frameworks folder with a copy of the AppKit folder from the Cappuccino project. 2. Add a copy of the built Aristo2.blend folder to the AppKit's Resource folder. 3. Add "-DPLATFORM_DOM", "-DPLATFORM_BROWSER" and optionally "-DDEBUG" to the global variable 'OBJJ_COMPILER_FLAGS' in the project's index.html file. The app load time will increase (about 3 seconds on a 2018 MacBook Pro) as the AppKit framework is compiled from source. The Foundation framework is not yet tested but it might be working by adding info about the file structure in the Info.plist file.
This commit is contained in:
+58
-33
@@ -24,8 +24,7 @@
|
||||
var ExecutableUnloadedFileDependencies = 0,
|
||||
ExecutableLoadingFileDependencies = 1,
|
||||
ExecutableLoadedFileDependencies = 2,
|
||||
ExecutableCantStartLoadYetFileDependencies = 3,
|
||||
AnonymousExecutableCount = 0;
|
||||
AnonymousExecutableCount = 0;
|
||||
|
||||
function Executable(/*String*/ aCode, /*Array*/ fileDependencies, /*CFURL|String*/ aURL, /*Function*/ aFunction, /*ObjJCompiler*/aCompiler, /*Dictionary*/ aFilenameTranslateDictionary, /* Base64 String */ sourceMap)
|
||||
{
|
||||
@@ -44,13 +43,7 @@ function Executable(/*String*/ aCode, /*Array*/ fileDependencies, /*CFURL|String
|
||||
if (sourceMap)
|
||||
this._base64EncodedSourceMap = sourceMap;
|
||||
|
||||
// This is a little hacky but if fileDependencies is null we can start loading file dependencies yet
|
||||
if (!fileDependencies)
|
||||
{
|
||||
this._fileDependencyStatus = ExecutableCantStartLoadYetFileDependencies;
|
||||
this._fileDependencyCallbacks = [];
|
||||
}
|
||||
else if (fileDependencies.length)
|
||||
if (fileDependencies.length)
|
||||
{
|
||||
this._fileDependencyStatus = ExecutableUnloadedFileDependencies;
|
||||
this._fileDependencyCallbacks = [];
|
||||
@@ -188,9 +181,10 @@ Executable.prototype.execute = function()
|
||||
|
||||
this.setCode(this._compiler.compilePass2(), this._compiler.map());
|
||||
|
||||
if (FileExecutable.printWarningsAndErrors(this._compiler, exports.messageOutputFormatInXML))
|
||||
if (Executable.printWarningsAndErrors(this._compiler, exports.messageOutputFormatInXML))
|
||||
throw "Compilation error";
|
||||
|
||||
// We don't need to save the AST tree and the source code. It will take up a lot of memory.
|
||||
this._compiler = null;
|
||||
}
|
||||
|
||||
@@ -314,8 +308,9 @@ Executable.prototype.loadFileDependencies = function(aCallback)
|
||||
|
||||
if (status === ExecutableUnloadedFileDependencies)
|
||||
{
|
||||
if (fileDependencyLoadCount)
|
||||
throw "Can't load";
|
||||
if (fileDependencyLoadCount) {
|
||||
throw "Can't load: " + this.URL().absoluteURL();
|
||||
}
|
||||
|
||||
loadFileDependenciesForExecutable(this);
|
||||
}
|
||||
@@ -323,20 +318,12 @@ Executable.prototype.loadFileDependencies = function(aCallback)
|
||||
|
||||
DISPLAY_NAME(Executable.prototype.loadFileDependencies);
|
||||
|
||||
Executable.prototype.setExecutableUnloadedFileDependencies = function()
|
||||
Executable.prototype.hasExecutableUnloadedFileDependencies = function()
|
||||
{
|
||||
if (this._fileDependencyStatus === ExecutableCantStartLoadYetFileDependencies)
|
||||
this._fileDependencyStatus = ExecutableUnloadedFileDependencies;
|
||||
return this._fileDependencyStatus === ExecutableUnloadedFileDependencies;
|
||||
}
|
||||
|
||||
DISPLAY_NAME(Executable.prototype.setExecutableUnloadedFileDependencies);
|
||||
|
||||
Executable.prototype.isExecutableCantStartLoadYetFileDependencies = function()
|
||||
{
|
||||
return this._fileDependencyStatus === ExecutableCantStartLoadYetFileDependencies;
|
||||
}
|
||||
|
||||
DISPLAY_NAME(Executable.prototype.setExecutableUnloadedFileDependencies);
|
||||
DISPLAY_NAME(Executable.prototype.hasExecutableUnloadedFileDependencies);
|
||||
|
||||
function loadFileDependenciesForExecutable(/*Executable*/ anExecutable)
|
||||
{
|
||||
@@ -442,6 +429,7 @@ DISPLAY_NAME(Executable.prototype.fileExecutableSearcher);
|
||||
|
||||
var cachedFileExecuters = { };
|
||||
|
||||
// All the file dependences must be loaded and executed before this can be executed.
|
||||
Executable.fileExecuterForURL = function(/*CFURL|String*/ aURL)
|
||||
{
|
||||
var referenceURL = makeAbsoluteURL(aURL),
|
||||
@@ -512,16 +500,6 @@ DISPLAY_NAME(Executable.fileImporterForURL);
|
||||
var cachedFileExecutableSearchers = { },
|
||||
cachedFileExecutableSearchResults = { };
|
||||
|
||||
function countProp(x) {
|
||||
var count = 0;
|
||||
for (var k in x) {
|
||||
if (x.hasOwnProperty(k)) {
|
||||
++count;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
Executable.resetCachedFileExecutableSearchers = function()
|
||||
{
|
||||
cachedFileExecutableSearchers = { };
|
||||
@@ -583,6 +561,53 @@ Executable.fileExecutableSearcherForURL = function(/*CFURL*/ referenceURL)
|
||||
|
||||
DISPLAY_NAME(Executable.fileExecutableSearcherForURL);
|
||||
|
||||
/*!
|
||||
This funtion prints all errors and warnings for the provided compiler. It returns true if there
|
||||
are any errors in the list. it will print it in xml format if printXML is 'true'
|
||||
*/
|
||||
Executable.printWarningsAndErrors = function(/*ObjJCompiler*/ compiler, /*BOOL*/ printXML)
|
||||
{
|
||||
var warnings = [],
|
||||
anyErrors = false;
|
||||
|
||||
for (var i = 0; i < compiler.warningsAndErrors.length; i++)
|
||||
{
|
||||
var warning = compiler.warningsAndErrors[i],
|
||||
message = compiler.prettifyMessage(warning);
|
||||
|
||||
// Set anyErrors to 'true' if there are any errors in the list
|
||||
anyErrors = anyErrors || warning.messageType === "ERROR";
|
||||
#ifdef BROWSER
|
||||
console.log(message);
|
||||
#else
|
||||
if (printXML)
|
||||
{
|
||||
var dict = new CFMutableDictionary();
|
||||
if (warning.messageOnLine != null) dict.addValueForKey('line', warning.messageOnLine)
|
||||
if (warning.path != null) dict.addValueForKey('sourcePath', new CFURL(warning.path).path())
|
||||
if (message != null) dict.addValueForKey('message', message)
|
||||
|
||||
warnings.push(dict);
|
||||
}
|
||||
else
|
||||
{
|
||||
print(message);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef BROWSER
|
||||
if (warnings.length && printXML)
|
||||
try {
|
||||
print(CFPropertyListCreateXMLData(warnings, kCFPropertyListXMLFormat_v1_0).rawString());
|
||||
} catch (e) {
|
||||
print ("XML encode error: " + e);
|
||||
}
|
||||
#endif
|
||||
|
||||
return anyErrors;
|
||||
}
|
||||
|
||||
/*
|
||||
* Adaption to javascript by Malte Tancred 2012 from ConvertUTF.[ch] by Unicode, Inc.
|
||||
* Speed improvements by Martin Carlberg 2016
|
||||
|
||||
Reference in New Issue
Block a user