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