CMakeLists.txt 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535
  1. #
  2. # Copyright (C) 2006-2024 wolfSSL Inc.
  3. #
  4. # This file is part of wolfSSL.
  5. #
  6. # wolfSSL is free software; you can redistribute it and/or modify
  7. # it under the terms of the GNU General Public License as published by
  8. # the Free Software Foundation; either version 2 of the License, or
  9. # (at your option) any later version.
  10. #
  11. # wolfSSL is distributed in the hope that it will be useful,
  12. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. # GNU General Public License for more details.
  15. #
  16. # You should have received a copy of the GNU General Public License
  17. # along with this program; if not, write to the Free Software
  18. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
  19. #
  20. # cmake for wolfssl Espressif projects
  21. #
  22. # Version 5.6.0.011 for detect test/benchmark
  23. #
  24. # See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html
  25. #
  26. cmake_minimum_required(VERSION 3.16)
  27. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_USER_SETTINGS")
  28. set(CMAKE_CURRENT_SOURCE_DIR ".")
  29. set(COMPONENT_REQUIRES lwip) # we typically don't need lwip directly in wolfssl component
  30. set(WOLFSSL_ROOT "$ENV{WOLFSSL_ROOT}" )
  31. # find the user name to search for possible "wolfssl-username"
  32. message(STATUS "USERNAME = $ENV{USERNAME}")
  33. if( "$ENV{USER}" STREQUAL "" ) # the bash user
  34. if( "$ENV{USERNAME}" STREQUAL "" ) # the Windows user
  35. message(STATUS "could not find USER or USERNAME")
  36. else()
  37. # the bash user is not blank, so we'll use it.
  38. set(THIS_USER "$ENV{USERNAME}")
  39. endif()
  40. else()
  41. # the bash user is not blank, so we'll use it.
  42. set(THIS_USER "$ENV{USER}")
  43. endif()
  44. message(STATUS "THIS_USER = ${THIS_USER}")
  45. if( "$ENV{IDF_PATH}" STREQUAL "" )
  46. message(FATAL_ERROR "IDF_PATH Environment variable not set!")
  47. else()
  48. string(REPLACE "\\" "/" THIS_IDF_PATH "$ENV{IDF_PATH}")
  49. endif()
  50. # COMPONENT_NAME = wolfssl
  51. # The component name is the directory name. "No feature to change this".
  52. # See https://github.com/espressif/esp-idf/issues/8978#issuecomment-1129892685
  53. # set the root of wolfSSL in top-level project CMakelists.txt:
  54. # set(WOLFSSL_ROOT "C:/some path/with/spaces")
  55. # set(WOLFSSL_ROOT "c:/workspace/wolfssl-[username]")
  56. # set(WOLFSSL_ROOT "/mnt/c/some path/with/spaces")
  57. # or use this logic to assign value from Environment Variable WOLFSSL_ROOT,
  58. # or assume this is an example 7 subdirectories below:
  59. # We are typically in [root]/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl
  60. # The root of wolfSSL is 7 directories up from here:
  61. # function: IS_WOLFSSL_SOURCE
  62. # parameter: DIRECTORY_PARAMETER - the directory to test
  63. # output: RESULT = contains contents of DIRECTORY_PARAMETER for wolfssl directory, otherwise blank.
  64. function(IS_WOLFSSL_SOURCE DIRECTORY_PARAMETER RESULT)
  65. if (EXISTS "${DIRECTORY_PARAMETER}/wolfcrypt/src")
  66. set(${RESULT} "${DIRECTORY_PARAMETER}" PARENT_SCOPE)
  67. else()
  68. set(${RESULT} "" PARENT_SCOPE)
  69. endif()
  70. endfunction()
  71. # function: FIND_WOLFSSL_DIRECTORY
  72. # parameter: OUTPUT_FOUND_WOLFSSL_DIRECTORY contains root of source code, otherwise blank
  73. #
  74. function(FIND_WOLFSSL_DIRECTORY OUTPUT_FOUND_WOLFSSL_DIRECTORY)
  75. message(STATUS "Starting FIND_WOLFSSL_DIRECTORY")
  76. set(CURRENT_SEARCH_DIR "$ENV{WOLFSSL_ROOT}")
  77. if( "${CURRENT_SEARCH_DIR}" STREQUAL "" )
  78. message(STATUS "The WOLFSSL_ROOT environment variable is not set. Searching...")
  79. else()
  80. get_filename_component(CURRENT_SEARCH_DIR "$ENV{WOLFSSL_ROOT}" ABSOLUTE)
  81. IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSL)
  82. if( FOUND_WOLFSSL )
  83. message(STATUS "Found WOLFSSL_ROOT via Environment Variable: ${CURRENT_SEARCH_DIR}")
  84. set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE)
  85. return()
  86. else()
  87. message(FATAL_ERROR "WOLFSSL_ROOT Environment Variable defined, but path not found:")
  88. message(STATUS "$ENV{WOLFSSL_ROOT}")
  89. endif()
  90. endif()
  91. # we'll start in the CMAKE_CURRENT_SOURCE_DIR, typically [something]/projectname/components/wolfssl
  92. message(STATUS "CMAKE_CURRENT_SOURCE_DIR = ${CMAKE_CURRENT_SOURCE_DIR}")
  93. get_filename_component(CURRENT_SEARCH_DIR "${CMAKE_CURRENT_SOURCE_DIR}" ABSOLUTE)
  94. message(STATUS "CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}")
  95. string(LENGTH ${CURRENT_SEARCH_DIR} CURRENT_SEARCH_DIR_LENGTH)
  96. # loop through all the parents, looking for wolfssl
  97. while(NOT CURRENT_SEARCH_DIR STREQUAL "/" AND NOT CURRENT_SEARCH_DIR STREQUAL "" )
  98. string(LENGTH ${CURRENT_SEARCH_DIR} CURRENT_SEARCH_DIR_LENGTH)
  99. # wolfSSL may simply be in a parent directory, such as for local examples in wolfssl repo
  100. IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSL)
  101. if( FOUND_WOLFSSL )
  102. message(STATUS "Found wolfssl in CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}")
  103. set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE)
  104. return()
  105. endif()
  106. if( THIS_USER )
  107. # Check for "wolfssl-[username]" subdirectory as we recurse up the directory tree
  108. set(CURRENT_SEARCH_DIR_ALT ${CURRENT_SEARCH_DIR}/wolfssl-${THIS_USER})
  109. message(STATUS "Looking in ${CURRENT_SEARCH_DIR}")
  110. #if(EXISTS ${CURRENT_SEARCH_DIR_ALT} AND IS_DIRECTORY ${CURRENT_SEARCH_DIR_ALT} AND EXISTS "${CURRENT_SEARCH_DIR_ALT}/wolfcrypt/src")
  111. IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR_ALT}" FOUND_WOLFSSL )
  112. if ( FOUND_WOLFSSL )
  113. message(STATUS "Found wolfssl in user-suffix CURRENT_SEARCH_DIR_ALT = ${CURRENT_SEARCH_DIR_ALT}")
  114. set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR_ALT} PARENT_SCOPE)
  115. return()
  116. endif()
  117. endif()
  118. # Next check for no user suffix "wolfssl" subdirectory as we recurse up the directory tree
  119. set(CURRENT_SEARCH_DIR_ALT ${CURRENT_SEARCH_DIR}/wolfssl)
  120. # if(EXISTS ${CURRENT_SEARCH_DIR} AND IS_DIRECTORY ${CURRENT_SEARCH_DIR} AND EXISTS "${CURRENT_SEARCH_DIR}/wolfcrypt/src")
  121. IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR_ALT}" FOUND_WOLFSSL )
  122. if ( FOUND_WOLFSSL )
  123. message(STATUS "Found wolfssl in CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}")
  124. set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE)
  125. return()
  126. endif()
  127. # Move up one directory level
  128. set(PRIOR_SEARCH_DIR "${CURRENT_SEARCH_DIR}")
  129. get_filename_component(CURRENT_SEARCH_DIR "${CURRENT_SEARCH_DIR}" DIRECTORY)
  130. message(STATUS "Next CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}")
  131. if( "${PRIOR_SEARCH_DIR}" STREQUAL "${CURRENT_SEARCH_DIR}" )
  132. # when the search directory is empty, we'll give up
  133. set(CURRENT_SEARCH_DIR "")
  134. endif()
  135. endwhile()
  136. # If not found, set the output variable to empty before exiting
  137. set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} "" PARENT_SCOPE)
  138. endfunction()
  139. # Example usage:
  140. if(CMAKE_BUILD_EARLY_EXPANSION)
  141. message(STATUS "wolfssl component CMAKE_BUILD_EARLY_EXPANSION:")
  142. idf_component_register(
  143. REQUIRES "${COMPONENT_REQUIRES}"
  144. PRIV_REQUIRES # esp_hw_support
  145. # esp_timer
  146. # driver # this will typically only be needed for wolfSSL benchmark
  147. )
  148. else()
  149. # not CMAKE_BUILD_EARLY_EXPANSION
  150. message(STATUS "************************************************************************************************")
  151. message(STATUS "wolfssl component config:")
  152. message(STATUS "************************************************************************************************")
  153. # search for wolfSSL
  154. FIND_WOLFSSL_DIRECTORY(WOLFSSL_ROOT)
  155. if(WOLFSSL_ROOT)
  156. message(STATUS "NEW Found wolfssl directory at: ${WOLFSSL_ROOT}")
  157. else()
  158. message(STATUS "NEW wolfssl directory not found.")
  159. # Abort. We need wolfssl _somewhere_.
  160. message(FATAL_ERROR "Could not find wolfssl in ${WOLFSSL_ROOT}.\n"
  161. "Try setting WOLFSSL_ROOT environment variable or git clone.")
  162. endif()
  163. set(INCLUDE_PATH ${WOLFSSL_ROOT})
  164. set(WOLFSSL_EXTRA_PROJECT_DIR "${WOLFSSL_ROOT}/src/")
  165. if( ${CMAKE_PROJECT_NAME} STREQUAL "wolfssl_benchmark" )
  166. set(WOLFSSL_EXTRA_PROJECT_DIR "${WOLFSSL_ROOT}/wolfcrypt/benchmark")
  167. endif()
  168. if( ${CMAKE_PROJECT_NAME} STREQUAL "wolfssl_test" )
  169. set(WOLFSSL_EXTRA_PROJECT_DIR "${WOLFSSL_ROOT}/wolfcrypt/test")
  170. endif()
  171. set(COMPONENT_SRCDIRS "\"${WOLFSSL_ROOT}/src/\""
  172. "\"${WOLFSSL_ROOT}/wolfcrypt/src\""
  173. "\"${WOLFSSL_ROOT}/wolfcrypt/src/port/Espressif\""
  174. "\"${WOLFSSL_ROOT}/wolfcrypt/src/port/atmel\""
  175. "\"${WOLFSSL_EXTRA_PROJECT_DIR}\""
  176. ) # COMPONENT_SRCDIRS
  177. message(STATUS "This COMPONENT_SRCDIRS = ${COMPONENT_SRCDIRS}")
  178. set(WOLFSSL_PROJECT_DIR "${CMAKE_HOME_DIRECTORY}/components/wolfssl")
  179. add_definitions(-DWOLFSSL_USER_SETTINGS_DIR="${WOLFSSL_PROJECT_DIR}/include/user_settings.h")
  180. # Espressif may take several passes through this makefile. Check to see if we found IDF
  181. string(COMPARE EQUAL "${PROJECT_SOURCE_DIR}" "" WOLFSSL_FOUND_IDF)
  182. # get a list of all wolfcrypt assembly files; we'll exclude them as they don't target Xtensa
  183. file(GLOB EXCLUDE_ASM *.S)
  184. file(GLOB_RECURSE EXCLUDE_ASM ${CMAKE_SOURCE_DIR} "${WOLFSSL_ROOT}/wolfcrypt/src/*.S")
  185. message(STATUS "IDF_PATH = $ENV{IDF_PATH}")
  186. message(STATUS "PROJECT_SOURCE_DIR = ${PROJECT_SOURCE_DIR}")
  187. message(STATUS "EXCLUDE_ASM = ${EXCLUDE_ASM}")
  188. #
  189. # Check to see if there's both a local copy and EDP-IDF copy of the wolfssl and/or wolfssh components.
  190. #
  191. if( EXISTS "${WOLFSSL_PROJECT_DIR}" AND EXISTS "$ENV{IDF_PATH}/components/wolfssl/" )
  192. #
  193. # wolfSSL found in both ESP-IDF and local project - needs to be resolved by user
  194. #
  195. message(STATUS "")
  196. message(STATUS "**************************************************************************************")
  197. message(STATUS "")
  198. message(STATUS "Error: Found components/wolfssl in both local project and IDF_PATH")
  199. message(STATUS "")
  200. message(STATUS "To proceed: ")
  201. message(STATUS "")
  202. message(STATUS "Remove either the local project component: ${WOLFSSL_PROJECT_DIR} ")
  203. message(STATUS "or the Espressif shared component installed at: $ENV{IDF_PATH}/components/wolfssl/ ")
  204. message(STATUS "")
  205. message(FATAL_ERROR "Please use wolfSSL in either local project or Espressif components, but not both.")
  206. message(STATUS "")
  207. message(STATUS "**************************************************************************************")
  208. message(STATUS "")
  209. # Optional: if you change the above FATAL_ERROR to STATUS you can warn at runtime with this macro definition:
  210. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_MULTI_INSTALL_WARNING")
  211. else()
  212. if( EXISTS "$ENV{IDF_PATH}/components/wolfssl/" )
  213. #
  214. # wolfSSL found in ESP-IDF components and is assumed to be already configured in user_settings.h via setup.
  215. #
  216. message(STATUS "")
  217. message(STATUS "Using components/wolfssl in IDF_PATH = $ENV{IDF_PATH}")
  218. message(STATUS "")
  219. else()
  220. #
  221. # wolfSSL is not an ESP-IDF component.
  222. # We need to now determine if it is local and if so if it is part of the wolfSSL repo,
  223. # or if wolfSSL is simply installed as a local component.
  224. #
  225. if( EXISTS "${WOLFSSL_PROJECT_DIR}" )
  226. #
  227. # wolfSSL found in local project.
  228. #
  229. if( EXISTS "${WOLFSSL_PROJECT_DIR}/wolfcrypt/" )
  230. message(STATUS "")
  231. message(STATUS "Using installed project ./components/wolfssl in CMAKE_HOME_DIRECTORY = ${CMAKE_HOME_DIRECTORY}")
  232. message(STATUS "")
  233. #
  234. # Note we already checked above and confirmed there's not another wolfSSL installed in the ESP-IDF components.
  235. #
  236. # We won't do anything else here, as it will be assumed the original install completed successfully.
  237. #
  238. else() # full wolfSSL not installed in local project
  239. #
  240. # This is the developer repo mode. wolfSSL will be assumed to be not installed to ESP-IDF nor local project
  241. # In this configuration, we are likely running a wolfSSL example found directly in the repo.
  242. #
  243. message(STATUS "")
  244. message(STATUS "Using developer repo ./components/wolfssl in CMAKE_HOME_DIRECTORY = ${CMAKE_HOME_DIRECTORY}")
  245. message(STATUS "")
  246. message(STATUS "************************************************************************************************")
  247. # When in developer mode, we are typically running wolfSSL examples such as benchmark or test directories.
  248. # However, the as-cloned or distributed wolfSSL does not have the ./include/ directory, so we'll add it as needed.
  249. #
  250. # first check if there's a [root]/include/user_settings.h
  251. if( EXISTS "${WOLFSSL_ROOT}/include/user_settings.h" )
  252. message(FATAL_ERROR "Found stray wolfSSL user_settings.h in "
  253. "${WOLFSSL_ROOT}/include/user_settings.h "
  254. " (please move it to ${WOLFSSL_PROJECT_DIR}/include/user_settings.h )")
  255. else()
  256. # we won't overwrite an existing user settings file, just note that we already have one:
  257. if( EXISTS "${WOLFSSL_PROJECT_DIR}/include/user_settings.h" )
  258. message(STATUS "Using existing wolfSSL user_settings.h in "
  259. "${WOLFSSL_PROJECT_DIR}/include/user_settings.h")
  260. else()
  261. message(STATUS "Installing wolfSSL user_settings.h to "
  262. "${WOLFSSL_PROJECT_DIR}/include/user_settings.h")
  263. file(COPY "${WOLFSSL_ROOT}/IDE/Espressif/ESP-IDF/user_settings.h"
  264. DESTINATION "${CMAKE_HOME_DIRECTORY}/wolfssl/include/")
  265. endif()
  266. endif() # user_settings.h
  267. # next check if there's a [root]/include/config.h
  268. if( EXISTS "${WOLFSSL_ROOT}/include/config.h" )
  269. message(STATUS "******************************************************************************")
  270. message(STATUS "******************************************************************************")
  271. message(STATUS "Found stray wolfSSL config.h in ${WOLFSSL_ROOT}/include/config.h" )
  272. message(STATUS " Please move it to ${WOLFSSL_PROJECT_DIR}/include/config.h" )
  273. message(STATUS "******************************************************************************")
  274. message(STATUS "******************************************************************************")
  275. else()
  276. # we won't overwrite an existing user settings file, just note that we already have one:
  277. if( EXISTS "${WOLFSSL_PROJECT_DIR}/include/config.h" )
  278. message(STATUS "Using existing wolfSSL config.h ${WOLFSSL_PROJECT_DIR}/include/config.h")
  279. else()
  280. message(STATUS "Installing wolfSSL config.h to ${WOLFSSL_PROJECT_DIR}/include/config.h")
  281. file(COPY "${WOLFSSL_ROOT}/IDE/Espressif/ESP-IDF/dummy_config_h" DESTINATION "${WOLFSSL_PROJECT_DIR}/include/")
  282. file(RENAME "${WOLFSSL_PROJECT_DIR}/include/dummy_config_h" "${WOLFSSL_PROJECT_DIR}/include/config.h")
  283. endif() # Project config.h
  284. endif() # WOLFSSL_ROOT config.h
  285. message(STATUS "************************************************************************************************")
  286. message(STATUS "")
  287. endif()
  288. else()
  289. # we did not find a ./components/wolfssl/include/ directory from this pass of cmake.
  290. if($WOLFSSL_FOUND_IDF)
  291. message(STATUS "")
  292. message(STATUS "WARNING: wolfSSL not found.")
  293. message(STATUS "")
  294. else()
  295. # probably needs to be re-parsed by Espressif
  296. message(STATUS "wolfSSL found IDF. Project Source:${PROJECT_SOURCE_DIR}")
  297. endif() # else we have not found ESP-IDF yet
  298. endif() # else not a local wolfSSL component
  299. endif() #else not an ESP-IDF component
  300. endif() # else not local copy and EDP-IDF wolfSSL
  301. # RTOS_IDF_PATH is typically:
  302. # "/Users/{username}/Desktop/esp-idf/components/freertos/include/freertos"
  303. # depending on the environment, we may need to swap backslashes with forward slashes
  304. string(REPLACE "\\" "/" RTOS_IDF_PATH "$ENV{IDF_PATH}/components/freertos/FreeRTOS-Kernel/include/freertos")
  305. string(REPLACE "\\" "/" WOLFSSL_ROOT ${WOLFSSL_ROOT})
  306. if(IS_DIRECTORY "${RTOS_IDF_PATH}")
  307. message(STATUS "Found current RTOS path: ${RTOS_IDF_PATH}")
  308. else()
  309. # ESP-IDF prior version 4.4x has a different RTOS directory structure
  310. string(REPLACE "\\" "/" RTOS_IDF_PATH "$ENV{IDF_PATH}/components/freertos/include/freertos")
  311. if(IS_DIRECTORY "${RTOS_IDF_PATH}")
  312. message(STATUS "Found legacy RTOS path: ${RTOS_IDF_PATH}")
  313. else()
  314. message(STATUS "Could not find RTOS path")
  315. endif()
  316. endif()
  317. set(COMPONENT_ADD_INCLUDEDIRS
  318. "./include" # this is the location of wolfssl user_settings.h
  319. "\"${WOLFSSL_ROOT}/\""
  320. "\"${WOLFSSL_ROOT}/wolfssl/\""
  321. "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/\""
  322. "\"${RTOS_IDF_PATH}/\""
  323. # wolfSSL release after v5.7 includes WiFi, time, and mem/debug helpers
  324. "${THIS_IDF_PATH}/components/esp_event/include"
  325. "${THIS_IDF_PATH}/components/esp_netif/include"
  326. "${THIS_IDF_PATH}/components/esp_wifi/include"
  327. )
  328. if(IS_DIRECTORY ${IDF_PATH}/components/cryptoauthlib)
  329. list(APPEND COMPONENT_ADD_INCLUDEDIRS "../cryptoauthlib/lib")
  330. endif()
  331. list(APPEND COMPONENT_ADD_INCLUDEDIRS "\"${WOLFSSL_ROOT}/wolfssl/\"")
  332. list(APPEND COMPONENT_ADD_INCLUDEDIRS "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/\"")
  333. set(COMPONENT_SRCEXCLUDE
  334. "\"${WOLFSSL_ROOT}/src/bio.c\""
  335. "\"${WOLFSSL_ROOT}/src/conf.c\""
  336. "\"${WOLFSSL_ROOT}/src/misc.c\""
  337. "\"${WOLFSSL_ROOT}/src/pk.c\""
  338. "\"${WOLFSSL_ROOT}/src/ssl_asn1.c\"" # included by ssl.c
  339. "\"${WOLFSSL_ROOT}/src/ssl_bn.c\"" # included by ssl.c
  340. "\"${WOLFSSL_ROOT}/src/ssl_certman.c\"" # included by ssl.c
  341. "\"${WOLFSSL_ROOT}/src/ssl_crypto.c\"" # included by ssl.c
  342. "\"${WOLFSSL_ROOT}/src/ssl_misc.c\"" # included by ssl.c
  343. "\"${WOLFSSL_ROOT}/src/x509.c\""
  344. "\"${WOLFSSL_ROOT}/src/x509_str.c\""
  345. "\"${WOLFSSL_ROOT}/wolfcrypt/src/evp.c\""
  346. "\"${WOLFSSL_ROOT}/wolfcrypt/src/misc.c\""
  347. "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_arm32.c\""
  348. "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_arm64.c\""
  349. "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_armthumb.c\""
  350. "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_c32.c\""
  351. "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_c64.c\""
  352. "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_cortexm.c\""
  353. "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_x86_64.c\""
  354. "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_x86_64_asm.S\""
  355. "\"${EXCLUDE_ASM}\""
  356. )
  357. spaces2list(COMPONENT_REQUIRES)
  358. separate_arguments(COMPONENT_SRCDIRS NATIVE_COMMAND "${COMPONENT_SRCDIRS}")
  359. separate_arguments(COMPONENT_SRCEXCLUDE NATIVE_COMMAND "${COMPONENT_SRCEXCLUDE}")
  360. separate_arguments(COMPONENT_ADD_INCLUDEDIRS NATIVE_COMMAND "${COMPONENT_ADD_INCLUDEDIRS}")
  361. #
  362. # See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html#example-component-requirements
  363. #
  364. message(STATUS "COMPONENT_SRCDIRS = ${COMPONENT_SRCDIRS}")
  365. message(STATUS "COMPONENT_ADD_INCLUDEDIRS = ${COMPONENT_ADD_INCLUDEDIRS}")
  366. message(STATUS "COMPONENT_REQUIRES = ${COMPONENT_REQUIRES}")
  367. message(STATUS "COMPONENT_SRCEXCLUDE = ${COMPONENT_SRCEXCLUDE}")
  368. #
  369. # see https://docs.espressif.com/projects/esp-idf/en/stable/esp32/migration-guides/release-5.x/build-system.html?highlight=space%20path
  370. #
  371. set(EXTRA_COMPONENT_DIRS "${COMPONENT_SRCDIRS}")
  372. idf_component_register(
  373. SRC_DIRS "${COMPONENT_SRCDIRS}"
  374. INCLUDE_DIRS "${COMPONENT_ADD_INCLUDEDIRS}"
  375. REQUIRES "${COMPONENT_REQUIRES}"
  376. EXCLUDE_SRCS "${COMPONENT_SRCEXCLUDE}"
  377. PRIV_REQUIRES esp_timer driver # this will typically only be needed for wolfSSL benchmark
  378. )
  379. # some optional diagnostics
  380. if (1)
  381. get_cmake_property(_variableNames VARIABLES)
  382. list (SORT _variableNames)
  383. message(STATUS "")
  384. message(STATUS "ALL VARIABLES BEGIN")
  385. message(STATUS "")
  386. foreach (_variableName ${_variableNames})
  387. message(STATUS "${_variableName}=${${_variableName}}")
  388. endforeach()
  389. message(STATUS "")
  390. message(STATUS "ALL VARIABLES END")
  391. message(STATUS "")
  392. endif()
  393. # target_sources(wolfssl PRIVATE "\"${WOLFSSL_ROOT}/wolfssl/\"" "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt\"")
  394. endif() # CMAKE_BUILD_EARLY_EXPANSION
  395. # check to see if there's both a local copy and EDP-IDF copy of the wolfssl components
  396. if( EXISTS "${WOLFSSL_PROJECT_DIR}" AND EXISTS "$ENV{IDF_PATH}/components/wolfssl/" )
  397. message(STATUS "")
  398. message(STATUS "")
  399. message(STATUS "********************************************************************")
  400. message(STATUS "WARNING: Found components/wolfssl in both local project and IDF_PATH")
  401. message(STATUS "********************************************************************")
  402. message(STATUS "")
  403. endif()
  404. # end multiple component check
  405. #
  406. # LIBWOLFSSL_SAVE_INFO(VAR_OUPUT THIS_VAR VAR_RESULT)
  407. #
  408. # Save the THIS_VAR as a string in a macro called VAR_OUPUT
  409. #
  410. # VAR_OUPUT: the name of the macro to define
  411. # THIS_VAR: the OUTPUT_VARIABLE result from a execute_process()
  412. # VAR_RESULT: the RESULT_VARIABLE from a execute_process(); "0" if successful.
  413. #
  414. function ( LIBWOLFSSL_SAVE_INFO VAR_OUPUT THIS_VAR VAR_RESULT )
  415. # is the RESULT_VARIABLE output value 0? If so, IS_VALID_VALUE is true.
  416. string(COMPARE EQUAL "${VAR_RESULT}" "0" IS_VALID_VALUE)
  417. # if we had a successful operation, save the THIS_VAR in VAR_OUPUT
  418. if(${IS_VALID_VALUE})
  419. # strip newline chars in THIS_VAR parameter and save in VAR_VALUE
  420. string(REPLACE "\n" "" VAR_VALUE ${THIS_VAR})
  421. # we'll could percolate the value to the parent for possible later use
  422. # set(${VAR_OUPUT} ${VAR_VALUE} PARENT_SCOPE)
  423. # but we're only using it here in this function
  424. set(${VAR_OUPUT} ${VAR_VALUE})
  425. # we'll print what we found to the console
  426. message(STATUS "Found ${VAR_OUPUT}=${VAR_VALUE}")
  427. # the interesting part is defining the VAR_OUPUT name a value to use in the app
  428. add_definitions(-D${VAR_OUPUT}=\"${VAR_VALUE}\")
  429. else()
  430. # if we get here, check the execute_process command and parameters.
  431. message(STATUS "LIBWOLFSSL_SAVE_INFO encountered a non-zero VAR_RESULT")
  432. set(${VAR_OUPUT} "Unknown")
  433. endif()
  434. endfunction() # LIBWOLFSSL_SAVE_INFO
  435. # create some programmatic #define values that will be used by ShowExtendedSystemInfo().
  436. # see wolfcrypt\src\port\Espressif\esp32_utl.c
  437. if(NOT CMAKE_BUILD_EARLY_EXPANSION)
  438. set (git_cmd "git")
  439. message(STATUS "Adding macro definitions:")
  440. # LIBWOLFSSL_VERSION_GIT_ORIGIN: git config --get remote.origin.url
  441. execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "config" "--get" "remote.origin.url" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET )
  442. LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_ORIGIN "${TMP_OUT}" "${TMP_RES}")
  443. # LIBWOLFSSL_VERSION_GIT_BRANCH: git rev-parse --abbrev-ref HEAD
  444. execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "--abbrev-ref" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET )
  445. LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_BRANCH "${TMP_OUT}" "${TMP_RES}")
  446. # LIBWOLFSSL_VERSION_GIT_HASH: git rev-parse HEAD
  447. execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET )
  448. LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_HASH "${TMP_OUT}" "${TMP_RES}")
  449. # LIBWOLFSSL_VERSION_GIT_SHORT_HASH: git rev-parse --short HEAD
  450. execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "--short" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET )
  451. LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_SHORT_HASH "${TMP_OUT}" "${TMP_RES}")
  452. # LIBWOLFSSL_VERSION_GIT_HASH_DATE git show --no-patch --no-notes --pretty=\'\%cd\'
  453. execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "show" "--no-patch" "--no-notes" "--pretty=\'\%cd\'" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES )
  454. LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_HASH_DATE "${TMP_OUT}" "${TMP_RES}")
  455. message(STATUS "************************************************************************************************")
  456. message(STATUS "wolfssl component config complete!")
  457. message(STATUS "************************************************************************************************")
  458. endif()