David Benjamin | 1967621 | 2023-01-25 10:03:53 -0500 | [diff] [blame] | 1 | macro(append_to_parent_scope var) |
| 2 | list(APPEND ${var} ${ARGN}) |
| 3 | set(${var} "${${var}}" PARENT_SCOPE) |
| 4 | endmacro() |
| 5 | |
| 6 | function(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 Benjamin | 1967621 | 2023-01-25 10:03:53 -0500 | [diff] [blame] | 20 | ${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 | ) |
| 27 | endfunction() |
| 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. |
| 33 | function(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 Benjamin | 1967621 | 2023-01-25 10:03:53 -0500 | [diff] [blame] | 43 | 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() |
| 58 | endfunction() |