|
| 1 | +cmake_minimum_required(VERSION 3.10) |
| 2 | +project(acpi-table-generator C) |
| 3 | + |
| 4 | +set(CMAKE_C_STANDARD 11) |
| 5 | +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -O2") |
| 6 | + |
| 7 | +# 查找 iasl 工具 |
| 8 | +find_program(IASL_EXECUTABLE iasl) |
| 9 | +if(IASL_EXECUTABLE) |
| 10 | + message(STATUS "找到 iasl: ${IASL_EXECUTABLE}") |
| 11 | + set(IASL_AVAILABLE TRUE) |
| 12 | +else() |
| 13 | + message(WARNING "未找到 iasl 工具,将跳过 DSL 反编译步骤") |
| 14 | + set(IASL_AVAILABLE FALSE) |
| 15 | +endif() |
| 16 | + |
| 17 | +# 扫描 include 目录下的所有子目录 |
| 18 | +file(GLOB PLATFORM_DIRS "${CMAKE_SOURCE_DIR}/include/*") |
| 19 | + |
| 20 | +# 为每个平台创建独立的构建目标 |
| 21 | +foreach(PLATFORM_DIR ${PLATFORM_DIRS}) |
| 22 | + if(IS_DIRECTORY ${PLATFORM_DIR}) |
| 23 | + # 提取平台名称(如 sm8550, sm8850) |
| 24 | + get_filename_component(PLATFORM_NAME ${PLATFORM_DIR} NAME) |
| 25 | + |
| 26 | + # 跳过 common 目录(它包含通用定义,不是平台) |
| 27 | + if(PLATFORM_NAME STREQUAL "common") |
| 28 | + continue() |
| 29 | + endif() |
| 30 | + |
| 31 | + message(STATUS "配置平台: ${PLATFORM_NAME}") |
| 32 | + |
| 33 | + # 创建该平台的可执行文件目标 |
| 34 | + set(TARGET_NAME pptt_generator_${PLATFORM_NAME}) |
| 35 | + add_executable(${TARGET_NAME} src/pptt.c) |
| 36 | + |
| 37 | + # 设置该目标的包含目录 |
| 38 | + target_include_directories(${TARGET_NAME} PRIVATE |
| 39 | + ${CMAKE_SOURCE_DIR}/include |
| 40 | + ${PLATFORM_DIR} |
| 41 | + ) |
| 42 | + |
| 43 | + # 设置平台输出目录(在构建目录下) |
| 44 | + set(PLATFORM_OUTPUT_DIR "${CMAKE_BINARY_DIR}/${PLATFORM_NAME}") |
| 45 | + set(PLATFORM_BUILTIN_DIR "${PLATFORM_OUTPUT_DIR}/builtin") |
| 46 | + set(PLATFORM_SRC_DIR "${PLATFORM_OUTPUT_DIR}/src") |
| 47 | + |
| 48 | + # 添加自定义命令:运行生成器并输出到指定目录 |
| 49 | + add_custom_command( |
| 50 | + TARGET ${TARGET_NAME} POST_BUILD |
| 51 | + # 创建目录结构 |
| 52 | + COMMAND ${CMAKE_COMMAND} -E make_directory ${PLATFORM_BUILTIN_DIR} |
| 53 | + COMMAND ${CMAKE_COMMAND} -E make_directory ${PLATFORM_SRC_DIR} |
| 54 | + # 运行生成器 |
| 55 | + COMMAND ${TARGET_NAME} |
| 56 | + # 复制 AML 到 builtin 目录 |
| 57 | + COMMAND ${CMAKE_COMMAND} -E copy PPTT.aml ${PLATFORM_BUILTIN_DIR}/PPTT.aml |
| 58 | + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} |
| 59 | + COMMENT "生成 ${PLATFORM_NAME} 的 PPTT.aml 到 ${PLATFORM_BUILTIN_DIR}" |
| 60 | + ) |
| 61 | + |
| 62 | + # 如果 iasl 可用,添加反编译步骤 |
| 63 | + if(IASL_AVAILABLE) |
| 64 | + add_custom_command( |
| 65 | + TARGET ${TARGET_NAME} POST_BUILD |
| 66 | + COMMAND ${IASL_EXECUTABLE} -d ${PLATFORM_BUILTIN_DIR}/PPTT.aml > /dev/null 2>&1 || true |
| 67 | + COMMAND ${CMAKE_COMMAND} -E rename ${PLATFORM_BUILTIN_DIR}/PPTT.dsl ${PLATFORM_SRC_DIR}/PPTT.dsl |
| 68 | + WORKING_DIRECTORY ${CMAKE_BINARY_DIR} |
| 69 | + COMMENT "反编译 ${PLATFORM_NAME} 的 PPTT.aml 到 DSL" |
| 70 | + ) |
| 71 | + endif() |
| 72 | + |
| 73 | + # 添加安装规则(可选) |
| 74 | + install(FILES ${PLATFORM_BUILTIN_DIR}/PPTT.aml |
| 75 | + DESTINATION ${PLATFORM_NAME}/builtin) |
| 76 | + if(IASL_AVAILABLE AND EXISTS ${PLATFORM_SRC_DIR}/PPTT.dsl) |
| 77 | + install(FILES ${PLATFORM_SRC_DIR}/PPTT.dsl |
| 78 | + DESTINATION ${PLATFORM_NAME}/src) |
| 79 | + endif() |
| 80 | + endif() |
| 81 | +endforeach() |
| 82 | + |
| 83 | +# 创建一个 all 目标来构建所有平台 |
| 84 | +add_custom_target(build_all_platforms ALL) |
| 85 | +foreach(PLATFORM_DIR ${PLATFORM_DIRS}) |
| 86 | + if(IS_DIRECTORY ${PLATFORM_DIR}) |
| 87 | + get_filename_component(PLATFORM_NAME ${PLATFORM_DIR} NAME) |
| 88 | + # 跳过 common 目录 |
| 89 | + if(NOT PLATFORM_NAME STREQUAL "common") |
| 90 | + add_dependencies(build_all_platforms pptt_generator_${PLATFORM_NAME}) |
| 91 | + endif() |
| 92 | + endif() |
| 93 | +endforeach() |
| 94 | + |
| 95 | +# 添加清理目标 |
| 96 | +add_custom_target(clean_output |
| 97 | + COMMAND ${CMAKE_COMMAND} -E echo "清理所有输出文件" |
| 98 | + COMMENT "清理所有输出文件" |
| 99 | +) |
| 100 | + |
| 101 | +# 打印配置信息 |
| 102 | +message(STATUS "源代码目录: ${CMAKE_SOURCE_DIR}") |
| 103 | +message(STATUS "构建目录: ${CMAKE_BINARY_DIR}") |
| 104 | +message(STATUS "AML 文件输出到: build/<平台名>/builtin/PPTT.aml") |
| 105 | +if(IASL_AVAILABLE) |
| 106 | + message(STATUS "DSL 文件输出到: build/<平台名>/src/PPTT.dsl") |
| 107 | +endif() |
0 commit comments