3882e48e8a
!4452 used setting LINK_LIBRARIES and INTERFACE_LINK_LIBRARIES to link components built under ESP-IDF build system. However, LINK_LIBRARIES does not produce behavior same as linking PRIVATE. This MR uses the new signature for target_link_libraries directly instead. This also moves setting dependencies during component registration rather than after all components have been processed. The consequence is that internally, components have to use the new signature form as well. This does not affect linking the components to external targets, such as with idf_as_lib example. This only affects linking additional libraries to ESP-IDF libraries outside component processing (after idf_build_process), which is not even possible for CMake<v3.13 as target_link_libraries is not valid for targets not created in current directory. See https://cmake.org/cmake/help/v3.13/policy/CMP0079.html#policy:CMP0079
97 lines
No EOL
4.2 KiB
CMake
97 lines
No EOL
4.2 KiB
CMake
set(COMPONENT_ADD_INCLUDEDIRS "port/include" "mbedtls/include")
|
|
set(COMPONENT_SRCS "mbedtls.c")
|
|
set(COMPONENT_REQUIRES lwip)
|
|
|
|
register_component()
|
|
|
|
# Only build mbedtls libraries
|
|
set(ENABLE_TESTING CACHE BOOL OFF)
|
|
set(ENABLE_PROGRAMS CACHE BOOL OFF)
|
|
|
|
# Use same policy between IDF and mbedtls build
|
|
function(project)
|
|
set(_args ARGV)
|
|
_project(${${_args}})
|
|
cmake_policy(SET CMP0022 NEW)
|
|
endfunction()
|
|
|
|
# Needed to for include_next includes to work from within mbedtls
|
|
include_directories("${COMPONENT_DIR}/port/include")
|
|
|
|
# Workaround issue with creating symbolic links due to issues with native
|
|
# path conversion (TO_NATIVE_PATH). The following summarizes what CMake invocations
|
|
# this workaround is for:
|
|
#
|
|
# 1. CMake from command line + Ninja = No errors
|
|
# 2. CMake from command line + MinGW Makefiles = Forward slash for paths, mklink mistakes path for a switch
|
|
# 3. CMake from MSYS + Ninja = No errors
|
|
# 4. CMake from MSYS + Unix Makefiles/MSYS Makefiles = Forward slash for paths, mklink mistakes path for a switch
|
|
#
|
|
# There are references to the issue in case (2) and (4) in https://github.com/ARMmbed/mbedtls/issues/1496,
|
|
# https://cmake.org/pipermail/cmake/2006-July/010193.html, and https://cmake.org/Bug/view.php?id=5939.
|
|
#
|
|
# This workaround is meant to circumvent logic inside link_to_source() function in mbedtls/mbedtls/CMakeLists.txt.
|
|
if(CMAKE_HOST_WIN32)
|
|
set(msystem $ENV{MSYSTEM})
|
|
if(MSYS OR msystem)
|
|
# Solves case (4). When in MSYS environment, instead opt to use the Unix equivalent of mklink.
|
|
set(CMAKE_HOST_UNIX 1)
|
|
else()
|
|
# Solves case (2). When invoked from command line, create the symbolic links ahead of link_to_source() invocations
|
|
# using a 'hybrid' path format resilient intermediary - in this case a Python wrapper for mklink. This is more unweildy
|
|
# than necessary, since string(REPLACE "/" "\\" ... does not actually work.
|
|
set(target_links "mbedtls/include/mbedtls"
|
|
"mbedtls/scripts")
|
|
foreach(target_link ${target_links})
|
|
file(TO_NATIVE_PATH ${CMAKE_CURRENT_BINARY_DIR}/${target_link} link)
|
|
file(TO_NATIVE_PATH ${COMPONENT_DIR}/${target_link} target)
|
|
|
|
idf_build_get_property(python PYTHON)
|
|
if(NOT EXISTS ${link})
|
|
if(IS_DIRECTORY ${target})
|
|
set(command ${python} ${COMPONENT_DIR}/mklink.py /j ${link} ${target})
|
|
else()
|
|
set(command ${python} ${COMPONENT_DIR}/mklink.py /h ${link} ${target})
|
|
endif()
|
|
|
|
execute_process(COMMAND ${command}
|
|
RESULT_VARIABLE result
|
|
ERROR_VARIABLE output)
|
|
|
|
if(NOT ${result} EQUAL 0)
|
|
message(FATAL_ERROR "Could not create symbolic link for: ${target} --> ${output}")
|
|
endif()
|
|
endif()
|
|
endforeach()
|
|
endif()
|
|
endif()
|
|
|
|
# Import mbedtls library targets
|
|
add_subdirectory(mbedtls)
|
|
|
|
# Use port specific implementation of net_socket.c instead of one from mbedtls
|
|
get_target_property(src_tls mbedtls SOURCES)
|
|
list(REMOVE_ITEM src_tls net_sockets.c)
|
|
set_property(TARGET mbedtls PROPERTY SOURCES ${src_tls})
|
|
|
|
set(mbedtls_targets mbedtls mbedcrypto mbedx509)
|
|
|
|
# Add port files to mbedtls targets
|
|
target_sources(mbedtls PRIVATE "${COMPONENT_DIR}/port/esp_bignum.c"
|
|
"${COMPONENT_DIR}/port/esp_hardware.c"
|
|
"${COMPONENT_PATH}/port/esp_sha.c"
|
|
"${COMPONENT_DIR}/port/esp_sha1.c"
|
|
"${COMPONENT_DIR}/port/esp_sha256.c"
|
|
"${COMPONENT_DIR}/port/esp_sha512.c"
|
|
"${COMPONENT_DIR}/port/mbedtls_debug.c"
|
|
"${COMPONENT_DIR}/port/net_sockets.c"
|
|
"${COMPONENT_DIR}/port/esp32/aes.c"
|
|
"${COMPONENT_DIR}/port/esp32/sha.c")
|
|
target_sources(mbedcrypto PRIVATE "${COMPONENT_DIR}/port/esp_mem.c")
|
|
|
|
foreach(target ${mbedtls_targets})
|
|
target_compile_definitions(${target} PUBLIC -DMBEDTLS_CONFIG_FILE="mbedtls/esp_config.h")
|
|
endforeach()
|
|
|
|
# Link mbedtls libraries to component library
|
|
target_link_libraries(${COMPONENT_LIB} INTERFACE ${mbedtls_targets}) |