|
| 1 | +# ============================================================ |
| 2 | +# Output Directory Configuration |
| 3 | +# ============================================================ |
| 4 | +# 配置构建产物的输出目录,实现分类管理 |
| 5 | +# |
| 6 | +# 目录结构: |
| 7 | +# bin/ - 主应用和共享库 |
| 8 | +# examples/ - 示例程序 (按类型分类) |
| 9 | +# plugins/ - Qt 插件 |
| 10 | +# resources/ - 资源文件 |
| 11 | +# runtimes/ - Windows Qt 运行时 DLLs (共享) |
| 12 | +# ============================================================ |
| 13 | + |
| 14 | +# 设置全局输出目录 (默认,可被覆盖) |
| 15 | +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") |
| 16 | +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") |
| 17 | +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib") |
| 18 | + |
| 19 | +# ============================================================ |
| 20 | +# 兼容性宏: cf_register_example_launcher |
| 21 | +# ============================================================ |
| 22 | +# 在非 Windows 平台上定义为空操作 |
| 23 | +# (在 Windows 上由 ExampleLauncher.cmake 提供实际实现) |
| 24 | +if(NOT WIN32) |
| 25 | + macro(cf_register_example_launcher TARGET_NAME CATEGORY) |
| 26 | + # Linux 下不需要启动脚本,空操作 |
| 27 | + endmacro() |
| 28 | +endif() |
| 29 | + |
| 30 | +# ============================================================ |
| 31 | +# 函数: cf_set_example_output_dir |
| 32 | +# ============================================================ |
| 33 | +# 为 example 可执行文件设置分类输出目录 |
| 34 | +# |
| 35 | +# 参数: |
| 36 | +# TARGET_NAME - 目标名称 |
| 37 | +# CATEGORY - 分类名称 (base, ui, gui) |
| 38 | +# |
| 39 | +# 用法: |
| 40 | +# cf_set_example_output_dir(my_example "ui") |
| 41 | +# |
| 42 | +function(cf_set_example_output_dir TARGET_NAME CATEGORY) |
| 43 | + if(NOT TARGET ${TARGET_NAME}) |
| 44 | + message(WARNING "cf_set_example_output_dir: Target '${TARGET_NAME}' does not exist") |
| 45 | + return() |
| 46 | + endif() |
| 47 | + |
| 48 | + # 设置输出目录为 examples/{category}/ |
| 49 | + set_target_properties(${TARGET_NAME} PROPERTIES |
| 50 | + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/examples/${CATEGORY}" |
| 51 | + ) |
| 52 | + |
| 53 | + # 确保输出目录存在 |
| 54 | + file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/examples/${CATEGORY}") |
| 55 | + |
| 56 | + log_info("OutputDir" "Target '${TARGET_NAME}' -> examples/${CATEGORY}") |
| 57 | +endfunction() |
| 58 | + |
| 59 | +# ============================================================ |
| 60 | +# 函数: cf_set_main_app_output_dir |
| 61 | +# ============================================================ |
| 62 | +# 为主应用设置输出目录 (bin/) |
| 63 | +# |
| 64 | +# 参数: |
| 65 | +# TARGET_NAME - 主应用目标名称 |
| 66 | +# |
| 67 | +function(cf_set_main_app_output_dir TARGET_NAME) |
| 68 | + if(NOT TARGET ${TARGET_NAME}) |
| 69 | + message(WARNING "cf_set_main_app_output_dir: Target '${TARGET_NAME}' does not exist") |
| 70 | + return() |
| 71 | + endif() |
| 72 | + |
| 73 | + set_target_properties(${TARGET_NAME} PROPERTIES |
| 74 | + RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin" |
| 75 | + ) |
| 76 | + |
| 77 | + log_info("OutputDir" "Main app '${TARGET_NAME}' -> bin/") |
| 78 | +endfunction() |
| 79 | + |
| 80 | +# ============================================================ |
| 81 | +# 函数: cf_get_runtime_output_dir |
| 82 | +# ============================================================ |
| 83 | +# 获取运行时输出目录 (用于 Qt 部署) |
| 84 | +# |
| 85 | +# 输出变量: |
| 86 | +# CF_RUNTIME_OUTPUT_DIR - 运行时输出目录 |
| 87 | +# |
| 88 | +function(cf_get_runtime_output_dir VAR_NAME) |
| 89 | + set(${VAR_NAME} "${CMAKE_BINARY_DIR}/bin" PARENT_SCOPE) |
| 90 | +endfunction() |
| 91 | + |
| 92 | +# ============================================================ |
| 93 | +# 函数: cf_get_examples_output_dir |
| 94 | +# ============================================================ |
| 95 | +# 获取 examples 输出目录 |
| 96 | +# |
| 97 | +# 参数: |
| 98 | +# CATEGORY - 分类名称 (可选) |
| 99 | +# 输出变量: |
| 100 | +# CF_EXAMPLES_OUTPUT_DIR - examples 输出目录 |
| 101 | +# |
| 102 | +function(cf_get_examples_output_dir VAR_NAME CATEGORY) |
| 103 | + if(CATEGORY) |
| 104 | + set(${VAR_NAME} "${CMAKE_BINARY_DIR}/examples/${CATEGORY}" PARENT_SCOPE) |
| 105 | + else() |
| 106 | + set(${VAR_NAME} "${CMAKE_BINARY_DIR}/examples" PARENT_SCOPE) |
| 107 | + endif() |
| 108 | +endfunction() |
| 109 | + |
| 110 | +# ============================================================ |
| 111 | +# 函数: cf_get_runtimes_dir |
| 112 | +# ============================================================ |
| 113 | +# 获取 runtimes 目录 (Windows Qt DLLs) |
| 114 | +# |
| 115 | +# 输出变量: |
| 116 | +# CF_RUNTIMES_DIR - runtimes 目录 |
| 117 | +# |
| 118 | +function(cf_get_runtimes_dir VAR_NAME) |
| 119 | + set(${VAR_NAME} "${CMAKE_BINARY_DIR}/runtimes" PARENT_SCOPE) |
| 120 | +endfunction() |
| 121 | + |
| 122 | +# ============================================================ |
| 123 | +# 函数: cf_get_plugins_dir |
| 124 | +# ============================================================ |
| 125 | +# 获取 plugins 目录 (Qt 插件) |
| 126 | +# |
| 127 | +# 输出变量: |
| 128 | +# CF_PLUGINS_DIR - plugins 目录 |
| 129 | +# |
| 130 | +function(cf_get_plugins_dir VAR_NAME) |
| 131 | + set(${VAR_NAME} "${CMAKE_BINARY_DIR}/plugins" PARENT_SCOPE) |
| 132 | +endfunction() |
| 133 | + |
| 134 | +# ============================================================ |
| 135 | +# 函数: cf_configure_qt_plugin_paths |
| 136 | +# ============================================================ |
| 137 | +# 配置 Qt 插件路径 (用于 windeployqt) |
| 138 | +# |
| 139 | +# 设置 QT_PLUGIN_PATH 环境变量,使 Qt 能找到插件 |
| 140 | +# |
| 141 | +function(cf_configure_qt_plugin_paths) |
| 142 | + if(WIN32) |
| 143 | + # 设置 Qt 插件输出到 plugins/ 目录 |
| 144 | + set(CMAKE_INSTALL_PLUGINSDIR "${CMAKE_BINARY_DIR}/plugins" CACHE PATH "") |
| 145 | + endif() |
| 146 | +endfunction() |
| 147 | + |
| 148 | +# ============================================================ |
| 149 | +# 函数: cf_setup_output_dirs |
| 150 | +# ============================================================ |
| 151 | +# 创建所有输出目录 |
| 152 | +# |
| 153 | +function(cf_setup_output_dirs) |
| 154 | + file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/bin") |
| 155 | + file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/lib") |
| 156 | + file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/examples/base") |
| 157 | + file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/examples/ui") |
| 158 | + file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/examples/gui") |
| 159 | + file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/plugins") |
| 160 | + file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/resources") |
| 161 | + |
| 162 | + if(WIN32) |
| 163 | + file(MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/runtimes") |
| 164 | + endif() |
| 165 | + |
| 166 | + log_info("OutputDir" "Output directories created") |
| 167 | +endfunction() |
| 168 | + |
| 169 | +# 自动创建输出目录 |
| 170 | +cf_setup_output_dirs() |
0 commit comments