advantage 0.1.0

Automatic Differentiation Toolkit
Documentation
cmake_minimum_required(VERSION 3.10)
project(advantage)

option(BUILD_TESTS "Build unit tests" ON)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED TRUE)

# Find dependencies
find_package(Threads REQUIRED)
find_package(Doxygen)

# Move cargo target directory to build dir
set(CARGO_TARGET_DIR ${PROJECT_BINARY_DIR}/target)

set(cargo_flags --features ffi)
if (CMAKE_BUILD_TYPE MATCHES DEBUG)
	set(cargo_library_path ${CARGO_TARGET_DIR}/debug/libadvantage.a)
else ()
	set(cargo_flags ${cargo_flags} --release)
	set(cargo_library_path ${CARGO_TARGET_DIR}/release/libadvantage.a)
endif ()

include(ExternalProject)
ExternalProject_add(advantage_rust
	SOURCE_DIR ${PROJECT_SOURCE_DIR}
	BUILD_IN_SOURCE TRUE
	BUILD_ALWAYS TRUE
	CONFIGURE_COMMAND ""
	BUILD_COMMAND CARGO_TARGET_DIR=${CARGO_TARGET_DIR} cargo +nightly build ${cargo_flags}
	TEST_COMMAND CARGO_TARGET_DIR=${CARGO_TARGET_DIR} cargo +nightly test ${cargo_flags}
	INSTALL_COMMAND ""
)

add_library(advantage SHARED
	src/Context.cpp
	src/Double.cpp
)
add_dependencies(advantage advantage_rust)
target_link_libraries(advantage PRIVATE
	${cargo_library_path}
	${CMAKE_DL_LIBS}
	Threads::Threads
)
target_include_directories(advantage PRIVATE
	${CARGO_TARGET_DIR}
)
target_include_directories(advantage PUBLIC
	${PROJECT_SOURCE_DIR}/include
)

if (BUILD_TESTS)
	enable_testing()
	find_package(GTest REQUIRED)
	add_subdirectory(tests)
endif ()

if (DOXYGEN_FOUND)
	doxygen_add_docs(doc include)
endif ()