aboutsummaryrefslogtreecommitdiff
path: root/CMakeLists.txt
blob: 5046a0085328a2c0502833201ef8880e2d6a8964 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
cmake_minimum_required(VERSION 3.16)
project(montis LANGUAGES C)

option(MONTIS_BUILD_BUNDLED_WORLD "Build the bundled Haskell world (montis.so)" ON)
if(DEFINED MONTIS_BUILD_BUNDLED_PLUGIN)
  set(MONTIS_BUILD_BUNDLED_WORLD "${MONTIS_BUILD_BUNDLED_PLUGIN}")
endif()

add_subdirectory(ark)

add_subdirectory(cross)

if(MONTIS_BUILD_BUNDLED_WORLD)
  add_custom_target(
    world_build ALL
    COMMAND sh -c "if [ -d \"$1\" ] && [ ! -L \"$1\" ]; then rm -rf \"$2\"; mv \"$1\" \"$2\"; fi" sh "${CMAKE_SOURCE_DIR}/montis/.stack-work" "${CMAKE_BINARY_DIR}/stack-work"
    COMMAND "${CMAKE_COMMAND}" -E make_directory "${CMAKE_BINARY_DIR}/stack-work"
    COMMAND "${CMAKE_COMMAND}" -E create_symlink "${CMAKE_BINARY_DIR}/stack-work" "${CMAKE_SOURCE_DIR}/montis/.stack-work"
    COMMAND "${CMAKE_COMMAND}" -E chdir "${CMAKE_SOURCE_DIR}/montis" stack build
    # Not sure why stack is generating an a.out file, but remove it.
    COMMAND "${CMAKE_COMMAND}" -E rm -f "${CMAKE_SOURCE_DIR}/montis/a.out"
    DEPENDS ark cross
    COMMENT "Building bundled Haskell world with Stack"
    VERBATIM
  )

  add_custom_target(
    run
    COMMAND sh -c "WORLD_SO=$(find '${CMAKE_BINARY_DIR}/stack-work' -name montis.so -type f | head -n 1); if [ -z \"$WORLD_SO\" ]; then echo 'montis.so not found in ${CMAKE_BINARY_DIR}/stack-work' 1>&2; exit 1; fi; \"$<TARGET_FILE:ark>\" -s foot -p \"$WORLD_SO\""
    DEPENDS ark world_build
    USES_TERMINAL
    VERBATIM
  )
endif()


install(TARGETS ark RUNTIME DESTINATION bin)

if(MONTIS_BUILD_BUNDLED_WORLD)
  install(CODE [[
    execute_process(
      COMMAND sh -c "find '${CMAKE_BINARY_DIR}/stack-work' -name montis.so -type f | head -n 1"
      OUTPUT_VARIABLE _montis_so
      OUTPUT_STRIP_TRAILING_WHITESPACE
    )
    if(NOT _montis_so)
      message(FATAL_ERROR "montis.so not found in ${CMAKE_BINARY_DIR}/stack-work")
    endif()
    file(INSTALL DESTINATION "${CMAKE_INSTALL_PREFIX}/lib" TYPE FILE FILES "${_montis_so}")
  ]])
endif()