diff --git a/content/Notes/OCPP/Everest/构建/运行脚本生成过程.md b/content/Notes/OCPP/Everest/构建/运行脚本生成过程.md new file mode 100644 index 000000000..18085f502 --- /dev/null +++ b/content/Notes/OCPP/Everest/构建/运行脚本生成过程.md @@ -0,0 +1,163 @@ +--- +date: 2025-03-13 11:31 +updated: 2025-03-13 15:14 +tags: + - Everest +date updated: 2025-04-02 11:54 +link: "false" +share: "true" +--- + +以run-sil-ocpp.sh为例 + +```mermaid +graph TD + A[CMakeLists.txt] -->|调用| B[generate_config_run_script函数] + B -->|定义在| C[config-run-script.cmake] + C -->|使用模板| D[run_template.sh.in] + C -->|读取配置| E[config-sil-ocpp.yaml] + D -->|变量替换| F[生成脚本] + E -->|提供配置路径| F + F -->|输出| G[run-sil-ocpp.sh] +``` + +# 在CMakeLists.txt中调用生成函数 + +在checkout/everest-workspace/everest-core/config/CMakeLists.txt文件中,项目明确调用了生成脚本的函数: + +```cmake +generate_config_run_script(CONFIG sil) +generate_config_run_script(CONFIG sil-two-evse) +generate_config_run_script(CONFIG sil-ocpp) # 这一行负责生成run-sil-ocpp.sh +generate_config_run_script(CONFIG sil-ocpp201) +... +``` + +# 生成函数的定义 + +该函数在checkout/everest-workspace/everest-core/cmake/config-run-script.cmake中定义: + +```cmake +function(generate_config_run_script) + # 检查是否启用脚本生成 + if (NOT EVEREST_ENABLE_RUN_SCRIPT_GENERATION) + return () + endif () + + # 定义参数 + set(options "") + set(one_value_args + CONFIG + LOGGING_CONFIG + OUTPUT + ) + set(multi_value_args + ADDITIONAL_ARGUMENTS + ) + + # 解析参数 + cmake_parse_arguments(OPTNS "${options}" "${one_value_args}" "${multi_value_args}" ${ARGN}) + + # 检查必要参数 + if (NOT OPTNS_CONFIG) + message(FATAL_ERROR "${CMAKE_CURRENT_FUNCTION} requires CONFIG parameter for the config name") + endif() + + # 设置配置文件路径 + set(CONFIG_FILE "${CMAKE_CURRENT_SOURCE_DIR}/config-${OPTNS_CONFIG}.yaml") + if (NOT EXISTS ${CONFIG_FILE}) + message(FATAL_ERROR "${CMAKE_CURRENT_FUNCTION}: config file '${CONFIG_FILE}' does not exist") + endif() + + # 设置日志配置文件路径 + set(LOGGING_CONFIG_FILE "${EVEREST_CONFIG_ASSET_DIR}/logging.ini") + if (OPTNS_LOGGING_CONFIG) + set(LOGGING_CONFIG_FILE "${CMAKE_CURRENT_SOURCE_DIR}/${OPTNS_LOGGING_CONFIG}.ini") + endif() + + # 设置输出路径和文件名 + set(SCRIPT_OUTPUT_PATH "${CMAKE_BINARY_DIR}/run-scripts") + set(SCRIPT_OUTPUT_FILE "${SCRIPT_OUTPUT_PATH}/run-${OPTNS_CONFIG}.sh") + if (OPTNS_OUTPUT) + set(SCRIPT_OUTPUT_FILE "${SCRIPT_OUTPUT_PATH}/run-${OPTNS_OUTPUT}.sh") + endif() + + # 设置其他必要变量 + set(LD_LIBRARY_VAR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}") + set(PATH_VAR "${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}") + + # 使用模板生成脚本 + configure_file("${EVEREST_CONFIG_ASSET_DIR}/run_template.sh.in" ${SCRIPT_OUTPUT_FILE}) +endfunction() +``` + +# 脚本模板内容 + +模板文件checkout/everest-workspace/everest-core/cmake/assets/run_template.sh.in的内容如下: + +```sh +LD_LIBRARY_PATH=@LD_LIBRARY_VAR@:$LD_LIBRARY_PATH \ +PATH=@PATH_VAR@:$PATH \ +manager \ + --prefix @CMAKE_INSTALL_PREFIX@ \ + --conf @CONFIG_FILE@ \ + @ADDITIONAL_ARGUMENTS@ + $@ +``` + +# 变量替换过程 + +在CMake构建过程中,configure_file 命令会将模板中的变量替换为实际值: + +- `@LD_LIBRARY_VAR@` → `${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}` +- `@PATH_VAR@` → `${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}` +- `@CMAKE_INSTALL_PREFIX@` → 安装前缀路径 +- `@CONFIG_FILE@` → 配置文件路径,即`${CMAKE_CURRENT_SOURCE_DIR}/config-sil-ocpp.yaml` +- `@ADDITIONAL_ARGUMENTS@` → 其他附加参数 + +# 生成的脚本 + +最终,生成的run-sil-ocpp.sh脚本看起来类似这样: + +```c +LD_LIBRARY_PATH=/安装路径/lib:$LD_LIBRARY_PATH \ +PATH=/安装路径/bin:$PATH \ +manager \ + --prefix /安装路径 \ + --conf /源代码路径/config-sil-ocpp.yaml \ +
+ $@ +``` + +当用户运行脚本时,它执行manager程序并传递配置文件路径: + +# 配置文件示例 + +config-sil-ocpp.yaml文件包含了运行时所需的配置信息,例如: + +```yaml +active_modules: + iso15118_charger: + module: EvseV2G + config_module: + device: auto + tls_security: allow + connections: + security: + - module_id: evse_security + implementation_id: main + iso15118_car: + module: PyEvJosev + config_module: + device: auto + supported_ISO15118_2: true + # 更多配置... +``` + +# 总结 + +1. CMake构建系统在处理CMakeLists.txt文件时,发现调用了generate_config_run_script(CONFIG sil-ocpp) +2. 执行该函数,找到对应的配置文件config-sil-ocpp.yaml +3. 使用run_template.sh.in模板,将其中的变量替换为实际值 +4. 生成最终的run-sil-ocpp.sh脚本到构建目录 +5. 这个脚本在运行时会启动带有指定配置的应用程序,主要用于OCPP(开放充电点协议)功能的测试和模拟。