#
# Copyright (c) 2020-2021 Arm Limited. All rights reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the License); you may
# not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an AS IS BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

cmake_minimum_required(VERSION 3.0.2)

# Set the project name and version
project("linux_driver_stack" VERSION 1.0)

# Default options
option(BUILD_KERNEL "Build the kernel driver" ON)
option(BUILD_MAILBOX "Build the MHU mailbox kernel module" ON)
option(BUILD_REMOTEPROC "Build the remoteproc kernel module" ON)

# Add rpath to library directory
set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")

# Add include directory
include_directories("kernel")

# Add sub directories
if(BUILD_KERNEL)
    add_subdirectory(kernel)
endif()

if (BUILD_MAILBOX)
    add_subdirectory(mailbox)
endif()

if (BUILD_REMOTEPROC)
add_subdirectory(remoteproc)
endif()

# Build flatbuffers
unset(PROJECT_VERSION)
unset(PROJECT_VERSION_MAJOR)
unset(PROJECT_VERSION_MINOR)
option(FLATBUFFERS_BUILD_TESTS OFF)
option(FLATBUFFERS_INSTALL OFF)
option(FLATBUFFERS_BUILD_FLATC OFF)
option(FLATBUFFERS_BUILD_FLATHASH OFF)
add_subdirectory(flatbuffers)

# Build driver library
add_subdirectory(driver_library)

# Build utils
add_subdirectory(utils)
