feat(tcl): create_project.tcl 自动清理旧工程后重建
- 新增 clean_first 开关(默认 1):先删掉旧工程与所有生成目录再新建, 只删生成物(*.xpr/*.srcs/*.runs/*.sim/*.cache/*.hw/*.gen/*.ip_user_files/ .Xil/xsim.dir/*.lpr/vivado*.jou|log|str/webtalk.*),srcs/、tools/、programs/ 不动 - 被别的 Vivado 占用的工程目录删不掉时,给出明确提示并中止(不再抛 Vivado 原始异常) - create_project 加 -force,残留目录也能覆盖 - 实测:空目录建工程成功;连续第二次运行自动清理 7 项后重建成功,综合通过
This commit is contained in:
@@ -13,11 +13,15 @@
|
||||
# 说明文档:cpu21_riscv_redirect_int_bpb说明.md
|
||||
#
|
||||
# 用法:
|
||||
# 1) 建议先删掉本目录下的 pipelined-cpu.xpr,以及 *.runs / *.sim / *.cache /
|
||||
# *.hw / *.gen / *.ip_user_files 等生成目录(不删会在下面报错提示);
|
||||
# 2) 在 Vivado Tcl Shell 里执行: source create_project.tcl
|
||||
# 1) 在 Vivado Tcl Shell 里执行: source create_project.tcl
|
||||
# 或命令行: vivado -mode batch -source create_project.tcl -log create.log
|
||||
# 2) 脚本会**先自动清理旧工程**再新建:只删生成物(*.xpr / *.srcs / *.runs /
|
||||
# *.sim / *.cache / *.hw / *.gen / *.ip_user_files / .Xil / xsim.dir /
|
||||
# vivado*.jou|log|str / webtalk.*),srcs/、tools/、programs/ 一律不动。
|
||||
# 不想自动清理(比如想在旧工程上追加设置)就把下面的 clean_first 改成 0。
|
||||
# 3) 工程就地创建:pipelined-cpu.xpr(源文件仍在 srcs/ 下,不会被搬动)。
|
||||
# 4) 若提示 .xpr 删不掉,说明有 Vivado(含 Hardware Manager)正开着那个工程,
|
||||
# 关掉它再跑一遍即可。
|
||||
#
|
||||
# 脚本用 [info script] 定位自身目录,所以整个文件夹拷到任何路径都能直接用。
|
||||
# 若想用 Vivado 自动生成的版本,见说明文档“工程分享”一节。
|
||||
@@ -47,10 +51,62 @@ if {[llength $missing] > 0} {
|
||||
return 1
|
||||
}
|
||||
|
||||
if {[file exists "$origin_dir/$proj_name.xpr"]} {
|
||||
puts "ERROR: 工程已存在:$origin_dir/$proj_name.xpr"
|
||||
puts " 请先删除 .xpr(以及 *.runs / *.sim 等生成目录)后重跑本脚本。"
|
||||
# ---------------------------------------------------------------- 清理旧工程
|
||||
# 一键重建:先删掉旧工程和所有生成目录。工程完全由 srcs/ + 本脚本决定,
|
||||
# 所以删掉不会丢任何源文件;不想自动清理就把 clean_first 改成 0。
|
||||
set clean_first 1
|
||||
|
||||
if {$clean_first} {
|
||||
# 必须删掉的工程目录:任何一个删不掉都不能继续(否则 Vivado 会拒绝建工程)
|
||||
set proj_items [list \
|
||||
"$origin_dir/$proj_name.xpr" \
|
||||
"$origin_dir/$proj_name.srcs" \
|
||||
"$origin_dir/$proj_name.runs" \
|
||||
"$origin_dir/$proj_name.sim" \
|
||||
"$origin_dir/$proj_name.cache" \
|
||||
"$origin_dir/$proj_name.hw" \
|
||||
"$origin_dir/$proj_name.gen" \
|
||||
"$origin_dir/$proj_name.ip_user_files" \
|
||||
"$origin_dir/$proj_name.lpr" \
|
||||
"$origin_dir/.Xil"]
|
||||
# 顺带清掉的杂项:删不掉也无所谓(本进程自己会占着 vivado.jou / .log / .str)
|
||||
set junk_items [list \
|
||||
"$origin_dir/xsim.dir" \
|
||||
"$origin_dir/webtalk.jou" \
|
||||
"$origin_dir/webtalk.log" \
|
||||
"$origin_dir/usage_statistics_webtalk.html" \
|
||||
"$origin_dir/usage_statistics_webtalk.xml"]
|
||||
foreach pat {vivado*.jou vivado*.log vivado*.str} {
|
||||
foreach f [glob -nocomplain "$origin_dir/$pat"] { lappend junk_items $f }
|
||||
}
|
||||
|
||||
set blocked {}
|
||||
set removed 0
|
||||
foreach {group items} [list proj $proj_items junk $junk_items] {
|
||||
foreach d $items {
|
||||
if {![file exists $d]} { continue }
|
||||
if {[catch {file delete -force $d} err]} {
|
||||
puts " WARNING: 删不掉 [file tail $d]($err)"
|
||||
if {$group eq "proj"} { lappend blocked [file tail $d] }
|
||||
} else {
|
||||
puts " 已删除:[file tail $d]"
|
||||
incr removed
|
||||
}
|
||||
}
|
||||
}
|
||||
puts "旧工程清理完成(删除 $removed 项)"
|
||||
if {[llength $blocked] > 0} {
|
||||
puts "ERROR: 这些工程目录删不掉:$blocked"
|
||||
puts " 它们正被另一个 Vivado(GUI / Hardware Manager)占用。"
|
||||
puts " 请关闭 Vivado 后重跑本脚本。"
|
||||
return 1
|
||||
}
|
||||
} else {
|
||||
if {[file exists "$origin_dir/$proj_name.xpr"] || [file exists "$origin_dir/$proj_name.runs"]} {
|
||||
puts "ERROR: 工程已存在且 clean_first = 0:$origin_dir/$proj_name.xpr"
|
||||
puts " 请先删除它,或把 clean_first 改成 1 让脚本自动清理。"
|
||||
return 1
|
||||
}
|
||||
}
|
||||
|
||||
# ---------------------------------------------------------------- 建工程
|
||||
@@ -61,7 +117,8 @@ if {[file exists "$origin_dir/$proj_name.xpr"]} {
|
||||
# create_project $proj_name $origin_dir -part $part_name \
|
||||
# -board_part digilentinc.com:nexys4ddr:part0:1.1
|
||||
# (那样工程会记上板卡,别人没装板卡文件就打不开了,所以默认不这么写。)
|
||||
create_project $proj_name $origin_dir -part $part_name
|
||||
# -force:万一还有残留目录(例如被占用的 .runs)也能覆盖,不至于卡死。
|
||||
create_project $proj_name $origin_dir -part $part_name -force
|
||||
|
||||
# 设计源文件:处理器 RTL + 板级顶层 + 片内 ROM 初始化
|
||||
add_files -norecurse -fileset sources_1 [glob "$origin_dir/srcs/rtl/*.v"]
|
||||
|
||||
Reference in New Issue
Block a user