Skip to content

Commit 5665ed6

Browse files
authored
Fix Windows/ARM64 assembly build (#1697)
### Issues: * Addresses: aws/aws-lc-rs#453 ### Description of changes: * When building for Windows/ARM64 with the "Visual Studio" generator (instead of Ninja) the "*.S" assembly source files for libraries are ignored. * This change provides a custom command to assemble the require objects files and adds them to the list of sources for the library. ### Call-outs: * See related aws-lc-rs PR: aws/aws-lc-rs#452 ### Testing * I've added CI tests to build for Windows using the "Visual Studio" generator. By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license and the ISC license.
1 parent 1fbf584 commit 5665ed6

File tree

7 files changed

+129
-9
lines changed

7 files changed

+129
-9
lines changed

.github/workflows/windows-alt.yml

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,53 @@ jobs:
6363
options: |
6464
CMAKE_SYSTEM_NAME=Windows \
6565
CMAKE_SYSTEM_PROCESSOR=x86_64 \
66-
CMAKE_MAKE_PROGRAM=ninja.exe \
6766
CMAKE_BUILD_TYPE=Release \
6867
- name: Build Project
6968
run: cmake --build ./build --target all
7069
- name: Run tests
7170
run: cmake --build ./build --target run_tests
72-
clang-cl:
71+
clang-cl-msbuild:
72+
if: github.repository_owner == 'aws'
73+
strategy:
74+
fail-fast: false
75+
matrix:
76+
target:
77+
- x64
78+
- x64_arm64
79+
runs-on: windows-latest
80+
env:
81+
CMAKE_GENERATOR: "Visual Studio 17 2022"
82+
CMAKE_GENERATOR_TOOLSET: "ClangCL,host=x64"
83+
steps:
84+
- if: ${{ matrix.target == 'x64' }}
85+
name: Install NASM
86+
uses: ilammy/[email protected]
87+
- name: Checkout
88+
uses: actions/checkout@v4
89+
- uses: TheMrMilchmann/setup-msvc-dev@v3
90+
with:
91+
arch: ${{ matrix.target }}
92+
- if: ${{ matrix.target == 'x64' }}
93+
name: Setup CMake
94+
uses: threeal/[email protected]
95+
with:
96+
options: |
97+
CMAKE_BUILD_TYPE=Release \
98+
- if: ${{ matrix.target == 'x64_arm64' }}
99+
name: Setup CMake
100+
uses: threeal/[email protected]
101+
with:
102+
options: |
103+
CMAKE_GENERATOR_PLATFORM=ARM64 \
104+
CMAKE_SYSTEM_NAME=Windows \
105+
CMAKE_SYSTEM_PROCESSOR=ARM64 \
106+
CMAKE_BUILD_TYPE=Release \
107+
- name: Build Project
108+
run: cmake --build ./build --target all_tests
109+
- if: ${{ matrix.target == 'x64' }}
110+
name: Run tests
111+
run: cmake --build ./build --target run_tests
112+
clang-cl-ninja:
73113
if: github.repository_owner == 'aws'
74114
strategy:
75115
fail-fast: false
@@ -97,9 +137,6 @@ jobs:
97137
c-compiler: clang-cl
98138
cxx-compiler: clang-cl
99139
options: |
100-
CMAKE_CROSSCOMPILING=${{ ((matrix.target == 'x64') && '0') || '1' }} \
101-
CMAKE_SYSTEM_NAME=Windows \
102-
CMAKE_SYSTEM_PROCESSOR=x86_64 \
103140
CMAKE_BUILD_TYPE=Release \
104141
- if: ${{ matrix.target == 'x64_arm64' }}
105142
name: Setup CMake
@@ -109,7 +146,6 @@ jobs:
109146
c-compiler: clang-cl
110147
cxx-compiler: clang-cl
111148
options: |
112-
CMAKE_CROSSCOMPILING=1 \
113149
CMAKE_SYSTEM_NAME=Windows \
114150
CMAKE_SYSTEM_PROCESSOR=ARM64 \
115151
CMAKE_C_COMPILER_TARGET=arm64-pc-windows-msvc \

CMakeLists.txt

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ if(MSVC)
99
set(CMAKE_GENERATOR_CC cl)
1010
endif()
1111

12+
if(ARCH STREQUAL "aarch64" AND CMAKE_GENERATOR MATCHES "Visual Studio" AND NOT "${CMAKE_VS_PLATFORM_TOOLSET}" MATCHES "ClangCL")
13+
message(FATAL_ERROR "AWS-LC Windows/ARM64 assembly code requires ClangCL. Current toolset: ${CMAKE_VS_PLATFORM_TOOLSET}")
14+
endif()
15+
1216
include(sources.cmake)
1317
include(TestBigEndian)
1418

@@ -366,10 +370,10 @@ if(GCC OR CLANG)
366370
else()
367371
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wextra")
368372
set(C_CXX_FLAGS "${C_CXX_FLAGS} -Wall -fvisibility=hidden -fno-common")
373+
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -Wno-newline-eof")
369374
endif()
370375
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wunused -Wcomment -Wchar-subscripts -Wuninitialized -Wshadow")
371376
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wwrite-strings -Wformat-security -Wunused-result -Wno-overlength-strings")
372-
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -Wno-newline-eof")
373377
set(C_CXX_FLAGS "${C_CXX_FLAGS} -Wno-c11-extensions -Wvla -Wtype-limits -Wno-unused-parameter")
374378
endif()
375379
set(C_CXX_FLAGS "${C_CXX_FLAGS} -Werror -Wformat=2 -Wsign-compare -Wmissing-field-initializers -Wwrite-strings")
@@ -945,6 +949,20 @@ if(BUILD_TESTING)
945949
endif()
946950

947951
add_subdirectory(util/fipstools/acvp/modulewrapper)
952+
953+
macro(set_test_location executable_name)
954+
if(CMAKE_GENERATOR MATCHES "Visual Studio")
955+
message(NOTICE "Location for ${executable_name} is: ${CMAKE_CURRENT_BINARY_DIR}")
956+
# Set the output directory for the executable
957+
set_target_properties(${executable_name} PROPERTIES
958+
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
959+
RUNTIME_OUTPUT_DIRECTORY_DEBUG "${CMAKE_CURRENT_BINARY_DIR}"
960+
RUNTIME_OUTPUT_DIRECTORY_RELEASE "${CMAKE_CURRENT_BINARY_DIR}"
961+
RUNTIME_OUTPUT_DIRECTORY_RELWITHDEBINFO "${CMAKE_CURRENT_BINARY_DIR}"
962+
RUNTIME_OUTPUT_DIRECTORY_MINSIZEREL "${CMAKE_CURRENT_BINARY_DIR}"
963+
)
964+
endif()
965+
endmacro()
948966
endif()
949967

950968
add_subdirectory(crypto)

crypto/CMakeLists.txt

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,48 @@
1+
2+
# Function to handle assembly files for ARM64 targets when using MSBuild (the "Visual Studio" generator)
3+
# This function is necessary because MSBuild ignores ARM64 assembly file dependencies
4+
include(CMakeParseArguments)
5+
function(msbuild_aarch64_asm)
6+
set(options "")
7+
set(oneValueArgs TARGET OUTPUT_OBJECTS)
8+
set(multiValueArgs ASM_FILES)
9+
10+
cmake_parse_arguments(MSBUILD_AARCH64_ASM "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGV})
11+
12+
# Set the output directory for object files
13+
set(OBJ_DIR "${CMAKE_CURRENT_BINARY_DIR}/${MSBUILD_AARCH64_ASM_TARGET}.dir/$<CONFIG>")
14+
15+
# Initialize list to store assembled object files
16+
set(ASSEMBLED_OBJECTS "")
17+
18+
foreach(ASM_FILE ${MSBUILD_AARCH64_ASM_ASM_FILES})
19+
# Get the filename without extension
20+
get_filename_component(ASM_NAME ${ASM_FILE} NAME_WE)
21+
set(OBJ_FILE "${OBJ_DIR}/${ASM_NAME}.obj")
22+
23+
add_custom_command(
24+
OUTPUT ${OBJ_FILE}
25+
COMMAND "${CMAKE_ASM_COMPILER}"
26+
--target=arm64-pc-windows-msvc
27+
/c
28+
/I "${PROJECT_BINARY_DIR}/symbol_prefix_include/"
29+
/I "${PROJECT_SOURCE_DIR}/include"
30+
/o "${OBJ_FILE}"
31+
"${ASM_FILE}"
32+
DEPENDS ${ASM_FILE}
33+
COMMENT "Assembling ${ASM_FILE}"
34+
)
35+
36+
# Mark the generated object file as an external object
37+
set_source_files_properties(${OBJ_FILE} PROPERTIES EXTERNAL_OBJECT TRUE)
38+
39+
list(APPEND ASSEMBLED_OBJECTS ${OBJ_FILE})
40+
endforeach()
41+
42+
# Set the output variable in the parent scope
43+
set(${MSBUILD_AARCH64_ASM_OUTPUT_OBJECTS} ${ASSEMBLED_OBJECTS} PARENT_SCOPE)
44+
endfunction()
45+
146
if(NOT OPENSSL_NO_ASM)
247
if(UNIX)
348
if(ARCH STREQUAL "aarch64")
@@ -281,6 +326,11 @@ if(ENABLE_DILITHIUM)
281326
)
282327
endif()
283328

329+
set(CRYPTO_ARCH_OBJECTS "")
330+
if (ARCH STREQUAL "aarch64" AND CMAKE_GENERATOR MATCHES "Visual Studio")
331+
msbuild_aarch64_asm(TARGET crypto_objects ASM_FILES ${CRYPTO_ARCH_SOURCES} OUTPUT_OBJECTS CRYPTO_ARCH_OBJECTS)
332+
endif()
333+
284334
add_library(
285335
crypto_objects
286336
OBJECT
@@ -532,6 +582,7 @@ add_library(
532582
decrepit/x509/x509_decrepit.c
533583

534584
${CRYPTO_ARCH_SOURCES}
585+
${CRYPTO_ARCH_OBJECTS}
535586
)
536587

537588
target_compile_definitions(crypto_objects PRIVATE BORINGSSL_IMPLEMENTATION)
@@ -674,6 +725,7 @@ if(BUILD_TESTING)
674725
add_dependencies(${executable_name} boringssl_prefix_symbols)
675726
target_include_directories(${executable_name} BEFORE PRIVATE ${PROJECT_BINARY_DIR}/symbol_prefix_include)
676727
add_dependencies(all_tests ${executable_name})
728+
set_test_location(${executable_name})
677729
endmacro()
678730

679731
# Below tests are added as new executables to be executed in single process.
@@ -689,6 +741,7 @@ if(BUILD_TESTING)
689741
${RANDOM_TEST_EXEC}
690742
fipsmodule/rand/urandom_test.cc
691743
)
744+
set_test_location(${RANDOM_TEST_EXEC})
692745

693746
add_dependencies(${RANDOM_TEST_EXEC} boringssl_prefix_symbols)
694747
target_link_libraries(${RANDOM_TEST_EXEC} test_support_lib boringssl_gtest crypto)
@@ -784,6 +837,7 @@ if(BUILD_TESTING)
784837

785838
$<TARGET_OBJECTS:crypto_test_data>
786839
)
840+
set_test_location(${CRYPTO_TEST_EXEC})
787841

788842
add_dependencies(${CRYPTO_TEST_EXEC} boringssl_prefix_symbols)
789843
target_link_libraries(${CRYPTO_TEST_EXEC} boringssl_gtest_main)
@@ -799,6 +853,7 @@ if(BUILD_TESTING)
799853

800854
add_executable(${DYNAMIC_LOADING_TEST_EXEC} dynamic_loading_test.c)
801855
add_dependencies(${DYNAMIC_LOADING_TEST_EXEC} crypto)
856+
set_test_location(${DYNAMIC_LOADING_TEST_EXEC})
802857

803858
add_dependencies(${DYNAMIC_LOADING_TEST_EXEC} boringssl_prefix_symbols)
804859
target_include_directories(${DYNAMIC_LOADING_TEST_EXEC} BEFORE PRIVATE ${PROJECT_BINARY_DIR}/symbol_prefix_include)
@@ -823,6 +878,7 @@ if(BUILD_TESTING)
823878
message(STATUS "Generating test executable ${RWLOCK_STATIC_INIT_TEST_EXEC}.")
824879
add_executable(${RWLOCK_STATIC_INIT_TEST_EXEC} rwlock_static_init.cc)
825880
add_dependencies(${RWLOCK_STATIC_INIT_TEST_EXEC} crypto)
881+
set_test_location(${RWLOCK_STATIC_INIT_TEST_EXEC})
826882

827883
target_link_libraries(${RWLOCK_STATIC_INIT_TEST_EXEC} crypto)
828884
target_include_directories(${RWLOCK_STATIC_INIT_TEST_EXEC} BEFORE PRIVATE ${PROJECT_BINARY_DIR}/symbol_prefix_include)

crypto/fipsmodule/CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -553,6 +553,11 @@ elseif(FIPS_SHARED)
553553
set(BCM_NAME ${BCM_NAME} PARENT_SCOPE)
554554

555555
else()
556+
set(BCM_ASM_OBJECTS "")
557+
if (ARCH STREQUAL "aarch64" AND CMAKE_GENERATOR MATCHES "Visual Studio")
558+
msbuild_aarch64_asm(TARGET fipsmodule ASM_FILES ${BCM_ASM_SOURCES} OUTPUT_OBJECTS BCM_ASM_OBJECTS)
559+
endif()
560+
556561
add_library(
557562
fipsmodule
558563

@@ -563,10 +568,12 @@ else()
563568
cpucap/cpucap.c
564569

565570
${BCM_ASM_SOURCES}
571+
${BCM_ASM_OBJECTS}
566572
)
567573
target_compile_definitions(fipsmodule PRIVATE BORINGSSL_IMPLEMENTATION)
568574

569575
add_dependencies(fipsmodule boringssl_prefix_symbols)
570576
target_include_directories(fipsmodule BEFORE PRIVATE ${PROJECT_BINARY_DIR}/symbol_prefix_include)
571577
target_include_directories(fipsmodule PRIVATE ${PROJECT_SOURCE_DIR}/include)
578+
572579
endif()

ssl/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ if(BUILD_TESTING)
7373
boringssl_gtest_main ssl )
7474
target_include_directories(${INTEGRATION_TEST_EXEC} BEFORE PRIVATE ${PROJECT_BINARY_DIR}/symbol_prefix_include)
7575
add_dependencies(all_tests ${INTEGRATION_TEST_EXEC})
76+
set_test_location(${INTEGRATION_TEST_EXEC})
7677

7778
add_executable(
7879
${SSL_TEST_EXEC}
@@ -83,6 +84,7 @@ if(BUILD_TESTING)
8384
)
8485

8586
target_link_libraries(${SSL_TEST_EXEC} boringssl_gtest_main ssl)
87+
set_test_location(${SSL_TEST_EXEC})
8688

8789
target_include_directories(${SSL_TEST_EXEC} BEFORE PRIVATE ${PROJECT_BINARY_DIR}/symbol_prefix_include)
8890

tool-openssl/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,5 @@ if(BUILD_TESTING)
5252
target_link_libraries(tool_openssl_test boringssl_gtest_main ssl crypto)
5353
target_include_directories(tool_openssl_test BEFORE PRIVATE ${PROJECT_BINARY_DIR}/symbol_prefix_include)
5454
add_dependencies(all_tests tool_openssl_test)
55+
set_test_location(tool_openssl_test)
5556
endif()

util/build_compilation_database.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ MY_CMAKE_FLAGS=("-GNinja" "-DCMAKE_BUILD_TYPE=Debug" "-DCMAKE_EXPORT_COMPILE_COM
1212

1313
mkdir -p "${AWS_LC_BUILD}"
1414

15-
cmake "${BASE_DIR}" -B "${AWS_LC_BUILD}" ${MY_CMAKE_FLAGS[@]} "${@}"
15+
cmake "${BASE_DIR}" -B "${AWS_LC_BUILD}" "${MY_CMAKE_FLAGS[@]}" "${@}"
1616

17-
cmake --build "${AWS_LC_BUILD}" --target all
17+
cmake --build "${AWS_LC_BUILD}" -j 4 --target all_tests
1818

1919
cp "${AWS_LC_BUILD}"/compile_commands.json "${BASE_DIR}"/

0 commit comments

Comments
 (0)