瀏覽代碼

feat: 支持cygwin编译

SongZihuan 3 年之前
父節點
當前提交
55bb77cb05

+ 1 - 1
CMakeLists.txt

@@ -66,7 +66,7 @@ set(CMAKEDIR ${INSTALL_CMAKEDIR})
 set(INCLUDEDIR ${INSTALL_INCLUDEDIR})
 
 set(path_var)
-if (WIN32 AND NOT CYGWIN)
+if (WIN32 AND NOT CYGWIN)  # cygwin 不需要编译 dl
     foreach(tgt dlfcn pcre2 fflags)
         set(${tgt}_INSTALL_DIR ${deps_install_dir})
         set(${tgt}_CMAKEDIR ${deps_install_dir}/${${tgt}_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()

+ 2 - 2
cmake/aFunlangConfig.cmake.in

@@ -33,7 +33,7 @@ set_and_check(aFunlang_ROOT @PACKAGE_INSTALL_DIR@)
 set_and_check(aFunlang_INCLUDE_DIRS @PACKAGE_INCLUDEDIR@)
 set_and_check(aFunlang_RUNTIME_DIRS @PACKAGE_BINDIR@)
 
-if(WIN32 AND NOT CYGWIN)
+if(WIN32 OR CYGWIN)  # cygwin 和 win32 一样使用.dll
     set_and_check(aFunlang_RUNTIME_LIBRARIES_DIRS @PACKAGE_BINDIR@)
 else()
     set_and_check(aFunlang_RUNTIME_LIBRARIES_DIRS @PACKAGE_LIBDIR@)
@@ -75,7 +75,7 @@ function(find_package_safe)
 endfunction()
 
 # 查找依赖
-if (WIN32 AND NOT CYGWIN)
+if (WIN32 AND NOT CYGWIN)  # cygwin 不需要 dl
     set_and_check(aFunlang_dlfcn_ROOT @PACKAGE_dlfcn_INSTALL_DIR@)
     find_package_safe(PACKAGE dlfcn-win32 QUIET HINTS @PACKAGE_dlfcn_CMAKEDIR@)  # 指定路径
     if (NOT TARGET dlfcn-win32::dl)

+ 8 - 1
deps/deps.cmake

@@ -12,7 +12,7 @@ set(dlfcn-win32_MUST_BUILD TRUE CACHE BOOL "Must build dlfcn-win32")
 set(PCRE2_MUST_BUILD TRUE CACHE BOOL "Must build pcre2")
 set(FFlags_MUST_BUILD TRUE CACHE BOOL "Must build FFlags")
 
-if (WIN32 AND NOT CYGWIN)
+if (WIN32 AND NOT CYGWIN)  # cygwin 不依赖 dl
     if (_print)
         message(STATUS "Build dlfcn-win32...")
     endif()
@@ -86,3 +86,10 @@ install(DIRECTORY "${fflags_INCLUDE_DIRS}/" DESTINATION ${INSTALL_INCLUDEDIR} FI
 install(FILES ${CMAKE_CURRENT_LIST_DIR}/cmake/FindFFlags.cmake DESTINATION ${deps_install_dir}/cmake)  # 安装find程序
 cfep_install(FFlags PREFIX ${deps_install_dir})
 
+# 安装 cygwin1.dll
+if (CYGWIN)
+    wi_find_cygwin1()
+    wi_copy_import(TARGETS CYGWIN::cygwin1)
+    wi_build_import(TARGETS CYGWIN::cygwin1)
+    wi_install_import(TARGETS CYGWIN::cygwin1)
+endif()