source: trunk/base/src/port/buildall.tcl @ 4601

Last change on this file since 4601 was 4601, checked in by jkh, 17 years ago

*slap* - append access, not write!

  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 3.1 KB
Line 
1#!@TCLSH@
2# Traverse through all ports and try to build/install each one.
3# should be run in a chroot tree unless you don't mind permuting the host
4# system.
5
6package require darwinports
7dportinit
8package require Pextlib
9
10global target uniquestr
11
12# UI Instantiations - These custom versions go to a debugging log.
13#
14# ui_options(ports_debug) - If set, output debugging messages.
15# ui_options(ports_verbose) - If set, output info messages (ui_info)
16# ui_options(ports_quiet) - If set, don't output "standard messages"
17
18# ui_options accessor
19proc ui_isset {val} {
20    global ui_options
21    if {[info exists ui_options($val)]} {
22        if {$ui_options($val) == "yes"} {
23            return 1
24        }
25    }
26    return 0
27}
28
29# UI Callback
30
31proc ui_puts {messagelist} {
32    global uniquestr
33
34    set channel [open "/tmp/portbuild.out" a+ 0644]
35    array set message $messagelist
36    switch $message(priority) {
37        debug {
38            if {[ui_isset ports_debug]} {
39                close $channel
40                set channel [open "/tmp/portdebug.out" a+ 0664]
41                set str "${uniquestr}DEBUG: $message(data)"
42            } else {
43                close $channel
44                return
45            }
46        }
47        info {
48            set str "${uniquestr}OUT: $message(data)"
49        }
50        msg {
51            set str "${uniquestr}OUT: $message(data)"
52        }
53        error {
54            set str "${uniquestr}ERR: $message(data)"
55        }
56        warn {
57            set str "${uniquestr}WARN: $message(data)"
58        }
59    }
60    puts $channel $str
61    close $channel
62}
63
64proc port_traverse {func {dir .}} {
65    set pwd [pwd]
66    if {[catch {cd $dir} err]} {
67        ui_error $err
68        return
69    }
70    foreach name [readdir .] {
71        if {[string match $name .] || [string match $name ..]} {
72            continue
73        }
74        if {[file isdirectory $name]} {
75            port_traverse $func $name
76        } else {
77            if {[string match $name Portfile]} {
78                catch {eval $func {[file join $pwd $dir]}}
79            }
80        }
81    }
82    cd $pwd
83}
84
85proc pindex {portdir} {
86    global target options variations
87
88    if {[catch {set interp [dportopen file://$portdir [array get options] [array get variations]]} err]} {
89        puts "Error: Couldn't create interpreter for $portdir: $err"
90        return -1
91    }
92    array set portinfo [dportinfo $interp]
93    dportexec $interp $target
94    dportclose $interp
95}
96
97# Main
98
99# zero-out the options array
100array set options [list]
101array set variations [list]
102
103set target install
104# Set to something unique that can be grepped out of the output easily
105set uniquestr "_BLDA_"
106set env(UI_PREFIX) "${uniquestr}PHASE: "
107
108if { $argc >= 1 } {
109    for {set i 0} {$i < $argc} {incr i} {
110        set arg [lindex $argv $i]
111
112        if {[regexp {([A-Za-z0-9_\.]+)=(.*)} $arg match key val] == 1} {
113            # option=value
114            set options($key) \"$val\"
115        } elseif {[regexp {^([-+])([-A-Za-z0-9_+\.]+)$} $arg match sign opt] == 1} {
116            # if +xyz -xyz or after the separator
117            set variations($opt) $sign
118        } else {
119            puts "Invalid argument: $arg"
120            return 1
121        }
122    }
123}
124
125if {[file isdirectory dports]} {
126    port_traverse pindex dports
127} elseif {[file isdirectory ../dports]} {
128    port_traverse pindex .
129} else {
130    puts "Please run me from the darwinports directory (dports/..)"
131    return 1
132}
Note: See TracBrowser for help on using the repository browser.