blob: 9828799007c230a6976f8a079abfba55292068dc [file] [log] [blame]
David Benjamin19676212023-01-25 10:03:53 -05001macro(append_to_parent_scope var)
2 list(APPEND ${var} ${ARGN})
3 set(${var} "${${var}}" PARENT_SCOPE)
4endmacro()
5
6function(add_perlasm_target dest src)
7 get_filename_component(dir ${dest} DIRECTORY)
8 if(dir STREQUAL "")
9 set(dir ".")
10 endif()
11
12 add_custom_command(
13 OUTPUT ${dest}
14 COMMAND ${CMAKE_COMMAND} -E make_directory ${dir}
15 COMMAND ${PERL_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/${src} ${ARGN}
16 ${dest}
17 DEPENDS
18 ${src}
19 ${PROJECT_SOURCE_DIR}/crypto/perlasm/arm-xlate.pl
David Benjamin19676212023-01-25 10:03:53 -050020 ${PROJECT_SOURCE_DIR}/crypto/perlasm/x86_64-xlate.pl
21 ${PROJECT_SOURCE_DIR}/crypto/perlasm/x86asm.pl
22 ${PROJECT_SOURCE_DIR}/crypto/perlasm/x86gas.pl
23 ${PROJECT_SOURCE_DIR}/crypto/perlasm/x86masm.pl
24 ${PROJECT_SOURCE_DIR}/crypto/perlasm/x86nasm.pl
25 WORKING_DIRECTORY .
26 )
27endfunction()
28
29# perlasm generates perlasm output from a given file. arch specifies the
30# architecture. dest specifies the basename of the output file. The list of
31# generated files will be appended to ${var}_ASM and ${var}_NASM depending on
32# the assembler used.
33function(perlasm var arch dest src)
34 if(arch STREQUAL "aarch64")
35 add_perlasm_target("${dest}-apple.S" ${src} ios64)
36 add_perlasm_target("${dest}-linux.S" ${src} linux64)
37 add_perlasm_target("${dest}-win.S" ${src} win64)
38 append_to_parent_scope("${var}_ASM" "${dest}-apple.S" "${dest}-linux.S" "${dest}-win.S")
39 elseif(arch STREQUAL "arm")
40 add_perlasm_target("${dest}-apple.S" ${src} ios32)
41 add_perlasm_target("${dest}-linux.S" ${src} linux32)
42 append_to_parent_scope("${var}_ASM" "${dest}-apple.S" "${dest}-linux.S")
David Benjamin19676212023-01-25 10:03:53 -050043 elseif(arch STREQUAL "x86")
44 add_perlasm_target("${dest}-apple.S" ${src} macosx -fPIC -DOPENSSL_IA32_SSE2)
45 add_perlasm_target("${dest}-linux.S" ${src} elf -fPIC -DOPENSSL_IA32_SSE2)
46 add_perlasm_target("${dest}-win.asm" ${src} win32n -DOPENSSL_IA32_SSE2)
47 append_to_parent_scope("${var}_ASM" "${dest}-apple.S" "${dest}-linux.S")
48 append_to_parent_scope("${var}_NASM" "${dest}-win.asm")
49 elseif(arch STREQUAL "x86_64")
50 add_perlasm_target("${dest}-apple.S" ${src} macosx)
51 add_perlasm_target("${dest}-linux.S" ${src} elf)
52 add_perlasm_target("${dest}-win.asm" ${src} nasm)
53 append_to_parent_scope("${var}_ASM" "${dest}-apple.S" "${dest}-linux.S")
54 append_to_parent_scope("${var}_NASM" "${dest}-win.asm")
55 else()
56 message(FATAL_ERROR "Unknown perlasm architecture: $arch")
57 endif()
58endfunction()