CMakeLists.txt 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746
  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.7.0 template update + THIS_IDF_PATH
  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(VERBOSE_COMPONENT_MESSAGES 1)
  28. # The scope of this CMAKE_C_FLAGS is just this component:
  29. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_USER_SETTINGS")
  30. set(CMAKE_CURRENT_SOURCE_DIR ".")
  31. # set(COMPONENT_REQUIRES lwip) # we typically don't need lwip directly in wolfssl component
  32. # Optionally set your source to wolfSSL in your project CMakeLists.txt like this:
  33. # set(WOLFSSL_ROOT "c:/test/my_wolfssl" )
  34. if ( "${WOLFSSL_ROOT}" STREQUAL "")
  35. set(WOLFSSL_ROOT "$ENV{WOLFSSL_ROOT}" )
  36. endif()
  37. if( "$ENV{IDF_PATH}" STREQUAL "" )
  38. message(FATAL_ERROR "IDF_PATH Environment variable not set!")
  39. else()
  40. string(REPLACE "\\" "/" THIS_IDF_PATH "$ENV{IDF_PATH}")
  41. endif()
  42. # Optional compiler definitions to help with system name detection (typically printed by app diagnostics)
  43. if(VERBOSE_COMPONENT_MESSAGES)
  44. if(WIN32)
  45. # Windows-specific configuration here
  46. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WINDOWS")
  47. message("Detected Windows")
  48. endif()
  49. if(CMAKE_HOST_UNIX)
  50. message("Detected UNIX")
  51. endif()
  52. if(APPLE)
  53. message("Detected APPLE")
  54. endif()
  55. if(CMAKE_HOST_UNIX AND (NOT APPLE) AND EXISTS "/proc/sys/fs/binfmt_misc/WSLInterop")
  56. # Windows-specific configuration here
  57. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_WSL")
  58. message("Detected WSL")
  59. endif()
  60. if(CMAKE_HOST_UNIX AND (NOT APPLE) AND (NOT WIN32))
  61. # Windows-specific configuration here
  62. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_LINUX")
  63. message("Detected Linux")
  64. endif()
  65. if(APPLE)
  66. # Windows-specific configuration here
  67. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_CMAKE_SYSTEM_NAME_APPLE")
  68. message("Detected Apple")
  69. endif()
  70. endif() # End optional WOLFSSL_CMAKE_SYSTEM_NAME
  71. message(STATUS "CONFIG_TARGET_PLATFORM = ${CONFIG_TARGET_PLATFORM}")
  72. # Check that there are not conflicting wolfSSL components
  73. # The ESP Registry Component will be in ./managed_components/wolfssl__wolfssl
  74. # The local component wolfSSL directory will be in ./components/wolfssl
  75. if( EXISTS "${CMAKE_HOME_DIRECTORY}/managed_components/wolfssl__wolfssl" AND EXISTS "${CMAKE_HOME_DIRECTORY}/components/wolfssl" )
  76. # These exclude statements don't seem to be honored by the $ENV{IDF_PATH}/tools/cmake/project.cmake'
  77. # add_subdirectory("${CMAKE_HOME_DIRECTORY}/managed_components/wolfssl__wolfssl" EXCLUDE_FROM_ALL)
  78. # add_subdirectory("${CMAKE_HOME_DIRECTORY}/managed_components/wolfssl__wolfssl/include" EXCLUDE_FROM_ALL)
  79. # So we'll error out and let the user decide how to proceed:
  80. message(WARNING "\nFound wolfSSL components in\n"
  81. "./managed_components/wolfssl__wolfssl\n"
  82. "and\n"
  83. "./components/wolfssl\n"
  84. "in project directory: \n"
  85. "${CMAKE_HOME_DIRECTORY}")
  86. message(FATAL_ERROR "\nPlease use either the ESP Registry Managed Component or the wolfSSL component directory but not both.\n"
  87. "If removing the ./managed_components/wolfssl__wolfssl directory, remember to also remove "
  88. "or rename the idf_component.yml file typically found in ./main/")
  89. else()
  90. message(STATUS "No conflicting wolfSSL components found.")
  91. endif()
  92. # Don't include lwip requirement for benchmark and test apps.
  93. if( ("${CMAKE_PROJECT_NAME}" STREQUAL "wolfssl_benchmark") OR ("${CMAKE_PROJECT_NAME}" STREQUAL "wolfssl_test") )
  94. message(STATUS "Not including lwip for ${CMAKE_PROJECT_NAME}")
  95. else()
  96. # benchmark and test do not need wifi, everything else probably does:
  97. set(COMPONENT_REQUIRES lwip) # we typically don't need lwip directly in wolfssl component
  98. endif()
  99. # find the user name to search for possible "wolfssl-username"
  100. message(STATUS "USERNAME = $ENV{USERNAME}")
  101. if( "$ENV{USER}" STREQUAL "" ) # the bash user
  102. if( "$ENV{USERNAME}" STREQUAL "" ) # the Windows user
  103. message(STATUS "could not find USER or USERNAME")
  104. else()
  105. # the bash user is not blank, so we'll use it.
  106. set(THIS_USER "$ENV{USERNAME}")
  107. endif()
  108. else()
  109. # the bash user is not blank, so we'll use it.
  110. set(THIS_USER "$ENV{USER}")
  111. endif()
  112. message(STATUS "THIS_USER = ${THIS_USER}")
  113. if( "$ENV{IDF_PATH}" STREQUAL "" )
  114. message(FATAL_ERROR "IDF_PATH Environment variable not set!")
  115. else()
  116. string(REPLACE "\\" "/" THIS_IDF_PATH "$ENV{IDF_PATH}")
  117. endif()
  118. # COMPONENT_NAME = wolfssl
  119. # The component name is the directory name. "No feature to change this".
  120. # See https://github.com/espressif/esp-idf/issues/8978#issuecomment-1129892685
  121. # set the root of wolfSSL in top-level project CMakelists.txt:
  122. # set(WOLFSSL_ROOT "C:/some path/with/spaces")
  123. # set(WOLFSSL_ROOT "c:/workspace/wolfssl-[username]")
  124. # set(WOLFSSL_ROOT "/mnt/c/some path/with/spaces")
  125. # or use this logic to assign value from Environment Variable WOLFSSL_ROOT,
  126. # or assume this is an example 7 subdirectories below:
  127. # We are typically in [root]/IDE/Espressif/ESP-IDF/examples/wolfssl_test/components/wolfssl
  128. # The root of wolfSSL is 7 directories up from here:
  129. # function: IS_WOLFSSL_SOURCE
  130. # parameter: DIRECTORY_PARAMETER - the directory to test
  131. # output: RESULT = contains contents of DIRECTORY_PARAMETER for wolfssl directory, otherwise blank.
  132. function(IS_WOLFSSL_SOURCE DIRECTORY_PARAMETER RESULT)
  133. if (EXISTS "${DIRECTORY_PARAMETER}/wolfcrypt/src")
  134. set(${RESULT} "${DIRECTORY_PARAMETER}" PARENT_SCOPE)
  135. else()
  136. set(${RESULT} "" PARENT_SCOPE)
  137. endif()
  138. endfunction()
  139. # *********************************************************************************************
  140. # function: FIND_WOLFSSL_DIRECTORY
  141. # parameter: OUTPUT_FOUND_WOLFSSL_DIRECTORY contains root of source code, otherwise blank
  142. #
  143. # Example usage:
  144. # FIND_WOLFSSL_DIRECTORY(WOLFSSL_ROOT)
  145. # *********************************************************************************************
  146. function(FIND_WOLFSSL_DIRECTORY OUTPUT_FOUND_WOLFSSL_DIRECTORY)
  147. message(STATUS "Starting FIND_WOLFSSL_DIRECTORY: ${${OUTPUT_FOUND_WOLFSSL_DIRECTORY}}")
  148. if ( "${${OUTPUT_FOUND_WOLFSSL_DIRECTORY}}" STREQUAL "" )
  149. set(CURRENT_SEARCH_DIR "$ENV{WOLFSSL_ROOT}")
  150. if( "${CURRENT_SEARCH_DIR}" STREQUAL "" )
  151. message(STATUS "The WOLFSSL_ROOT environment variable is not set. Searching...")
  152. else()
  153. get_filename_component(CURRENT_SEARCH_DIR "$ENV{WOLFSSL_ROOT}" ABSOLUTE)
  154. IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSL)
  155. if( FOUND_WOLFSSL )
  156. message(STATUS "Found WOLFSSL_ROOT via Environment Variable:")
  157. else()
  158. message(FATAL_ERROR "WOLFSSL_ROOT Environment Variable defined, but path not found:")
  159. message(STATUS "$ENV{WOLFSSL_ROOT}")
  160. endif()
  161. endif()
  162. else()
  163. get_filename_component(CURRENT_SEARCH_DIR "${${OUTPUT_FOUND_WOLFSSL_DIRECTORY}}" ABSOLUTE)
  164. IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSL)
  165. if( FOUND_WOLFSSL )
  166. message(STATUS "Found WOLFSSL_ROOT via prior specification.")
  167. else()
  168. message(FATAL_ERROR "WOLFSSL_ROOT Variable defined, but path not found: ${${OUTPUT_FOUND_WOLFSSL_DIRECTORY}}")
  169. endif()
  170. endif()
  171. # we'll start in the CMAKE_CURRENT_SOURCE_DIR, typically [something]/projectname/components/wolfssl
  172. message(STATUS "CMAKE_CURRENT_SOURCE_DIR = ${CMAKE_CURRENT_SOURCE_DIR}")
  173. get_filename_component(CURRENT_SEARCH_DIR "${CMAKE_CURRENT_SOURCE_DIR}" ABSOLUTE)
  174. message(STATUS "CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}")
  175. string(LENGTH ${CURRENT_SEARCH_DIR} CURRENT_SEARCH_DIR_LENGTH)
  176. # loop through all the parents, looking for wolfssl
  177. while(NOT CURRENT_SEARCH_DIR STREQUAL "/" AND NOT CURRENT_SEARCH_DIR STREQUAL "" )
  178. string(LENGTH ${CURRENT_SEARCH_DIR} CURRENT_SEARCH_DIR_LENGTH)
  179. # wolfSSL may simply be in a parent directory, such as for local examples in wolfssl repo
  180. IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR}" FOUND_WOLFSSL)
  181. if( FOUND_WOLFSSL )
  182. message(STATUS "Found wolfssl in CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}")
  183. set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE)
  184. return()
  185. endif()
  186. # Maintain CURRENT_SEARCH_DIR, but check various suffixes with CURRENT_SEARCH_DIR_ALT
  187. if( THIS_USER )
  188. # Check for "wolfssl-[username]" subdirectory as we recurse up the directory tree
  189. set(CURRENT_SEARCH_DIR_ALT ${CURRENT_SEARCH_DIR}/wolfssl-${THIS_USER})
  190. message(STATUS "Looking in ${CURRENT_SEARCH_DIR_ALT}")
  191. IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR_ALT}" FOUND_WOLFSSL )
  192. if ( FOUND_WOLFSSL )
  193. message(STATUS "Found wolfssl in user-suffix CURRENT_SEARCH_DIR_ALT = ${CURRENT_SEARCH_DIR_ALT}")
  194. set(CURRENT_SEARCH_DIR "${CURRENT_SEARCH_DIR_ALT}")
  195. set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE)
  196. return()
  197. endif()
  198. endif()
  199. if ( FOUND_WOLFSSL )
  200. # if we already found the source, skip attempt of "wolfssl-master"
  201. else()
  202. set(CURRENT_SEARCH_DIR_ALT ${CURRENT_SEARCH_DIR}/wolfssl-master)
  203. message(STATUS "Looking in ${CURRENT_SEARCH_DIR_ALT}")
  204. IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR_ALT}" FOUND_WOLFSSL )
  205. if ( FOUND_WOLFSSL )
  206. message(STATUS "Found wolfssl in master-suffix CURRENT_SEARCH_DIR_ALT = ${CURRENT_SEARCH_DIR_ALT}")
  207. set(CURRENT_SEARCH_DIR "${CURRENT_SEARCH_DIR_ALT}")
  208. set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE)
  209. return()
  210. endif()
  211. endif()
  212. if ( FOUND_WOLFSSL )
  213. # if we already found the source, skip attempt of "wolfssl"
  214. else()
  215. set(CURRENT_SEARCH_DIR_ALT ${CURRENT_SEARCH_DIR}/wolfssl)
  216. message(STATUS "Looking in ${CURRENT_SEARCH_DIR_ALT}")
  217. IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR_ALT}" FOUND_WOLFSSL )
  218. if ( FOUND_WOLFSSL )
  219. message(STATUS "Found wolfssl in CURRENT_SEARCH_DIR_ALT = ${CURRENT_SEARCH_DIR_ALT}")
  220. set(CURRENT_SEARCH_DIR "${CURRENT_SEARCH_DIR_ALT}")
  221. set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE)
  222. return()
  223. endif()
  224. endif()
  225. # Next check for no user suffix "wolfssl" subdirectory as we recurse up the directory tree
  226. set(CURRENT_SEARCH_DIR_ALT ${CURRENT_SEARCH_DIR}/wolfssl)
  227. # if(EXISTS ${CURRENT_SEARCH_DIR} AND IS_DIRECTORY ${CURRENT_SEARCH_DIR} AND EXISTS "${CURRENT_SEARCH_DIR}/wolfcrypt/src")
  228. IS_WOLFSSL_SOURCE("${CURRENT_SEARCH_DIR_ALT}" FOUND_WOLFSSL )
  229. if ( FOUND_WOLFSSL )
  230. message(STATUS "Found wolfssl in CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}")
  231. set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} ${CURRENT_SEARCH_DIR} PARENT_SCOPE)
  232. return()
  233. endif()
  234. # Move up one directory level
  235. set(PRIOR_SEARCH_DIR "${CURRENT_SEARCH_DIR}")
  236. get_filename_component(CURRENT_SEARCH_DIR "${CURRENT_SEARCH_DIR}" DIRECTORY)
  237. message(STATUS "Next CURRENT_SEARCH_DIR = ${CURRENT_SEARCH_DIR}")
  238. if( "${PRIOR_SEARCH_DIR}" STREQUAL "${CURRENT_SEARCH_DIR}" )
  239. # When the parent is current directory, cannot go any further. We didn't find wolfssl.
  240. # When the search directory is empty, we'll give up.
  241. set(CURRENT_SEARCH_DIR "")
  242. endif()
  243. endwhile()
  244. # If not found, set the output variable to empty before exiting
  245. set(${OUTPUT_FOUND_WOLFSSL_DIRECTORY} "" PARENT_SCOPE)
  246. endfunction()
  247. # Example usage:
  248. #
  249. # Simply find the WOLFSSL_DIRECTORY by searching parent directories:
  250. # FIND_WOLFSSL_DIRECTORY(WOLFSSL_ROOT)
  251. #
  252. message(STATUS "CONFIG_TARGET_PLATFORM = ${CONFIG_TARGET_PLATFORM}")
  253. if (0)
  254. get_cmake_property(_variableNames VARIABLES)
  255. list (SORT _variableNames)
  256. message(STATUS "")
  257. message(STATUS "ALL VARIABLES BEGIN")
  258. message(STATUS "")
  259. foreach (_variableName ${_variableNames})
  260. message(STATUS "${_variableName}=${${_variableName}}")
  261. endforeach()
  262. message(STATUS "")
  263. message(STATUS "ALL VARIABLES END")
  264. message(STATUS "")
  265. endif()
  266. if ( ("${CONFIG_TARGET_PLATFORM}" STREQUAL "esp8266") OR ("${IDF_TARGET}" STREQUAL "esp8266") )
  267. # There's no esp_timer, no driver components for the ESP8266
  268. message(STATUS "Early expansion EXCLUDES esp_timer: ${THIS_INCLUDE_TIMER}")
  269. message(STATUS "Early expansion EXCLUDES driver: ${THIS_INCLUDE_DRIVER}")
  270. set(THIS_INCLUDE_TIMER "")
  271. set(THIS_INCLUDE_DRIVER "")
  272. else()
  273. message(STATUS "Early expansion includes esp_timer: ${THIS_INCLUDE_TIMER}")
  274. message(STATUS "Early expansion includes driver: ${THIS_INCLUDE_DRIVER}")
  275. set(THIS_INCLUDE_TIMER "esp_timer")
  276. set(THIS_INCLUDE_DRIVER "driver")
  277. endif()
  278. if(CMAKE_BUILD_EARLY_EXPANSION)
  279. message(STATUS "wolfssl component CMAKE_BUILD_EARLY_EXPANSION:")
  280. idf_component_register(
  281. REQUIRES "${COMPONENT_REQUIRES}"
  282. PRIV_REQUIRES # esp_hw_support
  283. ${THIS_INCLUDE_TIMER}
  284. ${THIS_INCLUDE_DRIVER} # this will typically only be needed for wolfSSL benchmark
  285. )
  286. else()
  287. # not CMAKE_BUILD_EARLY_EXPANSION
  288. message(STATUS "************************************************************************************************")
  289. message(STATUS "wolfssl component config:")
  290. message(STATUS "************************************************************************************************")
  291. # search for wolfSSL
  292. FIND_WOLFSSL_DIRECTORY(WOLFSSL_ROOT)
  293. if(WOLFSSL_ROOT)
  294. IS_WOLFSSL_SOURCE("${WOLFSSL_ROOT}" FOUND_WOLFSSL)
  295. if(FOUND_WOLFSSL)
  296. message(STATUS "Found WOLFSSL_ROOT via CMake specification.")
  297. else()
  298. # WOLFSSL_ROOT Path specified in CMakeLists.txt is not a valid path
  299. message(FATAL_ERROR "WOLFSSL_ROOT CMake Variable defined, but path not found: ${WOLFSSL_ROOT}\n"
  300. "Try correcting WOLFSSL_ROOT in your project CMakeFile.txt or setting environment variable.")
  301. # Abort CMake after fatal error.
  302. endif()
  303. else()
  304. message(STATUS "Searching for wolfSL source code...")
  305. FIND_WOLFSSL_DIRECTORY(WOLFSSL_ROOT)
  306. endif()
  307. if(WOLFSSL_ROOT)
  308. message(STATUS "Confirmed wolfssl directory at: ${WOLFSSL_ROOT}")
  309. else()
  310. message(STATUS "Failed: wolfssl directory not found.")
  311. # Abort. We need wolfssl _somewhere_.
  312. message(FATAL_ERROR "Could not find wolfssl in any parent directory named wolfssl-${THIS_USER}, wolfssl-master, or wolfssl.\n"
  313. "Try setting WOLFSSL_ROOT environment variable, cmake variable in project, copy source, or use managed components.")
  314. # Abort CMake after fatal error.
  315. endif()
  316. set(INCLUDE_PATH ${WOLFSSL_ROOT})
  317. set(WOLFSSL_EXTRA_PROJECT_DIR "${WOLFSSL_ROOT}/src/")
  318. # During regression tests, optionally copy source locally and use: set(USE_LOCAL_TEST_BENCH 1)
  319. set(USE_LOCAL_TEST_BENCH 0)
  320. if(NOT USE_LOCAL_TEST_BENCH)
  321. if( "${CMAKE_PROJECT_NAME}" STREQUAL "hello-world" )
  322. message(STATUS "Include ${WOLFSSL_ROOT}/wolfcrypt/benchmark")
  323. set(WOLFSSL_EXTRA_PROJECT_DIR "${WOLFSSL_ROOT}/wolfcrypt/benchmark")
  324. endif()
  325. if( "${CMAKE_PROJECT_NAME}" STREQUAL "wolfssl_benchmark" )
  326. message(STATUS "Include ${WOLFSSL_ROOT}/wolfcrypt/benchmark")
  327. set(WOLFSSL_EXTRA_PROJECT_DIR "${WOLFSSL_ROOT}/wolfcrypt/benchmark")
  328. endif()
  329. if( "${CMAKE_PROJECT_NAME}" STREQUAL "wolfssl_test" )
  330. message(STATUS "Include ${WOLFSSL_ROOT}/wolfcrypt/test")
  331. set(WOLFSSL_EXTRA_PROJECT_DIR "${WOLFSSL_ROOT}/wolfcrypt/test")
  332. endif()
  333. endif()
  334. set(COMPONENT_SRCDIRS "\"${WOLFSSL_ROOT}/src/\""
  335. "\"${WOLFSSL_ROOT}/wolfcrypt/src\""
  336. "\"${WOLFSSL_ROOT}/wolfcrypt/src/port/Espressif\""
  337. "\"${WOLFSSL_ROOT}/wolfcrypt/src/port/atmel\""
  338. "\"${WOLFSSL_EXTRA_PROJECT_DIR}\""
  339. ) # COMPONENT_SRCDIRS
  340. message(STATUS "This COMPONENT_SRCDIRS = ${COMPONENT_SRCDIRS}")
  341. # wolfSSL user_settings.h is in the local project.
  342. set(WOLFSSL_PROJECT_DIR "${CMAKE_HOME_DIRECTORY}/components/wolfssl")
  343. # add_definitions(-DWOLFSSL_USER_SETTINGS_DIR="${WOLFSSL_PROJECT_DIR}/include/user_settings.h")
  344. string(REPLACE "/" "//" STR_WOLFSSL_PROJECT_DIR "${WOLFSSL_PROJECT_DIR}")
  345. add_definitions(-DWOLFSSL_USER_SETTINGS_DIR="${STR_WOLFSSL_PROJECT_DIR}//include//user_settings.h")
  346. # Espressif may take several passes through this makefile. Check to see if we found IDF
  347. string(COMPARE EQUAL "${PROJECT_SOURCE_DIR}" "" WOLFSSL_FOUND_IDF)
  348. # get a list of all wolfcrypt assembly files; we'll exclude them as they don't target Xtensa
  349. file(GLOB EXCLUDE_ASM *.S)
  350. file(GLOB EXCLUDE_ASM ${CMAKE_SOURCE_DIR} "${WOLFSSL_ROOT}/wolfcrypt/src/*.S")
  351. message(STATUS "IDF_PATH = $ENV{IDF_PATH}")
  352. message(STATUS "PROJECT_SOURCE_DIR = ${PROJECT_SOURCE_DIR}")
  353. message(STATUS "EXCLUDE_ASM = ${EXCLUDE_ASM}")
  354. #
  355. # Check to see if there's both a local copy and EDP-IDF copy of the wolfssl and/or wolfssh components.
  356. #
  357. if( EXISTS "${WOLFSSL_PROJECT_DIR}" AND EXISTS "$ENV{IDF_PATH}/components/wolfssl/" )
  358. #
  359. # wolfSSL found in both ESP-IDF and local project - needs to be resolved by user
  360. #
  361. message(STATUS "")
  362. message(STATUS "**************************************************************************************")
  363. message(STATUS "")
  364. message(STATUS "Error: Found components/wolfssl in both local project and IDF_PATH")
  365. message(STATUS "")
  366. message(STATUS "To proceed: ")
  367. message(STATUS "")
  368. message(STATUS "Remove either the local project component: ${WOLFSSL_PROJECT_DIR} ")
  369. message(STATUS "or the Espressif shared component installed at: $ENV{IDF_PATH}/components/wolfssl/ ")
  370. message(STATUS "")
  371. message(STATUS "")
  372. message(STATUS "**************************************************************************************")
  373. message(STATUS "")
  374. message(FATAL_ERROR "Please use wolfSSL in either local project or Espressif components, but not both.")
  375. # Abort CMake after fatal error.
  376. # Optional: if you change the above FATAL_ERROR to STATUS you can warn at runtime with this macro definition:
  377. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWOLFSSL_MULTI_INSTALL_WARNING")
  378. else()
  379. if( EXISTS "$ENV{IDF_PATH}/components/wolfssl/" )
  380. #
  381. # wolfSSL found in ESP-IDF components and is assumed to be already configured in user_settings.h via setup.
  382. #
  383. message(STATUS "")
  384. message(STATUS "Using components/wolfssl in IDF_PATH = $ENV{IDF_PATH}")
  385. message(STATUS "")
  386. else()
  387. #
  388. # wolfSSL is not an ESP-IDF component.
  389. # We need to now determine if it is local and if so if it is part of the wolfSSL repo,
  390. # or if wolfSSL is simply installed as a local component.
  391. #
  392. if( EXISTS "${WOLFSSL_PROJECT_DIR}" )
  393. #
  394. # wolfSSL found in local project.
  395. #
  396. if( EXISTS "${WOLFSSL_PROJECT_DIR}/wolfcrypt/" )
  397. message(STATUS "")
  398. message(STATUS "Using installed project ./components/wolfssl in CMAKE_HOME_DIRECTORY = ${CMAKE_HOME_DIRECTORY}")
  399. message(STATUS "")
  400. #
  401. # Note we already checked above and confirmed there's not another wolfSSL installed in the ESP-IDF components.
  402. #
  403. # We won't do anything else here, as it will be assumed the original install completed successfully.
  404. #
  405. else() # full wolfSSL not installed in local project
  406. #
  407. # This is the developer repo mode. wolfSSL will be assumed to be not installed to ESP-IDF nor local project
  408. # In this configuration, we are likely running a wolfSSL example found directly in the repo.
  409. #
  410. message(STATUS "")
  411. message(STATUS "Using developer repo ./components/wolfssl in CMAKE_HOME_DIRECTORY = ${CMAKE_HOME_DIRECTORY}")
  412. message(STATUS "")
  413. message(STATUS "************************************************************************************************")
  414. # When in developer mode, we are typically running wolfSSL examples such as benchmark or test directories.
  415. # However, the as-cloned or distributed wolfSSL does not have the ./include/ directory, so we'll add it as needed.
  416. #
  417. # first check if there's a [root]/include/user_settings.h
  418. if( EXISTS "${WOLFSSL_ROOT}/include/user_settings.h" )
  419. message(FATAL_ERROR "Found stray wolfSSL user_settings.h in "
  420. "${WOLFSSL_ROOT}/include/user_settings.h "
  421. " (please move it to ${WOLFSSL_PROJECT_DIR}/include/user_settings.h )")
  422. # Abort CMake after fatal error.
  423. else()
  424. # we won't overwrite an existing user settings file, just note that we already have one:
  425. if( EXISTS "${WOLFSSL_PROJECT_DIR}/include/user_settings.h" )
  426. message(STATUS "Using existing wolfSSL user_settings.h in "
  427. "${WOLFSSL_PROJECT_DIR}/include/user_settings.h")
  428. else()
  429. message(STATUS "Installing wolfSSL user_settings.h to "
  430. "${WOLFSSL_PROJECT_DIR}/include/user_settings.h")
  431. file(COPY "${WOLFSSL_ROOT}/IDE/Espressif/ESP-IDF/user_settings.h"
  432. DESTINATION "${CMAKE_HOME_DIRECTORY}/wolfssl/include/")
  433. endif()
  434. endif() # user_settings.h
  435. # next check if there's a [root]/include/config.h
  436. if( EXISTS "${WOLFSSL_ROOT}/include/config.h" )
  437. message(STATUS "******************************************************************************")
  438. message(STATUS "******************************************************************************")
  439. message(STATUS "Found stray wolfSSL config.h in ${WOLFSSL_ROOT}/include/config.h" )
  440. message(STATUS " Please move it to ${WOLFSSL_PROJECT_DIR}/include/config.h" )
  441. message(STATUS "******************************************************************************")
  442. message(STATUS "******************************************************************************")
  443. else()
  444. # we won't overwrite an existing user settings file, just note that we already have one:
  445. if( EXISTS "${WOLFSSL_PROJECT_DIR}/include/config.h" )
  446. message(STATUS "Using existing wolfSSL config.h ${WOLFSSL_PROJECT_DIR}/include/config.h")
  447. else()
  448. message(STATUS "Installing wolfSSL config.h to ${WOLFSSL_PROJECT_DIR}/include/config.h")
  449. file(COPY "${WOLFSSL_ROOT}/IDE/Espressif/ESP-IDF/dummy_config_h" DESTINATION "${WOLFSSL_PROJECT_DIR}/include/")
  450. file(RENAME "${WOLFSSL_PROJECT_DIR}/include/dummy_config_h" "${WOLFSSL_PROJECT_DIR}/include/config.h")
  451. endif() # Project config.h
  452. endif() # WOLFSSL_ROOT config.h
  453. message(STATUS "************************************************************************************************")
  454. message(STATUS "")
  455. endif()
  456. else()
  457. # we did not find a ./components/wolfssl/include/ directory from this pass of cmake.
  458. if($WOLFSSL_FOUND_IDF)
  459. message(STATUS "")
  460. message(STATUS "WARNING: wolfSSL not found.")
  461. message(STATUS "")
  462. else()
  463. # probably needs to be re-parsed by Espressif
  464. message(STATUS "wolfSSL found IDF. Project Source:${PROJECT_SOURCE_DIR}")
  465. endif() # else we have not found ESP-IDF yet
  466. endif() # else not a local wolfSSL component
  467. endif() #else not an ESP-IDF component
  468. endif() # else not local copy and EDP-IDF wolfSSL
  469. # RTOS_IDF_PATH is typically:
  470. # "/Users/{username}/Desktop/esp-idf/components/freertos/include/freertos"
  471. # depending on the environment, we may need to swap backslashes with forward slashes
  472. string(REPLACE "\\" "/" RTOS_IDF_PATH "$ENV{IDF_PATH}/components/freertos/FreeRTOS-Kernel/include/freertos")
  473. string(REPLACE "\\" "/" WOLFSSL_ROOT ${WOLFSSL_ROOT})
  474. if(IS_DIRECTORY "${RTOS_IDF_PATH}")
  475. message(STATUS "Found current RTOS path: ${RTOS_IDF_PATH}")
  476. else()
  477. # ESP-IDF prior version 4.4x has a different RTOS directory structure
  478. string(REPLACE "\\" "/" RTOS_IDF_PATH "$ENV{IDF_PATH}/components/freertos/include/freertos")
  479. if(IS_DIRECTORY "${RTOS_IDF_PATH}")
  480. message(STATUS "Found legacy RTOS path: ${RTOS_IDF_PATH}")
  481. else()
  482. message(STATUS "Could not find RTOS path")
  483. endif()
  484. endif()
  485. message(STATUS "THIS_IDF_PATH = $THIS_IDF_PATH")
  486. # wolfSSL-specific include directories
  487. set(COMPONENT_ADD_INCLUDEDIRS
  488. "./include" # this is the location of wolfssl user_settings.h
  489. "\"${WOLFSSL_ROOT}/\""
  490. "\"${WOLFSSL_ROOT}/wolfssl/\""
  491. "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/\""
  492. "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/port/Espressif\""
  493. "\"${RTOS_IDF_PATH}/\""
  494. # wolfSSL release after v5.7 includes WiFi, time, and mem/debug helpers
  495. "${THIS_IDF_PATH}/components/esp_event/include"
  496. "${THIS_IDF_PATH}/components/esp_netif/include"
  497. "${THIS_IDF_PATH}/components/esp_wifi/include"
  498. )
  499. # Optionally include cryptoauthlib if present
  500. if(IS_DIRECTORY ${IDF_PATH}/components/cryptoauthlib)
  501. list(APPEND COMPONENT_ADD_INCLUDEDIRS "../cryptoauthlib/lib")
  502. endif()
  503. list(APPEND COMPONENT_ADD_INCLUDEDIRS "\"${WOLFSSL_ROOT}/wolfssl/\"")
  504. list(APPEND COMPONENT_ADD_INCLUDEDIRS "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/\"")
  505. # Some files are known to be included elsewhere, or not used for Espressif
  506. set(COMPONENT_SRCEXCLUDE
  507. "\"${WOLFSSL_ROOT}/src/bio.c\""
  508. "\"${WOLFSSL_ROOT}/src/conf.c\""
  509. "\"${WOLFSSL_ROOT}/src/misc.c\""
  510. "\"${WOLFSSL_ROOT}/src/pk.c\""
  511. "\"${WOLFSSL_ROOT}/src/ssl_asn1.c\"" # included by ssl.c
  512. "\"${WOLFSSL_ROOT}/src/ssl_bn.c\"" # included by ssl.c
  513. "\"${WOLFSSL_ROOT}/src/ssl_certman.c\"" # included by ssl.c
  514. "\"${WOLFSSL_ROOT}/src/ssl_crypto.c\"" # included by ssl.c
  515. "\"${WOLFSSL_ROOT}/src/ssl_misc.c\"" # included by ssl.c
  516. "\"${WOLFSSL_ROOT}/src/x509.c\""
  517. "\"${WOLFSSL_ROOT}/src/x509_str.c\""
  518. "\"${WOLFSSL_ROOT}/wolfcrypt/src/ext_kyber.c\"" # external Kyber disabled by default
  519. "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt/ext_kyber.h\"" # external Kyber disabled by default
  520. "\"${WOLFSSL_ROOT}/wolfcrypt/src/evp.c\""
  521. "\"${WOLFSSL_ROOT}/wolfcrypt/src/misc.c\""
  522. "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_arm32.c\""
  523. "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_arm64.c\""
  524. "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_armthumb.c\""
  525. "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_c32.c\""
  526. "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_c64.c\""
  527. "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_cortexm.c\""
  528. "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_x86_64.c\""
  529. "\"${WOLFSSL_ROOT}/wolfcrypt/src/sp_sm2_x86_64_asm.S\""
  530. "\"${EXCLUDE_ASM}\""
  531. )
  532. spaces2list(COMPONENT_REQUIRES)
  533. separate_arguments(COMPONENT_SRCDIRS NATIVE_COMMAND "${COMPONENT_SRCDIRS}")
  534. separate_arguments(COMPONENT_SRCEXCLUDE NATIVE_COMMAND "${COMPONENT_SRCEXCLUDE}")
  535. separate_arguments(COMPONENT_ADD_INCLUDEDIRS NATIVE_COMMAND "${COMPONENT_ADD_INCLUDEDIRS}")
  536. #
  537. # See https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html#example-component-requirements
  538. #
  539. message(STATUS "COMPONENT_SRCDIRS = ${COMPONENT_SRCDIRS}")
  540. message(STATUS "COMPONENT_ADD_INCLUDEDIRS = ${COMPONENT_ADD_INCLUDEDIRS}")
  541. message(STATUS "COMPONENT_REQUIRES = ${COMPONENT_REQUIRES}")
  542. message(STATUS "COMPONENT_SRCEXCLUDE = ${COMPONENT_SRCEXCLUDE}")
  543. #
  544. # see https://docs.espressif.com/projects/esp-idf/en/stable/esp32/migration-guides/release-5.x/build-system.html?highlight=space%20path
  545. #
  546. set(EXTRA_COMPONENT_DIRS "${COMPONENT_SRCDIRS}")
  547. idf_component_register(
  548. SRC_DIRS "${COMPONENT_SRCDIRS}"
  549. INCLUDE_DIRS "${COMPONENT_ADD_INCLUDEDIRS}"
  550. REQUIRES "${COMPONENT_REQUIRES}"
  551. EXCLUDE_SRCS "${COMPONENT_SRCEXCLUDE}"
  552. PRIV_REQUIRES
  553. "${THIS_INCLUDE_TIMER}"
  554. "${THIS_INCLUDE_DRIVER}" # this will typically only be needed for wolfSSL benchmark
  555. )
  556. # Some optional diagnostics. Verbose ones are truncated.
  557. if (VERBOSE_COMPONENT_MESSAGES)
  558. get_cmake_property(_variableNames VARIABLES)
  559. list (SORT _variableNames)
  560. message(STATUS "")
  561. message(STATUS "ALL VARIABLES BEGIN")
  562. message(STATUS "")
  563. foreach (_variableName ${_variableNames})
  564. if ( ("${_variableName}" STREQUAL "bootloader_binary_files")
  565. OR ("${_variableName}" STREQUAL "Component paths")
  566. OR ("${_variableName}" STREQUAL "component_targets")
  567. OR ("${_variableName}" STREQUAL "__COMPONENT_TARGETS")
  568. OR ("${_variableName}" STREQUAL "CONFIGS_LIST")
  569. OR ("${_variableName}" STREQUAL "__CONFIG_VARIABLES")
  570. OR ("${_variableName}" STREQUAL "val")
  571. OR ("${_variableName}" MATCHES "^__idf_")
  572. )
  573. # Truncate the displayed value:
  574. string(SUBSTRING "${${_variableName}}" 0 70 truncatedValue)
  575. message(STATUS "${_variableName} = ${truncatedValue} ... (truncated)")
  576. else()
  577. message(STATUS "${_variableName}=${${_variableName}}")
  578. endif()
  579. endforeach()
  580. message(STATUS "")
  581. message(STATUS "ALL VARIABLES END")
  582. message(STATUS "")
  583. endif()
  584. # target_sources(wolfssl PRIVATE "\"${WOLFSSL_ROOT}/wolfssl/\"" "\"${WOLFSSL_ROOT}/wolfssl/wolfcrypt\"")
  585. endif() # CMAKE_BUILD_EARLY_EXPANSION
  586. # check to see if there's both a local copy and EDP-IDF copy of the wolfssl components
  587. if( EXISTS "${WOLFSSL_PROJECT_DIR}" AND EXISTS "$ENV{IDF_PATH}/components/wolfssl/" )
  588. message(STATUS "")
  589. message(STATUS "")
  590. message(STATUS "********************************************************************")
  591. message(STATUS "WARNING: Found components/wolfssl in both local project and IDF_PATH")
  592. message(STATUS "********************************************************************")
  593. message(STATUS "")
  594. endif()
  595. # end multiple component check
  596. #
  597. # LIBWOLFSSL_SAVE_INFO(VAR_OUPUT THIS_VAR VAR_RESULT)
  598. #
  599. # Save the THIS_VAR as a string in a macro called VAR_OUPUT
  600. #
  601. # VAR_OUPUT: the name of the macro to define
  602. # THIS_VAR: the OUTPUT_VARIABLE result from a execute_process()
  603. # VAR_RESULT: the RESULT_VARIABLE from a execute_process(); "0" if successful.
  604. #
  605. function ( LIBWOLFSSL_SAVE_INFO VAR_OUPUT THIS_VAR VAR_RESULT )
  606. # is the RESULT_VARIABLE output value 0? If so, IS_VALID_VALUE is true.
  607. string(COMPARE EQUAL "${VAR_RESULT}" "0" IS_VALID_VALUE)
  608. # if we had a successful operation, save the THIS_VAR in VAR_OUPUT
  609. if(${IS_VALID_VALUE})
  610. # strip newline chars in THIS_VAR parameter and save in VAR_VALUE
  611. string(REPLACE "\n" "" VAR_VALUE ${THIS_VAR})
  612. # we'll could percolate the value to the parent for possible later use
  613. # set(${VAR_OUPUT} ${VAR_VALUE} PARENT_SCOPE)
  614. # but we're only using it here in this function
  615. set(${VAR_OUPUT} ${VAR_VALUE})
  616. # we'll print what we found to the console
  617. message(STATUS "Found ${VAR_OUPUT}=${VAR_VALUE}")
  618. # the interesting part is defining the VAR_OUPUT name a value to use in the app
  619. add_definitions(-D${VAR_OUPUT}=\"${VAR_VALUE}\")
  620. else()
  621. # if we get here, check the execute_process command and parameters.
  622. message(STATUS "LIBWOLFSSL_SAVE_INFO encountered a non-zero VAR_RESULT")
  623. set(${VAR_OUPUT} "Unknown")
  624. endif()
  625. endfunction() # LIBWOLFSSL_SAVE_INFO
  626. # create some programmatic #define values that will be used by ShowExtendedSystemInfo().
  627. # see wolfcrypt\src\port\Espressif\esp32_utl.c
  628. if(NOT CMAKE_BUILD_EARLY_EXPANSION)
  629. set (git_cmd "git")
  630. message(STATUS "Adding macro definitions:")
  631. # LIBWOLFSSL_VERSION_GIT_ORIGIN: git config --get remote.origin.url
  632. execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "config" "--get" "remote.origin.url" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET )
  633. LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_ORIGIN "${TMP_OUT}" "${TMP_RES}")
  634. # LIBWOLFSSL_VERSION_GIT_BRANCH: git rev-parse --abbrev-ref HEAD
  635. execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "--abbrev-ref" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET )
  636. LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_BRANCH "${TMP_OUT}" "${TMP_RES}")
  637. # LIBWOLFSSL_VERSION_GIT_HASH: git rev-parse HEAD
  638. execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET )
  639. LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_HASH "${TMP_OUT}" "${TMP_RES}")
  640. # LIBWOLFSSL_VERSION_GIT_SHORT_HASH: git rev-parse --short HEAD
  641. execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "rev-parse" "--short" "HEAD" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES ERROR_QUIET )
  642. LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_SHORT_HASH "${TMP_OUT}" "${TMP_RES}")
  643. # LIBWOLFSSL_VERSION_GIT_HASH_DATE git show --no-patch --no-notes --pretty=\'\%cd\'
  644. execute_process(WORKING_DIRECTORY ${WOLFSSL_ROOT} COMMAND ${git_cmd} "show" "--no-patch" "--no-notes" "--pretty=\'\%cd\'" OUTPUT_VARIABLE TMP_OUT RESULT_VARIABLE TMP_RES )
  645. LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_GIT_HASH_DATE "${TMP_OUT}" "${TMP_RES}")
  646. LIBWOLFSSL_SAVE_INFO(LIBWOLFSSL_VERSION_WOLFSSL_ROOT "${WOLFSSL_ROOT}" "${TMP_RES}")
  647. message(STATUS "************************************************************************************************")
  648. message(STATUS "wolfssl component config complete!")
  649. message(STATUS "************************************************************************************************")
  650. endif()