1cmake_minimum_required(VERSION 3.13 FATAL_ERROR) 2cmake_policy(SET CMP0054 NEW) 3cmake_policy(SET CMP0057 NEW) 4cmake_policy(SET CMP0077 NEW) 5 6project(usbx_test LANGUAGES C) 7 8# Use customized ux_user.h 9set(UX_USER_FILE ${CMAKE_CURRENT_SOURCE_DIR}/ux_user.h) 10 11# Copy files instead of using symlink 12# libs/ -> ../libs/ 13file(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/libs) 14configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../libs/CMakeLists.txt 15 ${CMAKE_CURRENT_SOURCE_DIR}/libs/CMakeLists.txt COPYONLY) 16configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../libs/nx_user.h 17 ${CMAKE_CURRENT_SOURCE_DIR}/libs/nx_user.h COPYONLY) 18 19# Set build configurations 20# TODO: add when available : standalone_otg_build 21set(BUILD_CONFIGURATIONS 22 default_build_coverage 23 error_check_build_full_coverage 24 tracex_enable_build 25 device_buffer_owner_build 26 device_zero_copy_build 27 nofx_build_coverage 28 optimized_build 29 standalone_device_build_coverage 30 standalone_device_buffer_owner_build 31 standalone_device_zero_copy_build 32 standalone_host_build_coverage 33 standalone_build_coverage 34 generic_build 35 otg_support_build 36 memory_management_build_coverage 37 msrc_rtos_build 38 msrc_standalone_build 39 ) 40 41set(CMAKE_CONFIGURATION_TYPES 42 ${BUILD_CONFIGURATIONS} 43 CACHE STRING "list of supported configuration types" FORCE) 44set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS 45 ${CMAKE_CONFIGURATION_TYPES}) 46list(GET CMAKE_CONFIGURATION_TYPES 0 BUILD_TYPE) 47if((NOT CMAKE_BUILD_TYPE) OR (NOT ("${CMAKE_BUILD_TYPE}" IN_LIST 48 CMAKE_CONFIGURATION_TYPES))) 49 set(CMAKE_BUILD_TYPE 50 "${BUILD_TYPE}" 51 CACHE STRING "Build Type of the project" FORCE) 52endif() 53 54message(STATUS "Build for usbx") 55message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") 56message(STATUS "Using toolchain file: ${CMAKE_TOOLCHAIN_FILE}.") 57 58set(default_build_coverage 59 -DNX_PHYSICAL_HEADER=20 60# -DUX_SLAVE_REQUEST_CONTROL_MAX_LENGTH=512 61# -DUX_DEVICE_BIDIRECTIONAL_ENDPOINT_SUPPORT 62# -DUX_HOST_DEVICE_CLASS_CODE_VALIDATION_ENABLE 63# -DUX_DEVICE_CLASS_HID_INTERRUPT_OUT_SUPPORT 64# -DUX_HOST_CLASS_HID_INTERRUPT_OUT_SUPPORT 65 -DUX_DISABLE_ASSERT 66##############################################FeedBack Test Start 67# -DUX_DEVICE_CLASS_AUDIO_FEEDBACK_SUPPORT 68# -DUX_MAX_DEVICE_ENDPOINTS=6 69# -DUX_DEVICE_BIDIRECTIONAL_ENDPOINT_SUPPORT 70# -DUX_SLAVE_REQUEST_CONTROL_MAX_LENGTH=512 71##############################################FeedBack Test end 72 # -DUX_HOST_CLASS_AUDIO_2_SUPPORT 73 # -DUX_HOST_CLASS_AUDIO_FEEDBACK_SUPPORT 74 # -DUX_HOST_CLASS_AUDIO_DISABLE_CONTROLS 75 # -DUX_HOST_CLASS_AUDIO_INTERRUPT_SUPPORT 76 # -DUX_DEVICE_CLASS_PRINTER_WRITE_AUTO_ZLP 77 # -DUX_DEVICE_CLASS_CDC_ACM_WRITE_AUTO_ZLP 78 # -DUX_DEVICE_CLASS_AUDIO_INTERRUPT_SUPPORT 79 -DUX_HOST_STACK_CONFIGURATION_INSTANCE_CREATE_CONTROL=0 80 -DUX_DEVICE_ENABLE_GET_STRING_WITH_ZERO_LANGUAGE_ID 81) 82 83set(error_check_build_full_coverage 84 ${default_build_coverage} 85 -DUX_ENABLE_ASSERT 86 -DUX_ENABLE_ERROR_CHECKING 87 -DUX_PIMA_WITH_MTP_SUPPORT 88) 89 90set(msrc_rtos_build 91 ${error_check_build_full_coverage} 92 -DUX_SLAVE_REQUEST_CONTROL_MAX_LENGTH=512 93 -DUX_HOST_CLASS_AUDIO_2_SUPPORT 94 -DUX_HOST_CLASS_AUDIO_INTERRUPT_SUPPORT 95) 96set(msrc_standalone_build 97 ${msrc_rtos_build} 98 -DUX_STANDALONE 99) 100 101set(tracex_enable_build 102 -DNX_PHYSICAL_HEADER=20 103 -DTX_ENABLE_EVENT_TRACE 104 -DUX_TRACE_INSERT_MACROS 105) 106 107set(device_buffer_owner_build 108 -DNX_PHYSICAL_HEADER=20 109# -DUX_ENABLE_ASSERT 110 -DTX_ENABLE_EVENT_TRACE 111 -DUX_TRACE_INSERT_MACROS 112 -DUX_SLAVE_REQUEST_CONTROL_MAX_LENGTH=512 113 -DUX_DEVICE_ENDPOINT_BUFFER_OWNER=1 114 # -DUX_DEVICE_CLASS_CDC_ACM_TRANSMISSION_DISABLE 115 -DUX_DEVICE_CLASS_HID_INTERRUPT_OUT_SUPPORT 116 -DUX_DEVICE_CLASS_AUDIO_FEEDBACK_SUPPORT 117 -DUX_DEVICE_CLASS_AUDIO_INTERRUPT_SUPPORT 118) 119set(device_zero_copy_build 120 ${device_buffer_owner_build} 121 -DUX_DEVICE_CLASS_CDC_ACM_ZERO_COPY 122 -DUX_DEVICE_CLASS_CDC_ACM_WRITE_AUTO_ZLP 123 -DUX_DEVICE_CLASS_HID_ZERO_COPY 124 -DUX_DEVICE_CLASS_CDC_ECM_ZERO_COPY 125 -DUX_DEVICE_CLASS_RNDIS_ZERO_COPY 126 -DUX_DEVICE_CLASS_PRINTER_ZERO_COPY 127) 128 129set(nofx_build_coverage 130 -DNX_PHYSICAL_HEADER=20 131 -DUX_HOST_CLASS_STORAGE_NO_FILEX 132) 133set(standalone_build_coverage 134 -DNX_PHYSICAL_HEADER=20 135 -DUX_STANDALONE 136 # -DTX_ENABLE_EVENT_TRACE 137) 138set(standalone_device_build_coverage 139 -DUX_DEVICE_STANDALONE 140 # -DUX_DEVICE_CLASS_HID_INTERRUPT_OUT_SUPPORT 141 -DUX_SLAVE_REQUEST_CONTROL_MAX_LENGTH=512 142##############################################FeedBack Test Start 143# -DUX_DEVICE_CLASS_AUDIO_FEEDBACK_SUPPORT 144# -DUX_MAX_DEVICE_ENDPOINTS=6 145# -DUX_DEVICE_BIDIRECTIONAL_ENDPOINT_SUPPORT 146##############################################FeedBack Test End 147# -DUX_DEVICE_CLASS_AUDIO_INTERRUPT_SUPPORT 148 -DUX_ENABLE_ERROR_CHECKING 149) 150set(standalone_device_buffer_owner_build 151 ${device_buffer_owner_build} 152 ${standalone_device_build_coverage} 153) 154set(standalone_device_zero_copy_build 155 ${device_zero_copy_build} 156 ${standalone_device_build_coverage} 157) 158set(standalone_host_build_coverage 159 -DUX_HOST_STANDALONE 160 # -DUX_HOST_CLASS_HID_INTERRUPT_OUT_SUPPORT 161 -DUX_ENABLE_ERROR_CHECKING 162) 163set(standalone_otg_build 164 -DUX_OTG_STANDALONE 165) 166set(optimized_build 167 -DNX_PHYSICAL_HEADER=20 168 -DUX_NAME_REFERENCED_BY_POINTER 169 -DUX_MAX_HCD=1 170 -DUX_MAX_ISO_TD=0 171 -DUX_MAX_TD=20 172 -DUX_MAX_CLASS_DRIVER=1 173 -DUX_MAX_DEVICES=1 174 -DUX_HOST_CLASS_STORAGE_MEMORY_BUFFER_SIZE=512 175 -DUX_HOST_CLASS_STORAGE_MAX_TRANSFER_SIZE=512 176 -DUX_HOST_CLASS_STORAGE_MAX_MEDIA=1 177 -DUX_DEVICE_INITIALIZE_FRAMEWORK_SCAN_DISABLE 178 -DUX_MAX_DEVICE_ENDPOINTS=2 179 -DUX_MAX_DEVICE_INTERFACES=1 180 -DUX_MAX_SLAVE_INTERFACES=1 181 -DUX_MAX_SLAVE_CLASS_DRIVER=1 182 -DUX_MAX_SLAVE_LUN=1 183 -DUX_SLAVE_REQUEST_DATA_MAX_LENGTH=512 184 -DUX_DEVICE_ALTERNATE_SETTING_SUPPORT_DISABLE 185) 186set(generic_build 187 -DUX_HCD_EHCI_SPLIT_TRANSFER_ENABLE 188 -DUX_HOST_CLASS_STORAGE_INCLUDE_LEGACY_PROTOCOL_SUPPORT 189 -DUX_SLAVE_CLASS_STORAGE_INCLUDE_MMC 190 ############################################## warning check: CDC ACM 191 -DUX_DEVICE_CLASS_CDC_ACM_TRANSMISSION_DISABLE 192 ############################################## warning check: DFU 193 # -DUX_DEVICE_CLASS_DFU_UPLOAD_DISABLE 194 # -DUX_DEVICE_CLASS_DFU_ERROR_GET_ENABLE 195 -DUX_DEVICE_CLASS_DFU_STATUS_MODE=1 #0/1 196 -DUX_DEVICE_CLASS_DFU_STATUS_POLLTIMEOUT=0 197 # -DUX_DEVICE_CLASS_DFU_CUSTOM_REQUEST_ENABLE 198 -DUX_HOST_STACK_CONFIGURATION_INSTANCE_CREATE_CONTROL=1 199) 200set(otg_support_build 201 -DNX_PHYSICAL_HEADER=20 202 -DUX_OTG_SUPPORT= 203) 204set(memory_management_build_coverage 205 ${default_build_coverage} 206 -DUX_ENFORCE_SAFE_ALIGNMENT 207 -DUX_ENABLE_MEMORY_STATISTICS 208 -DUX_ENABLE_MEMORY_POOL_SANITY_CHECK 209) 210# Control if USBX is static or shared 211if($ENV{USBX_STATIC}) 212 message(STATUS "Building STATIC usbx") 213 set(BUILD_SHARED_LIBS OFF) 214else() 215 message(STATUS "Building usbx BUILD_SHARED_LIBS: ${BUILD_SHARED_LIBS}") 216endif() 217if(NOT BUILD_SHARED_LIBS) 218 if(CMAKE_BUILD_TYPE MATCHES ".*_coverage") 219 add_link_options(-fprofile-arcs) 220 add_link_options(-lgcov) 221 endif() 222endif() 223 224# Control if it's for 64 bit or 32 bit 225if($ENV{ENABLE_64}) 226 message(STATUS "Building for 64bit") 227else() 228 add_compile_options(-m32) 229 add_link_options(-m32) 230 message(STATUS "Building for 32bit") 231endif() 232add_compile_options( 233 -std=c99 234 -ggdb 235 -g3 236 -gdwarf-2 237 -fdiagnostics-color 238 -DUX_USE_IO_INSTRUCTIONS 239 #-DUX_DEVICE_CLASS_DFU_CUSTOM_REQUEST_ENABLE 240 #-DUX_DEVICE_CLASS_DFU_STATUS_MODE=1 241 ${${CMAKE_BUILD_TYPE}}) 242 243enable_testing() 244 245add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/../../../ usbx) 246if(CMAKE_BUILD_TYPE STREQUAL "generic_build") 247 add_test(fake_test true) 248else() 249 add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/regression regression) 250endif() 251 252# TODO: Unmask after adding sample for STANDALONE 253if(NOT (CMAKE_BUILD_TYPE MATCHES "standalone.*")) 254 add_subdirectory(../usbx/samples samples) 255endif() 256 257# Coverage 258if(CMAKE_BUILD_TYPE MATCHES ".*_coverage") 259 target_compile_options(usbx PRIVATE -fprofile-arcs -ftest-coverage) 260 target_link_options(usbx PRIVATE -fprofile-arcs -ftest-coverage) 261endif() 262 263# Build ThreadX library once 264execute_process(COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/run.sh build_libs) 265add_custom_target(build_libs ALL COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/run.sh 266 build_libs) 267 268add_dependencies(usbx build_libs) 269target_include_directories(usbx PUBLIC ${CMAKE_BINARY_DIR}/../libs/inc) 270 271add_library(threadx SHARED IMPORTED GLOBAL) 272add_library("azrtos::threadx" ALIAS threadx) 273set_target_properties( 274 threadx PROPERTIES IMPORTED_LOCATION 275 ${CMAKE_BINARY_DIR}/../libs/threadx/libthreadx.so) 276 277add_library(netxduo SHARED IMPORTED GLOBAL) 278add_library("azrtos::netxduo" ALIAS netxduo) 279set_target_properties( 280 netxduo PROPERTIES IMPORTED_LOCATION 281 ${CMAKE_BINARY_DIR}/../libs/netxduo/libnetxduo.so) 282 283add_library(filex SHARED IMPORTED GLOBAL) 284add_library("azrtos::filex" ALIAS filex) 285set_target_properties( 286 filex PROPERTIES IMPORTED_LOCATION 287 ${CMAKE_BINARY_DIR}/../libs/filex/libfilex.so) 288 289target_compile_options( 290 usbx 291 PRIVATE -Werror 292 -Wall 293 -Wextra 294 -pedantic 295 -fmessage-length=0 296 -fsigned-char 297 -ffunction-sections 298 -fdata-sections 299 -Wunused 300 -Wuninitialized 301 -Wmissing-declarations 302 -Wconversion 303 -Wpointer-arith 304 -Wshadow 305 -Wlogical-op 306 -Waggregate-return 307 -Wfloat-equal) 308 309# Remove includes and files not needed from usbx build 310set(UX_STANDALONE_HOST_EXCLUDES 311 # ux_host_class_asix 312 # ux_host_class_audio 313 # ux_host_class_cdc_acm 314 # ux_host_class_cdc_ecm 315 # ux_host_class_gser 316 # ux_host_class_hid 317 # ux_host_class_hub 318 # ux_host_class_pima 319 # ux_host_class_printer 320 # ux_host_class_prolific 321 # ux_host_class_storage 322 # ux_host_class_swar 323 # ux_host_class_video 324 # ux_hcd_ehci 325 # ux_hcd_ohci 326) 327set(UX_STANDALONE_DEVICE_EXCLUDES 328 # ux_device_class_audio 329 # ux_device_class_cdc_acm 330 # ux_device_class_cdc_ecm 331 # ux_device_class_dfu 332 # ux_device_class_hid 333 # ux_device_class_pima 334 # ux_device_class_rndis 335 # ux_device_class_ccid 336 # ux_device_class_printer 337 # ux_device_class_video 338) 339set(UX_STANDALONE_UTILITY_EXCLUDES 340 # ux_utility_event 341 # ux_utility_delay 342 # ux_utility_mutex 343 # ux_utility_semaphore 344 # ux_utility_thread 345 # ux_utility_timer 346) 347set(UX_STANDALONE_PICTBRIDGE_EXCLUDES 348 # ux_pictbridge 349) 350set(UX_STANDALONE_NX_EXCLUDES 351 # ux_network_driver 352) 353set(UX_STANDALONE_FX_EXCLUDES 354 # ux_host_class_storage_driver_entry 355 usbx_ux_host_class_storage_fx_driver 356) 357if(CMAKE_BUILD_TYPE MATCHES "standalone.*") 358 get_target_property(test_utility_SOURCES_LIST test_utility SOURCES) 359 get_target_property(SOURCES_LIST usbx SOURCES) 360 get_target_property(INCLUDES_LIST usbx INCLUDE_DIRECTORIES) 361 362 if("${CMAKE_BUILD_TYPE}" STREQUAL "standalone_build_coverage") 363 # TODO: enable when STANDALONE implement is done 364 # Remove files not support STANDALONE yet 365 foreach(EXCLUDE_VAL ${UX_STANDALONE_HOST_EXCLUDES} 366 ${UX_STANDALONE_DEVICE_EXCLUDES} 367 ${UX_STANDALONE_UTILITY_EXCLUDES} 368 ${UX_STANDALONE_PICTBRIDGE_EXCLUDES} 369 ${UX_STANDALONE_NX_EXCLUDES} 370 ${UX_STANDALONE_FX_EXCLUDES}) 371 list(FILTER test_utility_SOURCES_LIST EXCLUDE REGEX ".*${EXCLUDE_VAL}.*") 372 list(FILTER SOURCES_LIST EXCLUDE REGEX ".*${EXCLUDE_VAL}.*") 373 endforeach() 374 # Update includes to remove TX,FX,NX libs 375 list(FILTER INCLUDES_LIST EXCLUDE REGEX ".*externals.*") 376 list(FILTER INCLUDES_LIST EXCLUDE REGEX ".*/libs/inc.*") 377 # Update library links to remove TX,FX,NX libs 378 set_target_properties(usbx PROPERTIES LINK_LIBRARIES "") 379 set_target_properties(usbx PROPERTIES INTERFACE_LINK_LIBRARIES "") 380 381 elseif("${CMAKE_BUILD_TYPE}" STREQUAL "standalone_device_build_coverage") 382 # Only device part linked with STANDALONE 383 # Remove files not support STANDALONE yet 384 foreach(EXCLUDE_VAL ${UX_STANDALONE_DEVICE_EXCLUDES}) 385 list(FILTER SOURCES_LIST EXCLUDE REGEX ".*${EXCLUDE_VAL}.*") 386 list(FILTER test_utility_SOURCES_LIST EXCLUDE REGEX ".*${EXCLUDE_VAL}.*") 387 endforeach() 388 389 elseif("${CMAKE_BUILD_TYPE}" STREQUAL "standalone_host_build_coverage") 390 # Only host part linked with STANDALONE 391 # Remove files not support STANDALONE yet 392 foreach(EXCLUDE_VAL ${UX_STANDALONE_HOST_EXCLUDES}) 393 list(FILTER SOURCES_LIST EXCLUDE REGEX ".*${EXCLUDE_VAL}.*") 394 list(FILTER test_utility_SOURCES_LIST EXCLUDE REGEX ".*${EXCLUDE_VAL}.*") 395 endforeach() 396 397 elseif("${CMAKE_BUILD_TYPE}" STREQUAL "standalone_otg_build") 398 # Only some stack file linked with STANDALONE 399 # No file list change for now 400 endif() 401 402 # Commit sources and includes changes 403 set_target_properties(test_utility PROPERTIES SOURCES "${test_utility_SOURCES_LIST}") 404 set_target_properties(usbx PROPERTIES SOURCES "${SOURCES_LIST}") 405 set_target_properties(usbx PROPERTIES INCLUDE_DIRECTORIES "${INCLUDES_LIST}") 406endif() 407 408# Remove files not compatible with optimized build 409set(UX_OPTIMIZED_EXCLUDES 410 ux_device_class_rndis # buffer smaller than message size 411) 412if(CMAKE_BUILD_TYPE STREQUAL "optimized_build") 413 get_target_property(test_utility_SOURCES_LIST test_utility SOURCES) 414 get_target_property(SOURCES_LIST usbx SOURCES) 415 416 # Remove files not support STANDALONE yet 417 foreach(EXCLUDE_VAL ${UX_OPTIMIZED_EXCLUDES}) 418 list(FILTER test_utility_SOURCES_LIST EXCLUDE REGEX ".*${EXCLUDE_VAL}.*") 419 list(FILTER SOURCES_LIST EXCLUDE REGEX ".*${EXCLUDE_VAL}.*") 420 endforeach() 421 422 # Commit sources and includes changes 423 set_target_properties(test_utility PROPERTIES SOURCES "${test_utility_SOURCES_LIST}") 424 set_target_properties(usbx PROPERTIES SOURCES "${SOURCES_LIST}") 425endif() 426 427# Use generic port file for generic build. 428if(CMAKE_BUILD_TYPE STREQUAL "generic_build") 429 get_target_property(INCLUDES_LIST usbx INCLUDE_DIRECTORIES) 430 set(NEW_INCLUDES_LIST "") 431 foreach(INCLUDE_LIST ${INCLUDES_LIST}) 432 string(REPLACE "ports/linux/gnu" "ports/generic" INCLUDE_LIST ${INCLUDE_LIST}) 433 list(APPEND NEW_INCLUDES_LIST "${INCLUDE_LIST}") 434 endforeach() 435 set_target_properties(usbx PROPERTIES INCLUDE_DIRECTORIES "${NEW_INCLUDES_LIST}") 436endif()