123 lines
3.9 KiB
CMake
123 lines
3.9 KiB
CMake
# Copyright (C) 2015-2016 Franklin "Snaipe" Mathieu.
|
|
# Redistribution and use of this file is allowed according to the terms of the MIT license.
|
|
# For details see the LICENSE file distributed with Criterion.
|
|
|
|
include(ExternalProject)
|
|
include(CMakeParseArguments)
|
|
|
|
function (cr_add_subproject _NAME)
|
|
set (options CMAKE AUTOTOOLS)
|
|
set (oneValueArgs GIT PATH PREFIX GENERATOR)
|
|
set (multiValueArgs OPTS IF)
|
|
cmake_parse_arguments (ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
|
|
|
if (ARGS_IF)
|
|
if (${ARGS_IF})
|
|
set (${_NAME}_SUBPROJECT_EXISTS 1 PARENT_SCOPE)
|
|
else ()
|
|
return ()
|
|
endif ()
|
|
else ()
|
|
set (${_NAME}_SUBPROJECT_EXISTS 1 PARENT_SCOPE)
|
|
endif ()
|
|
|
|
if (ARGS_PREFIX)
|
|
set (install_prefix ${CMAKE_BINARY_DIR}/external/${ARGS_PREFIX})
|
|
else ()
|
|
set (install_prefix ${CMAKE_BINARY_DIR}/external)
|
|
endif ()
|
|
|
|
if (ARGS_GIT)
|
|
string(REPLACE "#" ";" git_opts "${ARGS_GIT}")
|
|
list(LENGTH git_opts git_opts_len)
|
|
list(GET git_opts 0 repo)
|
|
set (epa_opts GIT_REPOSITORY "${repo}")
|
|
if (git_opts_len GREATER 1)
|
|
list(GET git_opts 1 object)
|
|
set (epa_opts ${epa_opts} GIT_TAG "${object}")
|
|
endif ()
|
|
elseif (ARGS_PATH)
|
|
set (epa_opts SOURCE_DIR "${CMAKE_SOURCE_DIR}/${ARGS_PATH}")
|
|
endif ()
|
|
|
|
if (ARGS_CMAKE)
|
|
if (NOT ARGS_GENERATOR)
|
|
set (ARGS_GENERATOR ${CMAKE_GENERATOR})
|
|
endif ()
|
|
if (CMAKE_TOOLCHAIN_FILE)
|
|
set (ARGS_OPTS ${ARGS_OPTS}
|
|
"-DCMAKE_SYSTEM_PROCESSOR=${CMAKE_SYSTEM_PROCESSOR}"
|
|
"-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}")
|
|
endif ()
|
|
set (build_cmds
|
|
CONFIGURE_COMMAND ${CMAKE_COMMAND} <SOURCE_DIR>
|
|
-DCMAKE_INSTALL_PREFIX=${install_prefix}
|
|
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
|
|
-G "${ARGS_GENERATOR}"
|
|
${ARGS_OPTS}
|
|
BUILD_COMMAND ${CMAKE_COMMAND} --build "${CMAKE_BINARY_DIR}/${_NAME}"
|
|
INSTALL_COMMAND ${CMAKE_COMMAND} --build "${CMAKE_BINARY_DIR}/${_NAME}" --target install
|
|
)
|
|
elseif (ARGS_AUTOTOOLS)
|
|
set (make_opts "")
|
|
if (ARGS_PARALLELIZED)
|
|
set (make_opts "${make_opts} -j4")
|
|
endif ()
|
|
set (build_cmds
|
|
UPDATE_COMMAND <SOURCE_DIR>/autogen.sh
|
|
CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=${install_prefix} ${ARGS_OPTS}
|
|
BUILD_COMMAND make ${make_opts}
|
|
INSTALL_COMMAND make install
|
|
)
|
|
endif ()
|
|
|
|
externalproject_add(
|
|
${_NAME}
|
|
${epa_opts}
|
|
|
|
PREFIX "${CMAKE_BINARY_DIR}/${_NAME}-build"
|
|
BINARY_DIR "${CMAKE_BINARY_DIR}/${_NAME}"
|
|
|
|
${build_cmds}
|
|
)
|
|
|
|
if (WIN32)
|
|
set ("${_NAME}_SHARED_LIB" "${install_prefix}/lib/${_NAME}.dll" PARENT_SCOPE)
|
|
if (ARGS_GENERATOR MATCHES "(Unix|MSYS|MinGW) Makefiles")
|
|
set ("${_NAME}_STATIC_LIB" "${install_prefix}/lib/lib${_NAME}.a" PARENT_SCOPE)
|
|
else ()
|
|
set ("${_NAME}_STATIC_LIB" "${install_prefix}/lib/${_NAME}.lib" PARENT_SCOPE)
|
|
endif ()
|
|
elseif (APPLE)
|
|
set ("${_NAME}_SHARED_LIB" "${install_prefix}/lib/lib${_NAME}.dylib" PARENT_SCOPE)
|
|
set ("${_NAME}_STATIC_LIB" "${install_prefix}/lib/lib${_NAME}.a" PARENT_SCOPE)
|
|
elseif (UNIX)
|
|
set ("${_NAME}_SHARED_LIB" "${install_prefix}/lib/lib${_NAME}.so" PARENT_SCOPE)
|
|
set ("${_NAME}_STATIC_LIB" "${install_prefix}/lib/lib${_NAME}.a" PARENT_SCOPE)
|
|
else ()
|
|
message (FATAL_ERROR "Could not set proper library path for the current platform")
|
|
endif ()
|
|
|
|
endfunction ()
|
|
|
|
function (cr_link_subproject _TARGET _SUBPROJECT)
|
|
if (NOT ${_SUBPROJECT}_SUBPROJECT_EXISTS)
|
|
return ()
|
|
endif ()
|
|
|
|
set (options STATIC SHARED)
|
|
cmake_parse_arguments (ARGS "${options}" "" "" ${ARGN})
|
|
|
|
add_dependencies("${_TARGET}" "${_SUBPROJECT}")
|
|
if (ARGS_SHARED)
|
|
target_link_libraries("${_TARGET}" "${${_SUBPROJECT}_SHARED_LIB}")
|
|
endif ()
|
|
if (ARGS_STATIC)
|
|
target_link_libraries("${_TARGET}" "${${_SUBPROJECT}_STATIC_LIB}")
|
|
endif ()
|
|
endfunction ()
|
|
|
|
include_directories(${CMAKE_BINARY_DIR}/external/include)
|
|
link_directories(${CMAKE_BINARY_DIR}/external/lib)
|
|
|
|
|