java build compile_java-buildpack源码分析之Compile

bin/compile

入口是:bin/compile,该脚本和detect脚本很类似:需要一个构建目录实例化buildpack对象,并调用其compile接口。

注意:在这个脚本看似只有一个参数,但运行时实际需要第二个参数:应用缓存目录,当下载JDK,

compile方法

compilempilecompile先调用component_detection,探测了对容器,JRE,framework的支持情况,并依次调用JRE的编译,每个框架的编译,和容器的编译。

Ruby代码  c4402d717fe488c372063eceecf8d13c.png

def compile

puts BUILDPACK_MESSAGE % @buildpack_version

container = component_detection('container', @containers, true).first

fail 'No container can run this application' unless container

component_detection('JRE', @jres, true).first.compile

component_detection('framework', @frameworks, false).each(&:compile) #调用每一个框架的编译

container.compile

end

component_detection返回的是component,如JRE的component_detection返回的是JavaBuildpack::Jre::OpenJdkJRE。

JRE的编译

JRE编译调用的是JavaBuildpack::Jre::OpenJdkJRE的compile,而JavaBuildpack::Jre::OpenJdkJRE又是继承自OpenJDKLike,因此追溯到OpenJDKLike的compile

Ruby代码  c4402d717fe488c372063eceecf8d13c.png

def compile

download_tar

@droplet.copy_resources

end

可以看到编译就干了两件事:

下载Jdk的包,拷贝resources,即:拷贝resources/open_jdk_jre下面的文件

Tomcat的编译

容器的编译调用了JavaBuildpack::Container::Tomcat的compile,方法是定义在其父类:JavaBuildpack::Component::ModularComponent

Java代码  c4402d717fe488c372063eceecf8d13c.png

def compile

@sub_components.each(&:compile)

end

即调用其子组件的编译,子组件包括:TomcatInstance,TomcatLifecycleSupport,TomcatLoggingSupport,TomcatAccessLoggingSupport,TomcatRedisStore,TomcatInsightSupport。

TomcatInstance的compile方法

该compile方法完成了三件事:

1. 下载tomcat的包;

2. 在tomcat的webapps/WEB-INF/ROOT中链接用户应用根目录;

3. 链接jar包到WEB-INF/lib

Ruby代码  c4402d717fe488c372063eceecf8d13c.png

def compile

download(@version, @uri) { |file| expand file }

link_to(@application.root.children, root)

@droplet.additional_libraries <

@droplet.additional_libraries.link_to web_inf_lib

end

TomcatLifecycleSupport的compile方法

该方法只是下载了tomcat_lifecycle_support的jar包

Ruby代码  c4402d717fe488c372063eceecf8d13c.png

def compile

download_jar(jar_name, tomcat_lib)

end

TomcatLoggingSupport,TomcatAccessLoggingSupport的compile方法都只是下载了相应的jar包

TomcatRedisStore的compile方法

先检查了是否需要redis做session共享中间件,接着下载了redis_store.jar包,并修改tomcat的conf/context.xml配置

Ruby代码  c4402d717fe488c372063eceecf8d13c.png

def compile

return unless supports?

download_jar(jar_name, tomcat_lib)

mutate_context

end

总结

从源码来看,compile并非是编译java的源代码,而是准备应用运行的环境。

#THIS FILE IS AUTO GENERATED FROM THE TEMPLATE! DO NOT CHANGE! set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_VERSION 1) cmake_minimum_required(VERSION 3.28) # specify cross-compilers and tools set(CMAKE_C_COMPILER arm-none-eabi-gcc) set(CMAKE_CXX_COMPILER arm-none-eabi-g++) set(CMAKE_ASM_COMPILER arm-none-eabi-gcc) set(CMAKE_AR arm-none-eabi-ar) set(CMAKE_OBJCOPY arm-none-eabi-objcopy) set(CMAKE_OBJDUMP arm-none-eabi-objdump) set(SIZE arm-none-eabi-size) set(CMAKE_TRY_COMPILE_TARGET_TYPE STATIC_LIBRARY) # project settings project(untitled C CXX ASM) set(CMAKE_CXX_STANDARD 17) set(CMAKE_C_STANDARD 11) #Uncomment for hardware floating point #add_compile_definitions(ARM_MATH_CM4;ARM_MATH_MATRIX_CHECK;ARM_MATH_ROUNDING) #add_compile_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16) #add_link_options(-mfloat-abi=hard -mfpu=fpv4-sp-d16) #Uncomment for software floating point #add_compile_options(-mfloat-abi=soft) add_compile_options(-mcpu=cortex-m7 -mthumb -mthumb-interwork) add_compile_options(-ffunction-sections -fdata-sections -fno-common -fmessage-length=0) # uncomment to mitigate c++17 absolute addresses warnings #set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-register") # Enable assembler files preprocessing add_compile_options($<$<COMPILE_LANGUAGE:ASM>:-x$<SEMICOLON>assembler-with-cpp>) if ("${CMAKE_BUILD_TYPE}" STREQUAL "Release") message(STATUS "Maximum optimization for speed") add_compile_options(-Ofast) elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "RelWithDebInfo") message(STATUS "Maximum optimization for speed, debug info included") add_compile_options(-Ofast -g) elseif ("${CMAKE_BUILD_TYPE}" STREQUAL "MinSizeRel") message(STATUS "Maximum optimization for size") add_compile_options(-Os) else () message(STATUS "Minimal optimization, debug info included") add_compile_options(-Og -g) endif () include_directories(Core/Inc Drivers/STM32H7xx_HAL_Driver/Inc Drivers/STM32H7xx_HAL_Driver/Inc/Legacy Drivers/CMSIS/Device/ST/STM32H7xx/Include Drivers/CMSIS/Include) add_definitions(-DDEBUG -DUSE_HAL_DRIVER -DSTM32H743xx) file(GLOB_RECURSE SOURCES "Core/*.*" "Drivers/*.*") set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/STM32H743XIHX_FLASH.ld) add_link_options(-Wl,-gc-sections,--print-memory-usage,-Map=${PROJECT_BINARY_DIR}/${PROJECT_NAME}.map) add_link_options(-mcpu=cortex-m7 -mthumb -mthumb-interwork) add_link_options(-T ${LINKER_SCRIPT}) add_executable(${PROJECT_NAME}.elf ${SOURCES} ${LINKER_SCRIPT}) set(HEX_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.hex) set(BIN_FILE ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.bin) add_custom_command(TARGET ${PROJECT_NAME}.elf POST_BUILD COMMAND ${CMAKE_OBJCOPY} -Oihex $<TARGET_FILE:${PROJECT_NAME}.elf> ${HEX_FILE} COMMAND ${CMAKE_OBJCOPY} -Obinary $<TARGET_FILE:${PROJECT_NAME}.elf> ${BIN_FILE} COMMENT "Building ${HEX_FILE} Building ${BIN_FILE}")
最新发布
03-10
<think>嗯,用户给了一个CMakeLists.txt文件,想让我介绍一下这个文件的内容。首先,我需要仔细阅读这个文件,理解每一部分的作用。看起来这是一个用于嵌入式开发的CMake配置,特别是针对STM32H7系列的微控制器,因为里面有提到STM32H743xx之类的定义。 首先,用户可能是在进行ARM Cortex-M7的交叉编译,所以这个CMake文件配置了交叉编译工具链,比如arm-none-eabi-gcc和g++。我需要解释这些编译器设置的作用,以及为什么需要设置CMAKE_SYSTEM_NAME为Generic,因为嵌入式系统通常没有操作系统,所以用Generic来告诉CMake不要使用宿主机的系统配置。 接下来,用户可能关心如何为不同的构建类型(如Release、Debug)设置不同的编译选项。比如,在Release模式下使用-Ofast优化,而在Debug模式下使用-Og和-g选项。这部分需要详细说明每个编译选项的作用,比如-mcpu=cortex-m7指定目标处理器,-mthumb指示使用Thumb指令集,-ffunction-sections和-fdata-sections是为了后续的链接优化,减少生成的固件大小。 然后,用户可能对链接脚本的部分感兴趣,特别是add_link_options中的-T参数指定了链接脚本的位置。链接脚本在嵌入式开发中非常重要,它决定了内存布局,所以需要解释其作用。另外,生成HEX和BIN文件的自定义命令也很关键,因为这些是烧录到微控制器中的文件格式,用户可能需要知道如何调整这些生成步骤。 还有,用户可能不太明白条件编译的部分,比如根据CMAKE_BUILD_TYPE的不同添加不同的编译选项。这时候需要说明CMake如何根据构建类型切换优化选项,以及这些优化对代码大小和调试的影响。 另外,用户可能对包含路径和预定义宏(如USE_HAL_DRIVER,STM32H743xx)有疑问,需要说明这些是STM32硬件抽象层和具体芯片型号的配置,确保正确编译HAL库。 最后,用户可能希望了解如何扩展这个项目,比如添加新的源文件或调整编译选项,特别是关于浮点运算的硬件与软件选择部分被注释掉了,用户可能需要指导如何启用这些功能,或者为什么需要根据硬件支持来选择不同的浮点选项。 总结来说,用户可能需要一个结构清晰的解释,逐步介绍CMake文件的各个部分,包括工具链配置、编译选项、链接过程、构建类型处理以及如何生成最终的可执行文件和二进制文件。同时,要指出关键配置点,帮助用户理解如何根据需求进行修改和优化。</think>好的,我将为您逐段解析这个针对STM32H7系列微控制器的CMakeLists.txt文件: 一、工具链配置 $$ set(CMAKE_SYSTEM_NAME Generic) $$ 1. 交叉编译设置: - 指定`Generic`表示无操作系统环境 - 使用ARM工具链:`arm-none-eabi-gcc/g++` - 定义汇编器/二进制工具:`objcopy`用于生成HEX/BIN文件,`size`用于查看内存占用 二、项目基础设置 ```cmake project(untitled C CXX ASM) # 支持C/C++/汇编混合编程 set(CMAKE_CXX_STANDARD 17) # C++17标准 set(CMAKE_C_STANDARD 11) # C11标准 ``` 三、关键编译选项解析 1. 架构相关: - `-mcpu=cortex-m7`:指定Cortex-M7内核 - `-mthumb`:使用Thumb-2指令集 - `-mfloat-abi=hard/soft`:浮点运算实现方式选择(示例中已注释) 2. 优化选项: - `-Ofast`:最高速度优化(Release模式) - `-Os`:最小体积优化(MinSizeRel模式) - `-Og`:调试友好优化(Debug模式) 四、内存管理配置 $$ -fdata-sections -ffunction-sections $$ - 配合链接器的`-Wl,-gc-sections`使用,通过消除未使用代码来减少固件体积 五、链接脚本关键作用 ```cmake set(LINKER_SCRIPT ${CMAKE_SOURCE_DIR}/STM32H743XIHX_FLASH.ld) ``` - 定义存储器布局:FLASH/RAM分配 - 控制代码/数据的分区存放 - 指定中断向量表位置 六、构建后处理流程 ```cmake add_custom_command(...) # 生成HEX/BIN文件 ``` - HEX文件:用于调试烧录 - BIN文件:直接烧写到Flash - 通过`objcopy`工具转换ELF格式 七、HAL库集成要点 ```cmake include_directories(...) # 包含STM32H7 HAL库路径 add_definitions(-DUSE_HAL_DRIVER) # 启用HAL库 ``` 八、典型定制点说明 1. 硬件浮点单元启用: 取消注释相关`add_compile_options`和`add_link_options` 2. 扩展外设支持: 在`include_directories`中添加新驱动的头文件路径 3. 调试配置: 保留`-g`选项时需注意Flash空间占用 九、内存使用分析 ```cmake add_link_options(--print-memory-usage) ``` - 生成.map文件可分析各段内存分配 - 使用`arm-none-eabi-size`工具查看详细内存占用 十、推荐开发流程 1. 创建build目录:`mkdir build && cd build` 2. 配置工程:`cmake -DCMAKE_BUILD_TYPE=Debug ..` 3. 编译:`make -j4` 4. 烧录:使用ST-Link或J-Link工具烧写生成的BIN/HEX文件 该配置模板已实现从源码编译到生成可烧录文件的完整工具链集成,开发者只需根据具体硬件修改链接脚本和外设配置即可快速移植到实际项目中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值