Browse Source

cmake/modules: 增加 NOTEPAD_BUILD_BY_SHARED 构建配方

增加 utils.cmake 进行获取在不同平台构建时的目标库的名称
zinface 2 years ago
parent
commit
fc50cf38a2

+ 7 - 6
cmake/NotepadPluginConfig.cmake.in

@@ -18,7 +18,7 @@
 set(NOTEPAD_PLUGIN              @NOTEPAD_PLUGIN@)
 set(NOTEPAD_BUILD_BY_QT5        @NOTEPAD_BUILD_BY_QT5@)
 set(NOTEPAD_BUILD_BY_QT6        @NOTEPAD_BUILD_BY_QT6@)
-set(NOTEPAD_BUILD_BY_SHARED     FALSE)
+set(NOTEPAD_BUILD_BY_SHARED     @NOTEPAD_BUILD_BY_SHARED@)
 set(NOTEPAD_PLUGIN_CORELIB      @NOTEPAD_PLUGIN_CORELIB@)
 # 由插件开发者进行参考的 "Notepad 提供的插件安装目录(位置)" 
 set(NOTEPAD_PLUGIN_EXTERNAL_PLUGIN_INSTALL_DIRECTORY 
@@ -196,17 +196,18 @@ macro(add_notepad_plugin PLUGIN_VAR PLUGIN_SRC)
 
     # 这是插件实现接口中增加的 NOTEPAD_PLUGIN_MANAGER 宏开关
         # 来处理减少 Notepad-- 在编译时不需要,但在插件编译时所需要的模板内容
-    if(WIN32)
+    
+    if(WIN32 AND NOTEPAD_BUILD_BY_SHARED)
         target_compile_definitions(${PLUGIN_VAR} 
             PUBLIC 
                 NOTEPAD_PLUGIN_MANAGER
-                QSCINTILLA_DLL      # 在 Windows 中使用 QSci 库时应该采用 Q_DECL_IMPORT
-                                    # 控制 QSCINTILLA_EXPORT 符号应为 Q_DECL_IMPORT
+                # QSCINTILLA_DLL    # 废弃,插件构建中不需要明确显式声明此宏
         )
     else()
         target_compile_definitions(${PLUGIN_VAR} 
-            PUBLIC NOTEPAD_PLUGIN_MANAGER)
-    endif(WIN32)
+            PUBLIC 
+                NOTEPAD_PLUGIN_MANAGER)
+    endif(WIN32 AND NOTEPAD_BUILD_BY_SHARED)
     
 endmacro(add_notepad_plugin PLUGIN_VAR PLUGIN_SRC)
 

+ 7 - 1
cmake/modules/QScint.cmake

@@ -4,6 +4,8 @@
 # 1. 静态化构建库时产出的目标为 libQSci.a
 # 2. 在此处可对 QSci 目标进行详细的构建计划
 
+option(NOTEPAD_BUILD_BY_SHARED "指定 Notepad 将构建为动态库" OFF)
+
 if(TRUE)
     # add_subdirectory(${PROJECT_SOURCE_DIR}/src/qscint)
     # file(GLOB MOC_HEADER src/qscint/src/Qsci/*.h)
@@ -19,7 +21,11 @@ if(TRUE)
         # src/qscint/src/Qsci
         # FAIL: only *.ui will spark_file_glob(MOC_HEADER ...)
     )
-    spark_add_library(QSci STATIC ${QSciSources} ${MOC_HEADER})    
+    if(NOTEPAD_BUILD_BY_SHARED)
+        spark_add_library(QSci SHARED ${QSciSources} ${MOC_HEADER})
+    else()
+        spark_add_library(QSci STATIC ${QSciSources} ${MOC_HEADER})
+    endif(NOTEPAD_BUILD_BY_SHARED)
     target_include_directories(QSci PRIVATE
         src/qscint/scintilla/boostregex
         src/qscint/scintilla/lexlib)

+ 7 - 0
cmake/platforms/linux-universal.cmake

@@ -55,6 +55,12 @@ if(CMAKE_HOST_UNIX)
     # 定义一些扩展内容,主要是提供给 CMake 模块文件填充
     set(NOTEPAD_PLUGIN_CORELIB QSci) # QSci 为构建的 QScintllia 库
 
+    # 将当前平台构建的目标转为平台下的库名称
+    include(cmake/platforms/utils.cmake)
+    get_current_platform_lib_name(NOTEPAD_PLUGIN_CORELIB_NAME 
+        ${NOTEPAD_BUILD_BY_SHARED}
+        QSci)
+
     # 定义在插件开发的 CMake 模块中,Notepad-- 是否是基于 QT5 实现
         # 并自动为插件开发层自动开启相关 Qt 依赖组件
         # 此部分逻辑将自动提供给 add_notepad_plugin 自行处理
@@ -108,3 +114,4 @@ if(CMAKE_HOST_UNIX)
     # ------------------ INSTALL PLUGIN CONFIG ------------------ #
 
 endif(CMAKE_HOST_UNIX)
+

+ 40 - 0
cmake/platforms/utils.cmake

@@ -0,0 +1,40 @@
+# utils.cmake
+    # 定义一些其它工具函数
+    
+# get_current_platform_lib_name <_VAR> <_IS_IS_SHREAD> <_LIB>
+    # _VAR          用于存储内容的变量
+    # _IS_IS_SHREAD 是否为共享库
+    # _LIB          目标名称
+function(get_current_platform_lib_name _VAR _IS_SHREAD _LIB)
+    set(_LIB_NAME  "")
+    if(WIN32)
+        set(_LIB_NAME ${_LIB}.lib)
+    elseif(UNIX AND NOT APPLE)
+        if(${_IS_SHREAD})
+            set(_LIB_NAME lib${_LIB}.so)
+        else()
+            set(_LIB_NAME lib${_LIB}.a)
+        endif(${_IS_SHREAD})
+    elseif(APPLE)
+        if(${_IS_SHREAD})
+            set(_LIB_NAME lib${_LIB}.dylib)
+        else()
+            set(_LIB_NAME lib${_LIB}.a)
+        endif(${_IS_SHREAD})
+    else()
+        message("ERROR: Unknow current platform")
+        set(_LIB_NAME ${_LIB})
+    endif()
+    message("[utils.cmake] get_current_platform_lib_name: ${_LIB}(${_LIB_NAME}) ")
+    set(${_VAR} ${_LIB_NAME} PARENT_SCOPE)
+endfunction(get_current_platform_lib_name _VAR _IS_SHREAD _LIB)
+# 获取当前平台的 lib 名称
+# 在 Windows 中
+    # 用于编译的静态库与动态库后缀相同: .lib
+    # 并且不是 lib 开头
+# 在 Linux 中
+    # 用于编译的静态库与动态库后缀分别是:.a 与 .so
+    # 文件名称由 lib 开头
+# 在 MacOS 中
+    # 用于编译的静态库与动态库后缀分别是:.a 与 .dylib
+    # 文件名称由 lib 开头

+ 6 - 0
cmake/platforms/windows-universal.cmake

@@ -40,6 +40,12 @@ if(CMAKE_HOST_WIN32)
     # 定义一些扩展内容,主要是提供给 CMake 模块文件填充
     set(NOTEPAD_PLUGIN_CORELIB QSci) # QSci 为构建的 QScintllia 库
 
+    # 将当前平台构建的目标转为平台下的库名称
+    include(cmake/platforms/utils.cmake)
+    get_current_platform_lib_name(NOTEPAD_PLUGIN_CORELIB_NAME 
+        ${NOTEPAD_BUILD_BY_SHARED}
+        QSci)
+
     # 定义在插件开发的 CMake 模块中,Notepad-- 是否是基于 QT5 实现
         # 并自动为插件开发层自动开启相关 Qt 依赖组件
         # 此部分逻辑将自动提供给 add_notepad_plugin 自行处理