1# - Copy/parse lua source files as a custom target
2#
3#  include(LuaTargets)
4#  add_lua_target(<target_name> <directory to copy to> [<luafile> <luafile>])
5#    Relative paths for the destination directory are considered with
6#    with respect to CMAKE_CURRENT_BINARY_DIR
7#
8#  install_lua_target(<target_name> [arguments to INSTALL(PROGRAMS ...) ])
9#
10# Set this variable to specify location of luac, if it is not a target:
11#  LUA_TARGET_LUAC_EXECUTABLE
12#
13# Requires CMake 2.6 or newer (uses the 'function' command)
14#
15# Original Author:
16# 2009-2010 Ryan Pavlik <rpavlik@iastate.edu> <abiryan@ryand.net>
17# http://academic.cleardefinition.com
18# Iowa State University HCI Graduate Program/VRAC
19#
20# Copyright Iowa State University 2009-2010.
21# Distributed under the Boost Software License, Version 1.0.
22# (See accompanying file LICENSE_1_0.txt or copy at
23# http://www.boost.org/LICENSE_1_0.txt)
24
25if(__add_lua)
26	return()
27endif()
28set(__add_lua YES)
29
30include(FileCopyTargets)
31
32function(add_lua_target _target _dest)
33
34	if(NOT ARGN)
35		message(WARNING
36			"In add_lua_target call for target ${_target}, no source files were specified!")
37		return()
38	endif()
39
40	if(NOT LUA_TARGET_LUAC_EXECUTABLE)
41		if(TARGET luac)
42			set(LUA_TARGET_LUAC_EXECUTABLE luac)
43			mark_as_advanced(LUA_TARGET_LUAC_EXECUTABLE)
44		else()
45			find_program(LUA_TARGET_LUAC_EXECUTABLE NAMES luac)
46		endif()
47	endif()
48
49	if(NOT LUA_TARGET_LUAC_EXECUTABLE)
50		message(FATAL_ERROR
51			"Can't find luac: please give LUA_TARGET_LUAC_EXECUTABLE a useful value - currently ${LUA_TARGET_LUAC_EXECUTABLE}")
52	endif()
53	mark_as_advanced(LUA_TARGET_LUAC_EXECUTABLE)
54
55	set(ALLFILES)
56	set(SOURCES)
57	foreach(fn ${ARGN})
58		# Produce an absolute path to the input file
59		if(IS_ABSOLUTE "${fn}")
60			get_filename_component(fullpath "${fn}" ABSOLUTE)
61			get_filename_component(fn "${fn}" NAME)
62		else()
63			get_filename_component(fullpath
64				"${CMAKE_CURRENT_SOURCE_DIR}/${fn}"
65				ABSOLUTE)
66		endif()
67
68		# Clean up output file name
69		get_filename_component(absout "${_dest}/${fn}" ABSOLUTE)
70
71		add_custom_command(OUTPUT "${absout}"
72			COMMAND
73			${CMAKE_COMMAND}
74			ARGS -E make_directory "${_dest}"
75			COMMAND
76			${CMAKE_COMMAND}
77			ARGS -E copy "${fullpath}" "${_dest}"
78			COMMAND
79			"${LUA_TARGET_LUAC_EXECUTABLE}"
80			ARGS -p "${fullpath}"
81			MAIN_DEPENDENCY "${fullpath}"
82			VERBATIM
83			COMMENT "Copying ${fn} to ${absout} and parsing...")
84		list(APPEND SOURCES "${fullpath}")
85		list(APPEND ALLFILES "${absout}")
86	endforeach()
87
88	# Custom target depending on all the file copy commands
89	add_custom_target(${_target}
90		SOURCES ${SOURCES}
91		DEPENDS ${ALLFILES})
92	if(TARGET "${LUA_TARGET_LUAC_EXECUTABLE}")
93		get_property(_luac_imported
94			TARGET
95			"${LUA_TARGET_LUAC_EXECUTABLE}"
96			PROPERTY
97			IMPORTED)
98		if(NOT _luac_imported)
99			add_dependencies(${_target} ${LUA_TARGET_LUAC_EXECUTABLE})
100		endif()
101	endif()
102
103	set_property(TARGET ${_target} PROPERTY FILE_COPY_TARGET YES)
104endfunction()
105
106function(install_lua_target)
107	install_file_copy_target(${ARGN})
108endfunction()
109