117 строки
3.6 KiB
CMake
117 строки
3.6 KiB
CMake
cmake_minimum_required (VERSION 2.8.12)
|
|
|
|
set (CMAKE_MODULE_PATH
|
|
${CMAKE_CURRENT_SOURCE_DIR}/../cmake)
|
|
|
|
include (CMakeParseArguments)
|
|
|
|
# required Haskell components
|
|
find_package (Cabal 1.18.0.0 REQUIRED)
|
|
find_package (GHC 7.4.1.0 REQUIRED)
|
|
|
|
function (add_cabal_build target)
|
|
set (flagArgs ENABLE_TESTS)
|
|
set (multiValueArgs SOURCES DEPENDS)
|
|
cmake_parse_arguments (arg "${flagArgs}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
|
|
if (${arg_ENABLE_TESTS})
|
|
set (options --enable-tests)
|
|
endif()
|
|
add_custom_command (
|
|
DEPENDS ${arg_SOURCES}
|
|
COMMAND ${CMAKE_COMMAND}
|
|
${CMAKE_BINARY_DIR}
|
|
-N
|
|
-Dbuild_dir=${CMAKE_CURRENT_BINARY_DIR}
|
|
-Dtarget=${target}
|
|
-Dcabal_options=${options}
|
|
-P cabal_build.cmake
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/build/${target}/${target}${CMAKE_EXECUTABLE_SUFFIX})
|
|
add_custom_target (${target}
|
|
SOURCES ${arg_SOURCES}
|
|
DEPENDS ${arg_DEPENDS}
|
|
${CMAKE_CURRENT_BINARY_DIR}/build/${target}/${target}${CMAKE_EXECUTABLE_SUFFIX})
|
|
add_dependencies (${target} sandbox)
|
|
endfunction()
|
|
|
|
function (add_cabal_test target)
|
|
list (INSERT ${target} 0 EXCLUDE_FROM_ALL)
|
|
add_cabal_build (${ARGV} ENABLE_TESTS)
|
|
add_test (
|
|
NAME ${target}
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
COMMAND ${CMAKE_CURRENT_BINARY_DIR}/build/${target}/${target})
|
|
endfunction()
|
|
|
|
file (GLOB language_bond "src/Language/Bond/*.hs")
|
|
source_group ("Language\\Bond" FILES ${language_bond})
|
|
|
|
file (GLOB language_bond_syntax "src/Language/Bond/Syntax/*.hs")
|
|
source_group ("Language\\Bond\\Syntax" FILES ${language_bond_syntax})
|
|
|
|
file (GLOB language_bond_codegen "src/Language/Bond/Codegen/*.hs")
|
|
source_group ("Language\\Bond\\Codegen" FILES ${language_bond_codegen})
|
|
|
|
file (GLOB language_bond_codegen_cpp "src/Language/Bond/Codegen/Cpp/*.hs")
|
|
source_group ("Language\\Bond\\Codegen\\Cpp" FILES ${language_bond_codegen_cpp})
|
|
|
|
file (GLOB language_bond_codegen_cs "src/Language/Bond/Codegen/Cs/*.hs")
|
|
source_group ("Language\\Bond\\Codegen\\Cs" FILES ${language_bond_codegen_cs})
|
|
|
|
set (sources
|
|
bond.cabal
|
|
Main.hs
|
|
IO.hs
|
|
Options.hs
|
|
${language_bond}
|
|
${language_bond_syntax}
|
|
${language_bond_codegen}
|
|
${language_bond_codegen_cpp}
|
|
${language_bond_codegen_cs})
|
|
|
|
file (GLOB tests "tests/Tests/*.hs")
|
|
source_group ("Tests" FILES ${tests})
|
|
|
|
set (test_sources
|
|
tests/Main.hs
|
|
${tests})
|
|
|
|
set (completion_dir /etc/bash_completion.d)
|
|
set (completion ${CMAKE_CURRENT_BINARY_DIR}/gbc.comp)
|
|
set (output ${CMAKE_CURRENT_BINARY_DIR}/build/gbc/gbc${CMAKE_EXECUTABLE_SUFFIX})
|
|
set (GBC_EXECUTABLE ${output} PARENT_SCOPE)
|
|
|
|
add_custom_command (
|
|
COMMAND ${CMAKE_COMMAND}
|
|
${CMAKE_BINARY_DIR}
|
|
-N
|
|
-P sandbox_init.cmake
|
|
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
|
|
OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/cabal.sandbox.config)
|
|
|
|
add_custom_target (sandbox
|
|
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/cabal.sandbox.config)
|
|
|
|
add_custom_command (
|
|
DEPENDS ${output}
|
|
COMMAND ${output} --help=bash > ${completion}
|
|
OUTPUT ${completion})
|
|
|
|
add_cabal_build (gbc
|
|
DEPENDS sandbox ${completion}
|
|
SOURCES ${sources})
|
|
|
|
add_cabal_test (gbc-tests
|
|
DEPENDS gbc
|
|
SOURCES ${test_sources})
|
|
|
|
install (FILES ${output}
|
|
PERMISSIONS OWNER_EXECUTE GROUP_EXECUTE WORLD_EXECUTE
|
|
DESTINATION bin)
|
|
|
|
if(EXISTS "${completion_dir}" AND IS_DIRECTORY "${completion_dir}")
|
|
install (FILES ${completion}
|
|
RENAME gbc
|
|
DESTINATION ${completion_dir})
|
|
endif()
|