You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

50 lines
2.3 KiB

  1. # compile_asm(TARGET target ASM_FILES file1 [file2 ...] OUTPUT_OBJECTS [variableName])
  2. # CMake does not support the ARM or ARM64 assemblers on Windows when using the
  3. # MSBuild generator. When the MSBuild generator is in use, we manually compile the assembly files
  4. # using this function.
  5. #
  6. # Borrowed from dotnet/runtime, licensed under MIT
  7. # Copyright (c) .NET Foundation and Contributors
  8. # https://github.com/dotnet/runtime/blob/main/eng/native/functions.cmake
  9. function(compile_asm)
  10. set(options "")
  11. set(oneValueArgs TARGET OUTPUT_OBJECTS)
  12. set(multiValueArgs ASM_FILES)
  13. cmake_parse_arguments(COMPILE_ASM "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGV})
  14. get_include_directories_asm(ASM_INCLUDE_DIRECTORIES)
  15. set (ASSEMBLED_OBJECTS "")
  16. foreach(ASM_FILE ${COMPILE_ASM_ASM_FILES})
  17. get_filename_component(name ${ASM_FILE} NAME_WE)
  18. # Produce object file where CMake would store .obj files for an OBJECT library.
  19. # ex: artifacts\obj\coreclr\windows.arm64.Debug\src\vm\wks\cee_wks.dir\Debug\AsmHelpers.obj
  20. set (OBJ_FILE "${CMAKE_CURRENT_BINARY_DIR}/${COMPILE_ASM_TARGET}.dir/${CMAKE_CFG_INTDIR}/${name}.obj")
  21. # Need to compile asm file using custom command as include directories are not provided to asm compiler
  22. add_custom_command(OUTPUT ${OBJ_FILE}
  23. COMMAND "${CMAKE_ASM_COMPILER}" -g ${ASM_INCLUDE_DIRECTORIES} -o ${OBJ_FILE} ${ASM_FILE}
  24. DEPENDS ${ASM_FILE}
  25. COMMENT "Assembling ${ASM_FILE} ---> \"${CMAKE_ASM_COMPILER}\" -g ${ASM_INCLUDE_DIRECTORIES} -o ${OBJ_FILE} ${ASM_FILE}")
  26. # mark obj as source that does not require compile
  27. set_source_files_properties(${OBJ_FILE} PROPERTIES EXTERNAL_OBJECT TRUE)
  28. # Add the generated OBJ in the dependency list so that it gets consumed during linkage
  29. list(APPEND ASSEMBLED_OBJECTS ${OBJ_FILE})
  30. endforeach()
  31. set(${COMPILE_ASM_OUTPUT_OBJECTS} ${ASSEMBLED_OBJECTS} PARENT_SCOPE)
  32. endfunction()
  33. # Build a list of include directories for consumption by the assembler
  34. function(get_include_directories_asm IncludeDirectories)
  35. get_directory_property(dirs INCLUDE_DIRECTORIES)
  36. foreach(dir IN LISTS dirs)
  37. list(APPEND INC_DIRECTORIES -I${dir};)
  38. endforeach()
  39. set(${IncludeDirectories} ${INC_DIRECTORIES} PARENT_SCOPE)
  40. endfunction(get_include_directories_asm)