Compare commits

..
6 Commits
5 changed files with 134 additions and 150 deletions
+65 -39
View File
@@ -5,48 +5,53 @@ HIDE = > /dev/zero
endif endif
TIMESTAMP = $(shell date +"%T") TIMESTAMP = $(shell date +"%T")
cmd_copy = cp -a $(1) $(2) copy_files = cp $(1) $(2)
cmd_link = ln -sfr $(1) $(2) copy_dir = cp -r $(1) $(2)
cmd_remove = rm -rf $(1) remove_file = rm -rf $(1)
cmd_mkdir = mkdir -p $(1) remove_dir = rm -rf $(1)
cmd_cat = cat $(1) 2>/dev/null mk_dir = mkdir -p $(1)
cmd_print_lines = echo $(1) | tr ' ' '\n' read_file = cat $(1) 2>/dev/null
print_lines = echo $(1) | tr ' ' '\n'
color_green = \033[32m$(1)\033[0m green = \\e[32m$(1)\\e[39m
log = @printf "$(call color_green,[$(TIMESTAMP)]) %s\n" "$(1)" print = printf "$(call green,[$(TIMESTAMP)]) $(1)\n"
show_build_type = $(call log,Building for $(call green,$(1))) make_dir_link = ln -sfr $(1) $(2)
make_link = ln -sfr $(1) $(2)
check-var = $(if $(strip $($(1))),,$(error [ERROR] Missing required variable: $(1)))
check_command = $(shell which $(1) > /dev/null 2>&1 && echo y || echo n) check_command = $(shell which $(1) > /dev/null 2>&1 && echo y || echo n)
print_build_type = $(call print,Building for $(call green,$(1)))
$(call check-var,PROJECT) ifeq ('y', '$(strip $(LINK_SRCS))')
$(call check-var,PLATFORM) update_files = $(call make_link,$(1),$(2))
$(call check-var,BUILD_DIR) update_dir = $(call make_dir_link,$(1),$(2))
$(call check-var,CONFIG_FILE) ACTION = Linking
$(call check-var,LINK_SRCS) else
update_files = $(call copy_files,$(1),$(dir $(2)))
update_dir = $(call copy_dir,$(1),$(2))
ACTION = Copying
endif
ifndef PROJECT
@$(error "PROJECT variable needs to be set")
endif
ifndef PLATFORM
@$(error "PLATFORM variable needs to be set")
endif
ifndef BUILD_DIR
@$(error "BUILD_DIR variable needs to be set")
endif
ifndef CONFIG_FILE
@$(error "CONFIG_FILE variable needs to be set")
endif
ifndef SCRIPT_DIR ifndef SCRIPT_DIR
CURRENT_FILE := $(lastword $(MAKEFILE_LIST)) CURRENT_FILE := $(lastword $(MAKEFILE_LIST))
CURRENT_DIR := $(patsubst %/,%,$(dir $(CURRENT_FILE))) CURRENT_DIR := $(patsubst %/,%,$(dir $(CURRENT_FILE)))
SCRIPT_DIR := $(CURRENT_DIR) SCRIPT_DIR := $(CURRENT_DIR)
endif endif
ifeq ($(strip $(LINK_SRCS)),y)
update_files = $(call cmd_link,$(1),$(2))
update_dir = $(call cmd_link,$(1),$(2))
ACTION = Linking
else
update_files = $(call cmd_copy,$(1),$(dir $(2)))
update_dir = $(call cmd_copy,$(1),$(2))
ACTION = Copying
endif
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
# COMMON INITIALIZATION # COMMON INITIALIZATION
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
PLATFORM_TOOLS = $(SCRIPT_DIR)/platform/$(PLATFORM) PLATFORM_TOOLS = $(SCRIPT_DIR)/platform/$(PLATFORM)
BUILD_LOCK = $(BUILD_DIR)/.build.lock BUILD_LOCK = $(BUILD_DIR)/.project.lock
PROJECT_LOCK = $(BUILD_DIR)/.project.lock
ifeq ('xilinx', '$(PLATFORM)') ifeq ('xilinx', '$(PLATFORM)')
include $(PLATFORM_TOOLS)/xilinx.mk include $(PLATFORM_TOOLS)/xilinx.mk
@@ -57,28 +62,49 @@ endif
# Generic Goals # Generic Goals
#------------------------------------------------------------------------------ #------------------------------------------------------------------------------
PHONY := clean reset project build sdkopen .DEFAULT_GOAL := all
.DEFAULT_GOAL := project PHONY += all
ifneq ($(wildcard $(BUILD_LOCK)),)
all:
@$(call print_build_type,$(PLATFORM))
$(MAKE) --no-print-directory build
@$(call print,Done ($(notdir $(BUILD_DIR))))
else
all:
@$(call print_build_type,$(PLATFORM))
$(MAKE) --no-print-directory project
$(MAKE) --no-print-directory build
@$(call print,Done ($(notdir $(BUILD_DIR))))
endif
# Create project using corresponding SDK
project: $(PLATFORM)_project project: $(PLATFORM)_project
@echo "$(TIMESTAMP): Build lock." > $(BUILD_LOCK)
# Build project using corresponding compiler standalone:
build: project $(PLATFORM)_sdkbuild $(MAKE) --no-print-directory project LINK_SRCS=n
# Build project using generic compiler
build: $(PLATFORM)_sdkbuild
# Open the project using the corresponding SDK # Open the project using the corresponding SDK
sdkopen: project $(PLATFORM)_sdkopen sdkopen: $(PLATFORM)_sdkopen
# Remove build artefacts # Remove build artefacts
PHONY += clean
ifneq ($(wildcard $(BUILD_LOCK)),) ifneq ($(wildcard $(BUILD_LOCK)),)
clean: $(PLATFORM)_sdkclean clean:
@$(call print,Cleaning sdk build uploaded to board)
$(MAKE) --no-print-directory $(PLATFORM)_sdkclean
else else
clean: reset clean:
@$(call print,No project found, cleaning dummy files)
$(MAKE) --no-print-directory reset
endif endif
# Remove the whole build directory # Remove the whole build directory
PHONY += reset
reset: $(PLATFORM)_reset reset: $(PLATFORM)_reset
@$(call log,[Delete] $(BUILD_DIR)) @$(call print,[Delete] $(BUILD_DIR))
@$(call cmd_remove,$(BUILD_DIR)) @$(call remove_dir,$(BUILD_DIR))
.PHONY: $(PHONY) .PHONY: $(PHONY)
+5 -7
View File
@@ -44,7 +44,7 @@
- **project_name**: 项目名称,例如 `"demo"`。 - **project_name**: 项目名称,例如 `"demo"`。
- **version**: 项目版本,例如 `"0.0.0"`。 - **version**: 项目版本,例如 `"0.0.0"`。
- **hw_design**: 硬件设计文件(`.hdf` 或 `.xsa` 文件)路径(相对档案工作路径),例如 `"demo_v0.0.0.hdf"`。 - **hw_design**: 硬件设计文件(`.hdf` 或 `.xsa` 文件)路径(相对配置文件路径),例如 `"demo_v0.0.0.hdf"`。
### *fsbl_patch* (TODO) ### *fsbl_patch* (TODO)
@@ -172,7 +172,7 @@
} }
``` ```
- **sources**: 源文件列表,可使用通配符。例如,`"src/*"` 会将当前工作路径下的 `src` 文件夹中的所有文件复制或链接到相应工程目录下的 `src` 文件夹中。 - **sources**: 源文件列表,应为相对当前配置文件的路径,可使用通配符。例如,`"src/*"` 会将配置文件所在目录下的 `src` 文件夹中的所有文件复制或链接到相应工程目录下的 `src` 文件夹中。
- **target_cpu**: 目标 CPU ID[^2]; - **target_cpu**: 目标 CPU ID[^2];
- **os**: 操作系统类型[^1],必须与 BSP/Domain 匹配; - **os**: 操作系统类型[^1],必须与 BSP/Domain 匹配;
- **language**: 编程语言,"C" 或 "C++"; - **language**: 编程语言,"C" 或 "C++";
@@ -188,12 +188,12 @@
- `compiler-misc`: 其他编译器选项; - `compiler-misc`: 其他编译器选项;
- `compiler-optimization`: 编译优化选项; - `compiler-optimization`: 编译优化选项;
- `linker-misc`: 链接器选项; - `linker-misc`: 链接器选项;
- `linker-script`: 链接脚本路径[^3]; - `linker-script`: 链接脚本路径;
- `define-compiler-symbols`: 自定义的编译器宏定义符号列表; - `define-compiler-symbols`: 自定义的编译器宏定义符号列表;
- `undef-compiler-symbols`: 要取消定义的符号列表; - `undef-compiler-symbols`: 要取消定义的符号列表;
- `include-path`: 包含文件路径[^3]; - `include-path`: 包含文件路径;
- `libraries`: 需要链接的库; - `libraries`: 需要链接的库;
- `library-search-path`: 库搜索路径[^3]; - `library-search-path`: 库搜索路径;
以下配置添加了一个名为 `demo_app` 的 Application 工程,该工程没有指定 BSP/Domain 但能够通过 `bsp_lib` 和 `bsp_config` 自动生成一个名为 `standalone_ps7_cortexa9_0` 的 BSP/Domain 工程。 以下配置添加了一个名为 `demo_app` 的 Application 工程,该工程没有指定 BSP/Domain 但能够通过 `bsp_lib` 和 `bsp_config` 自动生成一个名为 `standalone_ps7_cortexa9_0` 的 BSP/Domain 工程。
@@ -239,5 +239,3 @@
[^1]: 具体可配置项取决于对应 IDE 版本; [^1]: 具体可配置项取决于对应 IDE 版本;
[^2]: 具体可选 CPU ID 取决于硬件型号; [^2]: 具体可选 CPU ID 取决于硬件型号;
[^3]: 相对对应工程的文件夹的路径;
+43 -72
View File
@@ -90,46 +90,6 @@ proc _configure_bsp {bsp_name bsp_config platform_name is_vitis} {
return $bsp_name return $bsp_name
} }
# Helper procedure to recursively create hard links for files in a directory
proc _link_or_copy_dir {source_dir target_dir link_mode} {
# Create target directory if it doesn't exist
if {![file exists $target_dir]} {
file mkdir $target_dir
_info "Created directory: $target_dir"
}
# Process each file and subdirectory in the source directory
foreach item [glob -nocomplain -directory $source_dir *] {
set item_name [file tail $item]
set target_item [file join $target_dir $item_name]
# Remove existing file or directory
if {[file exists $target_item]} {
file delete -force $target_item
_warn "Deleted existing item: $target_item"
}
if {[file isfile $item]} {
# Handle file - create hard link or copy
if {$link_mode eq "y"} {
if {[catch {
file link -hard $target_item $item
} err]} {
error "Failed to create hard link: $err"
} else {
_info "Created hard link: $target_item -> $item"
}
} else {
file copy $item $target_item
_info "Copied file: $item to $target_item"
}
} elseif {[file isdirectory $item]} {
# Handle subdirectory recursively
_link_or_copy_dir $item $target_item $link_mode
}
}
}
# Helper procedure to handle source files: link or copy based on LINK_SRCS # Helper procedure to handle source files: link or copy based on LINK_SRCS
proc _handle_sources {app_name sources} { proc _handle_sources {app_name sources} {
# Check environment variable LINK_SRCS # Check environment variable LINK_SRCS
@@ -144,41 +104,53 @@ proc _handle_sources {app_name sources} {
if {[llength $expanded_sources] == 0} { if {[llength $expanded_sources] == 0} {
_error "Source file not found" "No file or directory matches $source_file" _error "Source file not found" "No file or directory matches $source_file"
} }
# Hanle each expanded source
# Handle each expanded source
foreach eval_source $expanded_sources { foreach eval_source $expanded_sources {
set relative_source [string range $eval_source [expr [string length $::root] + 1] end] set relative_source [string range $eval_source [expr [string length $::root] + 1] end]
set target_path [file join $::ws $app_name $relative_source] set target_path [file join $::ws $app_name $relative_source]
if {[file isfile $eval_source]} { # Ensure the target directory exists
# For files, ensure the parent directory exists set target_dir [file dirname $target_path]
set target_dir [file dirname $target_path] if {![file exists $target_dir]} {
if {![file exists $target_dir]} { file mkdir $target_dir
file mkdir $target_dir _info "Created directory: $target_dir"
_info "Created directory: $target_dir" }
}
# Delete existing file if it exists # Delete existing symbolic link or file if it exists
if {[file exists $target_path]} { if {[file exists $target_path]} {
file delete -force $target_path file delete -force $target_path
_warn "Deleted existing file: $target_path" _warn "Deleted existing link or file: $target_path"
} }
# Handle file based on LINK_SRCS # Handle source based on the value of LINK_SRCS
if {$link_srcs eq "y"} { switch $link_srcs {
if {[catch { "y" {
file link -hard $target_path $eval_source # Create symbolic link
} err]} { # -- TCL cannont create symbolic link for files on Windows
error "Failed to create hard link: $err" # -- Fallback to use mklink command
if {$::tcl_platform(platform) eq "windows" && ![file isdirectory $eval_source]} {
if {[catch {
exec cmd /c mklink [file nativename $target_path] [file nativename $eval_source]
} err]} {
error "Failed to create file symbolic link using mklink: $err"
}
} else {
if {[catch {
file link -symbolic $target_path $eval_source
} err]} {
error "Failed to create symbolic link: $err"
}
} }
_info "Created hard link: $target_path -> $eval_source" _info "Created symbolic link: $target_path -> $eval_source"
} else { }
file copy $eval_source $target_path "n" {
_info "Copied file: $eval_source to $target_path" # Copy the source file
file copy $eval_source $target_path
_info "Copied source file: $eval_source to $target_path"
}
default {
_error "Unknown value for LINK_SRCS: ${link_srcs}."
} }
} else {
# For directories, use the helper function
_link_or_copy_dir $eval_source $target_path $link_srcs
} }
} }
} }
@@ -261,8 +233,7 @@ proc _update_app_build_config {app_name build_type build_config is_vitis} {
"linker-misc" - "linker-misc" -
"linker-script" { "linker-script" {
if {$value ne ""} { if {$value ne ""} {
set value_list [list $value] eval $cmd $app_name -set $param $value
eval $cmd $app_name -set $param $value_list
_info "Set $param: $value for $app_name." _info "Set $param: $value for $app_name."
} }
} }
@@ -339,7 +310,7 @@ proc _create_app {app_name app_config platform_name is_vitis} {
-proc $cpu \ -proc $cpu \
-os $os \ -os $os \
-lang $lang \ -lang $lang \
-app "$template" -template "$template"
_info "Application '$app_name' created for Xilinx SDK." _info "Application '$app_name' created for Xilinx SDK."
} }
@@ -466,10 +437,10 @@ _info "Working at $ws"
set config_file_id [open $config_file r] set config_file_id [open $config_file r]
set config_data [read $config_file_id] set config_data [read $config_file_id]
close $config_file_id close $config_file_id
set root [pwd] set root [file dirname [file normalize $config_file]]
set config [json::json2dict $config_data] set config [json::json2dict $config_data]
set project_name [dict get $config project_name] set project_name [dict get $config project_name]
set hw_file [file normalize [file join $root [dict get $config hw_design]]] set hw_file [file normalize [file join [file dirname $config_file] [dict get $config hw_design]]]
_info "Starting process: $function" _info "Starting process: $function"
_info "Project name: $project_name" _info "Project name: $project_name"
+15 -24
View File
@@ -1,21 +1,14 @@
$(call check-var,XILINX_VITIS_CLASSIC) #------------------------------------------------------------------------------
$(call check-var,PLATFORM_TOOLS) # ENVIRONMENT VARIABLES
$(call check-var,CONFIG_FILE) #------------------------------------------------------------------------------
$(call check-var,BUILD_DIR)
$(call check-var,PROJECT_LOCK)
$(call check-var,BUILD_LOCK)
$(call check-var,LINK_SRCS)
define tcl_util define tcl_util
xsct -nodisp $(PLATFORM_TOOLS)/util.tcl \ xsct -nodisp $(PLATFORM_TOOLS)/util.tcl \
$(1) \ $(1) \
$(CONFIG_FILE) $(BUILD_DIR) $(CONFIG_FILE) $(BUILD_DIR)
endef endef
PHONY += xilinx_reset xilinx_project xilinx_sdkclean xilinx_sdkbuild
xilinx_sdkopen: xilinx_sdkopen:
@$(call log,Launching IDE...) @$(call print,Launching IDE...)
@if [ "$(call check_command,vitis)" = "y" ]; then \ @if [ "$(call check_command,vitis)" = "y" ]; then \
if [ "$(XILINX_VITIS_CLASSIC)" = "y" ]; then \ if [ "$(XILINX_VITIS_CLASSIC)" = "y" ]; then \
vitis -classic -workspace=$(BUILD_DIR); \ vitis -classic -workspace=$(BUILD_DIR); \
@@ -28,22 +21,20 @@ xilinx_sdkopen:
echo "No IDE found!" && exit 1; \ echo "No IDE found!" && exit 1; \
fi fi
PHONY += xilinx_sdkbuild
xilinx_sdkbuild: xilinx_sdkbuild:
@$(call log,[Build] SDK projects in $(BUILD_DIR)) @$(call print,[Build] SDK projects in $(BUILD_DIR))
$(call tcl_util, build) $(HIDE) $(call tcl_util, build) $(HIDE)
@echo "$(TIMESTAMP): Build lock." > $(BUILD_LOCK)
PHONY += xilinx_sdkclean
xilinx_sdkclean: xilinx_sdkclean:
@$(call log,[Delete] SDK artefacts from $(BUILD_DIR)) @$(call print,[Delete] SDK artefacts from $(BUILD_DIR))
$(call tcl_util, clean_project) $(HIDE) $(call tcl_util, clean_project) $(HIDE)
$(PROJECT_LOCK): xilinx_project:
@$(call log,Creating and configuring the IDE project) @$(call print,Creating and configuring the IDE project)
@$(call cmd_mkdir,$(BUILD_DIR)) $(call mk_dir,$(BUILD_DIR))
$(call tcl_util, create_project) $(HIDE) $(call tcl_util, create_project) $(HIDE)
@echo "$(TIMESTAMP): Project lock." > $@
xilinx_project: $(PROJECT_LOCK)
xilinx_reset: xilinx_reset:
$(call cmd_remove,.Xil) $(HIDE) $(call remove_dir,.Xil) $(HIDE)
+6 -8
View File
@@ -1,16 +1,14 @@
@echo off @echo off
cd /d "%~dp0"
set "platform=xilinx" set "platform=xilinx"
set "platform_ver=2019.1" set "pltform_ver=2019.1"
set "work_dir=%~dp0build" set "work_dir=%~dp0build"
set "config=%~dp0config.json" set "config=%~dp0config.json"
set "tools_dir=%~dp0scripts\platform\%platform%" set "tools_dir=%~dp0scripts\platform\%platform%"
REM Set up environment REM Set up enviroment
call "%tools_dir%\setenv.bat" "%platform_ver%" call "%tools_dir%\setenv.bat" "%pltform_ver%"
if "%ERRORLEVEL%" neq "0" ( if "%ERRORLEVEL%" neq "0" (
echo Error: Failed to initialize environment. echo Error: Failed to installize enviroment.
pause >nul pause >nul
exit /b 1 exit /b 1
) )
@@ -23,8 +21,8 @@ if "%ERRORLEVEL%" neq "0" (
exit /b 1 exit /b 1
) )
REM Launch SDK REM Lauch SDK
call "%tools_dir%\launch.bat" "%platform_ver%" "%work_dir%" call "%tools_dir%\launch.bat" "%pltform_ver%" "%work_dir%"
if "%ERRORLEVEL%" neq "0" ( if "%ERRORLEVEL%" neq "0" (
echo Error: Failed to launch SDK. echo Error: Failed to launch SDK.
pause >nul pause >nul