668 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			CMake
		
	
	
	
	
	
			
		
		
	
	
			668 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			CMake
		
	
	
	
	
	
| cmake_minimum_required(VERSION 3.5)
 | |
| 
 | |
| if(NOT SCRIPT_API_SOURCE_FILE)
 | |
|     message(FATAL_ERROR "Script needs SCRIPT_API_SOURCE_FILE defined")
 | |
| endif()
 | |
| if(NOT SCRIPT_API_BINARY_FILE)
 | |
|     message(FATAL_ERROR "Script needs SCRIPT_API_BINARY_FILE defined")
 | |
| endif()
 | |
| if(NOT SCRIPT_API_FILE)
 | |
|     message(FATAL_ERROR "Script needs SCRIPT_API_FILE defined")
 | |
| endif()
 | |
| if(NOT APIUC)
 | |
|     message(FATAL_ERROR "Script needs APIUC defined")
 | |
| endif()
 | |
| if(NOT APILC)
 | |
|     message(FATAL_ERROR "Script needs APILC defined")
 | |
| endif()
 | |
| 
 | |
| macro(dump_fileheader)
 | |
|     get_filename_component(SCRIPT_API_FILE_NAME "${SCRIPT_API_FILE}" NAME)
 | |
|     string(APPEND SQUIRREL_EXPORT "\n#include \"../${SCRIPT_API_FILE_NAME}\"")
 | |
|     if(NOT "${APIUC}" STREQUAL "Template")
 | |
|         string(REPLACE "script_" "template_" SCRIPT_API_FILE_NAME "${SCRIPT_API_FILE_NAME}")
 | |
|         string(APPEND SQUIRREL_EXPORT "\n#include \"../template/${SCRIPT_API_FILE_NAME}.sq\"")
 | |
|     endif()
 | |
| endmacro()
 | |
| 
 | |
| macro(dump_class_templates NAME)
 | |
|     string(REGEX REPLACE "^Script" "" REALNAME ${NAME})
 | |
| 
 | |
|     string(APPEND SQUIRREL_EXPORT "\n	template <> inline ${NAME} *GetParam(ForceType<${NAME} *>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return  (${NAME} *)instance; }")
 | |
|     string(APPEND SQUIRREL_EXPORT "\n	template <> inline ${NAME} &GetParam(ForceType<${NAME} &>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(${NAME} *)instance; }")
 | |
|     string(APPEND SQUIRREL_EXPORT "\n	template <> inline const ${NAME} *GetParam(ForceType<const ${NAME} *>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return  (${NAME} *)instance; }")
 | |
|     string(APPEND SQUIRREL_EXPORT "\n	template <> inline const ${NAME} &GetParam(ForceType<const ${NAME} &>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQUserPointer instance; sq_getinstanceup(vm, index, &instance, 0); return *(${NAME} *)instance; }")
 | |
|     if("${NAME}" STREQUAL "ScriptEvent")
 | |
|         string(APPEND SQUIRREL_EXPORT "\n	template <> inline int Return<${NAME} *>(HSQUIRRELVM vm, ${NAME} *res) { if (res == nullptr) { sq_pushnull(vm); return 1; } Squirrel::CreateClassInstanceVM(vm, \"${REALNAME}\", res, nullptr, DefSQDestructorCallback<${NAME}>, true); return 1; }")
 | |
|     elseif("${NAME}" STREQUAL "ScriptText")
 | |
|         string(APPEND SQUIRREL_EXPORT "\n")
 | |
|         string(APPEND SQUIRREL_EXPORT "\n	template <> inline Text *GetParam(ForceType<Text *>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) {")
 | |
|         string(APPEND SQUIRREL_EXPORT "\n		if (sq_gettype(vm, index) == OT_INSTANCE) {")
 | |
|         string(APPEND SQUIRREL_EXPORT "\n			return GetParam(ForceType<ScriptText *>(), vm, index, ptr);")
 | |
|         string(APPEND SQUIRREL_EXPORT "\n		}")
 | |
|         string(APPEND SQUIRREL_EXPORT "\n		if (sq_gettype(vm, index) == OT_STRING) {")
 | |
|         string(APPEND SQUIRREL_EXPORT "\n			return new RawText(GetParam(ForceType<const char *>(), vm, index, ptr));")
 | |
|         string(APPEND SQUIRREL_EXPORT "\n		}")
 | |
|         string(APPEND SQUIRREL_EXPORT "\n		return nullptr;")
 | |
|         string(APPEND SQUIRREL_EXPORT "\n	}")
 | |
|     else()
 | |
|         string(APPEND SQUIRREL_EXPORT "\n	template <> inline int Return<${NAME} *>(HSQUIRRELVM vm, ${NAME} *res) { if (res == nullptr) { sq_pushnull(vm); return 1; } res->AddRef(); Squirrel::CreateClassInstanceVM(vm, \"${REALNAME}\", res, nullptr, DefSQDestructorCallback<${NAME}>, true); return 1; }")
 | |
|     endif()
 | |
| endmacro()
 | |
| 
 | |
| macro(reset_reader)
 | |
|     unset(ENUMS)
 | |
|     unset(ENUM_VALUES)
 | |
|     unset(CONST_VALUES)
 | |
|     unset(STRUCTS)
 | |
|     unset(ENUM_STRING_TO_ERRORS)
 | |
|     unset(ENUM_ERROR_TO_STRINGS)
 | |
|     unset(METHODS)
 | |
|     unset(STATIC_METHODS)
 | |
|     unset(CLS)
 | |
|     unset(START_SQUIRREL_DEFINE_ON_NEXT_LINE)
 | |
|     set(CLS_LEVEL 0)
 | |
|     unset(CLS_IN_API)
 | |
| endmacro()
 | |
| 
 | |
| reset_reader()
 | |
| 
 | |
| file(STRINGS "${SCRIPT_API_FILE}" SOURCE_LINES)
 | |
| 
 | |
| foreach(LINE IN LISTS SOURCE_LINES)
 | |
|     # Ignore special doxygen blocks
 | |
|     if("${LINE}" MATCHES "^#ifndef DOXYGEN_API")
 | |
|         set(DOXYGEN_SKIP "next")
 | |
|         continue()
 | |
|     endif()
 | |
|     if("${LINE}" MATCHES "^#ifdef DOXYGEN_API")
 | |
|         set(DOXYGEN_SKIP "true")
 | |
|         continue()
 | |
|     endif()
 | |
|     if("${LINE}" MATCHES "^#endif /\\* DOXYGEN_API \\*/")
 | |
|         unset(DOXYGEN_SKIP)
 | |
|         continue()
 | |
|     endif()
 | |
|     if("${LINE}" MATCHES "^#else")
 | |
|         if("${DOXYGEN_SKIP}" STREQUAL "next")
 | |
|             set(DOXYGEN_SKIP "true")
 | |
|         else()
 | |
|             unset(DOXYGEN_SKIP)
 | |
|         endif()
 | |
|         continue()
 | |
|     endif()
 | |
|     if("${DOXYGEN_SKIP}" STREQUAL "true")
 | |
|         continue()
 | |
|     endif()
 | |
| 
 | |
|     if("${LINE}" MATCHES "^([	 ]*)\\* @api (.*)$")
 | |
|         set(LINE ${CMAKE_MATCH_2})
 | |
|         # By default, classes are not selected
 | |
|         if(NOT CLS_LEVEL)
 | |
|             set(API_SELECTED FALSE)
 | |
|         endif()
 | |
| 
 | |
|         if("${APIUC}" STREQUAL "Template")
 | |
|             set(API_SELECTED TRUE)
 | |
|             if("${LINE}" STREQUAL "none" OR "${LINE}" STREQUAL "-all")
 | |
|                 set(API_SELECTED FALSE)
 | |
|             endif()
 | |
|             continue()
 | |
|         endif()
 | |
| 
 | |
|         if("${LINE}" STREQUAL "none" OR "${LINE}" STREQUAL "-all")
 | |
|             set(API_SELECTED FALSE)
 | |
|         elseif("${LINE}" MATCHES "-${APILC}")
 | |
|             set(API_SELECTED FALSE)
 | |
|         elseif("${LINE}" MATCHES "${APILC}")
 | |
|             set(API_SELECTED TRUE)
 | |
|         endif()
 | |
|         continue()
 | |
|     endif()
 | |
| 
 | |
|     # Remove the old squirrel stuff
 | |
|     if("${LINE}" MATCHES "#ifdef DEFINE_SQUIRREL_CLASS")
 | |
|         set(SQUIRREL_STUFF TRUE)
 | |
|         continue()
 | |
|     endif()
 | |
|     if("${LINE}" MATCHES "^#endif /\\* DEFINE_SQUIRREL_CLASS \\*/")
 | |
|         unset(SQUIRREL_STUFF)
 | |
|         continue()
 | |
|     endif()
 | |
|     if(SQUIRREL_STUFF)
 | |
|         continue()
 | |
|     endif()
 | |
| 
 | |
|     # Ignore forward declarations of classes
 | |
|     if("${LINE}" MATCHES "^(	*)class(.*);")
 | |
|         continue()
 | |
|     endif()
 | |
| 
 | |
|     # We only want to have public functions exported for now
 | |
|     if("${LINE}" MATCHES "^(	*)class (.*) (: public|: protected|: private|:) ([^ ]*)")
 | |
|         if(NOT CLS_LEVEL)
 | |
|             if(NOT DEFINED API_SELECTED)
 | |
|                 message(WARNING "Class '${CMAKE_MATCH_2}' has no @api. It won't be published to any API.")
 | |
|                 set(API_SELECTED FALSE)
 | |
|             endif()
 | |
|             unset(IS_PUBLIC)
 | |
|             unset(CLS_PARAM_0)
 | |
|             set(CLS_PARAM_1 1)
 | |
|             set(CLS_PARAM_2 "x")
 | |
|             set(CLS_IN_API ${API_SELECTED})
 | |
|             unset(API_SELECTED)
 | |
|             set(CLS "${CMAKE_MATCH_2}")
 | |
|             set(SUPER_CLS "${CMAKE_MATCH_4}")
 | |
|         elseif(CLS_LEVEL EQUAL 1)
 | |
|             if(NOT DEFINED API_SELECTED)
 | |
|                 set(API_SELECTED ${CLS_IN_API})
 | |
|             endif()
 | |
| 
 | |
|             if(API_SELECTED)
 | |
|                 list(APPEND STRUCTS "${CLS}::${CMAKE_MATCH_2}")
 | |
|             endif()
 | |
|             unset(API_SELECTED)
 | |
|         endif()
 | |
|         math(EXPR CLS_LEVEL "${CLS_LEVEL} + 1")
 | |
|         continue()
 | |
|     endif()
 | |
|     if("${LINE}" MATCHES "^(	*)public")
 | |
|         if(CLS_LEVEL EQUAL 1)
 | |
|             set(IS_PUBLIC TRUE)
 | |
|         endif()
 | |
|         continue()
 | |
|     endif()
 | |
|     if("${LINE}" MATCHES "^(	*)protected")
 | |
|         if(CLS_LEVEL EQUAL 1)
 | |
|             unset(IS_PUBLIC)
 | |
|         endif()
 | |
|         continue()
 | |
|     endif()
 | |
|     if("${LINE}" MATCHES "^(	*)private")
 | |
|         if(CLS_LEVEL EQUAL 1)
 | |
|             unset(IS_PUBLIC)
 | |
|         endif()
 | |
|         continue()
 | |
|     endif()
 | |
| 
 | |
|     # Ignore the comments
 | |
|     if("${LINE}" MATCHES "^#")
 | |
|         continue()
 | |
|     endif()
 | |
|     if("${LINE}" MATCHES "/\\*.*\\*/")
 | |
|         unset(COMMENT)
 | |
|         continue()
 | |
|     endif()
 | |
|     if("${LINE}" MATCHES "/\\*")
 | |
|         set(COMMENT TRUE)
 | |
|         continue()
 | |
|     endif()
 | |
|     if("${LINE}" MATCHES "\\*/")
 | |
|         unset(COMMENT)
 | |
|         continue()
 | |
|     endif()
 | |
|     if(COMMENT)
 | |
|         continue()
 | |
|     endif()
 | |
| 
 | |
|     # We need to make specialized conversions for structs
 | |
|     if("${LINE}" MATCHES "^(	*)struct ([^ ]*)")
 | |
|         math(EXPR CLS_LEVEL "${CLS_LEVEL} + 1")
 | |
| 
 | |
|         # Check if we want to publish this struct
 | |
|         if(NOT DEFINED API_SELECTED)
 | |
|             set(API_SELECTED ${CLS_IN_API})
 | |
|         endif()
 | |
|         if(NOT API_SELECTED)
 | |
|             unset(API_SELECTED)
 | |
|             continue()
 | |
|         endif()
 | |
|         unset(API_SELECTED)
 | |
| 
 | |
|         if(NOT IS_PUBLIC OR NOT CLS_LEVEL EQUAL 1)
 | |
|             continue()
 | |
|         endif()
 | |
| 
 | |
|         list(APPEND STRUCTS "${CLS}::${CMAKE_MATCH_2}")
 | |
|         continue()
 | |
|     endif()
 | |
| 
 | |
|     # We need to make specialized conversions for enums
 | |
|     if("${LINE}" MATCHES "^(	*)enum ([^ ]*)")
 | |
|         math(EXPR CLS_LEVEL "${CLS_LEVEL} + 1")
 | |
| 
 | |
|         # Check if we want to publish this enum
 | |
|         if(NOT DEFINED API_SELECTED)
 | |
|             set(API_SELECTED ${CLS_IN_API})
 | |
|         endif()
 | |
|         if(NOT API_SELECTED)
 | |
|             unset(API_SELECTED)
 | |
|             continue()
 | |
|         endif()
 | |
|         unset(API_SELECTED)
 | |
| 
 | |
|         if(NOT IS_PUBLIC)
 | |
|             continue()
 | |
|         endif()
 | |
| 
 | |
|         set(IN_ENUM TRUE)
 | |
|         list(APPEND ENUMS "${CLS}::${CMAKE_MATCH_2}")
 | |
|         continue()
 | |
|     endif()
 | |
| 
 | |
|     # Maybe the end of the class, if so we can start with the Squirrel export pretty soon
 | |
|     if("${LINE}" MATCHES "};")
 | |
|         math(EXPR CLS_LEVEL "${CLS_LEVEL} - 1")
 | |
|         if(CLS_LEVEL)
 | |
|             unset(IN_ENUM)
 | |
|             continue()
 | |
|         endif()
 | |
| 
 | |
|         if(CLS)
 | |
|             set(START_SQUIRREL_DEFINE_ON_NEXT_LINE TRUE)
 | |
|         endif()
 | |
|         continue()
 | |
|     endif()
 | |
| 
 | |
|     # Empty/white lines. When we may do the Squirrel export, do that export.
 | |
|     if("${LINE}" MATCHES "^([ 	]*)$")
 | |
|         if(NOT START_SQUIRREL_DEFINE_ON_NEXT_LINE)
 | |
|             continue()
 | |
|         endif()
 | |
| 
 | |
|         if(NOT CLS_IN_API)
 | |
|             reset_reader()
 | |
|             continue()
 | |
|         endif()
 | |
| 
 | |
|         if(NOT HAS_FILEHEADER)
 | |
|             dump_fileheader()
 | |
|             set(HAS_FILEHEADER TRUE)
 | |
|         endif()
 | |
| 
 | |
|         unset(IS_PUBLIC)
 | |
|         unset(NAMESPACE_OPENED)
 | |
| 
 | |
|         string(REGEX REPLACE "^Script" "${APIUC}" API_CLS "${CLS}")
 | |
|         string(REGEX REPLACE "^Script" "${APIUC}" API_SUPER_CLS "${SUPER_CLS}")
 | |
| 
 | |
|         string(APPEND SQUIRREL_EXPORT "\n")
 | |
| 
 | |
|         if("${APIUC}" STREQUAL "Template")
 | |
|             # First check whether we have enums to print
 | |
|             if(DEFINED ENUMS)
 | |
|                 if(NOT NAMESPACE_OPENED)
 | |
|                     string(APPEND SQUIRREL_EXPORT "\nnamespace SQConvert {")
 | |
|                     set(NAMESPACE_OPENED TRUE)
 | |
|                 endif()
 | |
|                 string(APPEND SQUIRREL_EXPORT "\n	/* Allow enums to be used as Squirrel parameters */")
 | |
|                 foreach(ENUM IN LISTS ENUMS)
 | |
|                     string(APPEND SQUIRREL_EXPORT "\n	template <> inline ${ENUM} GetParam(ForceType<${ENUM}>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (${ENUM})tmp; }")
 | |
|                     string(APPEND SQUIRREL_EXPORT "\n	template <> inline int Return<${ENUM}>(HSQUIRRELVM vm, ${ENUM} res) { sq_pushinteger(vm, (int32)res); return 1; }")
 | |
|                 endforeach()
 | |
|             endif()
 | |
| 
 | |
|             # Then check whether we have structs/classes to print
 | |
|             if(DEFINED STRUCTS)
 | |
|                 if(NOT NAMESPACE_OPENED)
 | |
|                     string(APPEND SQUIRREL_EXPORT "\nnamespace SQConvert {")
 | |
|                     set(NAMESPACE_OPENED TRUE)
 | |
|                 endif()
 | |
|                 string(APPEND SQUIRREL_EXPORT "\n	/* Allow inner classes/structs to be used as Squirrel parameters */")
 | |
|                 foreach(STRUCT IN LISTS STRUCTS)
 | |
|                     dump_class_templates(${STRUCT})
 | |
|                 endforeach()
 | |
|             endif()
 | |
| 
 | |
|             if(NOT NAMESPACE_OPENED)
 | |
|                 string(APPEND SQUIRREL_EXPORT "\nnamespace SQConvert {")
 | |
|                 set(NAMESPACE_OPENED TRUE)
 | |
|             else()
 | |
|                 string(APPEND SQUIRREL_EXPORT "\n")
 | |
|             endif()
 | |
|             string(APPEND SQUIRREL_EXPORT "\n	/* Allow ${CLS} to be used as Squirrel parameter */")
 | |
|             dump_class_templates(${CLS})
 | |
| 
 | |
|             string(APPEND SQUIRREL_EXPORT "\n} // namespace SQConvert")
 | |
| 
 | |
|             reset_reader()
 | |
|             continue()
 | |
|         endif()
 | |
| 
 | |
|         string(APPEND SQUIRREL_EXPORT "\n")
 | |
|         string(APPEND SQUIRREL_EXPORT "\ntemplate <> const char *GetClassName<${CLS}, ST_${APIUC}>() { return \"${API_CLS}\"; }")
 | |
|         string(APPEND SQUIRREL_EXPORT "\n")
 | |
| 
 | |
|         # Then do the registration functions of the class.
 | |
|         string(APPEND SQUIRREL_EXPORT "\nvoid SQ${API_CLS}_Register(Squirrel *engine)")
 | |
|         string(APPEND SQUIRREL_EXPORT "\n{")
 | |
|         string(APPEND SQUIRREL_EXPORT "\n	DefSQClass<${CLS}, ST_${APIUC}> SQ${API_CLS}(\"${API_CLS}\");")
 | |
|         if("${SUPER_CLS}" STREQUAL "Text" OR "${SUPER_CLS}" STREQUAL "ScriptObject" OR "${SUPER_CLS}" STREQUAL "AIAbstractiveList::Valuator")
 | |
|             string(APPEND SQUIRREL_EXPORT "\n	SQ${API_CLS}.PreRegister(engine);")
 | |
|         else()
 | |
|             string(APPEND SQUIRREL_EXPORT "\n	SQ${API_CLS}.PreRegister(engine, \"${API_SUPER_CLS}\");")
 | |
|         endif()
 | |
|         if(NOT "${SUPER_CLS}" STREQUAL "ScriptEvent")
 | |
|             if("${CLS_PARAM_2}" STREQUAL "v")
 | |
|                 string(APPEND SQUIRREL_EXPORT "\n	SQ${API_CLS}.AddSQAdvancedConstructor(engine);")
 | |
|             else()
 | |
|                 string(APPEND SQUIRREL_EXPORT "\n	SQ${API_CLS}.AddConstructor<void (${CLS}::*)(${CLS_PARAM_0}), ${CLS_PARAM_1}>(engine, \"${CLS_PARAM_2}\");")
 | |
|             endif()
 | |
|         endif()
 | |
|         string(APPEND SQUIRREL_EXPORT "\n")
 | |
| 
 | |
|         # Enum values
 | |
|         set(MLEN 0)
 | |
|         foreach(ENUM_VALUE IN LISTS ENUM_VALUES)
 | |
|             string(LENGTH "${ENUM_VALUE}" LEN)
 | |
|             if(MLEN LESS LEN)
 | |
|                 set(MLEN ${LEN})
 | |
|             endif()
 | |
|         endforeach()
 | |
|         foreach(ENUM_VALUE IN LISTS ENUM_VALUES)
 | |
|             string(LENGTH "${ENUM_VALUE}" LEN)
 | |
|             math(EXPR LEN "${MLEN} - ${LEN}")
 | |
|             unset(SPACES)
 | |
|             foreach(i RANGE ${LEN})
 | |
|                 string(APPEND SPACES " ")
 | |
|             endforeach()
 | |
|             string(APPEND SQUIRREL_EXPORT "\n	SQ${API_CLS}.DefSQConst(engine, ${CLS}::${ENUM_VALUE},${SPACES}\"${ENUM_VALUE}\");")
 | |
|         endforeach()
 | |
|         if(MLEN)
 | |
|             string(APPEND SQUIRREL_EXPORT "\n")
 | |
|         endif()
 | |
| 
 | |
|         # Const values
 | |
|         set(MLEN 0)
 | |
|         foreach(CONST_VALUE IN LISTS CONST_VALUES)
 | |
|             string(LENGTH "${CONST_VALUE}" LEN)
 | |
|             if(MLEN LESS LEN)
 | |
|                 set(MLEN ${LEN})
 | |
|             endif()
 | |
|         endforeach()
 | |
|         foreach(CONST_VALUE IN LISTS CONST_VALUES)
 | |
|             string(LENGTH "${CONST_VALUE}" LEN)
 | |
|             math(EXPR LEN "${MLEN} - ${LEN}")
 | |
|             unset(SPACES)
 | |
|             foreach(i RANGE ${LEN})
 | |
|                 string(APPEND SPACES " ")
 | |
|             endforeach()
 | |
|             string(APPEND SQUIRREL_EXPORT "\n	SQ${API_CLS}.DefSQConst(engine, ${CLS}::${CONST_VALUE},${SPACES}\"${CONST_VALUE}\");")
 | |
|         endforeach()
 | |
|         if(MLEN)
 | |
|             string(APPEND SQUIRREL_EXPORT "\n")
 | |
|         endif()
 | |
| 
 | |
|         # Mapping of OTTD strings to errors
 | |
|         set(MLEN 0)
 | |
|         foreach(ENUM_STRING_TO_ERROR IN LISTS ENUM_STRING_TO_ERRORS)
 | |
|             string(REPLACE ":" ";" ENUM_STRING_TO_ERROR "${ENUM_STRING_TO_ERROR}")
 | |
|             list(GET ENUM_STRING_TO_ERROR 0 ENUM_STRING)
 | |
|             string(LENGTH "${ENUM_STRING}" LEN)
 | |
|             if(MLEN LESS LEN)
 | |
|                 set(MLEN ${LEN})
 | |
|             endif()
 | |
|         endforeach()
 | |
|         foreach(ENUM_STRING_TO_ERROR IN LISTS ENUM_STRING_TO_ERRORS)
 | |
|             string(REPLACE ":" ";" ENUM_STRING_TO_ERROR "${ENUM_STRING_TO_ERROR}")
 | |
|             list(GET ENUM_STRING_TO_ERROR 0 ENUM_STRING)
 | |
|             list(GET ENUM_STRING_TO_ERROR 1 ENUM_ERROR)
 | |
|             string(LENGTH "${ENUM_STRING}" LEN)
 | |
|             math(EXPR LEN "${MLEN} - ${LEN}")
 | |
|             unset(SPACES)
 | |
|             foreach(i RANGE ${LEN})
 | |
|                 string(APPEND SPACES " ")
 | |
|             endforeach()
 | |
|             string(APPEND SQUIRREL_EXPORT "\n	ScriptError::RegisterErrorMap(${ENUM_STRING},${SPACES}${CLS}::${ENUM_ERROR});")
 | |
|         endforeach()
 | |
|         if(MLEN)
 | |
|             string(APPEND SQUIRREL_EXPORT "\n")
 | |
|         endif()
 | |
| 
 | |
|         # Mapping of errors to human 'readable' strings.
 | |
|         set(MLEN 0)
 | |
|         foreach(ENUM_ERROR_TO_STRING IN LISTS ENUM_ERROR_TO_STRINGS)
 | |
|             string(LENGTH "${ENUM_ERROR_TO_STRING}" LEN)
 | |
|             if(MLEN LESS LEN)
 | |
|                 set(MLEN ${LEN})
 | |
|             endif()
 | |
|         endforeach()
 | |
|         foreach(ENUM_ERROR_TO_STRING IN LISTS ENUM_ERROR_TO_STRINGS)
 | |
|             string(LENGTH "${ENUM_ERROR_TO_STRING}" LEN)
 | |
|             math(EXPR LEN "${MLEN} - ${LEN}")
 | |
|             unset(SPACES)
 | |
|             foreach(i RANGE ${LEN})
 | |
|                 string(APPEND SPACES " ")
 | |
|             endforeach()
 | |
|             string(APPEND SQUIRREL_EXPORT "\n	ScriptError::RegisterErrorMapString(${CLS}::${ENUM_ERROR_TO_STRING},${SPACES}\"${ENUM_ERROR_TO_STRING}\");")
 | |
|         endforeach()
 | |
|         if(MLEN)
 | |
|             string(APPEND SQUIRREL_EXPORT "\n")
 | |
|         endif()
 | |
| 
 | |
|         # Static methods
 | |
|         set(MLEN 0)
 | |
|         foreach(STATIC_METHOD IN LISTS STATIC_METHODS)
 | |
|             string(REPLACE ":" ";" STATIC_METHOD "${STATIC_METHOD}")
 | |
|             list(GET STATIC_METHOD 0 FUNCNAME)
 | |
|             string(LENGTH "${FUNCNAME}" LEN)
 | |
|             if(MLEN LESS LEN)
 | |
|                 set(MLEN ${LEN})
 | |
|             endif()
 | |
|         endforeach()
 | |
|         foreach(STATIC_METHOD IN LISTS STATIC_METHODS)
 | |
|             string(REPLACE ":" ";" STATIC_METHOD "${STATIC_METHOD}")
 | |
|             list(GET STATIC_METHOD 0 FUNCNAME)
 | |
|             list(GET STATIC_METHOD 1 ARGC)
 | |
|             list(GET STATIC_METHOD 2 TYPES)
 | |
|             string(LENGTH "${FUNCNAME}" LEN)
 | |
|             math(EXPR LEN "${MLEN} - ${LEN}")
 | |
|             if("${TYPES}" STREQUAL "v")
 | |
|                 if(LEN GREATER 8)
 | |
|                     math(EXPR LEN "${LEN} - 8")
 | |
|                 else()
 | |
|                     set(LEN 0)
 | |
|                 endif()
 | |
|             endif()
 | |
|             unset(SPACES)
 | |
|             foreach(i RANGE ${LEN})
 | |
|                 string(APPEND SPACES " ")
 | |
|             endforeach()
 | |
|             if("${TYPES}" STREQUAL "v")
 | |
|                 string(APPEND SQUIRREL_EXPORT "\n	SQ${API_CLS}.DefSQAdvancedStaticMethod(engine, &${CLS}::${FUNCNAME},${SPACES}\"${FUNCNAME}\");")
 | |
|             else()
 | |
|                 string(APPEND SQUIRREL_EXPORT "\n	SQ${API_CLS}.DefSQStaticMethod(engine, &${CLS}::${FUNCNAME},${SPACES}\"${FUNCNAME}\",${SPACES}${ARGC}, \"${TYPES}\");")
 | |
|             endif()
 | |
|         endforeach()
 | |
|         if(MLEN)
 | |
|             string(APPEND SQUIRREL_EXPORT "\n")
 | |
|         endif()
 | |
| 
 | |
|         # Non-static methods
 | |
|         set(MLEN 0)
 | |
|         foreach(METHOD IN LISTS METHODS)
 | |
|             string(REPLACE ":" ";" METHOD "${METHOD}")
 | |
|             list(GET METHOD 0 FUNCNAME)
 | |
|             string(LENGTH "${FUNCNAME}" LEN)
 | |
|             if(MLEN LESS LEN)
 | |
|                 set(MLEN ${LEN})
 | |
|             endif()
 | |
|         endforeach()
 | |
|         foreach(METHOD IN LISTS METHODS)
 | |
|             string(REPLACE ":" ";" METHOD "${METHOD}")
 | |
|             list(GET METHOD 0 FUNCNAME)
 | |
|             list(GET METHOD 1 ARGC)
 | |
|             list(GET METHOD 2 TYPES)
 | |
|             string(LENGTH "${FUNCNAME}" LEN)
 | |
|             math(EXPR LEN "${MLEN} - ${LEN}")
 | |
|             if("${TYPES}" STREQUAL "v")
 | |
|                 if(LEN GREATER 8)
 | |
|                     math(EXPR LEN "${LEN} - 8")
 | |
|                 else()
 | |
|                     set(LEN 0)
 | |
|                 endif()
 | |
|             endif()
 | |
|             unset(SPACES)
 | |
|             foreach(i RANGE ${LEN})
 | |
|                 string(APPEND SPACES " ")
 | |
|             endforeach()
 | |
|             if("${TYPES}" STREQUAL "v")
 | |
|                 string(APPEND SQUIRREL_EXPORT "\n	SQ${API_CLS}.DefSQAdvancedMethod(engine, &${CLS}::${FUNCNAME},${SPACES}\"${FUNCNAME}\");")
 | |
|             else()
 | |
|                 string(APPEND SQUIRREL_EXPORT "\n	SQ${API_CLS}.DefSQMethod(engine, &${CLS}::${FUNCNAME},${SPACES}\"${FUNCNAME}\",${SPACES}${ARGC}, \"${TYPES}\");")
 | |
|             endif()
 | |
|         endforeach()
 | |
|         if(MLEN)
 | |
|             string(APPEND SQUIRREL_EXPORT "\n")
 | |
|         endif()
 | |
| 
 | |
|         string(APPEND SQUIRREL_EXPORT "\n	SQ${API_CLS}.PostRegister(engine);")
 | |
|         string(APPEND SQUIRREL_EXPORT "\n}")
 | |
| 
 | |
|         reset_reader()
 | |
| 
 | |
|         continue()
 | |
|     endif()
 | |
| 
 | |
|     # Skip non-public functions
 | |
|     if(NOT IS_PUBLIC)
 | |
|         continue()
 | |
|     endif()
 | |
| 
 | |
|     # Add enums
 | |
|     if(IN_ENUM)
 | |
|         string(REGEX MATCH "([^,	 ]+)" ENUM_VALUE "${LINE}")
 | |
|         list(APPEND ENUM_VALUES "${ENUM_VALUE}")
 | |
| 
 | |
|         # Check if this a special error enum
 | |
|         list(GET ENUMS -1 ENUM)
 | |
|         if("${ENUM}" MATCHES ".*::ErrorMessages")
 | |
|             # syntax:
 | |
|             # enum ErrorMessages {
 | |
|             #	ERR_SOME_ERROR,	// [STR_ITEM1, STR_ITEM2, ...]
 | |
|             # }
 | |
| 
 | |
|             # Set the mappings
 | |
|             if("${LINE}" MATCHES "\\[(.*)\\]")
 | |
|                 string(REGEX REPLACE "[ 	]" "" MAPPINGS "${CMAKE_MATCH_1}")
 | |
|                 string(REPLACE "," ";" MAPPINGS "${MAPPINGS}")
 | |
| 
 | |
|                 foreach(MAPPING IN LISTS MAPPINGS)
 | |
|                     list(APPEND ENUM_STRING_TO_ERRORS "${MAPPING}:${ENUM_VALUE}")
 | |
|                 endforeach()
 | |
| 
 | |
|                 list(APPEND ENUM_ERROR_TO_STRINGS "${ENUM_VALUE}")
 | |
|             endif()
 | |
|         endif()
 | |
|         continue()
 | |
|     endif()
 | |
| 
 | |
|     # Add a const (non-enum) value
 | |
|     if("${LINE}" MATCHES "^[ 	]*static const [^ ]+ ([^ ]+) = -?\\(?[^ ]*\\)?[^ ]+;")
 | |
|         list(APPEND CONST_VALUES "${CMAKE_MATCH_1}")
 | |
|         continue()
 | |
|     endif()
 | |
| 
 | |
|     # Add a method to the list
 | |
|     if("${LINE}" MATCHES "^.*\\(.*\\).*$")
 | |
|         if(NOT CLS_LEVEL EQUAL 1)
 | |
|             continue()
 | |
|         endif()
 | |
|         if("${LINE}" MATCHES "~")
 | |
|             if(DEFINED API_SELECTED)
 | |
|                 message(WARNING "Destructor for '${CLS}' has @api. Tag ignored.")
 | |
|                 unset(API_SELECTED)
 | |
|             endif()
 | |
|             continue()
 | |
|         endif()
 | |
| 
 | |
|         unset(IS_STATIC)
 | |
|         if("${LINE}" MATCHES "static")
 | |
|             set(IS_STATIC TRUE)
 | |
|         endif()
 | |
| 
 | |
|         string(REGEX REPLACE "(virtual|static|const)[ 	]+" "" LINE "${LINE}")
 | |
|         string(REGEX REPLACE "{.*" "" LINE "${LINE}")
 | |
|         set(PARAM_S "${LINE}")
 | |
|         string(REGEX REPLACE "\\*" "" LINE "${LINE}")
 | |
|         string(REGEX REPLACE "\\(.*" "" LINE "${LINE}")
 | |
| 
 | |
|         string(REGEX REPLACE ".*\\(" "" PARAM_S "${PARAM_S}")
 | |
|         string(REGEX REPLACE "\\).*" "" PARAM_S "${PARAM_S}")
 | |
| 
 | |
|         string(REGEX MATCH "([^ 	]+)( ([^ ]+))?" RESULT "${LINE}")
 | |
|         set(FUNCTYPE "${CMAKE_MATCH_1}")
 | |
|         set(FUNCNAME "${CMAKE_MATCH_3}")
 | |
|         if("${FUNCTYPE}" STREQUAL "${CLS}" AND NOT FUNCNAME)
 | |
|             if(DEFINED API_SELECTED)
 | |
|                 message(WARNING "Constructor for '${CLS}' has @api. Tag ignored.")
 | |
|                 unset(API_SELECTED)
 | |
|             endif()
 | |
|             set(CLS_PARAM_0 "${PARAM_S}")
 | |
|             if(NOT PARAM_S)
 | |
|                 continue()
 | |
|             endif()
 | |
|         elseif(NOT FUNCNAME)
 | |
|             continue()
 | |
| 		endif()
 | |
| 
 | |
|         string(REPLACE "," ";" PARAMS "${PARAM_S}")
 | |
|         if(IS_STATIC)
 | |
|             set(TYPES ".")
 | |
|         else()
 | |
|             set(TYPES "x")
 | |
|         endif()
 | |
| 
 | |
|         set(LEN 1)
 | |
|         foreach(PARAM IN LISTS PARAMS)
 | |
|             math(EXPR LEN "${LEN} + 1")
 | |
|             string(STRIP "${PARAM}" PARAM)
 | |
|             if("${PARAM}" MATCHES "\\*|&")
 | |
|                 if("${PARAM}" MATCHES "^char")
 | |
|                     # Many types can be converted to string, so use '.', not 's'. (handled by our glue code)
 | |
|                     string(APPEND TYPES ".")
 | |
|                 elseif("${PARAM}" MATCHES "^void")
 | |
|                     string(APPEND TYPES "p")
 | |
|                 elseif("${PARAM}" MATCHES "^Array")
 | |
|                     string(APPEND TYPES "a")
 | |
|                 elseif("${PARAM}" MATCHES "^struct Array")
 | |
|                     string(APPEND TYPES "a")
 | |
|                 elseif("${PARAM}" MATCHES "^Text")
 | |
|                     string(APPEND TYPES ".")
 | |
|                 else()
 | |
|                     string(APPEND TYPES "x")
 | |
|                 endif()
 | |
|             elseif("${PARAM}" MATCHES "^bool")
 | |
|                 string(APPEND TYPES "b")
 | |
|             elseif("${PARAM}" MATCHES "^HSQUIRRELVM")
 | |
|                 set(TYPES "v")
 | |
|             else()
 | |
|                 string(APPEND TYPES "i")
 | |
|             endif()
 | |
|         endforeach()
 | |
| 
 | |
|         # Check if we want to publish this function
 | |
|         if(NOT DEFINED API_SELECTED)
 | |
|             set(API_SELECTED ${CLS_IN_API})
 | |
|         endif()
 | |
|         if(NOT API_SELECTED)
 | |
|             unset(API_SELECTED)
 | |
|             continue()
 | |
|         endif()
 | |
|         unset(API_SELECTED)
 | |
| 
 | |
|         if("${FUNCTYPE}" STREQUAL "${CLS}" AND NOT FUNCNAME)
 | |
|             set(CLS_PARAM_1 ${LEN})
 | |
|             set(CLS_PARAM_2 "${TYPES}")
 | |
|         elseif("${FUNCNAME}" MATCHES "^_" AND NOT "${TYPES}" STREQUAL "v")
 | |
|         elseif(IS_STATIC)
 | |
|             list(APPEND STATIC_METHODS "${FUNCNAME}:${LEN}:${TYPES}")
 | |
|         else()
 | |
|             list(APPEND METHODS "${FUNCNAME}:${LEN}:${TYPES}")
 | |
|         endif()
 | |
|         continue()
 | |
|     endif()
 | |
| endforeach()
 | |
| 
 | |
| configure_file(${SCRIPT_API_SOURCE_FILE} ${SCRIPT_API_BINARY_FILE})
 | 
