浏览代码

Detect Fortran ABI Information

Implement Fortran 32/64-bit ABI detection on some platforms.  We need to
set CMAKE_SIZEOF_VOID_P correctly in Fortran-only projects so that the
find_library() command knows whether to look for 64-bit binaries.  We
also detect ELF binaries to enable RPATH replacement.  See issue #10119.
Brad King 16 年之前
父节点
当前提交
6c1e24276f
共有 2 个文件被更改,包括 44 次插入2 次删除
  1. 12 0
      Modules/CMakeFortranCompiler.cmake.in
  2. 32 2
      Modules/CMakeFortranCompilerABI.F

+ 12 - 0
Modules/CMakeFortranCompiler.cmake.in

@@ -30,5 +30,17 @@ ELSE(UNIX)
   SET(CMAKE_Fortran_OUTPUT_EXTENSION .obj)
 ENDIF(UNIX)
 
+# Save compiler ABI information.
+SET(CMAKE_Fortran_SIZEOF_DATA_PTR "@CMAKE_Fortran_SIZEOF_DATA_PTR@")
+SET(CMAKE_Fortran_COMPILER_ABI "@CMAKE_Fortran_COMPILER_ABI@")
+
+IF(CMAKE_Fortran_SIZEOF_DATA_PTR)
+  SET(CMAKE_SIZEOF_VOID_P "${CMAKE_Fortran_SIZEOF_DATA_PTR}")
+ENDIF(CMAKE_Fortran_SIZEOF_DATA_PTR)
+
+IF(CMAKE_Fortran_COMPILER_ABI)
+  SET(CMAKE_INTERNAL_PLATFORM_ABI "${CMAKE_Fortran_COMPILER_ABI}")
+ENDIF(CMAKE_Fortran_COMPILER_ABI)
+
 SET(CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES "@CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES@")
 SET(CMAKE_Fortran_IMPLICIT_LINK_DIRECTORIES "@CMAKE_Fortran_IMPLICIT_LINK_DIRECTORIES@")

+ 32 - 2
Modules/CMakeFortranCompilerABI.F

@@ -1,3 +1,33 @@
-      PROGRAM CMakeFortranCompilerId
-        PRINT *, 'ABI Detection Binary'
+      PROGRAM CMakeFortranCompilerABI
+#if 0
+! Address Size
+#endif
+#if defined(_LP64)
+        PRINT *, 'INFO:sizeof_dptr[8]'
+#elif defined(_M_IA64)
+        PRINT *, 'INFO:sizeof_dptr[8]'
+#elif defined(_M_X64)
+        PRINT *, 'INFO:sizeof_dptr[8]'
+#elif defined(_M_AMD64)
+        PRINT *, 'INFO:sizeof_dptr[8]'
+
+#elif defined(_ILP32)
+        PRINT *, 'INFO:sizeof_dptr[4]'
+#elif defined(_M_IX86)
+        PRINT *, 'INFO:sizeof_dptr[4]'
+#endif
+
+#if 0
+! Application Binary Interface
+#endif
+#if defined(__sgi) && defined(_ABIO32)
+        PRINT *, 'INFO:abi[ELF O32]'
+#elif defined(__sgi) && defined(_ABIN32)
+        PRINT *, 'INFO:abi[ELF N32]'
+#elif defined(__sgi) && defined(_ABI64)
+        PRINT *, 'INFO:abi[ELF 64]'
+#elif defined(__ELF__)
+        PRINT *, 'INFO:abi[ELF]'
+#endif
+        PRINT *, 'ABI Detection'
       END