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; \"$\" -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()