include_directories(../include) if(NOT OPENSSL_NO_ASM) if(UNIX) if(${ARCH} STREQUAL "aarch64") # The "armx" Perl scripts look for "64" in the style argument # in order to decide whether to generate 32- or 64-bit asm. if(APPLE) set(PERLASM_STYLE ios64) else() set(PERLASM_STYLE linux64) endif() elseif(${ARCH} STREQUAL "arm") if(APPLE) set(PERLASM_STYLE ios32) else() set(PERLASM_STYLE linux32) endif() elseif(${ARCH} STREQUAL "ppc64le") set(PERLASM_STYLE linux64le) else() if(${ARCH} STREQUAL "x86") set(PERLASM_FLAGS "-fPIC -DOPENSSL_IA32_SSE2") endif() if(APPLE) set(PERLASM_STYLE macosx) else() set(PERLASM_STYLE elf) endif() endif() set(ASM_EXT S) enable_language(ASM) set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -Wa,--noexecstack") # Clang's integerated assembler does not support debug symbols. if(NOT CMAKE_ASM_COMPILER_ID MATCHES "Clang") set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -Wa,-g") endif() # CMake does not add -isysroot and -arch flags to assembly. if(APPLE) if(CMAKE_OSX_SYSROOT) set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -isysroot \"${CMAKE_OSX_SYSROOT}\"") endif() foreach(arch ${CMAKE_OSX_ARCHITECTURES}) set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} -arch ${arch}") endforeach() endif() else() if(${ARCH} STREQUAL "x86_64") set(PERLASM_STYLE nasm) else() set(PERLASM_STYLE win32n) set(PERLASM_FLAGS "-DOPENSSL_IA32_SSE2") endif() set(CMAKE_ASM_NASM_FLAGS "-gcv8") # On Windows, we use the NASM output, specifically built with Yasm. set(ASM_EXT asm) enable_language(ASM_NASM) endif() endif() function(perlasm dest src) add_custom_command( OUTPUT ${dest} COMMAND ${PERL_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/${src} ${PERLASM_STYLE} ${PERLASM_FLAGS} ${ARGN} ${dest} DEPENDS ${src} ${PROJECT_SOURCE_DIR}/crypto/perlasm/arm-xlate.pl ${PROJECT_SOURCE_DIR}/crypto/perlasm/ppc-xlate.pl ${PROJECT_SOURCE_DIR}/crypto/perlasm/x86_64-xlate.pl ${PROJECT_SOURCE_DIR}/crypto/perlasm/x86asm.pl ${PROJECT_SOURCE_DIR}/crypto/perlasm/x86gas.pl ${PROJECT_SOURCE_DIR}/crypto/perlasm/x86masm.pl ${PROJECT_SOURCE_DIR}/crypto/perlasm/x86nasm.pl WORKING_DIRECTORY . ) endfunction() # Level 0.1 - depends on nothing outside this set. add_subdirectory(stack) add_subdirectory(lhash) add_subdirectory(err) add_subdirectory(buf) add_subdirectory(base64) add_subdirectory(bytestring) add_subdirectory(pool) # Level 0.2 - depends on nothing but itself add_subdirectory(rc4) add_subdirectory(conf) add_subdirectory(chacha) add_subdirectory(poly1305) add_subdirectory(curve25519) # Level 1, depends only on 0.* add_subdirectory(digest_extra) add_subdirectory(cipher_extra) add_subdirectory(rand_extra) add_subdirectory(bio) add_subdirectory(bn_extra) add_subdirectory(obj) add_subdirectory(asn1) # Level 2 add_subdirectory(engine) add_subdirectory(dh) add_subdirectory(dsa) add_subdirectory(rsa_extra) add_subdirectory(ec_extra) add_subdirectory(ecdh_extra) add_subdirectory(ecdsa_extra) # Level 3 add_subdirectory(cmac) add_subdirectory(evp) add_subdirectory(hkdf) add_subdirectory(pem) add_subdirectory(x509) add_subdirectory(x509v3) # Level 4 add_subdirectory(pkcs7) add_subdirectory(pkcs8) # Test support code add_subdirectory(test) add_subdirectory(fipsmodule) add_library( crypto_base OBJECT cpu-aarch64-fuchsia.c cpu-aarch64-linux.c cpu-arm.c cpu-arm-linux.c cpu-intel.c cpu-ppc64le.c crypto.c ex_data.c mem.c refcount_c11.c refcount_lock.c thread.c thread_none.c thread_pthread.c thread_win.c ) if(FIPS_DELOCATE) SET_SOURCE_FILES_PROPERTIES(fipsmodule/bcm.o PROPERTIES EXTERNAL_OBJECT true) SET_SOURCE_FILES_PROPERTIES(fipsmodule/bcm.o PROPERTIES GENERATED true) set( CRYPTO_FIPS_OBJECTS fipsmodule/bcm.o ) endif() add_library( crypto $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ ${CRYPTO_FIPS_OBJECTS} ) if(FIPS_DELOCATE) add_dependencies(crypto bcm_o_target) endif() SET_TARGET_PROPERTIES(crypto PROPERTIES LINKER_LANGUAGE C) if(NOT MSVC AND NOT ANDROID) target_link_libraries(crypto pthread) endif() # Every target depends on crypto, so we add libcxx as a dependency here to # simplify injecting it everywhere. if(USE_CUSTOM_LIBCXX) target_link_libraries(crypto libcxx) endif() # TODO(davidben): Convert the remaining tests to GTest. add_executable( crypto_test asn1/asn1_test.cc base64/base64_test.cc buf/buf_test.cc bio/bio_test.cc bytestring/bytestring_test.cc chacha/chacha_test.cc cipher_extra/aead_test.cc cipher_extra/cipher_test.cc cmac/cmac_test.cc compiler_test.cc constant_time_test.cc curve25519/ed25519_test.cc curve25519/spake25519_test.cc curve25519/x25519_test.cc ecdh_extra/ecdh_test.cc dh/dh_test.cc digest_extra/digest_test.cc dsa/dsa_test.cc err/err_test.cc evp/evp_extra_test.cc evp/evp_test.cc evp/pbkdf_test.cc evp/scrypt_test.cc fipsmodule/aes/aes_test.cc fipsmodule/bn/bn_test.cc fipsmodule/ec/ec_test.cc fipsmodule/ec/p256-x86_64_test.cc fipsmodule/ecdsa/ecdsa_test.cc fipsmodule/modes/gcm_test.cc fipsmodule/rand/ctrdrbg_test.cc hkdf/hkdf_test.cc hmac_extra/hmac_test.cc lhash/lhash_test.cc obj/obj_test.cc pem/pem_test.cc pkcs7/pkcs7_test.cc pkcs8/pkcs8_test.cc pkcs8/pkcs12_test.cc poly1305/poly1305_test.cc pool/pool_test.cc refcount_test.cc rsa_extra/rsa_test.cc self_test.cc test/file_test_gtest.cc thread_test.cc x509/x509_test.cc x509/x509_time_test.cc x509v3/tab_test.cc x509v3/v3name_test.cc $ $ $ ) target_link_libraries(crypto_test crypto boringssl_gtest) if(WIN32) target_link_libraries(crypto_test ws2_32) endif() add_dependencies(all_tests crypto_test)