1macro(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 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 ) 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. Extra arguments are passed to the perlasm script. 33function(perlasm var arch dest src) 34 if(arch STREQUAL "aarch64") 35 add_perlasm_target("${dest}-apple.S" ${src} ios64 ${ARGN}) 36 add_perlasm_target("${dest}-linux.S" ${src} linux64 ${ARGN}) 37 add_perlasm_target("${dest}-win.S" ${src} win64 ${ARGN}) 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 ${ARGN}) 41 add_perlasm_target("${dest}-linux.S" ${src} linux32 ${ARGN}) 42 append_to_parent_scope("${var}_ASM" "${dest}-apple.S" "${dest}-linux.S") 43 elseif(arch STREQUAL "x86") 44 add_perlasm_target("${dest}-apple.S" ${src} macosx -fPIC -DOPENSSL_IA32_SSE2 ${ARGN}) 45 add_perlasm_target("${dest}-linux.S" ${src} elf -fPIC -DOPENSSL_IA32_SSE2 ${ARGN}) 46 add_perlasm_target("${dest}-win.asm" ${src} win32n -DOPENSSL_IA32_SSE2 ${ARGN}) 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 ${ARGN}) 51 add_perlasm_target("${dest}-linux.S" ${src} elf ${ARGN}) 52 add_perlasm_target("${dest}-win.asm" ${src} nasm ${ARGN}) 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() 59