This commit also converts our own copyright headers to directly use SPDX, but leaves all other copyright header intact, only adding the SPDX ident. As far as possible this commit also merges multiple Data61 copyright statements/headers into one for consistency.
181 lines
6.1 KiB
CMake
181 lines
6.1 KiB
CMake
#
|
|
# Copyright 2020, Data61, CSIRO (ABN 41 687 119 230)
|
|
#
|
|
# SPDX-License-Identifier: GPL-2.0-only
|
|
#
|
|
|
|
cmake_minimum_required(VERSION 3.7.2)
|
|
|
|
project(libsel4 C)
|
|
|
|
set(configure_string "")
|
|
|
|
config_choice(
|
|
LibSel4FunctionAttributes
|
|
LIB_SEL4_FUNCTION_ATTRIBUTE
|
|
"Function attributes \
|
|
default->Verification friendly default configuration. syscalls will be inlined, \
|
|
but generated functions will not. \
|
|
inline->When set to true will mark generated functions as 'inline', allowing \
|
|
them to be inlined by the callee user code. This may be undesirable \
|
|
for verification, so setting to 'n' will forcibly prevent the function \
|
|
from being inlined. \
|
|
public->When set to true will make all user facing functions available as \
|
|
public symbols, which can be convenient for some language bindings."
|
|
"inline;LibSel4FunctionAttributeInline;LIB_SEL4_INLINE_INVOCATIONS"
|
|
"default;LibSel4FunctionAttributeDefault;LIB_SEL4_DEFAULT_FUNCTION_ATTRIBUTES"
|
|
"public;LibSel4FunctionAttributePublic;LIB_SEL4_PUBLIC_SYMBOLS"
|
|
)
|
|
|
|
config_option(
|
|
LibSel4StubsUseIPCBufferOnly LIB_SEL4_STUBS_USE_IPC_BUFFER_ONLY
|
|
"use only IPC buffer for syscalls. When generating syscall wrappers, only use the \
|
|
IPC buffer for marshalling and unmarshalling arguments. Without this option set, \
|
|
arguments will be passed in registers where possible for better performance."
|
|
DEFAULT OFF
|
|
)
|
|
|
|
if(LibSel4StubsUseIPCBufferOnly)
|
|
set(buffer "--buffer")
|
|
endif()
|
|
|
|
RequireFile(SYSCALL_STUB_GEN_PATH syscall_stub_gen.py PATHS tools)
|
|
|
|
add_config_library(sel4 "${configure_string}")
|
|
|
|
# Currently we use autoconf.h, so generate one of those
|
|
generate_autoconf(sel4_autoconf "kernel;sel4")
|
|
|
|
gen_invocation_header(OUTPUT include/sel4/invocation.h XML include/interfaces/sel4.xml LIBSEL4)
|
|
|
|
gen_invocation_header(
|
|
OUTPUT sel4_arch_include/${KernelSel4Arch}/sel4/sel4_arch/invocation.h
|
|
XML "${CMAKE_CURRENT_SOURCE_DIR}/sel4_arch_include/${KernelSel4Arch}/interfaces/sel4arch.xml"
|
|
LIBSEL4 SEL4ARCH
|
|
)
|
|
|
|
gen_invocation_header(
|
|
OUTPUT arch_include/${KernelArch}/sel4/arch/invocation.h
|
|
XML "${CMAKE_CURRENT_SOURCE_DIR}/arch_include/${KernelArch}/interfaces/sel4arch.xml"
|
|
LIBSEL4 ARCH
|
|
)
|
|
|
|
set(
|
|
source_header_dirs
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/include"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/arch_include/${KernelArch}"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/sel4_arch_include/${KernelSel4Arch}"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/sel4_plat_include/${KernelPlatform}"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/mode_include/${KernelWordSize}"
|
|
)
|
|
include_directories("${source_header_dirs}")
|
|
|
|
# Add the include directory of autoconf.h to the cflags for the bitfield generation
|
|
include_directories("$<TARGET_PROPERTY:sel4_autoconf,INTERFACE_INCLUDE_DIRECTORIES>")
|
|
|
|
function(genbf target_prefix pbf_location bf_location header_output)
|
|
get_generated_files(gen_list sel4_autoconf_Gen)
|
|
cppfile(
|
|
"${pbf_location}"
|
|
${target_prefix}_pbf
|
|
"${bf_location}"
|
|
EXTRA_FLAGS
|
|
-P
|
|
EXTRA_DEPS
|
|
sel4_autoconf_Gen
|
|
${gen_list}
|
|
)
|
|
GenHBFTarget(
|
|
"libsel4"
|
|
${target_prefix}_h
|
|
"${header_output}"
|
|
"${pbf_location}"
|
|
${target_prefix}_pbf
|
|
""
|
|
""
|
|
)
|
|
endfunction(genbf)
|
|
|
|
genbf(
|
|
"libsel4_shared_types_gen"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/generated/shared_types_gen/shared_types.pbf"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/mode_include/${KernelWordSize}/sel4/shared_types.bf"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/include/sel4/shared_types_gen.h"
|
|
)
|
|
|
|
genbf(
|
|
"libsel4_sel4_arch_types_gen"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/generated/sel4_arch_shared_types/types.pbf"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/sel4_arch_include/${KernelSel4Arch}/sel4/sel4_arch/types.bf"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/sel4_arch_include/${KernelSel4Arch}/sel4/sel4_arch/types_gen.h"
|
|
)
|
|
|
|
if(KernelIsMCS)
|
|
set(mcs --mcs)
|
|
endif()
|
|
add_custom_command(
|
|
OUTPUT include/sel4/syscall.h
|
|
COMMAND rm -f include/sel4/syscall.h
|
|
COMMAND
|
|
"${XMLLINT_PATH}"
|
|
--noout
|
|
--schema
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/include/api/syscall.xsd"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/include/api/syscall.xml"
|
|
COMMAND
|
|
${PYTHON3} "${SYSCALL_ID_GEN_PATH}"
|
|
--xml "${CMAKE_CURRENT_SOURCE_DIR}/include/api/syscall.xml"
|
|
--libsel4_header include/sel4/syscall.h ${mcs}
|
|
DEPENDS
|
|
"${SYSCALL_ID_GEN_PATH}" "${CMAKE_CURRENT_SOURCE_DIR}/include/api/syscall.xsd"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/include/api/syscall.xml"
|
|
COMMENT "Generate syscall.h"
|
|
VERBATIM
|
|
)
|
|
|
|
set(
|
|
interface_xmls
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/sel4_arch_include/${KernelSel4Arch}/interfaces/sel4arch.xml"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/arch_include/${KernelArch}/interfaces/sel4arch.xml"
|
|
"${CMAKE_CURRENT_SOURCE_DIR}/include/interfaces/sel4.xml"
|
|
)
|
|
add_custom_command(
|
|
OUTPUT include/interfaces/sel4_client.h
|
|
COMMAND rm -f include/interfaces/sel4_client.h
|
|
COMMAND
|
|
echo "CONFIG_WORD_SIZE=${KernelWordSize}" > config
|
|
COMMAND
|
|
"${PYTHON3}" "${SYSCALL_STUB_GEN_PATH}" ${buffer} ${mcs} -a "${KernelSel4Arch}" -c config -o
|
|
include/interfaces/sel4_client.h ${interface_xmls}
|
|
DEPENDS
|
|
"${SYSCALL_STUB_GEN_PATH}"
|
|
${interface_xmls}
|
|
BYPRODUCTS
|
|
config
|
|
COMMENT "Generate sel4_client.h"
|
|
VERBATIM
|
|
)
|
|
|
|
add_custom_target(
|
|
sel4_generated
|
|
DEPENDS
|
|
include/interfaces/sel4_client.h
|
|
include/sel4/syscall.h
|
|
include/sel4/invocation.h
|
|
arch_include/${KernelArch}/sel4/arch/invocation.h
|
|
include/sel4/shared_types_gen.h
|
|
sel4_arch_include/${KernelSel4Arch}/sel4/sel4_arch/invocation.h
|
|
sel4_arch_include/${KernelSel4Arch}/sel4/sel4_arch/types_gen.h
|
|
)
|
|
|
|
add_library(sel4 src/sel4_bootinfo.c)
|
|
target_link_libraries(sel4 PRIVATE kernel_Config sel4_Config sel4_autoconf)
|
|
target_include_directories(
|
|
sel4
|
|
PUBLIC
|
|
${source_header_dirs}
|
|
"${CMAKE_CURRENT_BINARY_DIR}/include"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/arch_include/${KernelArch}"
|
|
"${CMAKE_CURRENT_BINARY_DIR}/sel4_arch_include/${KernelSel4Arch}"
|
|
)
|
|
add_dependencies(sel4 sel4_generated)
|