NotepadPluginConfig.cmake.in 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. # NotepadPluginConfig.cmake
  2. # 用于 Notepad-- 插件实现的 CMake 模块初级定义
  3. # 在 Linux 中,它的布局应该如下:
  4. # /usr/lib/x86_64-linux-gnu/cmake/NotepadPlugin/NotepadPluginConfig.cmake
  5. # 在 插件开发层中,它的使用如下:
  6. # 1. 查找 NotepadPlugin 模块
  7. # find_package(NotepadPlugin)
  8. # 2. 使用 add_notepad_plugin(<模块名称> <源代码、资源文件> [...])
  9. # add_notepad_plugin(<plugin_name> <plugin_srcs> ...)
  10. # 一些无关紧要的部分,如果需要实现插件安装操作时,即可进行使用
  11. # include(CMakePackageConfigHelpers)
  12. # include(GNUInstallDirs)
  13. # 主要内容,在构建时的填充
  14. set(NOTEPAD_PLUGIN @NOTEPAD_PLUGIN@)
  15. set(NOTEPAD_BUILD_BY_QT5 @NOTEPAD_BUILD_BY_QT5@)
  16. set(NOTEPAD_BUILD_BY_QT6 @NOTEPAD_BUILD_BY_QT6@)
  17. set(NOTEPAD_BUILD_BY_SHARED @NOTEPAD_BUILD_BY_SHARED@)
  18. set(NOTEPAD_PLUGIN_CORELIB @NOTEPAD_PLUGIN_CORELIB@)
  19. set(NOTEPAD_PLUGIN_CORELIB_NAME @NOTEPAD_PLUGIN_CORELIB_NAME@)
  20. # 由插件开发者进行参考的 "Notepad 提供的插件安装目录(位置)"
  21. set(NOTEPAD_PLUGIN_EXTERNAL_PLUGIN_INSTALL_DIRECTORY
  22. @NOTEPAD_PLUGIN_EXTERNAL_PLUGIN_DIRECTORY@)
  23. # 这些是被废除的内容
  24. # set(NOTEPAD_PLUGIN_INCLUDEDIR @NOTEPAD_PLUGIN_INCLUDEDIR@)
  25. # set(NOTEPAD_PLUGIN_LIBDIR @NOTEPAD_PLUGIN_LIBDIR@)
  26. # 一些核心位置设定参考
  27. # ./usr/bin/
  28. # ./usr/bin/notepad--
  29. # ./usr/include/
  30. # ./usr/include/NotepadPlugin/
  31. # ./usr/include/NotepadPlugin/Qsci/
  32. # ./usr/include/NotepadPlugin/Qsci/...
  33. # ./usr/include/NotepadPlugin/qscint/
  34. # ./usr/include/NotepadPlugin/qscint/scintilla/src/XPM.cp
  35. # ./usr/lib/
  36. # ./usr/lib/NotepadPlugin/
  37. # ./usr/lib/NotepadPlugin/libQSci.a
  38. # ./usr/lib/cmake/
  39. # ./usr/lib/cmake/NotepadPlugin/
  40. # ./usr/lib/cmake/NotepadPlugin/NotepadPluginConfig.cmake
  41. # ^ 以此文件目录位置开始,Linux/Windows中都相同,但不是写死路径
  42. # ../ 为 /usr/lib/cmake 目录
  43. # ../../ 为 /usr/lib 目录
  44. # ../../../ 为 /usr 目录
  45. # ../../../include 为 /usr/include 目录
  46. # ../../../lib 为 /usr/lib 目录
  47. # ../../../include/NotepadPlugin # (/usr)头文件目录(NOTEPAD_PLUGIN_INCLUDEDIR)
  48. # ../../NotepadPlugin # (/usr/lib)库文件目录(NOTEPAD_PLUGIN_LIBDIR)
  49. # ../../cmake # (/usr/lib)cmake文件目录(无需关心)
  50. set(NOTEPAD_PLUGIN_INCLUDEDIR
  51. ${CMAKE_CURRENT_LIST_DIR}/../../../include/${NOTEPAD_PLUGIN}
  52. ${CMAKE_CURRENT_LIST_DIR}/../../../include/${NOTEPAD_PLUGIN}/Qsci)
  53. set(NOTEPAD_PLUGIN_LIBDIR
  54. ${CMAKE_CURRENT_LIST_DIR}/../../${NOTEPAD_PLUGIN})
  55. if(NOTEPAD_BUILD_BY_QT5)
  56. set(CMAKE_AUTOMOC ON)
  57. set(CMAKE_AUTOUIC ON)
  58. set(CMAKE_AUTORCC ON)
  59. find_package(Qt5 COMPONENTS Core Widgets REQUIRED)
  60. endif(NOTEPAD_BUILD_BY_QT5)
  61. if(NOTEPAD_BUILD_BY_QT6)
  62. set(CMAKE_AUTOMOC ON)
  63. set(CMAKE_AUTOUIC ON)
  64. set(CMAKE_AUTORCC ON)
  65. find_package(Qt6 COMPONENTS Core Widgets REQUIRED)
  66. endif(NOTEPAD_BUILD_BY_QT6)
  67. if(NOTEPAD_BUILD_BY_SHARED)
  68. add_library(${NOTEPAD_PLUGIN} SHARED IMPORTED)
  69. set_target_properties(${${NOTEPAD_PLUGIN}} PROPERTIES
  70. IMPORTED_LOCATION
  71. ${NOTEPAD_PLUGIN_LIBDIR}/${NOTEPAD_PLUGIN_CORELIB_NAME}
  72. INCLUDE_DIRECTORIES
  73. "${NOTEPAD_PLUGIN_INCLUDEDIR}"
  74. )
  75. else()
  76. add_library(${NOTEPAD_PLUGIN} STATIC IMPORTED)
  77. set_target_properties(${${NOTEPAD_PLUGIN}} PROPERTIES
  78. IMPORTED_LOCATION
  79. ${NOTEPAD_PLUGIN_LIBDIR}/${NOTEPAD_PLUGIN_CORELIB_NAME}
  80. INCLUDE_DIRECTORIES
  81. "${NOTEPAD_PLUGIN_INCLUDEDIR}"
  82. )
  83. endif()
  84. if(CMAKE_HOST_UNIX)
  85. # 在 Linux 中开启 compile_commands.json 文件输出,增强 clangd 能力
  86. set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
  87. endif(CMAKE_HOST_UNIX)
  88. # add_notepad_plugin(<PLUGIN_VAR> <PLUGIN_SRC> [...])
  89. # 此宏定义了,基于源代码文件构建 Notepad-- 插件时所需要的一系列流程内容
  90. macro(add_notepad_plugin PLUGIN_VAR PLUGIN_SRC)
  91. # aux_source_directory(${PLUGIN_VAR}_SOURCES ${ARGN})
  92. add_library(${PLUGIN_VAR} SHARED ${PLUGIN_SRC} ${ARGN})
  93. if(CMAKE_HOST_WIN32)
  94. # Win32 已提供宏判断
  95. # target_compile_definitions(${PLUGIN_VAR} PUBLIC NDD_EXPORT=export)
  96. endif(CMAKE_HOST_WIN32)
  97. if(CMAKE_HOST_UNIX)
  98. target_compile_definitions(${PLUGIN_VAR} PUBLIC NDD_EXPORT=)
  99. endif(CMAKE_HOST_UNIX)
  100. # ------------ 为在不同平台构建的插件定义输出名称(尾巴) ------------- #
  101. # <OS> 平台: Windows/MacOS/Linux
  102. # <ARCH> 架构: X86_64、AMD64、ARM64、....
  103. # <COMPILER> 编译器:MinGW、Cygwin、MSVC、GNU、Clang、Intel....
  104. # <QT> Qt版本:
  105. set(${PLUGIN_VAR}_OUTPUT_NAME ${PLUGIN_VAR})
  106. # <OS> ------- 确定平台 Apple/Linux/Windows ------------------- #
  107. if(APPLE)
  108. string(APPEND ${PLUGIN_VAR}_OUTPUT_NAME "_MacOS")
  109. elseif(UNIX AND NOT APPLE AND NOT WIN32 AND NOT ANDROID)
  110. string(APPEND ${PLUGIN_VAR}_OUTPUT_NAME "_Linux")
  111. elseif(WIN32)
  112. string(APPEND ${PLUGIN_VAR}_OUTPUT_NAME "_Win32")
  113. endif()
  114. # <ARCH> ------- 确定架构 X86_64/AMD64/ARM64/... -------------- #
  115. string(APPEND ${PLUGIN_VAR}_OUTPUT_NAME "_${CMAKE_HOST_SYSTEM_PROCESSOR}")
  116. # if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.19)
  117. # if(CMAKE_APPLE_SILICON_PROCESSOR)
  118. # string(APPEND ${PLUGIN_VAR}_OUTPUT_NAME "_Silicon")
  119. # endif(CMAKE_APPLE_SILICON_PROCESSOR)
  120. # endif(CMAKE_VERSION VERSION_GREATER_EQUAL 3.19)
  121. # <COMPILER> ----- 确定编译器类型
  122. # string(APPEND ${PLUGIN_VAR}_OUTPUT_NAME "_MinGW")
  123. if(WIN32)
  124. if(MINGW)
  125. string(APPEND ${PLUGIN_VAR}_OUTPUT_NAME "_MinGW")
  126. elseif(CYGWIN)
  127. string(APPEND ${PLUGIN_VAR}_OUTPUT_NAME "_Cygwin")
  128. elseif(MSVC)
  129. string(APPEND ${PLUGIN_VAR}_OUTPUT_NAME "_MSVC")
  130. else() # 如果不是 MinGW、 Cygwin 、MSVC
  131. if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "")
  132. string(APPEND ${PLUGIN_VAR}_OUTPUT_NAME "_Unknow")
  133. else() # 如果不是 CMAKE_CXX_COMPILER_ID 不为空
  134. string(APPEND ${PLUGIN_VAR}_OUTPUT_NAME "_${CMAKE_CXX_COMPILER_ID}")
  135. endif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "")
  136. endif()
  137. else()
  138. # 此处:如果不提前进行 MINGW 判断,MINGW 也将会是 GNU
  139. string(APPEND ${PLUGIN_VAR}_OUTPUT_NAME "_${CMAKE_CXX_COMPILER_ID}")
  140. endif()
  141. # 预留: GNU Compiler 系列并不清楚如何区分
  142. # if(${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
  143. # string(APPEND ${PLUGIN_VAR}_OUTPUT_NAME "_GCC")
  144. # endif(${CMAKE_CXX_COMPILER_ID} STREQUAL "GNU")
  145. # <Qt 版本尾巴规划:待确定,目前使用 Qt5/Qt6 进行区分>
  146. # if(NOT "${Qt5_}" STREQUAL "")
  147. # string(APPEND ${PLUGIN_VAR}_OUTPUT_NAME "_${QT_VERSION}")
  148. # endif(NOT "${QT_VERSION}" STREQUAL "")
  149. if(NOTEPAD_BUILD_BY_QT5)
  150. string(APPEND ${PLUGIN_VAR}_OUTPUT_NAME "_Qt5")
  151. else()
  152. string(APPEND ${PLUGIN_VAR}_OUTPUT_NAME "_Qt6")
  153. endif(NOTEPAD_BUILD_BY_QT5)
  154. set_property(TARGET ${PLUGIN_VAR}
  155. PROPERTY
  156. OUTPUT_NAME "${${PLUGIN_VAR}_OUTPUT_NAME}")
  157. # ------------ 为构建的插件配置尾巴 ------------- #
  158. # Notepad-- 插件开发时应该使用的 头文件安装目录、库文件安装目录
  159. target_include_directories(${PLUGIN_VAR} PUBLIC
  160. ${NOTEPAD_PLUGIN_INCLUDEDIR})
  161. target_link_directories(${PLUGIN_VAR} PUBLIC
  162. ${NOTEPAD_PLUGIN_LIBDIR})
  163. target_link_libraries(${PLUGIN_VAR} ${NOTEPAD_PLUGIN_CORELIB})
  164. if(NOTEPAD_BUILD_BY_QT5)
  165. target_link_libraries(${PLUGIN_VAR} Qt5::Core Qt5::Widgets)
  166. endif(NOTEPAD_BUILD_BY_QT5)
  167. if(NOTEPAD_BUILD_BY_QT6)
  168. target_link_libraries(${PLUGIN_VAR} Qt6::Core Qt6::Widgets)
  169. endif(NOTEPAD_BUILD_BY_QT6)
  170. # 这是插件实现接口中增加的 NOTEPAD_PLUGIN_MANAGER 宏开关
  171. # 来处理减少 Notepad-- 在编译时不需要,但在插件编译时所需要的模板内容
  172. if(WIN32 AND NOTEPAD_BUILD_BY_SHARED)
  173. target_compile_definitions(${PLUGIN_VAR}
  174. PUBLIC
  175. NOTEPAD_PLUGIN_MANAGER
  176. QSCINTILLA_DLL # 取消废弃,一些插件的构建中测试为需要明确显式声明此宏
  177. )
  178. else()
  179. target_compile_definitions(${PLUGIN_VAR}
  180. PUBLIC
  181. NOTEPAD_PLUGIN_MANAGER)
  182. endif(WIN32 AND NOTEPAD_BUILD_BY_SHARED)
  183. endmacro(add_notepad_plugin PLUGIN_VAR PLUGIN_SRC)
  184. # support git plugin
  185. # add_notepad_plugin_with_git <plugin_name> <git_repo_url> <plugin_sources_path>
  186. # 该宏定义了从指定的 git 仓库中获取插件源代码,并进行简单的构建
  187. macro(add_notepad_plugin_with_git PLUGIN_VAR GIT_REPO_URL GIT_REPO_PLUGIN_PATH)
  188. execute_process(COMMAND git clone ${GIT_REPO_URL} ${PLUGIN_VAR}_git
  189. WORKING_DIRECTORY ${CMAKE_BINARY_DIR})
  190. aux_source_directory(${CMAKE_BINARY_DIR}/${PLUGIN_VAR}_git/${GIT_REPO_PLUGIN_PATH} ${PLUGIN_VAR}_RESOURCES)
  191. add_notepad_plugin(${PLUGIN_VAR} ${${PLUGIN_VAR}_RESOURCES})
  192. endmacro(add_notepad_plugin_with_git PLUGIN_VAR GIT_REPO_URL GIT_REPO_PLUGIN_PATH)
  193. message("- >>>>>>>>>>>>>>>>>> NotepadPlugin: <<<<<<<<<<<<<<<<<<")
  194. message(" - ${CMAKE_CURRENT_LIST_FILE}")
  195. message(" - ${NOTEPAD_PLUGIN_INCLUDEDIR}")
  196. message(" - ${NOTEPAD_PLUGIN_LIBDIR}")
  197. message(" - ${NOTEPAD_PLUGIN_CORELIB}")
  198. message(" - ${NOTEPAD_PLUGIN_CORELIB_NAME}")
  199. message("- >>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<")