Mercurial > pub > dyncall > dyncall
diff CMakeLists.txt @ 371:451299d50c1a
- windows arm64 support (dyncall, dyncallback, cmake support for armasm64), thanks Bernhard Urban-Forster!
- minor cleanups
author | Tassilo Philipp |
---|---|
date | Fri, 25 Dec 2020 18:07:39 +0100 |
parents | dc8bbffc39e6 |
children | 3c3e321875f7 |
line wrap: on
line diff
--- a/CMakeLists.txt Sat Dec 19 20:02:08 2020 +0100 +++ b/CMakeLists.txt Fri Dec 25 18:07:39 2020 +0100 @@ -3,7 +3,8 @@ # Description: DynCall Project cmake files # License: # -# Copyright (c) 2010 Daniel Adler <dadler@uni-goettingen.de> +# Copyright (c) 2010-2020 Daniel Adler <dadler@uni-goettingen.de> +# 2020 armasm64 support: Bernhard Urban-Forster <beurba@microsoft.com> # # Permission to use, copy, modify, and distribute this software for any # purpose with or without fee is hereby granted, provided that the above @@ -44,16 +45,71 @@ include(CheckCCompilerFlag) check_c_compiler_flag("-fPIC -Werror" COMPILER_HAS_FPIC) + +# compile_asm(TARGET target ASM_FILES file1 [file2 ...] OUTPUT_OBJECTS [variableName]) +# CMake does not support the ARM or ARM64 assemblers on Windows when using the +# MSBuild generator. +# credit to dotnet/runtime: +# https://github.com/dotnet/runtime/blob/e98fb61d8b4bb6687ccddead861d8b140751647b/eng/native/functions.cmake#L173-L207 +function(compile_asm) + set(options "") + set(oneValueArgs TARGET OUTPUT_OBJECTS) + set(multiValueArgs ASM_FILES) + cmake_parse_arguments(COMPILE_ASM "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGV}) + + set (ASSEMBLED_OBJECTS "") + + foreach(ASM_FILE ${COMPILE_ASM_ASM_FILES}) + get_filename_component(name ${ASM_FILE} NAME_WE) + # Produce object file where CMake would store .obj files for an OBJECT library. + # ex: artifacts\obj\coreclr\windows.arm64.Debug\src\vm\wks\cee_wks.dir\Debug\AsmHelpers.obj + set (OBJ_FILE "${CMAKE_CURRENT_BINARY_DIR}/${COMPILE_ASM_TARGET}.dir/${CMAKE_CFG_INTDIR}/${name}.obj") + + # Need to compile asm file using custom command as include directories are not provided to asm compiler + add_custom_command(OUTPUT ${OBJ_FILE} + COMMAND "${CMAKE_ASM_COMPILER}" ${ASM_INCLUDE_DIRECTORIES} -o ${OBJ_FILE} ${ASM_FILE} + DEPENDS ${ASM_FILE} + COMMENT "Assembling ${ASM_FILE} ---> \"${CMAKE_ASM_COMPILER}\" ${ASM_INCLUDE_DIRECTORIES} -o ${OBJ_FILE} ${ASM_FILE}"+ COMMENT "Assembling ${ASM_FILE} ---> \"${CMAKE_ASM_COMPILER}\" ${ASM_INCLUDE_DIRECTORIES} -o ${OBJ_FILE} ${ASM_FILE}") + + # mark obj as source that does not require compile + set_source_files_properties(${OBJ_FILE} PROPERTIES EXTERNAL_OBJECT TRUE) + + # Add the generated OBJ in the dependency list so that it gets consumed during linkage + list(APPEND ASSEMBLED_OBJECTS ${OBJ_FILE}) + endforeach() + + set(${COMPILE_ASM_OUTPUT_OBJECTS} ${ASSEMBLED_OBJECTS} PARENT_SCOPE) +endfunction() + + if(MSVC) - enable_language(ASM_MASM) - #if(CMAKE_SIZEOF_VOID_P MATCHES 8) - # set(CMAKE_ASM_COMPILER "ml64") - #else() - # set(CMAKE_ASM_COMPILER "ml") - #endif() - #set(CMAKE_ASM_COMPILER_ARG1 "/c") - #set(CMAKE_ASM_MASM_SOURCE_FILE_EXTENSIONS asm) - #set(CMAKE_ASM_MASM_COMPILE_OBJECT "<CMAKE_ASM_MASM_COMPILER> <FLAGS> /c /Fo <OBJECT> <SOURCE>") + if("${CMAKE_GENERATOR_PLATFORM}" MATCHES "ARM64") + # Explicitly specify the assembler to be used for Arm64 compile + file(TO_CMAKE_PATH "$ENV{VCToolsInstallDir}\\bin\\HostX64\\arm64\\armasm64.exe" CMAKE_ASM_COMPILER) + # file(TO_CMAKE_PATH "C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Enterprise\\VC\\Tools\\MSVC\\14.28.29333\\bin\\HostX64\\arm64\\armasm64.exe" CMAKE_ASM_COMPILER) + + set(CMAKE_ASM_MASM_COMPILER ${CMAKE_ASM_COMPILER}) + message("CMAKE_ASM_MASM_COMPILER explicitly set to: ${CMAKE_ASM_MASM_COMPILER}") + # Enable generic assembly compilation to avoid CMake generate VS proj files that explicitly + # use ml[64].exe as the assembler. + enable_language(ASM) + set(CMAKE_ASM_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreaded "") + set(CMAKE_ASM_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreadedDLL "") + set(CMAKE_ASM_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreadedDebug "") + set(CMAKE_ASM_COMPILE_OPTIONS_MSVC_RUNTIME_LIBRARY_MultiThreadedDebugDLL "") + set(CMAKE_ASM_COMPILE_OBJECT "<CMAKE_ASM_COMPILER> <INCLUDES> <FLAGS> -o <OBJECT> <SOURCE>") + else() + enable_language(ASM_MASM) + + #if(CMAKE_SIZEOF_VOID_P MATCHES 8) + # set(CMAKE_ASM_COMPILER "ml64") + #else() + # set(CMAKE_ASM_COMPILER "ml") + #endif() + #set(CMAKE_ASM_COMPILER_ARG1 "/c") + #set(CMAKE_ASM_MASM_SOURCE_FILE_EXTENSIONS asm) + #set(CMAKE_ASM_MASM_COMPILE_OBJECT "<CMAKE_ASM_MASM_COMPILER> <FLAGS> /c /Fo <OBJECT> <SOURCE>") + endif() elseif(CMAKE_COMPILER_IS_GNUCC OR "${CMAKE_C_COMPILER_ID}" STREQUAL "Intel") if(COMPILER_HAS_FPIC) # when used in shared libraries, -fPIC is required by several architectures