diff --git a/build.py b/build.py index 37e34304c149a9c7ec9c68b9cbd10f85f86ab01e..c8188b49592107bdc8d11c40e2d91c8806349a16 100644 --- a/build.py +++ b/build.py @@ -142,20 +142,24 @@ class Compile: os.makedirs(self.build_tmp_dir) #拼接cmake命令 if self.compile_option == 'fortify': - cmd = '%s/cmake %s -DCMAKE_TOOLCHAIN_FILE=%s/cmake/tool_chain/uniproton_tool_chain.cmake ' \ + cmd = '%s %s -DCMAKE_TOOLCHAIN_FILE=%s/cmake/tool_chain/uniproton_tool_chain.cmake ' \ '-DCMAKE_C_COMPILER_LAUNCHER="sourceanalyzer;-b;%sproject" ' \ '-DCMAKE_INSTALL_PREFIX=%s &> %s/%s' % ( - self.cmake_env_path, self.home_path, self.home_path, self.cpu_type, + os.path.join(self.cmake_env_path,'cmake'), + self.home_path, self.home_path, self.cpu_type, self.UniProton_packing_path, self.log_dir, self.log_file) elif self.compile_option == 'hllt': - cmd = '%s/cmake %s -DCMAKE_TOOLCHAIN_FILE=%s/cmake/tool_chain/uniproton_tool_chain.cmake ' \ + cmd = '%s %s -DCMAKE_TOOLCHAIN_FILE=%s/cmake/tool_chain/uniproton_tool_chain.cmake ' \ '-DCMAKE_C_COMPILER_LAUNCHER="lltwrapper" -DCMAKE_INSTALL_PREFIX=%s &> %s/%s' % ( - self.cmake_env_path, self.home_path, self.home_path, self.UniProton_packing_path, self.log_dir, self.log_file) + os.path.join(self.cmake_env_path,'cmake'), + self.home_path, self.home_path, self.UniProton_packing_path, self.log_dir, self.log_file) else: - cmd = '%s/cmake %s -DCMAKE_TOOLCHAIN_FILE=%s/cmake/tool_chain/uniproton_tool_chain.cmake ' \ + cmd = '%s %s -DCMAKE_TOOLCHAIN_FILE=%s/cmake/tool_chain/uniproton_tool_chain.cmake ' \ '-DCMAKE_INSTALL_PREFIX=%s &> %s/%s' % ( - self.cmake_env_path, self.home_path, self.home_path, self.UniProton_packing_path, self.log_dir, self.log_file) + os.path.join(self.cmake_env_path,'cmake'), + self.home_path, self.home_path, self.UniProton_packing_path, self.log_dir, self.log_file) #执行cmake命令 + #log_msg('info', f'build cmake command: {cmd}') if self.builder.run(cmd, cwd=self.build_tmp_dir, env=None): log_msg('error', 'generate makefile failed!') return False diff --git a/build/uniproton_ci_lib/get_config_info.py b/build/uniproton_ci_lib/get_config_info.py index 1214ba28b324f033caa88abf89fbe32f698952f5..bcfc8fe2c28abc84a27d39091cb61d7c3bb57be2 100644 --- a/build/uniproton_ci_lib/get_config_info.py +++ b/build/uniproton_ci_lib/get_config_info.py @@ -27,7 +27,9 @@ def getNodeAtrrValue(node, attrname): return node.getAttribute(attrname) def getChildNodeValueByNodeName(farthe_node, nodename, index = 0): - return farthe_node.getElementsByTagName(nodename)[0].childNodes[index].nodeValue + children = farthe_node.getElementsByTagName(nodename)[0].childNodes + # empty node will be no children, else text node: empty node return empty string + return children[index].nodeValue if children else '' def getChildNodeByNodeAtrr(farthe_node, node_name, atrr_name, strr_vlue): for node in farthe_node.getElementsByTagName(node_name): diff --git a/cmake/tool_chain/uniproton_tool_chain_gcc.cmake b/cmake/tool_chain/uniproton_tool_chain_gcc.cmake index 84cd3a090cab5332da5a8190884f3122f81966b9..6e5add82dc628e42de88f8806cecf9cf0149e4a3 100644 --- a/cmake/tool_chain/uniproton_tool_chain_gcc.cmake +++ b/cmake/tool_chain/uniproton_tool_chain_gcc.cmake @@ -21,9 +21,13 @@ set(COMPILE_MODE "$ENV{COMPILE_MODE}" ) set(CC_TYPE "$ENV{CC_TYPE}" ) set(TOOLCHAIN_DIR "$ENV{HCC_PATH}") #该路径应该是外部传入,指向编译工具路径 +if(TOOLCHAIN_DIR) + SET(TOOLCHAIN_DIR_X "${TOOLCHAIN_DIR}/") +endif() + ##compiler specified in /etc/profile -set(CMAKE_C_COMPILER "${TOOLCHAIN_DIR}/arm-none-eabi-gcc" CACHE PATH "arm-gcc C compiler" FORCE) -set(CMAKE_ASM_COMPILER "${TOOLCHAIN_DIR}/arm-none-eabi-gcc" CACHE PATH "arm-gcc ASM compiler" FORCE) +set(CMAKE_C_COMPILER "${TOOLCHAIN_DIR_X}arm-none-eabi-gcc" CACHE PATH "arm-gcc C compiler" FORCE) +set(CMAKE_ASM_COMPILER "${TOOLCHAIN_DIR_X}arm-none-eabi-gcc" CACHE PATH "arm-gcc ASM compiler" FORCE) if(${CPU_TYPE} STREQUAL "m4") set(CMAKE_ASM_FLAGS "--specs=nosys.specs") @@ -39,7 +43,7 @@ if(${CPU_TYPE} STREQUAL "m4") endif() -set(CMAKE_LINKER "${TOOLCHAIN_DIR}/arm-none-eabi-ld" CACHE STRING "" FORCE) -set(CMAKE_AR "${TOOLCHAIN_DIR}/arm-none-eabi-ar" CACHE STRING "" FORCE) +set(CMAKE_LINKER "${TOOLCHAIN_DIR_X}arm-none-eabi-ld" CACHE STRING "" FORCE) +set(CMAKE_AR "${TOOLCHAIN_DIR_X}arm-none-eabi-ar" CACHE STRING "" FORCE) set(CMAKE_C_LINK_FLAGS "-r ") set(CMAKE_C_ARCHIVE_CREATE " -r ") diff --git a/cmake/tool_chain/uniproton_tool_chain_gcc_arm64.cmake b/cmake/tool_chain/uniproton_tool_chain_gcc_arm64.cmake index 3427b8ebdd6aef441e231af5dfa392d594034180..308e8c803d2151add164ad84ad8ef47dd9bf9c05 100644 --- a/cmake/tool_chain/uniproton_tool_chain_gcc_arm64.cmake +++ b/cmake/tool_chain/uniproton_tool_chain_gcc_arm64.cmake @@ -33,9 +33,13 @@ set(CC_SEC_FLAGS "${CC_SEC_FLAGS} -fno-PIE") set(CC_OTHER_FLAGS "-fno-builtin -fno-dwarf2-cfi-asm -mcmodel=large -fomit-frame-pointer -fzero-initialized-in-bss -fdollars-in-identifiers -ffunction-sections -fdata-sections -fno-aggressive-loop-optimizations -fno-optimize-strlen -fno-schedule-insns -fno-inline-small-functions -fno-inline-functions-called-once -fno-strict-aliasing -finline-limit=20 -mstrict-align -mlittle-endian -nostartfiles -funwind-tables") set(CC_DEFINE_FLAGS "") +if(TOOLCHAIN_DIR) + SET(TOOLCHAIN_DIR_X "${TOOLCHAIN_DIR}/") +endif() + ##compiler specified in /etc/profile -set(CMAKE_C_COMPILER "${TOOLCHAIN_DIR}/aarch64-none-elf-gcc" CACHE PATH "arm-gcc C compiler" FORCE) -set(CMAKE_ASM_COMPILER "${TOOLCHAIN_DIR}/aarch64-none-elf-gcc" CACHE PATH "arm-gcc ASM compiler" FORCE) +set(CMAKE_C_COMPILER "${TOOLCHAIN_DIR_X}aarch64-none-elf-gcc" CACHE PATH "arm-gcc C compiler" FORCE) +set(CMAKE_ASM_COMPILER "${TOOLCHAIN_DIR_X}aarch64-none-elf-gcc" CACHE PATH "arm-gcc ASM compiler" FORCE) # 设置C和ASM相关的所有使用的编译选项 set(CMAKE_C_FLAGS "${CC_OPT_LEVEL} ${CC_OVERALL_FLAGS_COMMON} ${CC_WARN_FLAGS_COMMON} ${CC_WARN_FLAGS} ${CC_LANGUAGE_FLAGS_COMMON} ${CC_LANGUAGE_FLAGS} ${CC_CDG_FLAGS} ${CC_MD_DEPENDENT_FLAGS} ${CC_OPT_FLAGS} ${CC_SEC_FLAGS} ${CC_OTHER_FLAGS} ${CC_DEFINE_FLAGS_COMMON} ${CC_DEFINE_FLAGS}") @@ -47,7 +51,7 @@ foreach(config_option ${config_options}) endforeach() set(CMAKE_ASM_COMPILE_OBJECT " -c -o ") -set(CMAKE_LINKER "${TOOLCHAIN_DIR}/aarch64-none-elf-ld" CACHE STRING "" FORCE) -set(CMAKE_AR "${TOOLCHAIN_DIR}/aarch64-none-elf-ar" CACHE STRING "" FORCE) +set(CMAKE_LINKER "${TOOLCHAIN_DIR_X}aarch64-none-elf-ld" CACHE STRING "" FORCE) +set(CMAKE_AR "${TOOLCHAIN_DIR_X}aarch64-none-elf-ar" CACHE STRING "" FORCE) set(CMAKE_C_LINK_FLAGS "-r ") set(CMAKE_C_ARCHIVE_CREATE " -r ") diff --git a/cmake/tool_chain/uniproton_tool_chain_gcc_riscv64.cmake b/cmake/tool_chain/uniproton_tool_chain_gcc_riscv64.cmake index 05e3d2aa77f8b31c8e269bb38aacecb12e29f60b..54669bf1362ec7a5b56141c7b752382611ad2a7e 100644 --- a/cmake/tool_chain/uniproton_tool_chain_gcc_riscv64.cmake +++ b/cmake/tool_chain/uniproton_tool_chain_gcc_riscv64.cmake @@ -25,10 +25,13 @@ set(TOOLCHAIN_PREFIX "riscv64-unknown-elf-") if(DEFINED ENV{RISCV_NATIVE} AND "$ENV{RISCV_NATIVE}" STREQUAL "true") set(TOOLCHAIN_PREFIX "") endif() +if (TOOLCHAIN_DIR) + SET(TOOLCHAIN_PREFIX "${TOOLCHAIN_DIR}/${TOOLCHAIN_PREFIX}") +endif() ##compiler specified in /etc/profile -set(CMAKE_C_COMPILER "${TOOLCHAIN_DIR}/${TOOLCHAIN_PREFIX}gcc" CACHE PATH "gcc C compiler" FORCE) -set(CMAKE_ASM_COMPILER "${TOOLCHAIN_DIR}/${TOOLCHAIN_PREFIX}gcc" CACHE PATH "gcc ASM compiler" FORCE) +set(CMAKE_C_COMPILER "${TOOLCHAIN_PREFIX}gcc" CACHE PATH "gcc C compiler" FORCE) +set(CMAKE_ASM_COMPILER "${TOOLCHAIN_PREFIX}gcc" CACHE PATH "gcc ASM compiler" FORCE) #if use rv64virt open -g for debug information and -O0 if( ${CPU_TYPE} STREQUAL "rv64virt" OR ${CPU_TYPE} STREQUAL "ds-d1s" OR ${CPU_TYPE} STREQUAL "visionfive2") @@ -54,7 +57,7 @@ if(num_lines GREATER 0) set(CMAKE_ASM_COMPILE_OBJECT "${CMAKE_ASM_COMPILE_OBJECT} -DOS_ARCH_SURPORT_F") endif() -set(CMAKE_LINKER "${TOOLCHAIN_DIR}/${TOOLCHAIN_PREFIX}ld" CACHE STRING "" FORCE) -set(CMAKE_AR "${TOOLCHAIN_DIR}/${TOOLCHAIN_PREFIX}ar" CACHE STRING "" FORCE) +set(CMAKE_LINKER "${TOOLCHAIN_PREFIX}ld" CACHE STRING "" FORCE) +set(CMAKE_AR "${TOOLCHAIN_PREFIX}ar" CACHE STRING "" FORCE) set(CMAKE_C_LINK_FLAGS "-r ") set(CMAKE_C_ARCHIVE_CREATE " -r ") diff --git a/cmake/tool_chain/uniproton_tool_chain_gcc_x86_64.cmake b/cmake/tool_chain/uniproton_tool_chain_gcc_x86_64.cmake index 87ed0dbcfd57fc42eb9e13e7eb05bac30f2dc006..44e71eda99f5ece8cbd73ab867c4dbf34b94a116 100644 --- a/cmake/tool_chain/uniproton_tool_chain_gcc_x86_64.cmake +++ b/cmake/tool_chain/uniproton_tool_chain_gcc_x86_64.cmake @@ -21,9 +21,13 @@ set(COMPILE_MODE "$ENV{COMPILE_MODE}" ) set(CC_TYPE "$ENV{CC_TYPE}" ) set(TOOLCHAIN_DIR "$ENV{HCC_PATH}") #该路径应该是外部传入,指向编译工具路径 +if(TOOLCHAIN_DIR) + SET(TOOLCHAIN_DIR_X "${TOOLCHAIN_DIR}/") +endif() + ##compiler specified in /etc/profile -set(CMAKE_C_COMPILER "${TOOLCHAIN_DIR}/x86_64-openeuler-linux-gnu-gcc" CACHE PATH "gcc C compiler" FORCE) -set(CMAKE_ASM_COMPILER "${TOOLCHAIN_DIR}/x86_64-openeuler-linux-gnu-gcc" CACHE PATH "gcc ASM compiler" FORCE) +set(CMAKE_C_COMPILER "${TOOLCHAIN_DIR_X}x86_64-openeuler-linux-gnu-gcc" CACHE PATH "gcc C compiler" FORCE) +set(CMAKE_ASM_COMPILER "${TOOLCHAIN_DIR_X}x86_64-openeuler-linux-gnu-gcc" CACHE PATH "gcc ASM compiler" FORCE) set(CMAKE_ASM_COMPILE_OBJECT " -Os -g -nostdlib -nostartfiles -nodefaultlibs -fno-builtin -c -o ") set(CMAKE_C_COMPILE_OBJECT " -Os -g -m64 ${COMPILE_WARING_FLAG} -static -nostdlib -nostartfiles -nodefaultlibs -mpreferred-stack-boundary=3 -mno-3dnow -mno-avx -mno-red-zone -Wl,--build-id=none -fno-builtin -fno-PIE -fno-dwarf2-cfi-asm -mcmodel=large -fomit-frame-pointer -fzero-initialized-in-bss -fdollars-in-identifiers -ffunction-sections -fdata-sections -fno-common -fno-aggressive-loop-optimizations -fno-optimize-strlen -fno-schedule-insns -fno-inline-small-functions -fno-inline-functions-called-once -fno-strict-aliasing -fno-builtin -nostartfiles -fno-stack-protector -funsigned-char -fno-PIC -DVERSIONID=${VERSION_ID} -c -o ") @@ -33,7 +37,7 @@ foreach(config_option ${config_options}) set(CMAKE_C_COMPILE_OBJECT "${CMAKE_C_COMPILE_OBJECT} -D_GNU_SOURCE -D_POSIX_THREADS -D_POSIX_THREAD_PRIORITY_SCHEDULING -D_POSIX_PRIORITY_SCHEDULING -D_POSIX_TIMERS -D_POSIX_CPUTIME -D_POSIX_THREAD_CPUTIME -D_POSIX_MONOTONIC_CLOCK -D_POSIX_TIMEOUTS -D_POSIX_CLOCK_SELECTION -D_POSIX_THREAD_PRIO_PROTECT -D_UNIX98_THREAD_MUTEX_ATTRIBUTES -D_POSIX_READER_WRITER_LOCKS") endforeach() -set(CMAKE_LINKER "${TOOLCHAIN_DIR}/x86_64-openeuler-linux-gnu-ld" CACHE STRING "" FORCE) -set(CMAKE_AR "${TOOLCHAIN_DIR}/x86_64-openeuler-linux-gnu-ar" CACHE STRING "" FORCE) +set(CMAKE_LINKER "${TOOLCHAIN_DIR_X}x86_64-openeuler-linux-gnu-ld" CACHE STRING "" FORCE) +set(CMAKE_AR "${TOOLCHAIN_DIR_X}x86_64-openeuler-linux-gnu-ar" CACHE STRING "" FORCE) set(CMAKE_C_LINK_FLAGS "-r ") set(CMAKE_C_ARCHIVE_CREATE " -r ") diff --git a/doc/demo_guide/riscv64_usage.md b/doc/demo_guide/riscv64_usage.md index 326daa590b95997b172067002f9ba9d0c96aee71..3b7e20923a5d30e56d560bd9664d95d710be21e3 100644 --- a/doc/demo_guide/riscv64_usage.md +++ b/doc/demo_guide/riscv64_usage.md @@ -10,19 +10,19 @@ 1. 进入到用户的工作目录,这里假设为 /workspace/UniProton。 2. 将 UniProton 的源码放在 /workspace/UniProton 目录下。 -3. 参考[编译指导](../UniProton_build.md) 准备编译环境以及 libboundscheck 库下载。 +3. 参考[编译指导](./UniProton_build.md) 准备编译环境「编译器、cmake等工具的安装位置,默认为 `/opt/buildtools`,可由配置文件 `config.xml` 修改」以及 libboundscheck 库下载「按照 `platform/README.md` 说明进行即可」。 4. 安装qemu-system-riscv64 红帽子系列下使用 `sudo apt install qemu-system-misc` 进行安装,其他发行版按照对应的包管理命令安装 5. 配置好编译环境后,执行 python build.py rv64virt 进行编译 6. 将目录/workspace/UniProton/build/output/rv64virt/riscv64/FPGA 中的libCortexMXsec_c.lib 和 libRV64VIRT.a 复制到 demos/riscv64virt/libs目录下 7. 将 UniProton/src/include 目录下的头文件拷贝到 demos/riscv64virt/include 目录下。 8. 可以通过修改 demos/riscv64virt/config 目录下的 prt_config.c 和 prt_config.h 以适配用户功能,prt_config.h 可配置 os 功能开关,按需裁剪。 9. demos/riscv64virt/bsp 目录下可以新增板级驱动代码,demos/riscv64virt/build 目录下配置编译构建相关内容,rv64virt.ld为链接文件,根据单板内存地址等修改适配。 -10. 代码修改完成后,适配 cmake,最后在 build 目录下运行 `bash buibasld_app.sh` 即可在同级中的out目录下生成 rv64virt.elf 可执行二进制文件。 +10. 代码修改完成后,适配 cmake,最后在 build 目录下运行 `bash build_app.sh` 即可在同级中的out目录下生成 rv64virt.elf 可执行二进制文件。 11. 执行build目录中的./run.sh 运行示例 ## riscv64 virt 示例程序使用指南 -- 按照[编译要求](../../doc/UniProton_build.md)配置好编译环境 +- 按照[编译要求](./UniProton_build.md)配置好编译环境 - 交叉编译器 - CMake @@ -40,6 +40,7 @@ - **message-latency** [实时性能测试 - 消息队列延迟] - **deadlock-break** [实时性能测试-死锁解除] - **shell ** [UniProton shell 组件] + - `build_app.sh` 会调用 `build_static.sh`,后者会重新编译内核静态库,而在编译内核之前还会自动下载libboundscheck库,带来多次重复、无效的下载、编译工作,实际使用中,需根据情况修改 `build_app.sh` 文件。 - 运行 **bash build_app.sh 'APP名字'** 进行编译,编译完成后,会在**当前out目录** 生成对应工程的ELF文件 和 BIN文件 diff --git a/platform/CMakeLists.txt b/platform/CMakeLists.txt index 853a64f155eee36e0d5802455b2f2bd7754d8eea..93b7d39cc3d043974fb5e913b0c03bd6c2158c4c 100644 --- a/platform/CMakeLists.txt +++ b/platform/CMakeLists.txt @@ -1,3 +1,26 @@ +if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/libboundscheck.git") + message(STATUS "Clone remote repository: libboundscheck") + include(FetchContent) + FetchContent_Declare( + libboundscheck + GIT_REPOSITORY "https://gitee.com/openeuler/libboundscheck" + SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/libboundscheck.git" + ) + FetchContent_MakeAvailable(libboundscheck) + execute_process(COMMAND + rm -rf include src + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/libboundscheck" + ) + execute_process(COMMAND + ln -sf "../libboundscheck.git/include" include + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/libboundscheck" + ) + execute_process(COMMAND + ln -sf "../libboundscheck.git/src" src + WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/libboundscheck" + ) +endif() + set(CMAKE_C_ARCHIVE_CREATE " -r ") if (${COMPILE_OPTION} STREQUAL "coverity" OR ${COMPILE_OPTION} STREQUAL "fortify" OR ${COMPILE_OPTION} STREQUAL "single") @@ -13,4 +36,4 @@ else() set_target_properties(${LIB_SEC_NAME} PROPERTIES SUFFIX ".lib") -endif() \ No newline at end of file +endif()