Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(libs/dsm): adds dsm as a lib #208

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions libs/dsm/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
cmake_minimum_required(VERSION 2.6 FATAL_ERROR)
project("sharedmem-ebbrt" C CXX)

set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g3")
set(CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG")
set(CMAKE_CXX_FLAGS_RELEASE "-O4 -flto -DNDEBUG")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g3")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++14 -Wall -Werror")

set(HOSTED_SOURCES
src/sharedmem.h
src/RemoteMem.h
src/RemoteMem.cc
src/hosted/sharedmem.cc
src/hosted/Printer.cc)

set(BAREMETAL_SOURCES
src/sharedmem.h
src/RemoteMem.h
src/RemoteMem.cc
src/baremetal/sharedmem.cc
src/baremetal/Printer.cc)

# Baremetal ========================================================
if( ${CMAKE_SYSTEM_NAME} STREQUAL "EbbRT")
add_executable(sharedmem.elf ${BAREMETAL_SOURCES})
add_custom_command(TARGET sharedmem.elf POST_BUILD
COMMAND objcopy -O elf32-i386 sharedmem.elf sharedmem.elf32 )

# Hosted ===========================================================
elseif( ${CMAKE_SYSTEM_NAME} STREQUAL "Linux" )
find_package(EbbRT REQUIRED)
find_package(Boost 1.53.0 REQUIRED COMPONENTS
filesystem system coroutine context )
find_package(Capnp REQUIRED)
find_package(TBB REQUIRED)
find_package(Threads REQUIRED)

include_directories(${EBBRT_INCLUDE_DIRS})
add_executable(sharedmem ${HOSTED_SOURCES})
target_link_libraries(sharedmem ${EBBRT_LIBRARIES}
${CAPNP_LIBRARIES_LITE} ${CMAKE_THREAD_LIBS_INIT}
${Boost_LIBRARIES} ${TBB_LIBRARIES}
)
else()
message(FATAL_ERROR "System name unsupported: ${CMAKE_SYSTEM_NAME}")
endif()
90 changes: 90 additions & 0 deletions libs/dsm/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
MYDIR := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))

CD ?= cd
CMAKE ?= cmake
CP ?= cp
ECHO ?= echo
MAKE ?= make
MKDIR ?= mkdir

EBBRTSYSROOT ?= $(abspath $(EBBRT_SYSROOT))
CMAKE_TOOLCHAIN_FILE ?= $(EBBRTSYSROOT)/usr/misc/ebbrt.cmake
BAREMETAL_PREFIX_PATH= $(EBBRTSYSROOT)/usr/

BUILD_PATH ?= $(MYDIR)
DEBUG_PATH ?= $(BUILD_PATH)/Debug
RELEASE_PATH ?= $(BUILD_PATH)/Release
BAREMETAL_DEBUG_DIR ?= $(DEBUG_PATH)/bm
BAREMETAL_RELEASE_DIR ?= $(RELEASE_PATH)/bm
HOSTED_DEBUG_DIR ?= $(DEBUG_PATH)
HOSTED_RELEASE_DIR ?= $(RELEASE_PATH)

all: Debug Release
hosted: hosted-debug hosted-release
baremetal: baremetal-debug baremetal-release
Debug: baremetal-debug hosted-debug
Release: baremetal-release hosted-release

# ENVIRONMENT VARIABLES
check-ebbrt-sysroot:
ifndef EBBRT_SYSROOT
$(error EBBRT_SYSROOT is undefined)
endif

$(BUILD_PATH):
$(MKDIR) $@

$(DEBUG_PATH): | $(BUILD_PATH)
$(MKDIR) $@

$(RELEASE_PATH): | $(BUILD_PATH)
$(MKDIR) $@

ifneq ($(DEBUG_PATH), $(BAREMETAL_DEBUG_DIR))
$(BAREMETAL_DEBUG_DIR): | $(DEBUG_PATH)
$(MKDIR) $@
endif

ifneq ($(RELEASE_PATH), $(BAREMETAL_RELEASE_DIR))
$(BAREMETAL_RELEASE_DIR): | $(RELEASE_PATH)
$(MKDIR) $@
endif

ifneq ($(DEBUG_PATH), $(HOSTED_DEBUG_DIR))
$(HOSTED_DEBUG_DIR): | $(DEBUG_PATH)
$(MKDIR) $@
endif

ifneq ($(RELEASE_PATH), $(HOSTED_RELEASE_DIR))
$(HOSTED_RELEASE_DIR): | $(RELEASE_PATH)
$(MKDIR) $@
endif

baremetal-debug: | check-ebbrt-sysroot $(BAREMETAL_DEBUG_DIR)
$(CD) $(BAREMETAL_DEBUG_DIR) && \
EBBRT_SYSROOT=$(EBBRTSYSROOT) $(CMAKE) -DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_PREFIX_PATH=$(BAREMETAL_PREFIX_PATH) \
-DCMAKE_TOOLCHAIN_FILE=$(CMAKE_TOOLCHAIN_FILE) $(MYDIR) && $(MAKE)

baremetal-release: | check-ebbrt-sysroot $(BAREMETAL_RELEASE_DIR)
$(CD) $(BAREMETAL_RELEASE_DIR) && \
EBBRT_SYSROOT=$(EBBRTSYSROOT) $(CMAKE) -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_PREFIX_PATH=$(BAREMETAL_PREFIX_PATH) \
-DCMAKE_TOOLCHAIN_FILE=$(CMAKE_TOOLCHAIN_FILE) $(MYDIR) && \
$(MAKE)

hosted-debug: | $(HOSTED_DEBUG_DIR)
$(CD) $(HOSTED_DEBUG_DIR) && $(CMAKE) -DCMAKE_BUILD_TYPE=Debug \
$(MYDIR) && $(MAKE)

hosted-release: | $(HOSTED_RELEASE_DIR)
$(CD) $(HOSTED_RELEASE_DIR) && $(CMAKE) -DCMAKE_BUILD_TYPE=Release \
$(MYDIR) && $(MAKE)

clean:
$(MAKE) clean -C $(HOSTED_DEBUG_DIR) && \
$(MAKE) clean -C $(HOSTED_RELEASE_DIR) && \
$(MAKE) clean -C $(BAREMETAL_DEBUG_DIR) && \
$(MAKE) clean -C $(BAREMETAL_RELEASE_DIR)

.PHONY: Debug Release all clean baremetal baremetal-debug baremetal-release hosted hosted-debug hosted-release
186 changes: 186 additions & 0 deletions libs/dsm/cmake/FindCapnp.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,186 @@
#
# Finds the Cap'n Proto libraries, and compiles schema files.
#
# Configuration variables (optional):
# CAPNPC_OUTPUT_DIR
# Directory to place compiled schema sources (default: the same directory as the schema file).
# CAPNPC_IMPORT_DIRS
# List of additional include directories for the schema compiler.
# (CMAKE_CURRENT_SOURCE_DIR and CAPNP_INCLUDE_DIRS are always included.)
# CAPNPC_SRC_PREFIX
# Schema file source prefix (default: CMAKE_CURRENT_SOURCE_DIR).
# CAPNPC_FLAGS
# Additional flags to pass to the schema compiler.
#
# Variables that are discovered:
# CAPNP_EXECUTABLE
# Path to the `capnp` tool (can be set to override).
# CAPNPC_CXX_EXECUTABLE
# Path to the `capnpc-c++` tool (can be set to override).
# CAPNP_INCLUDE_DIRS
# Include directories for the library's headers (can be set to override).
# CANP_LIBRARIES
# The Cap'n Proto library paths.
# CAPNP_LIBRARIES_LITE
# Paths to only the 'lite' libraries.
# CAPNP_DEFINITIONS
# Compiler definitions required for building with the library.
# CAPNP_FOUND
# Set if the libraries have been located.
#
# Example usage:
#
# find_package(CapnProto REQUIRED)
# include_directories(${CAPNP_INCLUDE_DIRS})
# add_definitions(${CAPNP_DEFINITIONS})
#
# capnp_generate_cpp(CAPNP_SRCS CAPNP_HDRS schema.capnp)
# add_executable(a a.cc ${CAPNP_SRCS} ${CAPNP_HDRS})
# target_link_library(a ${CAPNP_LIBRARIES})
#
# For out-of-source builds:
#
# set(CAPNPC_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
# include_directories(${CAPNPC_OUTPUT_DIR})
# capnp_generate_cpp(...)
#

# CAPNP_GENERATE_CPP ===========================================================

function(CAPNP_GENERATE_CPP SOURCES HEADERS)
if(NOT ARGN)
message(SEND_ERROR "CAPNP_GENERATE_CPP() called without any source files.")
endif()
if(NOT CAPNP_EXECUTABLE)
message(SEND_ERROR "Could not locate capnp executable (CAPNP_EXECUTABLE).")
endif()
if(NOT CAPNPC_CXX_EXECUTABLE)
message(SEND_ERROR "Could not locate capnpc-c++ executable (CAPNPC_CXX_EXECUTABLE).")
endif()
if(NOT CAPNP_INCLUDE_DIRS)
message(SEND_ERROR "Could not locate capnp header files (CAPNP_INCLUDE_DIRS).")
endif()

# Default compiler includes
set(include_path -I ${CMAKE_CURRENT_SOURCE_DIR} -I ${CAPNP_INCLUDE_DIRS})

if(DEFINED CAPNPC_IMPORT_DIRS)
# Append each directory as a series of '-I' flags in ${include_path}
foreach(directory ${CAPNPC_IMPORT_DIRS})
get_filename_component(absolute_path "${directory}" ABSOLUTE)
list(APPEND include_path -I ${absolute_path})
endforeach()
endif()

if(DEFINED CAPNPC_OUTPUT_DIR)
# Prepend a ':' to get the format for the '-o' flag right
set(output_dir ":${CAPNPC_OUTPUT_DIR}")
else()
set(output_dir ":.")
endif()

if(NOT DEFINED CAPNPC_SRC_PREFIX)
set(CAPNPC_SRC_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}")
endif()
get_filename_component(CAPNPC_SRC_PREFIX "${CAPNPC_SRC_PREFIX}" ABSOLUTE)

set(${SOURCES})
set(${HEADERS})
foreach(schema_file ${ARGN})
get_filename_component(file_path "${schema_file}" ABSOLUTE)
get_filename_component(file_dir "${file_path}" PATH)

# Figure out where the output files will go
if (NOT DEFINED CAPNPC_OUTPUT_DIR)
set(output_base "${file_path}")
else()
# Output files are placed in CAPNPC_OUTPUT_DIR, at a location as if they were
# relative to CAPNPC_SRC_PREFIX.
string(LENGTH "${CAPNPC_SRC_PREFIX}" prefix_len)
string(SUBSTRING "${file_path}" 0 ${prefix_len} output_prefix)
if(NOT "${CAPNPC_SRC_PREFIX}" STREQUAL "${output_prefix}")
message(SEND_ERROR "Could not determine output path for '${schema_file}' ('${file_path}') with source prefix '${CAPNPC_SRC_PREFIX}' into '${CAPNPC_OUTPUT_DIR}'.")
endif()

string(SUBSTRING "${file_path}" ${prefix_len} -1 output_path)
set(output_base "${CAPNPC_OUTPUT_DIR}${output_path}")
endif()

add_custom_command(
OUTPUT "${output_base}.c++" "${output_base}.h"
COMMAND "${CAPNP_EXECUTABLE}"
ARGS compile
-o ${CAPNPC_CXX_EXECUTABLE}${output_dir}
--src-prefix ${CAPNPC_SRC_PREFIX}
${include_path}
${CAPNPC_FLAGS}
${file_path}
DEPENDS "${schema_file}"
COMMENT "Compiling Cap'n Proto schema ${schema_file}"
VERBATIM
)
list(APPEND ${SOURCES} "${output_base}.c++")
list(APPEND ${HEADERS} "${output_base}.h")
endforeach()

set_source_files_properties(${${SOURCES}} ${${HEADERS}} PROPERTIES GENERATED TRUE)
set(${SOURCES} ${${SOURCES}} PARENT_SCOPE)
set(${HEADERS} ${${HEADERS}} PARENT_SCOPE)
endfunction()

# Find Libraries/Paths =========================================================

find_library(CAPNP_LIB_KJ kj
)
find_library(CAPNP_LIB_KJ-ASYNC kj-async
)
find_library(CAPNP_LIB_CAPNP capnp
)
find_library(CAPNP_LIB_CAPNP-RPC capnp-rpc
)
find_library(CAPNP_LIB_CAPNP-JSON capnp-json
)
mark_as_advanced(CAPNP_LIB_KJ CAPNP_LIB_KJ-ASYNC CAPNP_LIB_CAPNP CAPNP_LIB_CAPNP-RPC CAPNP_LIB_CAPNP-JSON)
set(CAPNP_LIBRARIES_LITE
${CAPNP_LIB_CAPNP}
${CAPNP_LIB_KJ}
)
set(CAPNP_LIBRARIES
${CAPNP_LIB_CAPNP-JSON}
${CAPNP_LIB_CAPNP-RPC}
${CAPNP_LIB_CAPNP}
${CAPNP_LIB_KJ-ASYNC}
${CAPNP_LIB_KJ}
)

# Was only the 'lite' library found?
if(CAPNP_LIB_CAPNP AND NOT CAPNP_LIB_CAPNP-RPC)
set(CAPNP_DEFINITIONS -DCAPNP_LITE)
else()
set(CAPNP_DEFINITIONS)
endif()

find_path(CAPNP_INCLUDE_DIRS capnp/generated-header-support.h
HINTS "${PKGCONFIG_CAPNP_INCLUDEDIR}" ${PKGCONFIG_CAPNP_INCLUDE_DIRS}
)

find_program(CAPNP_EXECUTABLE
NAMES capnp
DOC "Cap'n Proto Command-line Tool"
HINTS "${PKGCONFIG_CAPNP_PREFIX}/bin"
)

find_program(CAPNPC_CXX_EXECUTABLE
NAMES capnpc-c++
DOC "Capn'n Proto C++ Compiler"
HINTS "${PKGCONFIG_CAPNP_PREFIX}/bin"
)

# Only *require* the include directory, libkj, and libcapnp. If compiling with
# CAPNP_LITE, nothing else will be found.
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(CAPNP DEFAULT_MSG
CAPNP_INCLUDE_DIRS
CAPNP_LIB_KJ
CAPNP_LIB_CAPNP
)
Loading