#!/bin/sh  
# \
exec oagtclsh "$0" "$@"
set auto_path [linsert $auto_path 0  /usr/local/oag/apps/lib/$env(HOST_ARCH)]
set auto_path [linsert $auto_path 0 /usr/local/oag/lib_patch/$env(HOST_ARCH)]

proc CheckoutAndBuildEPICS {args} {
    global env buildDir
    
    if {[file exists /net/phoebus/epicsmgr/cvsroot] && [file exists /usr/local/epicsmgr/cvsLockDir]} {
	set env(CVSROOT) /net/phoebus/epicsmgr/cvsroot
    } else {
	set env(CVSROOT) :ext:oag@carnation.aps.anl.gov:/net/phoebus/epicsmgr/cvsroot
    }
    exec rm -rf ${buildDir}/oagsoftware
    exec mkdir ${buildDir}/oagsoftware
    cd ${buildDir}/oagsoftware
    if {[catch {exec cvs -Q checkout -P -r R3-14-10 epics/base} results]} {
#        puts stderr "error: $results"
#        exit
    }
    cd ${buildDir}/oagsoftware/epics/base/config
    
    exec echo CROSS_COMPILER_TARGET_ARCHS = >> CONFIG
    exec echo SHARED_LIBRARIES=NO >> CONFIG
    if {$env(EPICS_HOST_ARCH) == "solaris-x86-gnu"} {
	exec echo GNU_DIR=/usr/local >> CONFIG
    }
    
    cd ${buildDir}/oagsoftware/epics/base/configure
    
    exec echo CROSS_COMPILER_TARGET_ARCHS = >> CONFIG
    exec echo SHARED_LIBRARIES=NO >> CONFIG
    exec echo COMMANDLINE_LIBRARY= >> CONFIG
    if {$env(EPICS_HOST_ARCH) == "solaris-x86-gnu"} {
	exec echo GNU_DIR=/usr/local >> CONFIG
    }
    
    cd ${buildDir}/oagsoftware/epics/base
        
    catch {exec make -s}
    
}

proc CheckoutAndBuildSDDS {args} {
    global env buildDir
    if {[file exists /net/phoebus/epicsmgr/cvsroot] && [file exists /usr/local/epicsmgr/cvsLockDir]} {
	set env(CVSROOT) /net/phoebus/epicsmgr/cvsroot
    } else {
	set env(CVSROOT) :ext:oag@carnation.aps.anl.gov:/net/phoebus/epicsmgr/cvsroot
    }
    cd ${buildDir}/oagsoftware
    
    if {[catch {exec cvs -Q checkout -P epics/extensions/config epics/extensions/configure epics/extensions/src/SDDS epics/extensions/src/oagca epics/extensions/src/SDDSepics} results]} {
        puts stderr "error: $results"
        exit
    }
    
    cd ${buildDir}/oagsoftware/epics/extensions/config
    
    exec echo EPICS_BASE=${buildDir}/oagsoftware/epics/base >> RELEASE
    exec echo CROSS_COMPILER_TARGET_ARCHS = >> CONFIG
    exec echo SHARED_LIBRARIES=NO >> CONFIG
    if {$env(EPICS_HOST_ARCH) == "solaris-x86-gnu"} {
	exec echo GNU_DIR=/usr/local >> CONFIG
    }

    cd ${buildDir}/oagsoftware/epics/extensions/configure
    
    exec echo EPICS_BASE=${buildDir}/oagsoftware/epics/base >> RELEASE
    exec echo CROSS_COMPILER_TARGET_ARCHS = >> CONFIG
    exec echo SHARED_LIBRARIES=NO >> CONFIG
    if {$env(EPICS_HOST_ARCH) == "solaris-x86-gnu"} {
	exec echo GNU_DIR=/usr/local >> CONFIG
    }
    
    exec make
    
    cd ${buildDir}/oagsoftware/epics/extensions/src/SDDS
    
    catch {exec make -sk}
    
    cd ${buildDir}/oagsoftware/epics/extensions/src/oagca
    
    catch {exec make -sk}
    
    cd ${buildDir}/oagsoftware/epics/extensions/src/SDDSepics
    
    catch {exec make -sk}
}

proc CheckoutAndBuildOAG {args} {
    global env buildDir
    if {[file exists /net/phoebus/oagmgr/cvsroot]} {
	set env(CVSROOT) /net/phoebus/oagmgr/cvsroot
    } else {
	set env(CVSROOT) :ext:oag@carnation.aps.anl.gov:/net/phoebus/oagmgr/cvsroot
    }
    cd ${buildDir}/oagsoftware
    
    if {[catch {exec cvs -Q checkout -P oag/apps/config oag/apps/configure oag/apps/src} results]} {
        puts stderr "error: $results"
        exit
    }
    
    cd ${buildDir}/oagsoftware/oag/apps/config
    
    exec echo EPICS_BASE=${buildDir}/oagsoftware/epics/base >> RELEASE
    exec echo CROSS_COMPILER_TARGET_ARCHS = >> CONFIG
    exec echo SHARED_LIBRARIES=NO >> CONFIG
    if {$env(EPICS_HOST_ARCH) == "solaris-x86-gnu"} {
	exec echo GNU_DIR=/usr/local >> CONFIG
    }
    
    cd ${buildDir}/oagsoftware/oag/apps/configure
    
    exec echo EPICS_BASE=${buildDir}/oagsoftware/epics/base >> RELEASE
    exec echo EPICS_BASE=${buildDir}/oagsoftware/epics/base >> RELEASE.$env(EPICS_HOST_ARCH)
    exec echo CROSS_COMPILER_TARGET_ARCHS = >> CONFIG
    exec echo SHARED_LIBRARIES=NO >> CONFIG
    if {$env(EPICS_HOST_ARCH) == "solaris-x86-gnu"} {
	exec echo GNU_DIR=/usr/local >> CONFIG
    }
    
    exec make
    
    cd ${buildDir}/oagsoftware/oag/apps/src
    
    catch {exec make -sk}
    
}

proc CppatchNewSDDSFiles {args} {
    global env buildDir
    if {[file exists ${buildDir}/oagsoftware/epics/extensions/bin/$env(EPICS_HOST_ARCH)] == 0} {
        return
    }
    cd ${buildDir}/oagsoftware/epics/extensions/bin/$env(EPICS_HOST_ARCH)
    array set modTimes [exec cat /tmp/modTimes.txt]
    
    set files [glob *]
    
    set fileList ""

    foreach f $files {
        set update 0
        set f1 /net/helios/usr/local-sun4u/oag/apps/bin/solaris/$f
        if {[lsearch -exact [array names modTimes] $f1] != -1} {
            set t1 $modTimes($f1)
            set f2 /usr/local/oag/apps/bin/$env(EPICS_HOST_ARCH)/$f
            if {[file exists $f2]} {
                set t2 [file mtime $f2]
                if {$t1 > $t2} {
                    set update 1
                }
            } else {
                set update 1
            }
        }
        if {$update} {
            append fileList "$f "
        }
    }
    if {[llength $fileList]} {
        eval exec cppatch -comment "Nightly build for Solaris Beams clients" $fileList
    }
}

proc CppatchNewOAGFiles {args} {
    global env buildDir
    if {[file exists ${buildDir}/oagsoftware/oag/apps/lib/$env(EPICS_HOST_ARCH)] == 0} {
        return
    }
    cd ${buildDir}/oagsoftware/oag/apps/lib/$env(EPICS_HOST_ARCH)
    array set modTimes [exec cat /tmp/modTimes.txt]
    
    set files [glob *]
    
    set fileList ""

    foreach f $files {
        if {$f == "working.au"} { continue }
        if {$f == "emergency.au"} { continue }
        if {$f == "alert.au"} { continue }
        set update 0
        set f1 /net/helios/usr/local-sun4u/oag/apps/lib/solaris/$f
        if {[lsearch -exact [array names modTimes] $f1] != -1} {
            set t1 $modTimes($f1)
            set f2 /usr/local/oag/apps/lib/$env(EPICS_HOST_ARCH)/$f
            if {[file exists $f2]} {
                set t2 [file mtime $f2]
                if {$t1 > $t2} {
                    set update 1
                }
            } else {
                set update 1
            }
        }
        if {$update} {
            append fileList "$f "
        }
    }
    if {[llength $fileList]} {
        eval exec cppatch $fileList
    }


    if {[file exists ${buildDir}/oagsoftware/oag/apps/bin/$env(EPICS_HOST_ARCH)] == 0} {
        return
    }
    cd ${buildDir}/oagsoftware/oag/apps/bin/$env(EPICS_HOST_ARCH)
    
    set files [glob *]
    
    set fileList ""

    foreach f $files {
        set update 0
        set f1 /net/helios/usr/local-sun4u/oag/apps/bin/solaris/$f
        if {[lsearch -exact [array names modTimes] $f1] != -1} {
            set t1 $modTimes($f1)
            set f2 /usr/local/oag/apps/bin/$env(EPICS_HOST_ARCH)/$f
            if {[file exists $f2]} {
                set t2 [file mtime $f2]
                if {$t1 > $t2} {
                    set update 1
                }
            } else {
                set update 1
            }
        }
        if {$update} {
            append fileList "$f "
        }
    }
    if {[llength $fileList]} {
        eval exec cppatch $fileList
    }
}

proc UpdateTclExtensions {args} {
    global buildDir
    if {[file exists ${buildDir}/oagsoftware/oag/apps/src/tcltkinterp/extensions] == 0} {
        return
    }
    cd ${buildDir}/oagsoftware/oag/apps/src/tcltkinterp/extensions
    
    foreach extension "ca os sdds rpn" so "libtclCa.so libtclOS.so libtclSDDS.so libtclRPN.so" {
        set files "${extension}/pkgIndex.tcl ${extension}/O.solaris-sparc/$so"
        set files2 "pkgIndex.tcl $so"

        foreach f $files f0 $files2 {
            set f1 /net/helios/usr/local-sun4u/oag/lib/${extension}/$f0
            if {[file exists $f1]} {
                set t1 [file mtime $f1]
                set f2 /usr/local/oag/lib/${extension}/$f0
                if {[file exists $f2]} {
                    set t2 [file mtime $f2]
                    puts "$t1 > $t2"
                    if {$t1 < $t2} {
                        file delete -force $f2
                        file copy -force $f $f2
                        exec chmod g+w $f2
                    }
                } else {
                    file copy -force $f $f2
                    exec chmod g+w $f2
                }
            }
        }
    }
}

proc CleanUpFiles {args} {
    global buildDir
    cd ${buildDir}
    exec rm -rf ${buildDir}/oagsoftware
}



if {([info hostname] == "challenger.aps.anl.gov")} {
    proc GetModificationTimes {args} {
        cd /net/helios/usr/local-sun4u/oag/apps/bin/solaris
        set files [glob *]
        
        foreach f $files {
            set f1 /net/helios/usr/local-sun4u/oag/apps/bin/solaris/$f
            set t1 [file mtime $f1]
            set modTimes($f1) $t1
        }
        
        cd /net/helios/usr/local-sun4u/oag/apps/lib/solaris
        set files [glob *]
        foreach f $files {
            set f2 /net/helios/usr/local-sun4u/oag/apps/lib/solaris/$f
            set t2 [file mtime $f2]
            set modTimes($f2) $t2
        }
        cd /tmp
        set fid [open modTimes.txt "w"]
        puts $fid [array get modTimes]
        close $fid
    }
    
    proc SendModificationTimes {args} {
        cd /tmp
        
        exec scp -C -c blowfish /tmp/modTimes.txt oag@ipnspool3:/tmp/modTimes.txt
        exec scp -C -c blowfish /tmp/modTimes.txt oag@sakie:/tmp/modTimes.txt
        exec scp -C -c blowfish /tmp/modTimes.txt oag@quacky:/tmp/modTimes.txt
    }
       
    GetModificationTimes
    SendModificationTimes
} else {

    if {([exec domainname] != "xdiv.netw0rk") && ([exec domainname] != "xor.aps.anl.gov")} {
        puts "You must run this from a XOR Beams client"
        exit
    }
    
    if {$env(EPICS_HOST_ARCH) == "solaris-x86"} {
        set env(EPICS_HOST_ARCH) "solaris-x86-gnu"
    }
    
    if {[file exists /local]} {
        set buildDir /local
    } elseif {[file exists /scratch]} {
        set buildDir /scratch
    } else {
        set buildDir /tmp
    }
    
    CleanUpFiles
    CheckoutAndBuildEPICS
    CheckoutAndBuildSDDS
    CheckoutAndBuildOAG
    CppatchNewSDDSFiles
    CppatchNewOAGFiles
    #UpdateTclExtensions
    CleanUpFiles
}
