Procházet zdrojové kódy

feat: 添加cygwin的支持

SongZihuan před 3 roky
rodič
revize
0b07351c6a

+ 8 - 2
README.md

@@ -6,8 +6,10 @@ CMakeFindExternalProject(下称CFEP)是用于CMake构建系统的依赖管
 同时, 它提供了第三方依赖安装, Windows运行时库安装等工具。
 
 ## 功能
-**使用注意:**
-**以下函数(宏)均允许以小写形式调用**
+**使用注意:**  
+**以下函数(宏)均允许以小写形式调用**  
+**CYGWIN平台也被判定为WINDOWS平台**  
+**还为CYGWIN平台的cygwin1.dll添加支持**
 
 ### 第三方依赖
 CMake提供如下函数:
@@ -222,6 +224,10 @@ wi_set_install_dir_quiet
 - CMAKE_LIBRARY_OUTPUT_DIRECTORY
 - CMAKE_RUNTIME_OUTPUT_DIRECTORY
 
+### cygwin支持
+使用函数`wi_find_cygwin1`可以获取`cygwin1.dll`动态库。
+将生成导入目标: `CYGWIN::cygwin1`
+
 ## 使用方式
 将项目中的`cmake/CMakeFindExternalProject`文件夹放置在项目指定位置, 在`cmake`中执行:
 ```

+ 2 - 2
cmake/CMakeFindExternalProject/CMakeFindExternalProject.cmake

@@ -331,7 +331,7 @@ macro(_cfep_first_find_inline name _cmake)
         if (re)
             if (_cmake)
                 set(${name}_DIR "${re}/${_cmake}" CACHE PATH "" FORCE)
-            elseif(WIN32 AND NOT CYGWIN)
+            elseif(WIN32 OR CYGWIN)
                 set(${name}_DIR "${re}/cmake" CACHE PATH "" FORCE)
             else()
                 set(${name}_DIR "${re}/share/cmake/${name}" CACHE PATH "" FORCE)
@@ -391,7 +391,7 @@ macro(_cfep_find_xxx_inline name func)
         if (NOT _module)
             if (_cmake)
                 set(${name}_DIR "${${name}_CFEP_INSTALL}/${_cmake}" CACHE PATH "" FORCE)
-            elseif(WIN32 AND NOT CYGWIN)
+            elseif(WIN32 OR CYGWIN)
                 set(${name}_DIR "${${name}_CFEP_INSTALL}/cmake" CACHE PATH "" FORCE)
             else()
                 set(${name}_DIR "${${name}_CFEP_INSTALL}/share/cmake/${name}" CACHE PATH "" FORCE)

+ 1 - 1
cmake/CMakeFindExternalProject/InstallDir.cmake

@@ -31,7 +31,7 @@ function(wi_set_install_dir_quiet)
     set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${_lib} PARENT_SCOPE)
     set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${_bin} PARENT_SCOPE)
 
-    if(WIN32 AND NOT CYGWIN)
+    if(WIN32 OR CYGWIN)  # cygwin和windows使用相同的文件结构
         set(DEF_INSTALL_CMAKEDIR cmake)
         set(DEF_INSTALL_INCLUDEDIR ${CMAKE_INSTALL_INCLUDEDIR})
         set(DEF_INSTALL_RESOURCEDIR ${CMAKE_INSTALL_DATAROOTDIR})  # 关联文件

+ 19 - 8
cmake/CMakeFindExternalProject/WindowsInstall.cmake

@@ -6,7 +6,7 @@ windows下安装程序
 
 # 找到导入库的.dll和.lib并添加install
 function(_wi_install_import_inline target run lib)
-    if(WIN32)  # 只有windows需要执行该操作
+    if(WIN32 OR CYGWIN)  # 只有windows需要执行该操作 (包括cygwin也需要处理.dll依赖的问题)
         if (CMAKE_BUILD_TYPE)
             string(TOUPPER ${CMAKE_BUILD_TYPE} _build_type)
         else()
@@ -69,7 +69,7 @@ endfunction()
 
 # 找到导入库的.dll和.lib并复制到指定的目录
 function(_wi_copy_import_inline target run lib)
-    if(WIN32)  # 只有windows需要执行该操作
+    if(WIN32 OR CYGWIN)
         if (CMAKE_BUILD_TYPE)
             string(TOUPPER ${CMAKE_BUILD_TYPE} _build_type)
         else()
@@ -114,7 +114,7 @@ macro(set_copy_command target a b)
 endmacro()
 
 function(_wi_build_import_inline target run lib)
-    if(WIN32)  # 只有windows需要执行该操作
+    if(WIN32 OR CYGWIN)
         if (CMAKE_BUILD_TYPE)
             string(TOUPPER ${CMAKE_BUILD_TYPE} _build_type)
         else()
@@ -206,7 +206,7 @@ endfunction()
 
 # 安装install的bin目录(检查.dll并安装到指定位置)
 function(wi_install_dll_bin)
-    if(WIN32)
+    if(WIN32 OR CYGWIN)
         cmake_parse_arguments(ii "" "RUNTIME" "DIRS" ${ARGN})
         if (NOT ii_RUNTIME)
             if (INSTALL_BINDIR)
@@ -234,7 +234,7 @@ endfunction()
 
 # 复制bin目录(检查.dll并复制到指定位置)
 function(wi_copy_dll_bin)
-    if(WIN32)
+    if(WIN32 OR CYGWIN)
         cmake_parse_arguments(ii "" "RUNTIME" "DIRS" ${ARGN})
         if (NOT ii_RUNTIME)
             if (INSTALL_BINDIR)
@@ -262,7 +262,7 @@ endfunction()
 
 # 检查文件夹是否有exe, 若有则将其当作bin目录处理
 function(wi_install_dll_dir)
-    if(WIN32)
+    if(WIN32 OR CYGWIN)
         cmake_parse_arguments(ii "" "RUNTIME" "DIRS" ${ARGN})
         if (NOT ii_RUNTIME)
             if (INSTALL_BINDIR)
@@ -289,7 +289,7 @@ endfunction()
 
 # 检查文件夹是否有exe, 若有则将其当作bin目录处理
 function(wi_copy_dll_dir)
-    if(WIN32)
+    if(WIN32 OR CYGWIN)
         cmake_parse_arguments(ii "" "RUNTIME" "DIRS" ${ARGN})
         if (NOT ii_RUNTIME)
             if (INSTALL_BINDIR)
@@ -312,4 +312,15 @@ function(wi_copy_dll_dir)
             endif()
         endforeach()
     endif()
-endfunction()
+endfunction()
+
+function(wi_find_cygwin1)
+    if(CYGWIN)
+        find_file(cygwin1_dll "cygwin1.dll" DOC "Find cygwin1.dll on windows.")
+        if (NOT cygwin1_dll)
+            message(FATAL_ERROR "The cygwin1.dll not found.")
+        endif()
+        add_library(CYGWIN::cygwin1 SHARED IMPORTED)
+        set_target_properties(CYGWIN::cygwin1 PROPERTIES IMPORTED_LOCATION "${cygwin1_dll}")
+    endif()
+endfunction()