• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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