|
|
|
|
#!/usr/bin/wish
|
|
|
|
|
# ----------------------------------------------------------------------------
|
|
|
|
|
# "THE BEER-WARE LICENSE" (Revision 42) (by Poul-Henning Kamp):
|
|
|
|
|
# Joerg Wunsch <j.gnu@uriah.heep.sax.de> wrote this file. As long as you
|
|
|
|
|
# retain this notice you can do whatever you want with this stuff. If we meet
|
|
|
|
|
# some day, and you think this stuff is worth it, you can buy me a beer
|
|
|
|
|
# in return.
|
|
|
|
|
# ----------------------------------------------------------------------------
|
|
|
|
|
#
|
|
|
|
|
# Simple Makefile generator for AVR-GCC
|
|
|
|
|
#
|
|
|
|
|
# $Id: mfile.tcl,v 2.12 2008/11/06 03:35:52 arcanum Exp $
|
|
|
|
|
|
|
|
|
|
# Full path name where various files will be found
|
|
|
|
|
|
|
|
|
|
if {[info exists env(MFILE_HOME)]} {
|
|
|
|
|
set prefix $env(MFILE_HOME)
|
|
|
|
|
} else {
|
|
|
|
|
if {$tcl_platform(platform) == "unix"} {
|
|
|
|
|
set prefix "/usr/local/share/mfile"
|
|
|
|
|
} else {
|
|
|
|
|
set prefix "."
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
set templatename "$prefix/makefile_template"
|
|
|
|
|
set helpfile "$prefix/help.html"
|
|
|
|
|
set mainicon "$prefix/mfile.xbm"
|
|
|
|
|
set helpicon "$prefix/htmlview.xbm"
|
|
|
|
|
|
|
|
|
|
global helpfile mainicon helpicon
|
|
|
|
|
|
|
|
|
|
# color to highlight changed items with
|
|
|
|
|
global highlight
|
|
|
|
|
set highlight "\#ffff80"
|
|
|
|
|
|
|
|
|
|
#
|
|
|
|
|
# end of configurable section
|
|
|
|
|
#
|
|
|
|
|
|
|
|
|
|
global devicelist
|
|
|
|
|
set devicelist \
|
|
|
|
|
{ {at90can32 0x800900} \
|
|
|
|
|
{at90can64 0x801100} \
|
|
|
|
|
{at90can128 0x801100} \
|
|
|
|
|
at90pwm1 \
|
|
|
|
|
at90pwm2 \
|
|
|
|
|
at90pwm216 \
|
|
|
|
|
at90pwm2b \
|
|
|
|
|
at90pwm3 \
|
|
|
|
|
at90pwm316 \
|
|
|
|
|
at90pwm3b \
|
|
|
|
|
at90s1200 \
|
|
|
|
|
at90s2313 \
|
|
|
|
|
at90s2323 \
|
|
|
|
|
at90s2333 \
|
|
|
|
|
at90s2343 \
|
|
|
|
|
{at90s4414 0x800160} \
|
|
|
|
|
at90s4433 \
|
|
|
|
|
at90s4434 \
|
|
|
|
|
{at90s8515 0x800260} \
|
|
|
|
|
at90s8535 \
|
|
|
|
|
at90usb1286 \
|
|
|
|
|
at90usb1287 \
|
|
|
|
|
at90usb162 \
|
|
|
|
|
at90usb646 \
|
|
|
|
|
at90usb647 \
|
|
|
|
|
at90usb82 \
|
|
|
|
|
{atmega103 0x801000} \
|
|
|
|
|
{atmega128 0x801100} \
|
|
|
|
|
{atmega1280 0x802200} \
|
|
|
|
|
{atmega1281 0x802200} \
|
|
|
|
|
atmega1284p \
|
|
|
|
|
atmega16 \
|
|
|
|
|
{atmega161 0x800460} \
|
|
|
|
|
{atmega162 0x800500} \
|
|
|
|
|
atmega163 \
|
|
|
|
|
atmega164p \
|
|
|
|
|
atmega165 \
|
|
|
|
|
atmega165p \
|
|
|
|
|
atmega168 \
|
|
|
|
|
atmega168p \
|
|
|
|
|
atmega169 \
|
|
|
|
|
atmega169p \
|
|
|
|
|
atmega2560 \
|
|
|
|
|
atmega2561 \
|
|
|
|
|
atmega32 \
|
|
|
|
|
atmega323 \
|
|
|
|
|
atmega324p \
|
|
|
|
|
atmega325 \
|
|
|
|
|
atmega325p \
|
|
|
|
|
atmega3250 \
|
|
|
|
|
atmega328p \
|
|
|
|
|
atmega329 \
|
|
|
|
|
atmega329p \
|
|
|
|
|
atmega3290 \
|
|
|
|
|
atmega3290p \
|
|
|
|
|
atmega32c1 \
|
|
|
|
|
atmega32m1 \
|
|
|
|
|
atmega32u4 \
|
|
|
|
|
atmega32u6 \
|
|
|
|
|
atmega406 \
|
|
|
|
|
atmega48 \
|
|
|
|
|
atmega48p \
|
|
|
|
|
{atmega64 0x801100} \
|
|
|
|
|
{atmega640 0x802200} \
|
|
|
|
|
atmega644 \
|
|
|
|
|
atmega644p \
|
|
|
|
|
atmega645 \
|
|
|
|
|
atmega6450 \
|
|
|
|
|
atmega649 \
|
|
|
|
|
atmega6490 \
|
|
|
|
|
atmega8 \
|
|
|
|
|
{atmega8515 0x800260} \
|
|
|
|
|
atmega8535 \
|
|
|
|
|
atmega88
|
|
|
|
|
atmega88p
|
|
|
|
|
attiny11 \
|
|
|
|
|
attiny12 \
|
|
|
|
|
attiny13 \
|
|
|
|
|
attiny13a \
|
|
|
|
|
attiny15 \
|
|
|
|
|
attiny167 \
|
|
|
|
|
attiny22 \
|
|
|
|
|
attiny2313 \
|
|
|
|
|
attiny24 \
|
|
|
|
|
attiny25 \
|
|
|
|
|
attiny26 \
|
|
|
|
|
attiny261 \
|
|
|
|
|
attiny28 \
|
|
|
|
|
attiny43u \
|
|
|
|
|
attiny44 \
|
|
|
|
|
attiny45 \
|
|
|
|
|
attiny461 \
|
|
|
|
|
attiny48 \
|
|
|
|
|
attiny84 \
|
|
|
|
|
attiny85 \
|
|
|
|
|
attiny861 \
|
|
|
|
|
attiny88 \
|
|
|
|
|
at94K \
|
|
|
|
|
at76c711 \
|
|
|
|
|
at43usb320 \
|
|
|
|
|
at43usb355 \
|
|
|
|
|
at86rf401 \
|
|
|
|
|
atxmega64a1 \
|
|
|
|
|
atxmega64a3 \
|
|
|
|
|
atxmega128a1 \
|
|
|
|
|
atxmega128a3 \
|
|
|
|
|
atxmega256a3 \
|
|
|
|
|
atxmega256a3b }
|
|
|
|
|
|
|
|
|
|
global makefile
|
|
|
|
|
|
|
|
|
|
global filename
|
|
|
|
|
set filename "Makefile"
|
|
|
|
|
global basename
|
|
|
|
|
set basename $filename
|
|
|
|
|
|
|
|
|
|
global backupsuffix
|
|
|
|
|
if {$tcl_platform(platform) == "unix"} {
|
|
|
|
|
set backupsuffix "~"
|
|
|
|
|
} else {
|
|
|
|
|
set backupsuffix ".bak"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
global extmemparts
|
|
|
|
|
foreach m $devicelist {
|
|
|
|
|
if {[llength $m] > 1} {
|
|
|
|
|
set extmemparts([lindex $m 0]) [lindex $m 1]
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
global extmemmax memoffset
|
|
|
|
|
set extmemmax [expr 0x80ffff]
|
|
|
|
|
set memoffset [expr 0x800000]
|
|
|
|
|
|
|
|
|
|
proc parsetemplate {fname} {
|
|
|
|
|
global makefile
|
|
|
|
|
|
|
|
|
|
set fh [open $fname]
|
|
|
|
|
set template [read $fh]
|
|
|
|
|
close $fh
|
|
|
|
|
|
|
|
|
|
global mainfile mcutype oformat optlevel stdlevel src mainfilesrc
|
|
|
|
|
global asrc printfopts scanfopts deftarget avrdudeprog avrdudeport
|
|
|
|
|
global dformat
|
|
|
|
|
global extmemsize extmemstart extmemopts
|
|
|
|
|
global extmemmax extmemparts memoffset
|
|
|
|
|
|
|
|
|
|
foreach v { mainfile mcutype oformat optlevel stdlevel src \
|
|
|
|
|
mainfilesrc asrc printfopts scanfopts deftarget \
|
|
|
|
|
avrdudeprog avrdudeport dformat \
|
|
|
|
|
extmemsize extmemstart extmemopts} {
|
|
|
|
|
if {[info exists $v]} {
|
|
|
|
|
unset $v
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# Now parse what we've got, and allocate our
|
|
|
|
|
# internal variables
|
|
|
|
|
if {[regexp {(?n)^MCU\s*=\s*(\S+)} $template dummy x]} {
|
|
|
|
|
set mcutype $x
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {[regexp {(?n)^TARGET\s*=\s*(\S+)} $template dummy x]} {
|
|
|
|
|
set mainfile $x
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {[regexp {(?n)^FORMAT\s*=\s*(\S+)} $template dummy x]} {
|
|
|
|
|
set oformat $x
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {[regexp {(?n)^OPT\s*=\s*(\S+)} $template dummy x]} {
|
|
|
|
|
set optlevel $x
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {[regexp {(?n)^DEBUG\s*=\s*(\S+)} $template dummy x]} {
|
|
|
|
|
set dformat $x
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {[regexp {(?n)^CSTANDARD\s*=\s*-std=(\S+)} $template dummy x]} {
|
|
|
|
|
set stdlevel $x
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {[regexp {(?n)^SRC\s*=\s*(.*)$} $template dummy x]} {
|
|
|
|
|
if {[regexp {(.*)\$[(]TARGET[)].c(.*)} $x dummy y z]} {
|
|
|
|
|
# replace multiple consecutive spaces by just one
|
|
|
|
|
regsub -all {\s+} "$y$z" " " y
|
|
|
|
|
set src $y
|
|
|
|
|
# mainfilesrc == 1 means include $(TARGET).c into SRC
|
|
|
|
|
set mainfilesrc 1
|
|
|
|
|
} else {
|
|
|
|
|
set src $x
|
|
|
|
|
# mainfilesrc == 0 means do not include $(TARGET).c into SRC
|
|
|
|
|
set mainfilesrc 0
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {[regexp {(?n)^ASRC\s*=\s*(\S+)} $template dummy x]} {
|
|
|
|
|
set asrc ""
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {[regexp {(?n)^PRINTF_LIB\s*=\s*(\S+)} $template dummy x]} {
|
|
|
|
|
if {$x == {$(PRINTF_LIB_MIN)}} {
|
|
|
|
|
set printfopts "min"
|
|
|
|
|
} elseif {$x == {$(PRINTF_LIB_FLOAT)}} {
|
|
|
|
|
set printfopts "flt"
|
|
|
|
|
} else {
|
|
|
|
|
set printfopts "none"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {[regexp {(?n)^SCANF_LIB\s*=\s*(\S+)} $template dummy x]} {
|
|
|
|
|
if {$x == {$(SCANF_LIB_MIN)}} {
|
|
|
|
|
set scanfopts "min"
|
|
|
|
|
} elseif {$x == {$(SCANF_LIB_FLOAT)}} {
|
|
|
|
|
set scanfopts "flt"
|
|
|
|
|
} else {
|
|
|
|
|
set scanfopts "none"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {[regexp {(?n)^EXTMEMOPTS\s*=(.*)$} $template dummy x]} {
|
|
|
|
|
if {[regexp -- {--section-start[,=]\.data=([0-9a-fA-Fx]+).*__heap_end=([0-9a-fA-Fx]+)} \
|
|
|
|
|
$x dummy y1 y2]} {
|
|
|
|
|
# variables & heap are in external RAM
|
|
|
|
|
set extmemopts "vars"
|
|
|
|
|
} elseif {[regexp \
|
|
|
|
|
{__heap_start=([0-9a-fA-Fx]+).*__heap_end=([0-9a-fA-Fx]+)} \
|
|
|
|
|
$x dummy y1 y2]} {
|
|
|
|
|
# only heap in external RAM
|
|
|
|
|
set extmemopts "heap"
|
|
|
|
|
} else {
|
|
|
|
|
set extmemopts "none"
|
|
|
|
|
if {$x != ""} {
|
|
|
|
|
complain "Unknown EXTMEMOPTS $x, ignored"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if {$extmemopts != "none"} {
|
|
|
|
|
set extmemstart [expr $y1]
|
|
|
|
|
if {[expr $y2 == $extmemmax]} {
|
|
|
|
|
set extmemsize [expr $extmemmax + 1]
|
|
|
|
|
} else {
|
|
|
|
|
set extmemsize [expr $y2 - $y1 + 1]
|
|
|
|
|
}
|
|
|
|
|
if {[info exists mcutype]} {
|
|
|
|
|
if {[info exists extmemparts($mcutype)]} {
|
|
|
|
|
if {[expr $extmemparts($mcutype) == $y1]} {
|
|
|
|
|
# extmemstart == 0 means "lowest possible value"
|
|
|
|
|
set extmemstart 0
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {[regexp {(?n)^build:\s*(.*)$} $template dummy x]} {
|
|
|
|
|
if {[regexp {\sextcoff\s*$} $x]} {
|
|
|
|
|
set deftarget "extcoff"
|
|
|
|
|
} elseif {[regexp {\scoff\s*$} $x]} {
|
|
|
|
|
set deftarget "coff"
|
|
|
|
|
} else {
|
|
|
|
|
set deftarget "none"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {[regexp {(?n)^AVRDUDE_PROGRAMMER\s*=\s*(\S+)} $template dummy x]} {
|
|
|
|
|
set avrdudeprog $x
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {[regexp {(?n)^AVRDUDE_PORT\s*=\s*(\S+)} $template dummy x]} {
|
|
|
|
|
set avrdudeport $x
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
set makefile $template
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc makemfilemenu {} {
|
|
|
|
|
global tcl_platform
|
|
|
|
|
global devicelist xram
|
|
|
|
|
global mainfile mcutype oformat optlevel stdlevel src mainfilesrc
|
|
|
|
|
global asrc printfopts scanfopts deftarget avrdudeprog avrdudeport
|
|
|
|
|
global dformat debugidx
|
|
|
|
|
global extmemsize extmemstart extmemopts
|
|
|
|
|
global extmemmax extmemparts extmemmentry memoffset
|
|
|
|
|
|
|
|
|
|
.f1.f1.mb2.m1 delete 0 last
|
|
|
|
|
foreach w [winfo children .f1.f1.mb2.m1] {
|
|
|
|
|
destroy $w
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.f1.f1.mb2.m1 add command -label {Code generation} -state disabled
|
|
|
|
|
if {[info exists mainfile]} {
|
|
|
|
|
.f1.f1.mb2.m1 add command -command {setmainfile} \
|
|
|
|
|
-label "Main file name..." -underline 0
|
|
|
|
|
}
|
|
|
|
|
if {[info exists mcutype]} {
|
|
|
|
|
.f1.f1.mb2.m1 add cascade -menu .f1.f1.mb2.m1.c1 \
|
|
|
|
|
-label "MCU type" \
|
|
|
|
|
-underline 2
|
|
|
|
|
}
|
|
|
|
|
if {[info exists oformat]} {
|
|
|
|
|
.f1.f1.mb2.m1 add cascade -menu .f1.f1.mb2.m1.c2 \
|
|
|
|
|
-label "Output format" \
|
|
|
|
|
-underline 7
|
|
|
|
|
}
|
|
|
|
|
if {[info exists optlevel]} {
|
|
|
|
|
.f1.f1.mb2.m1 add cascade -menu .f1.f1.mb2.m1.c3 \
|
|
|
|
|
-label "Optimization level" \
|
|
|
|
|
-underline 0
|
|
|
|
|
}
|
|
|
|
|
if {[info exists dformat]} {
|
|
|
|
|
.f1.f1.mb2.m1 add cascade -menu .f1.f1.mb2.m1.c30 \
|
|
|
|
|
-label "Debug format" \
|
|
|
|
|
-underline 0
|
|
|
|
|
}
|
|
|
|
|
if {[info exists stdlevel]} {
|
|
|
|
|
.f1.f1.mb2.m1 add cascade -menu .f1.f1.mb2.m1.c31 \
|
|
|
|
|
-label "C standard level" \
|
|
|
|
|
-underline 2
|
|
|
|
|
}
|
|
|
|
|
if {[info exists src]} {
|
|
|
|
|
.f1.f1.mb2.m1 add command -command {asksrc} \
|
|
|
|
|
-label "C/C++ source file(s)..." -underline 0
|
|
|
|
|
}
|
|
|
|
|
if {[info exists asrc]} {
|
|
|
|
|
.f1.f1.mb2.m1 add command -command {setasrc} \
|
|
|
|
|
-label "Assembler source file(s)..." -underline 0
|
|
|
|
|
}
|
|
|
|
|
if {[info exists printfopts]} {
|
|
|
|
|
.f1.f1.mb2.m1 add cascade -menu .f1.f1.mb2.m1.c4 \
|
|
|
|
|
-label "printf() options" \
|
|
|
|
|
-underline 0
|
|
|
|
|
}
|
|
|
|
|
if {[info exists scanfopts]} {
|
|
|
|
|
.f1.f1.mb2.m1 add cascade -menu .f1.f1.mb2.m1.c41 \
|
|
|
|
|
-label "scanf() options" \
|
|
|
|
|
-underline 3
|
|
|
|
|
}
|
|
|
|
|
if {[info exists extmemopts]} {
|
|
|
|
|
.f1.f1.mb2.m1 add cascade -menu .f1.f1.mb2.m1.c42 \
|
|
|
|
|
-label "External RAM options" \
|
|
|
|
|
-underline 1 -state disabled
|
|
|
|
|
set extmemmentry [.f1.f1.mb2.m1 index end]
|
|
|
|
|
if {[info exists mcutype]} {
|
|
|
|
|
if {[info exists extmemparts($mcutype)]} {
|
|
|
|
|
.f1.f1.mb2.m1 entryconfigure $extmemmentry \
|
|
|
|
|
-state normal
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if {[info exists deftarget] && ! [info exists dformat]} {
|
|
|
|
|
.f1.f1.mb2.m1 add cascade -menu .f1.f1.mb2.m1.c5 \
|
|
|
|
|
-label "Default \"make\" target" \
|
|
|
|
|
-underline 15
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.f1.f1.mb2.m1 add separator
|
|
|
|
|
.f1.f1.mb2.m1 add command -label {AVRdude} -state disabled
|
|
|
|
|
|
|
|
|
|
switch $tcl_platform(platform) {
|
|
|
|
|
"windows" {
|
|
|
|
|
set portlist {usb com1 com2 com3 com4 lpt1 lpt2 lpt3}
|
|
|
|
|
}
|
|
|
|
|
"unix" {
|
|
|
|
|
switch $tcl_platform(os) {
|
|
|
|
|
"Linux" {
|
|
|
|
|
set portlist {usb /dev/ttyS0 /dev/ttyS1 /dev/ttyS2 /dev/ttyS3 \
|
|
|
|
|
/dev/parport0 /dev/parport1 /dev/parport2}
|
|
|
|
|
}
|
|
|
|
|
"FreeBSD" {
|
|
|
|
|
set portlist {usb dev/cuaa0 /dev/cuaa1 /dev/cuaa2 /dev/cuaa3 \
|
|
|
|
|
/dev/ppi0 /dev/ppi1 /dev/ppi2}
|
|
|
|
|
}
|
|
|
|
|
"Solaris" {
|
|
|
|
|
set portlist {usb /dev/term/a /dev/term/b /dev/printers/0}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {[info exists avrdudeprog]} {
|
|
|
|
|
.f1.f1.mb2.m1 add cascade -menu .f1.f1.mb2.m1.c6 \
|
|
|
|
|
-label {Programmer} \
|
|
|
|
|
-underline 3
|
|
|
|
|
}
|
|
|
|
|
if {[info exists portlist] && [info exists avrdudeport]} {
|
|
|
|
|
.f1.f1.mb2.m1 add cascade -menu .f1.f1.mb2.m1.c7 \
|
|
|
|
|
-label {Port} \
|
|
|
|
|
-underline 2
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.f1.f1.mb2.m1 add separator
|
|
|
|
|
.f1.f1.mb2.m1 add command -label {Miscellaneous} -state disabled
|
|
|
|
|
.f1.f1.mb2.m1 add checkbutton -variable editwidget \
|
|
|
|
|
-label "Enable Editing of Makefile" \
|
|
|
|
|
-command changeeditable \
|
|
|
|
|
-onvalue normal -offvalue disabled
|
|
|
|
|
|
|
|
|
|
.f1.f1.mb2 configure -menu .f1.f1.mb2.m1
|
|
|
|
|
|
|
|
|
|
if {[info exists mcutype]} {
|
|
|
|
|
menu .f1.f1.mb2.m1.c1 -tearoff 0
|
|
|
|
|
.f1.f1.mb2.m1.c1 add cascade -menu .f1.f1.mb2.m1.c1.at90 \
|
|
|
|
|
-label "AT90" -underline 2
|
|
|
|
|
.f1.f1.mb2.m1.c1 add cascade -menu .f1.f1.mb2.m1.c1.atmega \
|
|
|
|
|
-label "ATmega" -underline 2
|
|
|
|
|
.f1.f1.mb2.m1.c1 add cascade -menu .f1.f1.mb2.m1.c1.attiny \
|
|
|
|
|
-label "ATtiny" -underline 2
|
|
|
|
|
.f1.f1.mb2.m1.c1 add cascade -menu .f1.f1.mb2.m1.c1.other \
|
|
|
|
|
-label "Other" -underline 0
|
|
|
|
|
|
|
|
|
|
menu .f1.f1.mb2.m1.c1.at90 -tearoff 0
|
|
|
|
|
menu .f1.f1.mb2.m1.c1.atmega -tearoff 0
|
|
|
|
|
menu .f1.f1.mb2.m1.c1.attiny -tearoff 0
|
|
|
|
|
menu .f1.f1.mb2.m1.c1.other -tearoff 0
|
|
|
|
|
|
|
|
|
|
foreach m $devicelist {
|
|
|
|
|
set mcu [lindex $m 0]
|
|
|
|
|
if {[llength $mcu] > 1} {
|
|
|
|
|
set xram($mcu) [lindex $m 1]
|
|
|
|
|
}
|
|
|
|
|
switch -glob $mcu {
|
|
|
|
|
"at90*" {
|
|
|
|
|
.f1.f1.mb2.m1.c1.at90 add radiobutton -variable mcutype \
|
|
|
|
|
-label $mcu -command setmcu
|
|
|
|
|
}
|
|
|
|
|
"atmega*" {
|
|
|
|
|
.f1.f1.mb2.m1.c1.atmega add radiobutton -variable mcutype \
|
|
|
|
|
-label $mcu -command setmcu
|
|
|
|
|
}
|
|
|
|
|
"attiny*" {
|
|
|
|
|
.f1.f1.mb2.m1.c1.attiny add radiobutton -variable mcutype \
|
|
|
|
|
-label $mcu -command setmcu
|
|
|
|
|
}
|
|
|
|
|
"*" {
|
|
|
|
|
.f1.f1.mb2.m1.c1.other add radiobutton -variable mcutype \
|
|
|
|
|
-label $mcu -command setmcu
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {[info exists oformat]} {
|
|
|
|
|
menu .f1.f1.mb2.m1.c2 -tearoff 0
|
|
|
|
|
|
|
|
|
|
foreach f {srec ihex binary} {
|
|
|
|
|
.f1.f1.mb2.m1.c2 add radiobutton -variable oformat \
|
|
|
|
|
-label $f -command setoformat
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {[info exists optlevel]} {
|
|
|
|
|
menu .f1.f1.mb2.m1.c3 -tearoff 0
|
|
|
|
|
|
|
|
|
|
foreach f {0 1 s 2 3} {
|
|
|
|
|
.f1.f1.mb2.m1.c3 add radiobutton -variable optlevel \
|
|
|
|
|
-label $f -command setoptlevel
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {[info exists dformat]} {
|
|
|
|
|
menu .f1.f1.mb2.m1.c30 -tearoff 0
|
|
|
|
|
|
|
|
|
|
if {[info exists deftarget]} {
|
|
|
|
|
# We've got both, DEBUG and the default target selection.
|
|
|
|
|
# Join them into a single menu entry.
|
|
|
|
|
if {$dformat == "dwarf-2"} {
|
|
|
|
|
set debugidx 3
|
|
|
|
|
} elseif {$deftarget == "none"} {
|
|
|
|
|
set debugidx 0
|
|
|
|
|
} elseif {$deftarget == "coff"} {
|
|
|
|
|
set debugidx 1
|
|
|
|
|
} elseif {$deftarget == "extcoff"} {
|
|
|
|
|
set debugidx 2
|
|
|
|
|
} else {
|
|
|
|
|
set debugidx 0
|
|
|
|
|
}
|
|
|
|
|
# Note that the order of the setdeftarget and setdformat
|
|
|
|
|
# calls below determines which of the edited fields will
|
|
|
|
|
# be displayed highlighted to the user. The last one
|
|
|
|
|
# wins. Thus, we highlight the stabs vs. dwarf-2 decision
|
|
|
|
|
# for the ELF formats, or the default build target for the
|
|
|
|
|
# COFF formats.
|
|
|
|
|
.f1.f1.mb2.m1.c30 add radiobutton \
|
|
|
|
|
-variable debugidx -value 0 \
|
|
|
|
|
-label "ELF/stabs (GDB/Insight)" \
|
|
|
|
|
-command {set dformat "stabs"; set deftarget "none"; \
|
|
|
|
|
setdeftarget; setdformat }
|
|
|
|
|
.f1.f1.mb2.m1.c30 add radiobutton \
|
|
|
|
|
-variable debugidx -value 1 \
|
|
|
|
|
-label {AVR-COFF (AVR Studio 3.x, VMLAB < 3.10 [obsolete])} \
|
|
|
|
|
-command {set dformat "stabs"; set deftarget "coff"; \
|
|
|
|
|
setdformat; setdeftarget }
|
|
|
|
|
.f1.f1.mb2.m1.c30 add radiobutton \
|
|
|
|
|
-variable debugidx -value 2 \
|
|
|
|
|
-label {AVR-ext-COFF (AVR Studio 4.07+, VMLAB 3.10+ [obsolete])} \
|
|
|
|
|
-command {set dformat "stabs"; set deftarget "extcoff"; \
|
|
|
|
|
setdformat; setdeftarget }
|
|
|
|
|
.f1.f1.mb2.m1.c30 add radiobutton \
|
|
|
|
|
-variable debugidx -value 3 \
|
|
|
|
|
-label {ELF/DWARF-2 (AVR Studio 4.11+)} \
|
|
|
|
|
-command {set dformat "dwarf-2"; set deftarget "none"; \
|
|
|
|
|
setdeftarget; setdformat }
|
|
|
|
|
} else {
|
|
|
|
|
foreach f {stabs dwarf-2} {
|
|
|
|
|
.f1.f1.mb2.m1.c30 add radiobutton -variable dformat \
|
|
|
|
|
-label $f -command setdformat
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {[info exists stdlevel]} {
|
|
|
|
|
menu .f1.f1.mb2.m1.c31 -tearoff 0
|
|
|
|
|
|
|
|
|
|
foreach f {c89 gnu89 c99 gnu99} {
|
|
|
|
|
.f1.f1.mb2.m1.c31 add radiobutton -variable stdlevel \
|
|
|
|
|
-label $f -command setstdlevel
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {[info exists printfopts]} {
|
|
|
|
|
menu .f1.f1.mb2.m1.c4 -tearoff 0
|
|
|
|
|
|
|
|
|
|
.f1.f1.mb2.m1.c4 add radiobutton -variable printfopts \
|
|
|
|
|
-label "none/standard" -underline 0 -value "none" -command setprintfopts
|
|
|
|
|
.f1.f1.mb2.m1.c4 add radiobutton -variable printfopts \
|
|
|
|
|
-label "minimalistic" -underline 0 -value "min" -command setprintfopts
|
|
|
|
|
.f1.f1.mb2.m1.c4 add radiobutton -variable printfopts \
|
|
|
|
|
-label "floating point" -underline 0 -value "flt" -command setprintfopts
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {[info exists scanfopts]} {
|
|
|
|
|
menu .f1.f1.mb2.m1.c41 -tearoff 0
|
|
|
|
|
|
|
|
|
|
.f1.f1.mb2.m1.c41 add radiobutton -variable scanfopts \
|
|
|
|
|
-label "none/standard" -underline 0 -value "none" -command setscanfopts
|
|
|
|
|
.f1.f1.mb2.m1.c41 add radiobutton -variable scanfopts \
|
|
|
|
|
-label "minimalistic" -underline 0 -value "min" -command setscanfopts
|
|
|
|
|
.f1.f1.mb2.m1.c41 add radiobutton -variable scanfopts \
|
|
|
|
|
-label "floating point + %\[" -underline 0 -value "flt" -command setscanfopts
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {[info exists extmemopts]} {
|
|
|
|
|
menu .f1.f1.mb2.m1.c42 -tearoff 0
|
|
|
|
|
|
|
|
|
|
.f1.f1.mb2.m1.c42 add radiobutton -variable extmemopts \
|
|
|
|
|
-label "none" -underline 0 -value "none" -command setextmemopts
|
|
|
|
|
.f1.f1.mb2.m1.c42 add radiobutton -variable extmemopts \
|
|
|
|
|
-label "variables & heap" -underline 0 -value "vars" -command setextmemopts
|
|
|
|
|
.f1.f1.mb2.m1.c42 add radiobutton -variable extmemopts \
|
|
|
|
|
-label "heap only" -underline 0 -value "heap" -command setextmemopts
|
|
|
|
|
.f1.f1.mb2.m1.c42 add cascade -menu .f1.f1.mb2.m1.c42.c1 \
|
|
|
|
|
-label "Ext. memory start" -underline 5
|
|
|
|
|
.f1.f1.mb2.m1.c42 add cascade -menu .f1.f1.mb2.m1.c42.c2 \
|
|
|
|
|
-label "Ext. memory size" -underline 14
|
|
|
|
|
|
|
|
|
|
menu .f1.f1.mb2.m1.c42.c1 -tearoff 0
|
|
|
|
|
foreach m {0 1024 2048 4096 8192 16384 32768} {
|
|
|
|
|
if {$m == 0} {
|
|
|
|
|
set s "lowest possible"
|
|
|
|
|
set v 0
|
|
|
|
|
} else {
|
|
|
|
|
set s [format {%d KB} [expr $m / 1024]]
|
|
|
|
|
set v [expr $m + $memoffset]
|
|
|
|
|
}
|
|
|
|
|
.f1.f1.mb2.m1.c42.c1 add radiobutton -variable extmemstart \
|
|
|
|
|
-label $s -value $v \
|
|
|
|
|
-command setextmemopts
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
menu .f1.f1.mb2.m1.c42.c2 -tearoff 0
|
|
|
|
|
foreach m {1024 2048 4096 8192 16384 32768 65536} {
|
|
|
|
|
set s [format {%d KB} [expr $m / 1024]]
|
|
|
|
|
.f1.f1.mb2.m1.c42.c2 add radiobutton -variable extmemsize \
|
|
|
|
|
-label $s -value [expr $m] \
|
|
|
|
|
-command setextmemopts
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {[info exists deftarget] && ! [info exists dformat]} {
|
|
|
|
|
menu .f1.f1.mb2.m1.c5 -tearoff 0
|
|
|
|
|
|
|
|
|
|
.f1.f1.mb2.m1.c5 add radiobutton -variable deftarget \
|
|
|
|
|
-label "standard (ELF + ihex/srec/binary)" -underline 0 \
|
|
|
|
|
-value "none" -command setdeftarget
|
|
|
|
|
.f1.f1.mb2.m1.c5 add radiobutton -variable deftarget \
|
|
|
|
|
-label "AVR \"Extended\" COFF (AVR Studio 4.07+, VMLAB 3.10+)" -underline 6 \
|
|
|
|
|
-value "extcoff" -command setdeftarget
|
|
|
|
|
.f1.f1.mb2.m1.c5 add radiobutton -variable deftarget -underline 4 \
|
|
|
|
|
-label "AVR COFF (AVR Studio 3.x, VMLAB < 3.10)" \
|
|
|
|
|
-value "coff" -command setdeftarget
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {[info exists avrdudeprog]} {
|
|
|
|
|
menu .f1.f1.mb2.m1.c6 -tearoff 0
|
|
|
|
|
|
|
|
|
|
foreach p [lsort {dasa3 dasa ponyser dapa xil futurlec \
|
|
|
|
|
abcmini picoweb sp12 alf bascom dt006 \
|
|
|
|
|
pony-stk200 stk200 pavr jtag2 jtag2fast \
|
|
|
|
|
jtag2slow jtagmkII jtagmkI avr911 avr109 \
|
|
|
|
|
butterfly avr910 stk500v2 stk500 avrisp2 \
|
|
|
|
|
avrispv2 avrisp bsd }] {
|
|
|
|
|
.f1.f1.mb2.m1.c6 add radiobutton -variable avrdudeprog \
|
|
|
|
|
-label $p -command setavrdudeprog
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {[info exists portlist] && [info exists avrdudeport]} {
|
|
|
|
|
menu .f1.f1.mb2.m1.c7 -tearoff 0
|
|
|
|
|
|
|
|
|
|
foreach p $portlist {
|
|
|
|
|
.f1.f1.mb2.m1.c7 add radiobutton -variable avrdudeport \
|
|
|
|
|
-label $p -command setavrdudeport
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc writefile {fname} {
|
|
|
|
|
global backupsuffix makefile modified
|
|
|
|
|
|
|
|
|
|
if {[file exists $fname]} {
|
|
|
|
|
file rename -force $fname "$fname$backupsuffix"
|
|
|
|
|
}
|
|
|
|
|
set makefile [.f1.f2.f1.t1 get 1.0 end]
|
|
|
|
|
set f [open $fname "w"]
|
|
|
|
|
puts $f $makefile
|
|
|
|
|
close $f
|
|
|
|
|
set modified 0
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc about {} {
|
|
|
|
|
toplevel .about
|
|
|
|
|
|
|
|
|
|
set x [winfo pointerx .]
|
|
|
|
|
set y [winfo pointery .]
|
|
|
|
|
if {$x != -1 && $y != -1} {
|
|
|
|
|
wm geometry .about "+[expr $x - 250]+[expr $y - 100]"
|
|
|
|
|
}
|
|
|
|
|
wm title .about {About Mfile}
|
|
|
|
|
wm resizable .about 0 0
|
|
|
|
|
|
|
|
|
|
frame .about.f1
|
|
|
|
|
message .about.f1.m1 \
|
|
|
|
|
-relief sunken \
|
|
|
|
|
-width 500 \
|
|
|
|
|
-text \
|
|
|
|
|
{Mfile - Simple Makefile generator for AVR-GCC
|
|
|
|
|
|
|
|
|
|
Copyright <EFBFBD> 2003,2004 J<EFBFBD>rg Wunsch
|
|
|
|
|
|
|
|
|
|
$Revision: 2.12 $ $Date: 2008/11/06 03:35:52 $
|
|
|
|
|
|
|
|
|
|
"THE BEER-WARE LICENSE" (Revision 42) (by Poul-Henning Kamp):
|
|
|
|
|
Joerg Wunsch <j.gnu@uriah.heep.sax.de> wrote this file. As long as you
|
|
|
|
|
retain this notice you can do whatever you want with this stuff. If we meet
|
|
|
|
|
some day, and you think this stuff is worth it, you can buy me a beer
|
|
|
|
|
in return.}
|
|
|
|
|
button .about.f1.ok -command {destroy .about} -text {OK}
|
|
|
|
|
|
|
|
|
|
pack configure .about.f1.m1 -side top
|
|
|
|
|
pack configure .about.f1.ok -side bottom
|
|
|
|
|
pack configure .about.f1
|
|
|
|
|
|
|
|
|
|
tkwait window .about
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc setmcu {} {
|
|
|
|
|
global mcutype
|
|
|
|
|
global editwidget
|
|
|
|
|
global highlight modified
|
|
|
|
|
global extmemmentry extmemparts extmemstart extmemopts
|
|
|
|
|
|
|
|
|
|
set r1 [.f1.f2.f1.t1 search -regexp "^MCU = " 1.0]
|
|
|
|
|
if {$r1 == ""} {
|
|
|
|
|
complain "Oops, MCU not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, MCU not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
set modified 1
|
|
|
|
|
.f1.f2.f1.t1 configure -state normal
|
|
|
|
|
.f1.f2.f1.t1 delete $r1 $r2
|
|
|
|
|
.f1.f2.f1.t1 insert $r2 "MCU = $mcutype"
|
|
|
|
|
.f1.f2.f1.t1 configure -state $editwidget
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, MCU not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {[info exists extmemopts]} {
|
|
|
|
|
if {[info exists extmemparts($mcutype)]} {
|
|
|
|
|
.f1.f1.mb2.m1 entryconfigure $extmemmentry -state normal
|
|
|
|
|
if {$extmemstart == ""} {
|
|
|
|
|
set extmemstart 0
|
|
|
|
|
}
|
|
|
|
|
if {$extmemstart == 0 || \
|
|
|
|
|
[expr $extmemparts($mcutype) == $extmemstart]} {
|
|
|
|
|
# extmemstart == 0 means "lowest possible value"
|
|
|
|
|
set extmemstart 0
|
|
|
|
|
setextmemopts
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
.f1.f1.mb2.m1 entryconfigure $extmemmentry -state disabled
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.f1.f2.f1.t1 tag delete highlight
|
|
|
|
|
.f1.f2.f1.t1 tag add highlight $r1 $r2
|
|
|
|
|
.f1.f2.f1.t1 tag configure highlight -background $highlight
|
|
|
|
|
.f1.f2.f1.t1 see $r1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc setoformat {} {
|
|
|
|
|
global oformat
|
|
|
|
|
global editwidget
|
|
|
|
|
global highlight modified
|
|
|
|
|
|
|
|
|
|
set r1 [.f1.f2.f1.t1 search -regexp "^FORMAT = " 1.0]
|
|
|
|
|
if {$r1 == ""} {
|
|
|
|
|
complain "Oops, FORMAT not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, FORMAT not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
set modified 1
|
|
|
|
|
.f1.f2.f1.t1 configure -state normal
|
|
|
|
|
.f1.f2.f1.t1 delete $r1 $r2
|
|
|
|
|
.f1.f2.f1.t1 insert $r2 "FORMAT = $oformat"
|
|
|
|
|
.f1.f2.f1.t1 configure -state $editwidget
|
|
|
|
|
.f1.f2.f1.t1 see $r1
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, FORMAT not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
.f1.f2.f1.t1 tag delete highlight
|
|
|
|
|
.f1.f2.f1.t1 tag add highlight $r1 $r2
|
|
|
|
|
.f1.f2.f1.t1 tag configure highlight -background $highlight
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc setoptlevel {} {
|
|
|
|
|
global optlevel
|
|
|
|
|
global editwidget
|
|
|
|
|
global highlight modified
|
|
|
|
|
|
|
|
|
|
set r1 [.f1.f2.f1.t1 search -regexp "^OPT = " 1.0]
|
|
|
|
|
if {$r1 == ""} {
|
|
|
|
|
complain "Oops, OPT not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, OPT not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
set modified 1
|
|
|
|
|
.f1.f2.f1.t1 configure -state normal
|
|
|
|
|
.f1.f2.f1.t1 delete $r1 $r2
|
|
|
|
|
.f1.f2.f1.t1 insert $r2 "OPT = $optlevel"
|
|
|
|
|
.f1.f2.f1.t1 configure -state $editwidget
|
|
|
|
|
.f1.f2.f1.t1 see $r1
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, OPT not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
.f1.f2.f1.t1 tag delete highlight
|
|
|
|
|
.f1.f2.f1.t1 tag add highlight $r1 $r2
|
|
|
|
|
.f1.f2.f1.t1 tag configure highlight -background $highlight
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc setdformat {} {
|
|
|
|
|
global dformat
|
|
|
|
|
global editwidget
|
|
|
|
|
global highlight modified
|
|
|
|
|
|
|
|
|
|
set r1 [.f1.f2.f1.t1 search -regexp "^DEBUG = " 1.0]
|
|
|
|
|
if {$r1 == ""} {
|
|
|
|
|
complain "Oops, DEBUG not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, DEBUG not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
set modified 1
|
|
|
|
|
.f1.f2.f1.t1 configure -state normal
|
|
|
|
|
.f1.f2.f1.t1 delete $r1 $r2
|
|
|
|
|
.f1.f2.f1.t1 insert $r2 "DEBUG = $dformat"
|
|
|
|
|
.f1.f2.f1.t1 configure -state $editwidget
|
|
|
|
|
.f1.f2.f1.t1 see $r1
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, DEBUG not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
.f1.f2.f1.t1 tag delete highlight
|
|
|
|
|
.f1.f2.f1.t1 tag add highlight $r1 $r2
|
|
|
|
|
.f1.f2.f1.t1 tag configure highlight -background $highlight
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc setstdlevel {} {
|
|
|
|
|
global stdlevel
|
|
|
|
|
global editwidget
|
|
|
|
|
global highlight modified
|
|
|
|
|
|
|
|
|
|
set r1 [.f1.f2.f1.t1 search -regexp "^CSTANDARD = " 1.0]
|
|
|
|
|
if {$r1 == ""} {
|
|
|
|
|
complain "Oops, CSTANDARD not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, CSTANDARD not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
set modified 1
|
|
|
|
|
.f1.f2.f1.t1 configure -state normal
|
|
|
|
|
.f1.f2.f1.t1 delete $r1 $r2
|
|
|
|
|
.f1.f2.f1.t1 insert $r2 "CSTANDARD = -std=$stdlevel"
|
|
|
|
|
.f1.f2.f1.t1 configure -state $editwidget
|
|
|
|
|
.f1.f2.f1.t1 see $r1
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, CSTANDARD not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
.f1.f2.f1.t1 tag delete highlight
|
|
|
|
|
.f1.f2.f1.t1 tag add highlight $r1 $r2
|
|
|
|
|
.f1.f2.f1.t1 tag configure highlight -background $highlight
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc setdeftarget {} {
|
|
|
|
|
global deftarget
|
|
|
|
|
global editwidget
|
|
|
|
|
global highlight modified
|
|
|
|
|
|
|
|
|
|
set r1 [.f1.f2.f1.t1 search -regexp "^build:" 1.0]
|
|
|
|
|
if {$r1 == ""} {
|
|
|
|
|
complain "Oops, default target not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, default target not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
set modified 1
|
|
|
|
|
.f1.f2.f1.t1 configure -state normal
|
|
|
|
|
set line [.f1.f2.f1.t1 get $r1 $r2]
|
|
|
|
|
if {[regexp {^(.*) (ext)?coff} $line dummy d]} {
|
|
|
|
|
set line $d
|
|
|
|
|
} else {
|
|
|
|
|
regsub {^(.*)} $line {\1} line
|
|
|
|
|
}
|
|
|
|
|
switch $deftarget {
|
|
|
|
|
"coff" {
|
|
|
|
|
set line "$line coff"
|
|
|
|
|
}
|
|
|
|
|
"extcoff" {
|
|
|
|
|
set line "$line extcoff"
|
|
|
|
|
}
|
|
|
|
|
"none" {
|
|
|
|
|
set line "$line"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
.f1.f2.f1.t1 delete $r1 $r2
|
|
|
|
|
.f1.f2.f1.t1 insert $r2 "$line"
|
|
|
|
|
.f1.f2.f1.t1 configure -state $editwidget
|
|
|
|
|
.f1.f2.f1.t1 see $r1
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, default target not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
.f1.f2.f1.t1 tag delete highlight
|
|
|
|
|
.f1.f2.f1.t1 tag add highlight $r1 $r2
|
|
|
|
|
.f1.f2.f1.t1 tag configure highlight -background $highlight
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc setprintfopts {} {
|
|
|
|
|
global printfopts
|
|
|
|
|
global editwidget
|
|
|
|
|
global highlight modified
|
|
|
|
|
|
|
|
|
|
set r1 [.f1.f2.f1.t1 search -regexp "^PRINTF_LIB = " 1.0]
|
|
|
|
|
if {$r1 == ""} {
|
|
|
|
|
complain "Oops, PRINTF_LIB not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, PRINTF_LIB not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
set modified 1
|
|
|
|
|
.f1.f2.f1.t1 configure -state normal
|
|
|
|
|
.f1.f2.f1.t1 delete $r1 $r2
|
|
|
|
|
switch $printfopts {
|
|
|
|
|
"none" {
|
|
|
|
|
set line "PRINTF_LIB = "
|
|
|
|
|
}
|
|
|
|
|
"min" {
|
|
|
|
|
set line "PRINTF_LIB = \$(PRINTF_LIB_MIN)"
|
|
|
|
|
}
|
|
|
|
|
"flt" {
|
|
|
|
|
set line "PRINTF_LIB = \$(PRINTF_LIB_FLOAT)"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
.f1.f2.f1.t1 insert $r2 "$line"
|
|
|
|
|
|
|
|
|
|
.f1.f2.f1.t1 configure -state $editwidget
|
|
|
|
|
.f1.f2.f1.t1 see $r1
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, PRINTF_LIB not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
.f1.f2.f1.t1 tag delete highlight
|
|
|
|
|
.f1.f2.f1.t1 tag add highlight $r1 $r2
|
|
|
|
|
.f1.f2.f1.t1 tag configure highlight -background $highlight
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc setscanfopts {} {
|
|
|
|
|
global scanfopts
|
|
|
|
|
global editwidget
|
|
|
|
|
global highlight modified
|
|
|
|
|
|
|
|
|
|
set r1 [.f1.f2.f1.t1 search -regexp "^SCANF_LIB = " 1.0]
|
|
|
|
|
if {$r1 == ""} {
|
|
|
|
|
complain "Oops, SCANF_LIB not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, SCANF_LIB not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
set modified 1
|
|
|
|
|
.f1.f2.f1.t1 configure -state normal
|
|
|
|
|
.f1.f2.f1.t1 delete $r1 $r2
|
|
|
|
|
switch $scanfopts {
|
|
|
|
|
"none" {
|
|
|
|
|
set line "SCANF_LIB = "
|
|
|
|
|
}
|
|
|
|
|
"min" {
|
|
|
|
|
set line "SCANF_LIB = \$(SCANF_LIB_MIN)"
|
|
|
|
|
}
|
|
|
|
|
"flt" {
|
|
|
|
|
set line "SCANF_LIB = \$(SCANF_LIB_FLOAT)"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
.f1.f2.f1.t1 insert $r2 "$line"
|
|
|
|
|
|
|
|
|
|
.f1.f2.f1.t1 configure -state $editwidget
|
|
|
|
|
.f1.f2.f1.t1 see $r1
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, SCANF_LIB not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
.f1.f2.f1.t1 tag delete highlight
|
|
|
|
|
.f1.f2.f1.t1 tag add highlight $r1 $r2
|
|
|
|
|
.f1.f2.f1.t1 tag configure highlight -background $highlight
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc setextmemopts {} {
|
|
|
|
|
global extmemsize extmemstart extmemopts
|
|
|
|
|
global extmemmax extmemparts extmemmentry memoffset
|
|
|
|
|
global mcutype
|
|
|
|
|
global editwidget
|
|
|
|
|
global highlight modified
|
|
|
|
|
|
|
|
|
|
set r1 [.f1.f2.f1.t1 search -regexp "^EXTMEMOPTS *=" 1.0]
|
|
|
|
|
if {$r1 == ""} {
|
|
|
|
|
complain "Oops, EXTMEMOPTS not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, EXTMEMOPTS not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
if {$extmemopts != "none"} {
|
|
|
|
|
if {![info exists extmemsize]} {
|
|
|
|
|
set extmemsize [expr $extmemmax + 1 - $memoffset]
|
|
|
|
|
} elseif {$extmemsize == 0 || $extmemsize == ""} {
|
|
|
|
|
set extmemsize [expr $extmemmax + 1 - $memoffset]
|
|
|
|
|
}
|
|
|
|
|
if {![info exists extmemstart]} {
|
|
|
|
|
set extmemstart 0
|
|
|
|
|
} elseif {$extmemstart == 0 || $extmemstart == ""} {
|
|
|
|
|
set extmemstart 0
|
|
|
|
|
}
|
|
|
|
|
if {[expr $extmemstart] == 0} {
|
|
|
|
|
set m $extmemparts($mcutype)
|
|
|
|
|
} else {
|
|
|
|
|
set m [expr $extmemstart]
|
|
|
|
|
}
|
|
|
|
|
set xstart [format {0x%x} [expr $m]]
|
|
|
|
|
if {[expr $memoffset + $extmemsize] == [expr $extmemmax + 1]} {
|
|
|
|
|
set xend [format {0x%x} [expr $extmemmax]]
|
|
|
|
|
} else {
|
|
|
|
|
set xend [format {0x%x} [expr $m + $extmemsize - 1]]
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
set modified 1
|
|
|
|
|
.f1.f2.f1.t1 configure -state normal
|
|
|
|
|
.f1.f2.f1.t1 delete $r1 $r2
|
|
|
|
|
switch $extmemopts {
|
|
|
|
|
"none" {
|
|
|
|
|
set line "EXTMEMOPTS = "
|
|
|
|
|
}
|
|
|
|
|
"vars" {
|
|
|
|
|
set line "EXTMEMOPTS = -Wl,--section-start,.data=$xstart,--defsym=__heap_end=$xend"
|
|
|
|
|
}
|
|
|
|
|
"heap" {
|
|
|
|
|
set line "EXTMEMOPTS = -Wl,--defsym=__heap_start=$xstart,--defsym=__heap_end=$xend"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
.f1.f2.f1.t1 insert $r2 "$line"
|
|
|
|
|
|
|
|
|
|
.f1.f2.f1.t1 configure -state $editwidget
|
|
|
|
|
.f1.f2.f1.t1 see $r1
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, EXTMEMOPTS not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
.f1.f2.f1.t1 tag delete highlight
|
|
|
|
|
.f1.f2.f1.t1 tag add highlight $r1 $r2
|
|
|
|
|
.f1.f2.f1.t1 tag configure highlight -background $highlight
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc setmainfile {} {
|
|
|
|
|
global mainfile
|
|
|
|
|
global editwidget
|
|
|
|
|
global highlight modified
|
|
|
|
|
|
|
|
|
|
set mainfile [ask $mainfile "Main file"]
|
|
|
|
|
|
|
|
|
|
set r1 [.f1.f2.f1.t1 search -regexp "^TARGET = " 1.0]
|
|
|
|
|
if {$r1 == ""} {
|
|
|
|
|
complain "Oops, TARGET not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, TARGET not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
set modified 1
|
|
|
|
|
.f1.f2.f1.t1 configure -state normal
|
|
|
|
|
.f1.f2.f1.t1 delete $r1 $r2
|
|
|
|
|
.f1.f2.f1.t1 insert $r2 "TARGET = $mainfile"
|
|
|
|
|
.f1.f2.f1.t1 configure -state $editwidget
|
|
|
|
|
.f1.f2.f1.t1 see $r1
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, TARGET not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
.f1.f2.f1.t1 tag delete highlight
|
|
|
|
|
.f1.f2.f1.t1 tag add highlight $r1 $r2
|
|
|
|
|
.f1.f2.f1.t1 tag configure highlight -background $highlight
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc setmakefile {} {
|
|
|
|
|
global basename
|
|
|
|
|
global editwidget
|
|
|
|
|
global highlight modified
|
|
|
|
|
|
|
|
|
|
set r1 [.f1.f2.f1.t1 search -regexp "^MAKEFILE\\s*=" 1.0]
|
|
|
|
|
if {$r1 == ""} {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, MAKEFILE not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
set modified 1
|
|
|
|
|
.f1.f2.f1.t1 configure -state normal
|
|
|
|
|
.f1.f2.f1.t1 delete $r1 $r2
|
|
|
|
|
.f1.f2.f1.t1 insert $r2 "MAKEFILE = $basename"
|
|
|
|
|
.f1.f2.f1.t1 configure -state $editwidget
|
|
|
|
|
.f1.f2.f1.t1 see $r1
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, MAKEFILE not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
.f1.f2.f1.t1 tag delete highlight
|
|
|
|
|
.f1.f2.f1.t1 tag add highlight $r1 $r2
|
|
|
|
|
.f1.f2.f1.t1 tag configure highlight -background $highlight
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc setasrc {} {
|
|
|
|
|
global asrc
|
|
|
|
|
global editwidget
|
|
|
|
|
global highlight modified
|
|
|
|
|
|
|
|
|
|
set asrc [ask $asrc "Assembler source file(s)"]
|
|
|
|
|
|
|
|
|
|
set r1 [.f1.f2.f1.t1 search -regexp "^ASRC = " 1.0]
|
|
|
|
|
if {$r1 == ""} {
|
|
|
|
|
complain "Oops, ASRC not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, ASRC not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
set modified 1
|
|
|
|
|
.f1.f2.f1.t1 configure -state normal
|
|
|
|
|
.f1.f2.f1.t1 delete $r1 $r2
|
|
|
|
|
.f1.f2.f1.t1 insert $r2 "ASRC = $asrc"
|
|
|
|
|
.f1.f2.f1.t1 configure -state $editwidget
|
|
|
|
|
.f1.f2.f1.t1 see $r1
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, ASRC not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
.f1.f2.f1.t1 tag delete highlight
|
|
|
|
|
.f1.f2.f1.t1 tag add highlight $r1 $r2
|
|
|
|
|
.f1.f2.f1.t1 tag configure highlight -background $highlight
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc setavrdudeprog {} {
|
|
|
|
|
global avrdudeprog
|
|
|
|
|
global editwidget
|
|
|
|
|
global highlight modified
|
|
|
|
|
|
|
|
|
|
set r1 [.f1.f2.f1.t1 search -regexp "^AVRDUDE_PROGRAMMER = " 1.0]
|
|
|
|
|
if {$r1 == ""} {
|
|
|
|
|
complain "Oops, AVRDUDE_PROGRAMMER not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, AVRDUDE_PROGRAMMER not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
set modified 1
|
|
|
|
|
.f1.f2.f1.t1 configure -state normal
|
|
|
|
|
.f1.f2.f1.t1 delete $r1 $r2
|
|
|
|
|
.f1.f2.f1.t1 insert $r2 "AVRDUDE_PROGRAMMER = $avrdudeprog"
|
|
|
|
|
.f1.f2.f1.t1 configure -state $editwidget
|
|
|
|
|
.f1.f2.f1.t1 see $r1
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, AVRDUDE_PROGRAMMER not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
.f1.f2.f1.t1 tag delete highlight
|
|
|
|
|
.f1.f2.f1.t1 tag add highlight $r1 $r2
|
|
|
|
|
.f1.f2.f1.t1 tag configure highlight -background $highlight
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc setavrdudeport {} {
|
|
|
|
|
global avrdudeport
|
|
|
|
|
global editwidget
|
|
|
|
|
global highlight modified
|
|
|
|
|
|
|
|
|
|
set r1 [.f1.f2.f1.t1 search -regexp "^AVRDUDE_PORT = " 1.0]
|
|
|
|
|
if {$r1 == ""} {
|
|
|
|
|
complain "Oops, AVRDUDE_PORT not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, AVRDUDE_PORT not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
set modified 1
|
|
|
|
|
.f1.f2.f1.t1 configure -state normal
|
|
|
|
|
.f1.f2.f1.t1 delete $r1 $r2
|
|
|
|
|
.f1.f2.f1.t1 insert $r2 "AVRDUDE_PORT = $avrdudeport"
|
|
|
|
|
.f1.f2.f1.t1 configure -state $editwidget
|
|
|
|
|
.f1.f2.f1.t1 see $r1
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, AVRDUDE_PORT not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
.f1.f2.f1.t1 tag delete highlight
|
|
|
|
|
.f1.f2.f1.t1 tag add highlight $r1 $r2
|
|
|
|
|
.f1.f2.f1.t1 tag configure highlight -background $highlight
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc complain {text} {
|
|
|
|
|
if {[winfo exists .complain]} {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
toplevel .complain
|
|
|
|
|
set x [winfo pointerx .]
|
|
|
|
|
set y [winfo pointery .]
|
|
|
|
|
if {$x != -1 && $y != -1} {
|
|
|
|
|
wm geometry .complain "+$x+$y"
|
|
|
|
|
}
|
|
|
|
|
wm title .complain {Error}
|
|
|
|
|
wm resizable .complain 0 0
|
|
|
|
|
|
|
|
|
|
message .complain.m1 -text $text
|
|
|
|
|
button .complain.ok -text {OK} -command {destroy .complain}
|
|
|
|
|
|
|
|
|
|
pack .complain.m1
|
|
|
|
|
pack .complain.ok
|
|
|
|
|
|
|
|
|
|
tkwait window .complain
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc ask {val text} {
|
|
|
|
|
global askval
|
|
|
|
|
|
|
|
|
|
if {[winfo exists .ask]} {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
toplevel .ask
|
|
|
|
|
set x [winfo pointerx .]
|
|
|
|
|
set y [winfo pointery .]
|
|
|
|
|
if {$x != -1 && $y != -1} {
|
|
|
|
|
wm geometry .ask "+$x+$y"
|
|
|
|
|
}
|
|
|
|
|
wm title .ask $text
|
|
|
|
|
wm resizable .ask 0 0
|
|
|
|
|
|
|
|
|
|
set askval $val
|
|
|
|
|
|
|
|
|
|
frame .ask.f1
|
|
|
|
|
label .ask.f1.l1 -text "$text:"
|
|
|
|
|
entry .ask.f1.e1 -width 20 -relief sunken -textvariable askval
|
|
|
|
|
|
|
|
|
|
frame .ask.f2
|
|
|
|
|
button .ask.f2.b1 -text {OK} -command {destroy .ask}
|
|
|
|
|
|
|
|
|
|
pack configure .ask.f1.l1 -side left
|
|
|
|
|
pack configure .ask.f1.e1 -side left
|
|
|
|
|
pack configure .ask.f1
|
|
|
|
|
pack configure .ask.f2.b1 -side top
|
|
|
|
|
pack configure .ask.f2
|
|
|
|
|
|
|
|
|
|
bind .ask.f1.e1 <Key-Return> {destroy .ask}
|
|
|
|
|
|
|
|
|
|
tkwait window .ask
|
|
|
|
|
|
|
|
|
|
return $askval
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc asksrc {} {
|
|
|
|
|
global src mainfilesrc mainfile
|
|
|
|
|
global editwidget
|
|
|
|
|
global highlight modified
|
|
|
|
|
|
|
|
|
|
if {[winfo exists .ask]} {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
toplevel .ask
|
|
|
|
|
set x [winfo pointerx .]
|
|
|
|
|
set y [winfo pointery .]
|
|
|
|
|
if {$x != -1 && $y != -1} {
|
|
|
|
|
wm geometry .ask "+$x+$y"
|
|
|
|
|
}
|
|
|
|
|
wm title .ask {Source files}
|
|
|
|
|
wm resizable .ask 1 0
|
|
|
|
|
|
|
|
|
|
frame .ask.f1
|
|
|
|
|
frame .ask.f1.f1
|
|
|
|
|
label .ask.f1.f1.l1 -text "C/C++ source file(s):"
|
|
|
|
|
entry .ask.f1.f1.e1 -width 20 -relief sunken -textvariable src
|
|
|
|
|
button .ask.f1.f1.b1 -text "Choose file..." \
|
|
|
|
|
-command {
|
|
|
|
|
global src
|
|
|
|
|
set x [tk_getOpenFile -filetypes {
|
|
|
|
|
{{C source files} {.c}}
|
|
|
|
|
{{C++ source files} {.C .cc .cxx}}
|
|
|
|
|
{{All files} *}
|
|
|
|
|
}]
|
|
|
|
|
if {$x != ""} {
|
|
|
|
|
set rootname [lindex [file split [pwd]] 0]
|
|
|
|
|
if {[string range $x 0 [expr [string length $rootname] - 1]] \
|
|
|
|
|
== $rootname} {
|
|
|
|
|
# Try finding common path name components to the
|
|
|
|
|
# current working directory. If found, eliminate
|
|
|
|
|
# them.
|
|
|
|
|
set y [pwd]
|
|
|
|
|
set prefix "."
|
|
|
|
|
while {[expr [string first $y $x] == -1]} {
|
|
|
|
|
set y [file dirname $y]
|
|
|
|
|
if {$prefix == "."} {
|
|
|
|
|
set prefix ".."
|
|
|
|
|
} else {
|
|
|
|
|
set prefix "../${prefix}"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if {$y != $rootname} {
|
|
|
|
|
# If more than the root directory name
|
|
|
|
|
# remained, replace it.
|
|
|
|
|
set commonlen [string length $y]
|
|
|
|
|
set x [string range $x $commonlen end]
|
|
|
|
|
set x "${prefix}${x}"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
set src "$src $x"
|
|
|
|
|
}
|
|
|
|
|
focus .ask
|
|
|
|
|
wm deiconify .ask
|
|
|
|
|
if {[string length $src]} {
|
|
|
|
|
# let the entry widget auto-size
|
|
|
|
|
.ask.f1.f1.e1 configure -width 0
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
frame .ask.f1.f2
|
|
|
|
|
checkbutton .ask.f1.f2.cb1 -variable mainfilesrc
|
|
|
|
|
label .ask.f1.f2.l1 -text "Include ${mainfile}.c"
|
|
|
|
|
button .ask.f1.f2.b1 -text {OK} -command {destroy .ask}
|
|
|
|
|
|
|
|
|
|
pack configure .ask.f1.f1.l1 -side left
|
|
|
|
|
pack configure .ask.f1.f1.e1 -side left -expand y -fill x
|
|
|
|
|
pack configure .ask.f1.f1.b1 -side left
|
|
|
|
|
pack configure .ask.f1.f1 -side top -anchor nw -expand y -fill x
|
|
|
|
|
pack configure .ask.f1.f2.cb1 -side left
|
|
|
|
|
pack configure .ask.f1.f2.l1 -side left
|
|
|
|
|
pack configure .ask.f1.f2.b1 -side right
|
|
|
|
|
pack configure .ask.f1.f2 -side top -anchor nw -expand y -fill x
|
|
|
|
|
pack configure .ask.f1 -expand y -fill x
|
|
|
|
|
|
|
|
|
|
bind .ask.f1.f1.e1 <Key-Return> {destroy .ask}
|
|
|
|
|
focus .ask
|
|
|
|
|
|
|
|
|
|
tkwait window .ask
|
|
|
|
|
|
|
|
|
|
set r1 [.f1.f2.f1.t1 search -regexp "^SRC = " 1.0]
|
|
|
|
|
if {$r1 == ""} {
|
|
|
|
|
complain "Oops, SRC not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, SRC not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {$mainfilesrc != 0} {
|
|
|
|
|
set s "\$(TARGET).c $src"
|
|
|
|
|
} else {
|
|
|
|
|
set s "$src"
|
|
|
|
|
}
|
|
|
|
|
set modified 1
|
|
|
|
|
.f1.f2.f1.t1 configure -state normal
|
|
|
|
|
.f1.f2.f1.t1 delete $r1 $r2
|
|
|
|
|
.f1.f2.f1.t1 insert $r2 "SRC = $s"
|
|
|
|
|
.f1.f2.f1.t1 configure -state $editwidget
|
|
|
|
|
.f1.f2.f1.t1 see $r1
|
|
|
|
|
set r2 [.f1.f2.f1.t1 search -regexp {$} $r1]
|
|
|
|
|
if {$r2 == ""} {
|
|
|
|
|
complain "Oops, SRC not found"
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
.f1.f2.f1.t1 tag delete highlight
|
|
|
|
|
.f1.f2.f1.t1 tag add highlight $r1 $r2
|
|
|
|
|
.f1.f2.f1.t1 tag configure highlight -background $highlight
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc changeeditable {} {
|
|
|
|
|
global editwidget modified
|
|
|
|
|
|
|
|
|
|
if {$editwidget == "normal"} {
|
|
|
|
|
set modified 1
|
|
|
|
|
}
|
|
|
|
|
.f1.f2.f1.t1 configure -state $editwidget
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc openfile {} {
|
|
|
|
|
global filename basename
|
|
|
|
|
global modified
|
|
|
|
|
global asksavereply
|
|
|
|
|
global makefile editwidget
|
|
|
|
|
|
|
|
|
|
if {$modified} {
|
|
|
|
|
if {[winfo exists .asksave]} {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
toplevel .asksave
|
|
|
|
|
message .asksave.l1 -width 400 \
|
|
|
|
|
-text "The current buffer has been modified.\n\nDiscard changes?"
|
|
|
|
|
frame .asksave.f1
|
|
|
|
|
button .asksave.f1.ok -text {Yes} -command {
|
|
|
|
|
global asksavereply
|
|
|
|
|
set asksavereply 1
|
|
|
|
|
destroy .asksave
|
|
|
|
|
}
|
|
|
|
|
button .asksave.f1.cancel -text {No} -command {
|
|
|
|
|
global asksavereply
|
|
|
|
|
set asksavereply 0
|
|
|
|
|
destroy .asksave
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pack configure .asksave.l1 -side top
|
|
|
|
|
pack configure .asksave.f1.ok -side left
|
|
|
|
|
pack configure .asksave.f1.cancel -side left
|
|
|
|
|
pack configure .asksave.f1 -side top
|
|
|
|
|
|
|
|
|
|
set x [winfo pointerx .]
|
|
|
|
|
set y [winfo pointery .]
|
|
|
|
|
if {$x != -1 && $y != -1} {
|
|
|
|
|
wm geometry .asksave "+$x+$y"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
tkwait window .asksave
|
|
|
|
|
|
|
|
|
|
if {$asksavereply == 0} {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
set modified 0
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
set fn [tk_getOpenFile -initialfile $filename]
|
|
|
|
|
if {[string length $fn] > 0} {
|
|
|
|
|
parsetemplate $fn
|
|
|
|
|
makemfilemenu
|
|
|
|
|
|
|
|
|
|
set filename $fn
|
|
|
|
|
catch "regsub {^.*/} $fn {} basename"
|
|
|
|
|
wm title . $basename
|
|
|
|
|
|
|
|
|
|
.f1.f2.f1.t1 configure -state normal
|
|
|
|
|
.f1.f2.f1.t1 delete 1.0 end
|
|
|
|
|
.f1.f2.f1.t1 insert end $makefile
|
|
|
|
|
.f1.f2.f1.t1 configure -state $editwidget
|
|
|
|
|
|
|
|
|
|
setmakefile
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc saveas {} {
|
|
|
|
|
global filename basename
|
|
|
|
|
set fn [tk_getSaveFile -initialfile $filename]
|
|
|
|
|
if {[string length $fn] > 0} {
|
|
|
|
|
set filename $fn
|
|
|
|
|
catch "regsub {^.*/} $fn {} basename"
|
|
|
|
|
wm title . $basename
|
|
|
|
|
setmakefile
|
|
|
|
|
writefile $fn
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
proc quit {force} {
|
|
|
|
|
global modified filename
|
|
|
|
|
|
|
|
|
|
if {$modified} {
|
|
|
|
|
if {$force} {
|
|
|
|
|
# called from WM_SAVE_YOURSELF handler only -- no time
|
|
|
|
|
# to ask the luser back
|
|
|
|
|
wm protocol . WM_SAVE_YOURSELF {}
|
|
|
|
|
set modified 0
|
|
|
|
|
writefile "${filename}.saved"
|
|
|
|
|
exit 0
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if {[winfo exists .askquit]} {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
toplevel .askquit
|
|
|
|
|
message .askquit.l1 -width 400 \
|
|
|
|
|
-text "The current buffer has been modified.\n\nExit anyway?"
|
|
|
|
|
frame .askquit.f1
|
|
|
|
|
button .askquit.f1.ok -text {Yes} -command {
|
|
|
|
|
wm protocol . WM_DELETE_WINDOW {}
|
|
|
|
|
wm protocol . WM_SAVE_YOURSELF {}
|
|
|
|
|
exit 0
|
|
|
|
|
}
|
|
|
|
|
button .askquit.f1.cancel -text {No} -command {destroy .askquit}
|
|
|
|
|
|
|
|
|
|
pack configure .askquit.l1 -side top
|
|
|
|
|
pack configure .askquit.f1.ok -side left
|
|
|
|
|
pack configure .askquit.f1.cancel -side left
|
|
|
|
|
pack configure .askquit.f1 -side top
|
|
|
|
|
|
|
|
|
|
set x [winfo pointerx .]
|
|
|
|
|
set y [winfo pointery .]
|
|
|
|
|
if {$x != -1 && $y != -1} {
|
|
|
|
|
wm geometry .askquit "+$x+$y"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
tkwait window .askquit
|
|
|
|
|
} else {
|
|
|
|
|
exit 0
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
source "$prefix/htmlview.tcl"
|
|
|
|
|
|
|
|
|
|
parsetemplate $templatename
|
|
|
|
|
|
|
|
|
|
global editwidget
|
|
|
|
|
set editwidget disabled
|
|
|
|
|
|
|
|
|
|
global modified
|
|
|
|
|
set modified 0
|
|
|
|
|
|
|
|
|
|
frame .f1
|
|
|
|
|
|
|
|
|
|
frame .f1.f1
|
|
|
|
|
|
|
|
|
|
# "File" menu
|
|
|
|
|
menubutton .f1.f1.mb1 -text File -underline 0
|
|
|
|
|
|
|
|
|
|
menu .f1.f1.mb1.m1 -tearoff 1
|
|
|
|
|
.f1.f1.mb1.m1 add command -command {writefile $filename} \
|
|
|
|
|
-label Save -underline 0
|
|
|
|
|
.f1.f1.mb1.m1 add command -command {saveas} \
|
|
|
|
|
-label {Save As...} -underline 5
|
|
|
|
|
.f1.f1.mb1.m1 add command -command {openfile} \
|
|
|
|
|
-label {Open...} -underline 0
|
|
|
|
|
.f1.f1.mb1.m1 add separator
|
|
|
|
|
.f1.f1.mb1.m1 add command -command {quit 0} -label Exit -underline 1
|
|
|
|
|
|
|
|
|
|
.f1.f1.mb1 configure -menu .f1.f1.mb1.m1
|
|
|
|
|
|
|
|
|
|
# "Help" menu
|
|
|
|
|
menubutton .f1.f1.mbH -text Help -underline 0
|
|
|
|
|
|
|
|
|
|
menu .f1.f1.mbH.m1 -tearoff 1
|
|
|
|
|
.f1.f1.mbH.m1 add command -command {htmlview $helpfile} \
|
|
|
|
|
-label "Help..." -underline 0
|
|
|
|
|
.f1.f1.mbH.m1 add separator
|
|
|
|
|
.f1.f1.mbH.m1 add command -command {about} -label "About..." -underline 0
|
|
|
|
|
|
|
|
|
|
.f1.f1.mbH configure -menu .f1.f1.mbH.m1
|
|
|
|
|
|
|
|
|
|
# "Makefile" menu
|
|
|
|
|
menubutton .f1.f1.mb2 -text Makefile -underline 0
|
|
|
|
|
menu .f1.f1.mb2.m1 -tearoff 1 -disabledforeground blue3
|
|
|
|
|
makemfilemenu
|
|
|
|
|
|
|
|
|
|
frame .f1.f2
|
|
|
|
|
frame .f1.f2.f1
|
|
|
|
|
text .f1.f2.f1.t1 -height 25 -width 80 -wrap none \
|
|
|
|
|
-yscrollcommand {.f1.f2.f1.s1 set} \
|
|
|
|
|
-xscrollcommand {.f1.f2.s2 set} \
|
|
|
|
|
-state $editwidget
|
|
|
|
|
scrollbar .f1.f2.f1.s1 -command {.f1.f2.f1.t1 yview}
|
|
|
|
|
scrollbar .f1.f2.s2 -orient horizontal -command {.f1.f2.f1.t1 xview}
|
|
|
|
|
|
|
|
|
|
pack configure .f1.f1.mbH -side right
|
|
|
|
|
pack configure .f1.f1.mb1 -side left
|
|
|
|
|
pack configure .f1.f1.mb2 -side left
|
|
|
|
|
pack configure .f1.f1 -fill x -side top -anchor nw
|
|
|
|
|
|
|
|
|
|
pack configure .f1.f2.f1.t1 -side left -expand y -fill both -anchor nw
|
|
|
|
|
pack configure .f1.f2.f1.s1 -side left -fill y -anchor nw
|
|
|
|
|
pack configure .f1.f2.f1 -side top -expand y -fill both -anchor nw
|
|
|
|
|
pack configure .f1.f2.s2 -side left -expand y -fill x -anchor nw
|
|
|
|
|
pack configure .f1.f2 -side top -expand y -fill both -anchor nw
|
|
|
|
|
|
|
|
|
|
pack configure .f1 -side left -expand y -fill both -anchor nw
|
|
|
|
|
|
|
|
|
|
update
|
|
|
|
|
set x [winfo width .]
|
|
|
|
|
set y [winfo height .]
|
|
|
|
|
wm minsize . $x $y
|
|
|
|
|
|
|
|
|
|
# XBM icons look fairly stupid on Windows since the background will
|
|
|
|
|
# be rendered in black. Rather keep the standar Tk icon there.
|
|
|
|
|
if {$tcl_platform(platform) == "unix" && [file exists $mainicon]} {
|
|
|
|
|
wm iconbitmap . @$mainicon
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
.f1.f2.f1.t1 configure -state normal
|
|
|
|
|
.f1.f2.f1.t1 insert end $makefile
|
|
|
|
|
.f1.f2.f1.t1 configure -state $editwidget
|
|
|
|
|
|
|
|
|
|
bind . <Key-F1> {htmlview $helpfile}
|
|
|
|
|
|
|
|
|
|
# When the text widget is in normal state, <Key-Prior> and <Key-Next>
|
|
|
|
|
# already work as expected, but they don't when it is in disabled
|
|
|
|
|
# state (since the widget doesn't get any focus then) so we override
|
|
|
|
|
# it globally here. While we are at it, bind <Key-Home> and <Key-End>
|
|
|
|
|
# as well.
|
|
|
|
|
|
|
|
|
|
bind . <Key-Prior> ".f1.f2.f1.t1 yview scroll -10 units"
|
|
|
|
|
bind . <Key-Next> ".f1.f2.f1.t1 yview scroll 10 units"
|
|
|
|
|
bind . <Key-Home> ".f1.f2.f1.t1 yview moveto 0"
|
|
|
|
|
bind . <Key-End> ".f1.f2.f1.t1 yview moveto 1"
|
|
|
|
|
|
|
|
|
|
wm protocol . WM_DELETE_WINDOW {quit 0}
|
|
|
|
|
wm protocol . WM_SAVE_YOURSELF {quit 1}
|