mirror of
https://github.com/cappuccino/cappuccino.git
synced 2026-10-24 17:18:54 +00:00
Give TextEditor a display name and a real bundle identifier, and replace the template copyright and author placeholders. * Info.plist: Set the bundle identifier to dev.cappuccino.TextEditor, add the display name TextEdit by Cappuccino, and state the MIT license in the copyright string. * Jakefile: Set the same bundle identifier and remove the placeholder email. * Resources/MainMenu.xib, Resources/MainMenu.cib: Use the display name in the application menu, About and Help items.
198 lines
6.9 KiB
JavaScript
198 lines
6.9 KiB
JavaScript
/*
|
|
* Jakefile
|
|
* TextEditor
|
|
*
|
|
* Copyright (c) 2026 David Richardson
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
* in the Software without restriction, including without limitation the rights
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
* furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in all
|
|
* copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
* SOFTWARE.
|
|
*/
|
|
|
|
const path = require("path");
|
|
const fs = require("fs");
|
|
|
|
var ENV = process.env,
|
|
task = JAKE.task,
|
|
FileList = JAKE.FileList,
|
|
app = CAPPUCCINO.Jake.applicationtask.app,
|
|
configuration = ENV["CONFIG"] || ENV["CONFIGURATION"] || ENV["c"] || "Debug",
|
|
OS = require("os"),
|
|
projectName = "TextEditor";
|
|
|
|
var buildDir = path.resolve(ENV["BUILD_PATH"] || ENV["CAPP_BUILD"] || "Build");
|
|
|
|
app (projectName, function(task)
|
|
{
|
|
ENV["OBJJ_INCLUDE_PATHS"] = "Frameworks";
|
|
|
|
if (configuration === "Debug")
|
|
ENV["OBJJ_INCLUDE_PATHS"] = path.join(ENV["OBJJ_INCLUDE_PATHS"], configuration);
|
|
|
|
task.setBuildIntermediatesPath(path.join(buildDir, "TextEditor.build", configuration));
|
|
task.setBuildPath(path.join(buildDir, configuration));
|
|
|
|
task.setProductName("TextEditor");
|
|
task.setIdentifier("dev.cappuccino.TextEditor");
|
|
task.setVersion("1.0");
|
|
task.setAuthor("David Richardson");
|
|
task.setSummary("TextEditor");
|
|
task.setSources(new FileList("**/*.j").exclude(path.join("Build", "**")).exclude(path.join("Frameworks", "Source", "**")));
|
|
task.setResources(new FileList("Resources/**"));
|
|
task.setIndexFilePath("index.html");
|
|
task.setInfoPlistPath("Info.plist");
|
|
|
|
if (configuration === "Debug")
|
|
task.setCompilerFlags("-DDEBUG -g -S --inline-msg-send");
|
|
else
|
|
task.setCompilerFlags("-O2");
|
|
});
|
|
|
|
task ("default", [projectName], function()
|
|
{
|
|
printResults(configuration);
|
|
});
|
|
|
|
task ("build", ["default"], function()
|
|
{
|
|
updateApplicationSize();
|
|
});
|
|
|
|
task ("debug", function()
|
|
{
|
|
configuration = ENV["CONFIGURATION"] = "Debug";
|
|
JAKE.subjake(["."], "build", ENV);
|
|
});
|
|
|
|
task ("release", function()
|
|
{
|
|
configuration = ENV["CONFIGURATION"] = "Release";
|
|
JAKE.subjake(["."], "build", ENV);
|
|
});
|
|
|
|
task ("run", ["debug"], function()
|
|
{
|
|
OS.system(["open", path.join(buildDir, "Debug", projectName, "index.html")]);
|
|
});
|
|
|
|
task ("run-release", ["release"], function()
|
|
{
|
|
OS.system(["open", path.join(buildDir, "Release", projectName, "index.html")]);
|
|
});
|
|
|
|
task ("deploy", ["release"], function()
|
|
{
|
|
FILE.mkdirs(path.join(buildDir, "Deployment", projectName));
|
|
OS.system(["press", "-f", path.join(buildDir, "Release", projectName), path.join(buildDir, "Deployment", projectName)]);
|
|
printResults("Deployment")
|
|
});
|
|
|
|
function printResults(configuration)
|
|
{
|
|
console.log("----------------------------");
|
|
console.log(configuration+" app built at path: " + path.join(buildDir, configuration, projectName));
|
|
console.log("----------------------------");
|
|
}
|
|
|
|
function updateApplicationSize()
|
|
{
|
|
console.log("Calculating application file sizes...");
|
|
|
|
var contents = fs.readFileSync(path.join(buildDir, configuration, projectName, "Info.plist"), { encoding: "utf8" }),
|
|
format = CFPropertyList.sniffedFormatOfString(contents),
|
|
plist = CFPropertyList.propertyListFromString(contents),
|
|
totalBytes = {executable:0, data:0, mhtml:0};
|
|
|
|
// Get the size of all framework executables and sprite data
|
|
var frameworksDir = "Frameworks";
|
|
|
|
if (configuration === "Debug")
|
|
frameworksDir = path.join(frameworksDir, "Debug");
|
|
|
|
var frameworks = [];
|
|
|
|
if (fs.existsSync(frameworksDir)) {
|
|
frameworks = fs.readdirSync(frameworksDir);
|
|
}
|
|
//var frameworks = FILE.list(frameworksDir);
|
|
|
|
frameworks.forEach(function(framework)
|
|
{
|
|
if (framework !== "Source")
|
|
addBundleFileSizes(path.join(frameworksDir, framework), totalBytes);
|
|
});
|
|
|
|
// Read in the default theme name, and attempt to get its size
|
|
var themeName = plist.valueForKey("CPDefaultTheme") || "Aristo2",
|
|
themePath = nil;
|
|
|
|
if (themeName === "Aristo" || themeName === "Aristo2")
|
|
themePath = path.join(frameworksDir, "AppKit", "Resources", themeName + ".blend");
|
|
else
|
|
themePath = path.join("Frameworks", "Resources", themeName + ".blend");
|
|
|
|
if (fs.existsSync(themePath) && fs.lstatSync(themePath).isDirectory())
|
|
addBundleFileSizes(themePath, totalBytes);
|
|
|
|
// Add sizes for the app
|
|
addBundleFileSizes(path.join(buildDir, configuration, projectName), totalBytes);
|
|
|
|
console.log("Executables: " + totalBytes.executable + ", sprite data: " + totalBytes.data + ", total: " + (totalBytes.executable + totalBytes.data));
|
|
|
|
var dict = new CFMutableDictionary();
|
|
|
|
dict.setValueForKey("executable", totalBytes.executable);
|
|
dict.setValueForKey("data", totalBytes.data);
|
|
dict.setValueForKey("mhtml", totalBytes.mhtml);
|
|
|
|
plist.setValueForKey("CPApplicationSize", dict);
|
|
fs.writeFileSync(path.join(buildDir, configuration, projectName, "Info.plist"), CFPropertyList.stringFromPropertyList(plist, format), { encoding: "utf8" });
|
|
//FILE.write(path.join(buildDir, configuration, projectName, "Info.plist"), CFPropertyList.stringFromPropertyList(plist, format), { charset:"UTF-8" });
|
|
}
|
|
|
|
function addBundleFileSizes(bundlePath, totalBytes)
|
|
{
|
|
var bundleName = path.basename(bundlePath),
|
|
environment = bundleName === "Foundation" ? "Objj" : "Browser",
|
|
bundlePath = path.join(bundlePath, environment + ".environment");
|
|
|
|
if (fs.existsSync(bundlePath) && fs.lstatSync(bundlePath).isDirectory())
|
|
{
|
|
var filename = bundleName + ".sj",
|
|
filePath = path.join(bundlePath, filename);
|
|
|
|
if (fs.existsSync(filePath)) {
|
|
totalBytes.executable += fs.lstatSync(filePath).size;
|
|
}
|
|
|
|
filePath = path.join(bundlePath, "dataURLs.txt");
|
|
|
|
if (fs.existsSync(filePath))
|
|
totalBytes.data += fs.lstatSync(filePath).size;
|
|
|
|
filePath = path.join(bundlePath, "MHTMLData.txt");
|
|
|
|
if (fs.existsSync(filePath))
|
|
totalBytes.mhtml += fs.lstatSync(filePath).size;
|
|
|
|
filePath = path.join(bundlePath, "MHTMLPaths.txt");
|
|
|
|
if (fs.existsSync(filePath))
|
|
totalBytes.mhtml += fs.lstatSync(filePath).size;
|
|
}
|
|
}
|