mirror of
https://github.com/espressif/esp-idf.git
synced 2026-04-27 19:13:21 +00:00
0505ced81d
In CMake v2's recursive component evaluation model, when a component
triggers the inclusion of another component via idf_component_include(),
the child component's directory scope inherits variables from the
caller's scope chain through the idf_component_include() function scope
and add_subdirectory().
The vfs component's Linux target block used list(APPEND ...) without
first initializing the srcs, inc, and priv_inc variables. This was
harmless when vfs was evaluated before esp_stdio, but after commit
5fac0b7386 ("feat(console): Move IO initialization outside of the
console component"), esp_stdio became a real component for the Linux
target and started calling idf_component_include(vfs). When esp_stdio
is evaluated first, its srcs variable (containing stdio_port.c and
linux/esp_stdio_linux.c) leaks into vfs's scope, causing the build
to fail with "Cannot find source file: components/vfs/stdio_port.c".
Fix by explicitly initializing all local variables at the top of the
Linux target block before appending to them.
Signed-off-by: Frantisek Hrbata <frantisek.hrbata@espressif.com>
60 lines
2.0 KiB
CMake
60 lines
2.0 KiB
CMake
idf_build_get_property(target IDF_TARGET)
|
|
|
|
# On Linux, we only support a few features, hence this simple component registration
|
|
if(${target} STREQUAL "linux")
|
|
set(srcs)
|
|
set(inc)
|
|
set(priv_inc)
|
|
|
|
list(APPEND inc include)
|
|
if(CONFIG_VFS_SUPPORT_IO)
|
|
list(APPEND inc linux_include)
|
|
list(APPEND priv_inc private_include)
|
|
list(APPEND srcs "vfs_linux.c" "vfs.c" "vfs_calls.c")
|
|
endif()
|
|
|
|
if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Linux")
|
|
list(APPEND srcs "vfs_eventfd_linux.c")
|
|
endif()
|
|
|
|
idf_component_register(SRCS ${srcs}
|
|
LDFRAGMENTS "linker.lf"
|
|
INCLUDE_DIRS ${inc}
|
|
PRIV_INCLUDE_DIRS ${priv_inc})
|
|
return()
|
|
endif()
|
|
|
|
set(sources "")
|
|
|
|
# These are here to pull the misc stdio drivers into the build when using VFS
|
|
# This maintains the old behavior of just having to add vfs as a REQUIRES to enable
|
|
# the desired output driver. For the new cmake v2 build system this is no longer
|
|
# necessary as we can conditionally pull in dependencies.
|
|
|
|
list(APPEND pr esp_driver_uart esp_driver_usb_serial_jtag esp_usb_cdc_rom_console)
|
|
|
|
if(IDF_BUILD_V2)
|
|
# Clear driver dependencies in v2, these will be pulled in conditionally by stdio
|
|
set(pr "")
|
|
endif()
|
|
|
|
list(APPEND sources "vfs.c"
|
|
"vfs_calls.c"
|
|
"vfs_eventfd.c"
|
|
"vfs_semihost.c"
|
|
"nullfs.c"
|
|
)
|
|
|
|
idf_component_register(SRCS ${sources}
|
|
LDFRAGMENTS "linker.lf"
|
|
INCLUDE_DIRS include
|
|
PRIV_INCLUDE_DIRS private_include
|
|
PRIV_REQUIRES ${pr})
|
|
|
|
# Some libc syscalls are implemented in vfs.c, make sure these are always
|
|
# seen by the linker
|
|
target_link_libraries(${COMPONENT_LIB} INTERFACE "-u vfs_include_syscalls_impl")
|
|
|
|
# Make sure nullfs is registered
|
|
target_link_libraries(${COMPONENT_LIB} INTERFACE "-u esp_vfs_include_nullfs_register")
|