# -*- coding: utf-8 -*-
#
# Copyright 2010 Matthias Ableitner
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
# @author Andreas Löscher
# @author Matthias Ableitner
#
### Python AI Interface
#
# Global variables set in this file:
# * BUILD_PYTHON_AIINTERFACE
# * PYTHON_AIINTERFACE_VERS
# * PYTHON_AIINTERFACE_TARGET
#
################################################################################
### BEGINN: MACROS_AND_FUNCTIONS
# Define macros and functions to be used in this file and by Skirmish AIs
# Native Skirmish AI configuration macro
# This will be called from native AIs at AI/Skirmish/*/CMakeLists.txt.
macro (ConfigurePythonSkirmishAI)
set(myDir "${CMAKE_CURRENT_SOURCE_DIR}")
GetLastPathPart(dirName ${myDir})
set(myName "${dirName}")
set(mySourceDirRel "${${mySourceDirRel_var}}") # Common values are "" or "src"
set(additionalSources ${${additionalSources_var}})
set(additionalCompileFlags ${${additionalCompileFlags_var}})
set(additionalLibraries ${${additionalLibraries_var}})
# Check if the user wants to compile the AI
if (BUILD_PYTHON_AIINTERFACE AND NOT myName MATCHES "${AI_EXCLUDE_REGEX}")
set(BUILD_THIS_SKIRMISHAI TRUE)
else (BUILD_PYTHON_AIINTERFACE AND NOT myName MATCHES "${AI_EXCLUDE_REGEX}")
set(BUILD_THIS_SKIRMISHAI FALSE)
message("warning: ${myName} Skirmish AI will not be built!")
endif (BUILD_PYTHON_AIINTERFACE AND NOT myName MATCHES "${AI_EXCLUDE_REGEX}")
# Compile and install
if (BUILD_THIS_SKIRMISHAI)
# Assemble meta data
GetVersionFromFile(myVersion "${myDir}/VERSION")
set(myTarget "${myName}")
set(myInstLibsDir "${SKIRMISH_AI_LIBS}/${myName}/${myVersion}")
set(myInstDataDir "${SKIRMISH_AI_DATA}/${myName}/${myVersion}")
MakeAbsolute(mySourceDir "${myDir}" "${mySourceDirRel}")
SkirmishAIMessage(STATUS "Found Skirmish AI: ${myName} ${myVersion}")
# Install the data files
install(DIRECTORY "${myDir}/data/" DESTINATION ${myInstDataDir})
install(DIRECTORY "${myDir}/src/" DESTINATION ${myInstDataDir} FILES_MATCHING PATTERN REGEX ".*\\.py$")
# Install the library
endif (BUILD_THIS_SKIRMISHAI)
endmacro (ConfigurePythonSkirmishAI)
### END: MACROS_AND_FUNCTIONS
################################################################################
set(myName "Python")
set(myDir "${CMAKE_CURRENT_SOURCE_DIR}")
set(mySourceDirRel "src")
# Check if the user wants to compile the interface
if ("${AI_TYPES}" STREQUAL "ALL" OR "${AI_TYPES}" STREQUAL "PYTHON")
set(AI_TYPES_PYTHON TRUE)
else ("${AI_TYPES}" STREQUAL "ALL" OR "${AI_TYPES}" STREQUAL "PYTHON")
set(AI_TYPES_PYTHON FALSE)
endif ("${AI_TYPES}" STREQUAL "ALL" OR "${AI_TYPES}" STREQUAL "PYTHON")
if (AI_TYPES_PYTHON AND myName MATCHES "${AI_EXCLUDE_REGEX}")
set(AI_TYPES_PYTHON FALSE)
endif (AI_TYPES_PYTHON AND myName MATCHES "${AI_EXCLUDE_REGEX}")
FIND_PACKAGE(PythonInterp)
FIND_PACKAGE(PythonLibs)
# Check dependencies of the interface are met
if (PYTHONINTERP_FOUND AND PYTHONLIBS_FOUND AND AI_TYPES_PYTHON)
SetGlobal(BUILD_PYTHON_AIINTERFACE TRUE)
else (PYTHONINTERP_FOUND AND PYTHONLIBS_FOUND AND AI_TYPES_PYTHON)
SetGlobal(BUILD_PYTHON_AIINTERFACE FALSE)
message ("warning: Python AI Interface will not be built!")
endif (PYTHONINTERP_FOUND AND PYTHONLIBS_FOUND AND AI_TYPES_PYTHON)
# Build
if (BUILD_PYTHON_AIINTERFACE)
GetVersionFromFile(myVersion ${myDir}/VERSION)
INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH})
set(myTarget "${myName}-AIInterface")
set(myNullPython "NullPythonAI")
set(myInstLibsDir ${AI_INTERFACES_LIBS}/${myName}/${myVersion})
set(myInstDataDir ${AI_INTERFACES_DATA}/${myName}/${myVersion})
set(myInstAIDir ${SKIRMISH_AI_LIBS}/${myNullPython}/${myVersion})
set(myGeneratedDir "${CMAKE_CURRENT_BINARY_DIR}/src-generated")
set(myBuilderDir "${CMAKE_CURRENT_BINARY_DIR}/src-generated-builder")
set(engineHeadersDir "${CMAKE_SOURCE_DIR}/rts/ExternalAI/Interface")
MakeAbsolute(mySourceDir "${myDir}" "${mySourceDirRel}")
AIInterfaceMessage(STATUS "Found AI Interface: ${myTarget} ${myVersion}")
AIInterfaceMessage(STATUS "Found Skirmish AI: ${myNullPython} ${myVersion}") # SkirmishAIMessage() not defined here
SetGlobal(PYTHON_AIINTERFACE_VERS ${myVersion})
SetGlobal(PYTHON_AIINTERFACE_TARGET ${myTarget})
set(builderFiles
"template/__init__.py"
"template/context.py"
"template/engine.py"
"template/helper.py"
"template/defaulttags.py"
"interface_builder.py"
"templates/interface.c"
"templates/aiInterface.py"
"templates/wrappai.c"
"templates/converter.c"
"templates/callback.c"
"templates/command_wrapper.c"
"templates/event_wrapper.c"
"templates/create_command.c"
"helper.py"
"generator.py"
"event_parser.py"
"callback_parser.py")
FOREACH (FILE ${builderFiles})
list (APPEND myGeneratedFilesSourceDir "builder/${FILE}")
list (APPEND myGeneratedFilesmyBuilderDir "${myBuilderDir}/${FILE}")
ENDFOREACH(FILE)
set(myGenerateFiles
${myGeneratedFilesmyBuilderDir}
"${engineHeadersDir}/SSkirmishAICallback.h"
"${engineHeadersDir}/AISEvents.h"
"${engineHeadersDir}/AISCommands.h")
# Copy python files to generated dir, because python <=2.5 creates .pyc
add_custom_command(
COMMAND "cmake" "-E" "copy_directory" "builder" "${myBuilderDir}"
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMENT "copying builder/ files to ${myBuilderDir}"
DEPENDS ${myGeneratedFilesSourceDir}
OUTPUT ${myGeneratedFilesmyBuilderDir}
)
# Create the interface
add_custom_command(
COMMAND ${PYTHON_EXECUTABLE}
"${myBuilderDir}/generator.py"
${PROJECT_SOURCE_DIR}
"${myBuilderDir}/templates"
${myGeneratedDir}
WORKING_DIRECTORY ${myBuilderDir}
COMMENT " Generating Python Interface" VERBATIM
OUTPUT "${myGeneratedDir}/ai.c"
OUTPUT "${myGeneratedDir}/PyAI/interface.py"
DEPENDS ${myGenerateFiles}
)
SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "src/ai.c;src/PyAI/interface.py")
set_source_files_properties("${myGeneratedDir}/ai.c" PROPERTIES GENERATED TRUE)
set_source_files_properties(${myGeneratedFilesmyBuilderDir} PROPERTIES GENERATED TRUE)
aux_source_directory(${mySourceDir} mySources)
INCLUDE_DIRECTORIES(${mySourceDir})
add_library(${myTarget} MODULE ${mySources} ${ai_common_SRC} ${CUtils_SRC} "${myGeneratedDir}/ai.c")
FixLibName(${myTarget})
set_target_properties(${myTarget} PROPERTIES OUTPUT_NAME "AIInterface")
# Install the data files
install(DIRECTORY "${myDir}/data/" DESTINATION "${myInstLibsDir}" FILES_MATCHING PATTERN REGEX "InterfaceInfo\\.lua$")
install(DIRECTORY "${myDir}/data/" DESTINATION "${myInstDataDir}" FILES_MATCHING PATTERN REGEX "InterfaceInfo\\.lua$" EXCLUDE PATTERN "*")
install(DIRECTORY "${myDir}/src/" DESTINATION "${myInstDataDir}" FILES_MATCHING PATTERN REGEX ".*\\.py$")
install(DIRECTORY "${myGeneratedDir}/PyAI" DESTINATION "${myInstDataDir}" FILES_MATCHING PATTERN REGEX ".*\\.py$")
# Install the library
install(TARGETS ${myTarget} DESTINATION "${myInstLibsDir}")
# Install the NullPythonAI
install(DIRECTORY "${myDir}/${myNullPython}/src/" DESTINATION "${myInstAIDir}" FILES_MATCHING PATTERN REGEX ".*\\.py$")
install(DIRECTORY "${myDir}/${myNullPython}/data/" DESTINATION "${myInstAIDir}" FILES_MATCHING PATTERN REGEX ".*\\.lua$")
endif (BUILD_PYTHON_AIINTERFACE)