Module: dfmc-projects Synopsis: DFMC project manager interface Author: Andy Armstrong, Roman Budzianowski Copyright: Original Code is Copyright (c) 1995-2004 Functional Objects, Inc. All rights reserved. License: Functional Objects Library Public License Version 1.0 Dual-license: GNU Lesser General Public License Warranty: Distributed WITHOUT WARRANTY OF ANY KIND /// Useful constants define constant $platform-variable = "OPEN_DYLAN_PLATFORM_NAME"; define constant $default-platform = $platform-name; define constant = ; define constant = ; /// DFMC build request define class () slot build-canonical-projects :: = make(); end class ; define method build-canonicalized-project (build :: , project :: ) => (canonicalized? :: ) member?(project, build.build-canonical-projects) end method build-canonicalized-project; define method build-canonicalized-project-setter (canonicalized? :: , build :: , project :: ) => (canonicalized? :: ) add-new!(build.build-canonical-projects, project) end method build-canonicalized-project-setter; define method clear-build-canonicalized-projects (build :: ) => () remove-all-keys!(build.build-canonical-projects) end method clear-build-canonicalized-projects; /// DFMC project workspace define class () constant slot workspace-processor :: , required-init-keyword: processor:; constant slot workspace-operating-system :: , required-init-keyword: operating-system:; constant slot workspace-projects :: = make(); slot workspace-build-target :: false-or() = #f; slot %registries :: false-or() = #f; slot workspace-debug-target :: false-or() = #f; end class ; define method make-default-workspace () => (workspace :: ) let (processor, os) = default-platform-info(); make(, processor: processor, operating-system: os) end method make-default-workspace; default-workspace() := make-default-workspace(); define method workspace-registries (workspace :: ) => (registries :: ) workspace.%registries | begin let processor = workspace.workspace-processor; let os = workspace.workspace-operating-system; workspace.%registries := platform-registries(processor, os) end end method workspace-registries; define method compilation-context-workspace (context :: ) => (workspace :: ) let project = context.compilation-context-project; project.project-workspace end method compilation-context-workspace; define method note-workspace-build-operation-started (workspace :: , target :: ) => () workspace.workspace-build-target := target end method note-workspace-build-operation-started; define method note-workspace-build-operation-finished (workspace :: ) => () let target = workspace.workspace-build-target; workspace.workspace-build-target := #f; clear-build-canonicalized-projects(target.target-build-state) end method note-workspace-build-operation-finished; /// DFMC project define sealed abstract class () constant slot project-execution-contexts :: = make(); end class ; define sealed method open-project (workspace :: , locator :: , #key read-only? :: = #f) => (project :: ) find-open-project(workspace, locator, read-only?: read-only?) | begin let extension = locator.locator-extension; let project :: = select (extension by \=) lid-file-extension() => open-lid-project(workspace, locator); project-file-extension() => open-hdp-project(workspace, locator); database-file-extension() => open-binary-project(workspace, locator); otherwise => error("Invalid project file %s", locator); end; add!(workspace.workspace-projects, project); project end end method open-project; define sealed method find-open-project (workspace :: , locator :: , #key read-only? :: = #f) => (project :: false-or()) let projects = workspace.workspace-projects; block (return) for (project :: in projects) if (project.project-file-location = locator & project.project-read-only? == read-only?) return(project) end end; #f end end method find-open-project; define sealed method find-project (workspace :: , name :: ) => (project :: false-or()) let projects = workspace.workspace-projects; block (return) for (project :: in projects) if (project.project-name == name) return(project) end end; find-project-in-registry(workspace, name) | find-binary-project(workspace, name) end end method find-project; /// DFMC build target define class () slot target-compilation-context :: false-or() = #f, init-keyword: compilation-context:; end class ; define method make-workspace-build-target (workspace :: , #rest args, #key, #all-keys) => (target :: ) apply(make, , args) end method make-workspace-build-target; define method target-canonical-source-records (target :: ) => (records :: ) let context = target.target-compilation-context; case context => context.compilation-context-sources; otherwise => #[]; end end method target-canonical-source-records; define method compilation-context-target (context :: ) => (target :: ) let workspace = context.compilation-context-workspace; workspace.workspace-build-target end method compilation-context-target; define method target-browsing-context (target :: ) => (context :: ) target.target-compilation-context end method target-browsing-context; /// Platform information define sideways method default-platform-info () => (processor :: , os :: ) let platform = environment-variable($platform-variable) | $default-platform; let name = as-lowercase(as(, platform)); let separator-position = position(name, '-'); let processor-name = copy-sequence(name, end: separator-position); let os-name = copy-sequence(name, start: separator-position + 1); values(as(, processor-name), as(, os-name)) end method default-platform-info;