Skip to content

Instantly share code, notes, and snippets.

@keharriso
Created November 19, 2016 21:56
Show Gist options
  • Save keharriso/3b67f11e90bfcec815fce144cc7e9dc3 to your computer and use it in GitHub Desktop.
Save keharriso/3b67f11e90bfcec815fce144cc7e9dc3 to your computer and use it in GitHub Desktop.
CMake module for compiling Moonscript code
# FindMoonscript.cmake - Compile Moonscript as a custom target
# ------------------------------------------------------------------------------
# Provides:
#
# MOONSCRIPT_COMPILE_TARGET TARGET WORKING_DIRECTORY OUT_DIR FILES...
# TARGET - The name of the custom target
# WORKING_DIRECTORY - The working directory for the moonc command
# OUT_DIR - The directory to store compiled .lua files
# FILES... - The .moon files to compile (relative to WORKING_DIRECTORY)
#
# ------------------------------------------------------------------------------
# Copyright (c) Kevin Harrison 2016
# Released under the MIT License (https://opensource.org/licenses/MIT)
find_program(MOONSCRIPT_FOUND_moonc "moonc" PATHS ENV "PATH")
if (NOT MOONSCRIPT_FOUND_moonc)
message(FATAL_ERROR "Failed to find moonc in PATH")
endif (NOT MOONSCRIPT_FOUND_moonc)
function (MOONSCRIPT_COMPILE_TARGET TARGET WORKING_DIRECTORY OUT_DIR)
set(OUT "")
foreach (moon ${ARGN})
file(RELATIVE_PATH relative_bin "${CMAKE_BINARY_DIR}" "${WORKING_DIRECTORY}/${moon}")
file(RELATIVE_PATH relative_src "${CMAKE_SOURCE_DIR}" "${WORKING_DIRECTORY}/${moon}")
string(LENGTH "${relative_bin}" rel_bin_len)
string(LENGTH "${relative_src}" rel_src_len)
if ("${rel_bin_len}" GREATER "${rel_src_len}")
set(relative "${relative_src}")
else ("${rel_bin_len}" GREATER "${rel_src_len}")
set(relative "${relative_bin}")
endif ("${rel_bin_len}" GREATER "${rel_src_len}")
get_filename_component(dir "${moon}" DIRECTORY)
get_filename_component(name "${moon}" NAME_WE)
set(lua "${OUT_DIR}/${dir}/${name}.lua")
list(APPEND OUT "${lua}")
add_custom_command(
OUTPUT "${lua}"
COMMAND "${MOONSCRIPT_FOUND_moonc}" "-o" "${lua}" "${moon}"
DEPENDS "${WORKING_DIRECTORY}/${moon}"
WORKING_DIRECTORY "${WORKING_DIRECTORY}"
COMMENT "Compiling ${relative}")
endforeach (moon ${ARGN})
add_custom_target(
"${TARGET}"
ALL DEPENDS ${OUT})
endfunction (MOONSCRIPT_COMPILE_TARGET TARGET WORKING_DIRECTORY OUT_DIR)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment