cmake: ninja: Change how CMake names the kernelspace archives

The linker script places kernelspace and userspace archives in
different sections. But the linker script itself does not determine
what archives are in what space, that is done by CMake.

CMake passes the list of kernelspace archives to the linker script
through defines, like this:

-DNUM_KERNEL_OBJECT_FILES=3
-DKERNEL_OBJECT_FILE_0=path/to/archive_a.a
-DKERNEL_OBJECT_FILE_1=path/to/archive_b.a
-DKERNEL_OBJECT_FILE_2=path/to/archive_c.a

These paths are relative, and since Ninja and Make invoke the linker
with different "working directories"[0], the relative paths need to be
different. This patch rectifies the relative path when using Ninja.

This fixes #5343

[0] https://gitlab.kitware.com/cmake/cmake/issues/17448

Signed-off-by: Sebastian Bøe <sebastian.boe@nordicsemi.no>
This commit is contained in:
Sebastian Bøe 2018-01-02 15:54:16 +01:00 committed by Anas Nashif
parent a0b9129e85
commit 1c2de10c06
2 changed files with 13 additions and 3 deletions

View file

@ -475,7 +475,17 @@ if(CONFIG_APPLICATION_MEMORY)
string(SUBSTRING ${fixed_path} 1 -1 fixed_path)
endif()
list(APPEND ks "${fixed_path}lib${target_name}.a")
set(fixed_path "${fixed_path}lib${target_name}.a")
if(CMAKE_GENERATOR STREQUAL "Ninja")
# Ninja invokes the linker from the root of the build directory
# (APPLICATION_BINARY_DIR) instead of from the build/zephyr
# directory (PROJECT_BINARY_DIR). So for linker-defs.h to get
# the correct path we need to prefix with zephyr/.
set(fixed_path "zephyr/${fixed_path}")
endif()
list(APPEND ks ${fixed_path})
endforeach()
# We are done constructing kernel_object_file_list, now we inject this

View file

@ -115,8 +115,8 @@
archives like KBuild did.*/
#endif
#define X(i, j) KERNEL_OBJECT_FILE_##i (j)
#define Y(i, j) *KERNEL_OBJECT_FILE_##i
#define X(i, j) KERNEL_OBJECT_FILE_##i (j)
#define Y(i, j) KERNEL_OBJECT_FILE_##i
#define KERNEL_INPUT_SECTION(sect) \
UTIL_LISTIFY(NUM_KERNEL_OBJECT_FILES, X, sect)