Module: build-system Synopsis: A build-system for Dylan PC Applications in Dylan Author: Nosa Omo, Peter S. Housel 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 define constant $dylanmakefile = "dylanmakefile.mkf"; define constant $build-log-file = "build.log"; define settings () key-name "Build-System"; slot build-script :: = as(, merge-locators(as(, concatenate(as(, $platform-name), "-build.jam")), $system-lib)); end settings ; define constant $build-system-settings = make(); define function default-build-script () => (script :: ) as(, $build-system-settings.build-script) end function default-build-script; define function default-build-script-setter (script :: ) => (script :: ) $build-system-settings.build-script := as(, script); script end function default-build-script-setter; define method change-directory (directory :: ) if (~file-exists?(directory)) error("Invalid Directory %s", directory); else working-directory() := directory; end if; end method; define macro with-build-directory { with-build-directory (?directory:expression) ?:body end } => { let directory = ?directory; let previous-directory = if (directory) working-directory(); end; block() if (directory) change-directory(directory); end; ?body cleanup if (previous-directory) change-directory(previous-directory) end if; end block; } end macro; // Toplevel internal function that can be invoked by Dylan Clients define method build-system (build-targets :: , #key directory :: = working-directory(), progress-callback :: = ignore, build-script = default-build-script(), project-build-info, force?, configure? = #t) => (build-successful? :: ); if (configure?) configure-build-system(); end; let log-file = make(, directory: directory, name: $build-log-file); with-open-file (stream = log-file, direction: #"output") local method wrap-progress-callback(message-string :: , #rest keys) write-line(stream, message-string); apply(progress-callback, message-string, keys); end method; block () let handler = method (w :: , next :: ) wrap-progress-callback(condition-to-string(w), warning?: #t); end; let jam = make-jam-state(build-script, progress-callback: wrap-progress-callback, build-directory: directory); with-build-directory (directory) jam-read-mkf(jam, as(, $dylanmakefile)); format(stream, "building targets:"); for (target in build-targets) format(stream, " %s", target); end for; new-line(stream); jam-target-build(jam, build-targets, progress-callback: wrap-progress-callback, force?: force?); end; exception (e :: ) wrap-progress-callback(condition-to-string(e), error?: #t); end block; end with-open-file; end method;