Search code examples
tclxilinxvivado

Copy filename (with wildcard) in tcl


I'm trying to copy a file using a wildcard and it isn't being interpreted correctly.

set projName [lindex $argv 0]
puts "$projName chosen"

set sysdefPath "$projName/$projName.runs/impl_1/*.sysdef"
file copy -force $sysdefPath ./src/generatedFiles/$projName.hdf

I've tried a couple of variations of this but none have worked {*}, (*), [*], {.*}. The result of this places the wildcard (*) in the search path instead of trying to pattern match it.

What is the correct way to perform this?

Output,

$ test.tcl -tclargs proj
# set projName [lindex $argv 0]
# puts "$projName chosen"
proj chosen
# set sysdefPath "$projName/$projName.runs/impl_1/*.sysdef"
# file copy -force $sysdefPath ./src/generatedFiles/$projName.hdf
error copying "proj/proj.runs/impl_1/*.sysdef": no such file or directory
    while executing
"file copy -force $sysdefPath ./src/generatedFiles/$projName.hdf"
    (file "./src/projTcls/build_bitstream.tcl" line 5)

Solution

  • Your shell will expand file patterns wherever it finds them. Tcl is not like that: you have to explicitly ask for the list of files matching a pattern using the glob command: untested

    set pattern $projName/$projName.runs/impl_1/*.sysdef
    set sysdefPaths [glob -nocomplain -- $pattern]
    switch -exact [llength $sysdefPaths] {
        0 {error "No files match $pattern"}
        1 {file copy -force [lindex $sysdefPaths 0] ./src/generatedFiles/$projName.hdf}
        default {error "Multiple files match $pattern: [list $sysdefPaths]"}
    }