1 cmake_minimum_required(VERSION 3.9)
4 set(CMAKE_SHARED_LIBRARY_PREFIX)
5 set(CMAKE_STATIC_LIBRARY_PREFIX)
7 if(NOT CMAKE_SYSTEM_PROCESSOR)
8 set(CMAKE_SYSTEM_PROCESSOR "${CMAKE_HOST_SYSTEM_PROCESSOR}")
11 # config variables for ffi.h.in
14 set(KNOWN_PROCESSORS x86 x86_64 amd64 arm arm64 i386 armv7l armv7-a aarch64)
16 string(TOLOWER "${CMAKE_SYSTEM_PROCESSOR}" lower_system_processor)
18 if(NOT lower_system_processor IN_LIST KNOWN_PROCESSORS)
19 message(FATAL_ERROR "Unknown processor: ${CMAKE_SYSTEM_PROCESSOR}")
22 if(CMAKE_SYSTEM_NAME MATCHES "Windows" AND VCPKG_TARGET_ARCHITECTURE STREQUAL "arm")
24 elseif(CMAKE_SYSTEM_NAME MATCHES "Windows" AND VCPKG_TARGET_ARCHITECTURE STREQUAL "arm64")
26 elseif(CMAKE_SYSTEM_NAME MATCHES "Windows" AND VCPKG_TARGET_ARCHITECTURE STREQUAL "x86")
28 elseif(CMAKE_SYSTEM_NAME MATCHES "Windows" AND VCPKG_TARGET_ARCHITECTURE STREQUAL "x64")
30 elseif(lower_system_processor MATCHES "arm64|aarch64")
32 elseif(lower_system_processor MATCHES "arm")
34 elseif(CMAKE_SYSTEM_NAME MATCHES "BSD" AND CMAKE_SIZEOF_VOID_P EQUAL 4)
35 set(TARGET X86_FREEBSD)
36 elseif(CMAKE_SYSTEM_NAME MATCHES "Darwin" AND CMAKE_SIZEOF_VOID_P EQUAL 4)
37 set(TARGET X86_DARWIN)
38 elseif(CMAKE_SIZEOF_VOID_P EQUAL 8)
40 elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
43 message(FATAL_ERROR "Cannot determine target. Please consult ${CMAKE_CURRENT_SOURCE_DIR}/configure.ac and add your platform to this CMake file.")
46 if("${TARGET}" STREQUAL "X86_64")
47 set(HAVE_LONG_DOUBLE 1)
49 set(HAVE_LONG_DOUBLE 0)
51 set(FFI_EXEC_TRAMPOLINE_TABLE 0)
53 # mimic layout of original buildsystem
54 configure_file(include/ffi.h.in ${CMAKE_BINARY_DIR}/include/ffi.h)
55 file(COPY ${FFI_CONFIG_FILE} DESTINATION ${CMAKE_BINARY_DIR})
57 if ("${TARGET}" STREQUAL "ARM_WIN64" OR "${TARGET}" STREQUAL "ARM64")
58 file(COPY src/aarch64/ffitarget.h DESTINATION ${CMAKE_BINARY_DIR}/include)
59 elseif ("${TARGET}" STREQUAL "ARM_WIN32" OR "${TARGET}" STREQUAL "ARM")
60 file(COPY src/arm/ffitarget.h DESTINATION ${CMAKE_BINARY_DIR}/include)
62 file(COPY src/x86/ffitarget.h DESTINATION ${CMAKE_BINARY_DIR}/include)
65 include_directories(${CMAKE_BINARY_DIR}/include)
66 include_directories(${CMAKE_BINARY_DIR})
67 include_directories(include)
69 add_definitions(-DFFI_BUILDING)
70 if(BUILD_SHARED_LIBS AND WIN32)
71 add_definitions(-DFFI_BUILDING_DLL)
79 if ("${TARGET}" STREQUAL "ARM_WIN64" OR "${TARGET}" STREQUAL "ARM64")
83 elseif("${TARGET}" STREQUAL "ARM_WIN32" OR "${TARGET}" STREQUAL "ARM")
92 if("${TARGET}" STREQUAL "X86_WIN32" OR "${TARGET}" STREQUAL "X86_DARWIN" OR "${TARGET}" STREQUAL "X86")
96 elseif("${TARGET}" STREQUAL "X86_WIN64")
100 elseif("${TARGET}" STREQUAL "X86_64")
108 macro(add_assembly ASMFILE)
109 get_filename_component(ASMFILE_FULL "${ASMFILE}" ABSOLUTE)
111 if ("${TARGET}" STREQUAL "ARM_WIN64")
112 set(ARCH_ASSEMBLER armasm64)
113 elseif ("${TARGET}" STREQUAL "ARM_WIN32")
114 set(ARCH_ASSEMBLER armasm)
115 elseif(CMAKE_SIZEOF_VOID_P EQUAL 4)
116 set(ARCH_ASSEMBLER ml /safeseh /c /Zi)
118 set(ARCH_ASSEMBLER ml64 /c /Zi)
121 get_filename_component(ARCH_ASM_NAME "${ASMFILE_FULL}" NAME_WE)
124 COMMAND ${CMAKE_C_COMPILER} /nologo /EP /I. /Iinclude /I${CMAKE_CURRENT_SOURCE_DIR}/include "${ASMFILE_FULL}"
125 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
126 OUTPUT_FILE ${ARCH_ASM_NAME}.asm
127 RESULT_VARIABLE retcode
130 if(NOT ${retcode} STREQUAL "0")
131 message(FATAL_ERROR "Unable to assemble, exit code: '${retcode}'.")
134 # Produced *.asm file could be just added to sources.
135 # It works in x64 mode, but for some strange reason MASM returns error code when in x86,
136 # (even though it didn't report any errors and correctly generated object file)
137 # which in turn causes MSBUILD to stop.
139 COMMAND ${ARCH_ASSEMBLER} ${ARCH_ASM_NAME}.asm
140 WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
141 RESULT_VARIABLE retcode
144 if(NOT ${retcode} STREQUAL "0")
145 message(FATAL_ERROR "Unable to compile assembly, exit code: '${retcode}'.")
148 list(APPEND FFI_SOURCES ${CMAKE_BINARY_DIR}/${ARCH_ASM_NAME}.obj)
150 list(APPEND FFI_SOURCES ${ASMFILE})
154 if("${TARGET}" STREQUAL "X86")
155 set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -m32")
158 if("${TARGET}" STREQUAL "X86" OR "${TARGET}" STREQUAL "X86_DARWIN")
159 add_assembly(src/x86/sysv.S)
160 elseif("${TARGET}" STREQUAL "X86_64")
161 add_assembly(src/x86/unix64.S)
162 add_assembly(src/x86/win64.S)
163 elseif("${TARGET}" STREQUAL "X86_WIN32")
165 add_assembly(src/x86/sysv_intel.S)
167 add_assembly(src/x86/sysv.S)
169 elseif("${TARGET}" STREQUAL "X86_WIN64")
171 add_assembly(src/x86/win64_intel.S)
173 add_assembly(src/x86/win64.S)
175 elseif("${TARGET}" STREQUAL "ARM_WIN32")
177 add_assembly(src/arm/sysv_msvc_arm32.S)
179 add_assembly(src/arm/sysv.S)
181 elseif("${TARGET}" STREQUAL "ARM")
182 add_assembly(src/arm/sysv.S)
183 elseif("${TARGET}" STREQUAL "ARM_WIN64")
185 add_assembly(src/aarch64/win64_armasm.S)
187 add_assembly(src/aarch64/sysv.S)
189 elseif("${TARGET}" STREQUAL "ARM64")
190 add_assembly(src/aarch64/sysv.S)
192 message(FATAL_ERROR "Target not implemented")
195 if(CMAKE_BUILD_TYPE STREQUAL "Debug")
196 list(APPEND FFI_SOURCES src/debug.c)
197 add_definitions(-DFFI_DEBUG)
200 add_library(libffi ${FFI_SOURCES})
202 install(TARGETS libffi
203 EXPORT ${PROJECT_NAME}Targets
204 RUNTIME DESTINATION bin
205 ARCHIVE DESTINATION lib
206 LIBRARY DESTINATION lib)
208 include(CMakePackageConfigHelpers)
210 configure_package_config_file(${PROJECT_NAME}Config.cmake.in
211 "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
212 INSTALL_DESTINATION share/${PROJECT_NAME})
213 write_basic_package_version_file(
214 ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
216 COMPATIBILITY AnyNewerVersion)
217 install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
218 "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
219 DESTINATION share/${PROJECT_NAME})
220 install(EXPORT ${PROJECT_NAME}Targets
221 DESTINATION share/${PROJECT_NAME})
223 if(NOT FFI_SKIP_HEADERS)
225 ${CMAKE_BINARY_DIR}/include/ffi.h
226 ${CMAKE_BINARY_DIR}/include/ffitarget.h