seL4/libsel4/CMakeLists.txt
Adrian Danis 2a70716833 libsel4: Make guard and badge definitions mode specific
The definitions of guard and badge sizes is going to be changed for 64-bit platforms,
this change provides an easy way of providing different definitions
2017-10-27 12:15:09 +11:00

147 lines
6 KiB
CMake

#
# Copyright 2017, Data61
# Commonwealth Scientific and Industrial Research Organisation (CSIRO)
# ABN 41 687 119 230.
#
# This software may be distributed and modified according to the terms of
# the GNU General Public License version 2. Note that NO WARRANTY is provided.
# See "LICENSE_GPLv2.txt" for details.
#
# @TAG(DATA61_GPL)
#
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}"
)
# Add the include directory of autoconf.h to the cflags for the bitfield generation
set(extra_cflags "${extra_cflags} -I$<JOIN:$<TARGET_PROPERTY:sel4_autoconf,INTERFACE_INCLUDE_DIRECTORIES>;${source_header_dirs}, -I>")
function(genbf target_prefix pbf_location bf_location header_output)
get_generated_files(gen_list sel4_autoconf_Gen)
GenCPPCommand(
"${pbf_location}" "${bf_location}"
EXTRA_FLAGS "${extra_cflags} -P"
TARGET ${target_prefix}_pbf
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}/include/sel4/shared_types_${KernelWordSize}.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"
)
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 ${PYTHON} "${SYSCALL_ID_GEN_PATH}" --xml "${CMAKE_CURRENT_SOURCE_DIR}/include/api/syscall.xml"
--libsel4_header include/sel4/syscall.h
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 "${PYTHON}" "${SYSCALL_STUB_GEN_PATH}" ${buffer} -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_gen
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_gen)