1
# -*- coding: utf-8 -*-
3
# Copyright 2010 Matthias Ableitner
5
# This program is free software; you can redistribute it and/or modify
6
# it under the terms of the GNU General Public License as published by
7
# the Free Software Foundation; either version 2 of the License, or
8
# (at your option) any later version.
10
# This program is distributed in the hope that it will be useful,
11
# but WITHOUT ANY WARRANTY; without even the implied warranty of
12
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
# GNU General Public License for more details.
15
# You should have received a copy of the GNU General Public License
16
# along with this program. If not, see <http://www.gnu.org/licenses/>.
18
# @author Andreas Löscher
19
# @author Matthias Ableitner <spam@abma.de>
22
### Python AI Interface
24
# Global variables set in this file:
25
# * BUILD_PYTHON_AIINTERFACE
26
# * PYTHON_AIINTERFACE_VERS
27
# * PYTHON_AIINTERFACE_TARGET
31
################################################################################
32
### BEGINN: MACROS_AND_FUNCTIONS
33
# Define macros and functions to be used in this file and by Skirmish AIs
35
# Native Skirmish AI configuration macro
36
# This will be called from native AIs at AI/Skirmish/*/CMakeLists.txt.
37
macro (ConfigurePythonSkirmishAI)
38
set(myDir "${CMAKE_CURRENT_SOURCE_DIR}")
39
GetLastPathPart(dirName ${myDir})
40
set(myName "${dirName}")
41
set(mySourceDirRel "${${mySourceDirRel_var}}") # Common values are "" or "src"
42
set(additionalSources ${${additionalSources_var}})
43
set(additionalCompileFlags ${${additionalCompileFlags_var}})
44
set(additionalLibraries ${${additionalLibraries_var}})
46
# Check if the user wants to compile the AI
47
if (BUILD_PYTHON_AIINTERFACE AND NOT myName MATCHES "${AI_EXCLUDE_REGEX}")
48
set(BUILD_THIS_SKIRMISHAI TRUE)
49
else (BUILD_PYTHON_AIINTERFACE AND NOT myName MATCHES "${AI_EXCLUDE_REGEX}")
50
set(BUILD_THIS_SKIRMISHAI FALSE)
51
message("warning: ${myName} Skirmish AI will not be built!")
52
endif (BUILD_PYTHON_AIINTERFACE AND NOT myName MATCHES "${AI_EXCLUDE_REGEX}")
55
if (BUILD_THIS_SKIRMISHAI)
57
GetVersionFromFile(myVersion "${myDir}/VERSION")
58
set(myTarget "${myName}")
59
set(myInstLibsDir "${SKIRMISH_AI_LIBS}/${myName}/${myVersion}")
60
set(myInstDataDir "${SKIRMISH_AI_DATA}/${myName}/${myVersion}")
61
MakeAbsolute(mySourceDir "${myDir}" "${mySourceDirRel}")
63
SkirmishAIMessage(STATUS "Found Skirmish AI: ${myName} ${myVersion}")
65
# Install the data files
66
install(DIRECTORY "${myDir}/data/" DESTINATION ${myInstDataDir})
67
install(DIRECTORY "${myDir}/src/" DESTINATION ${myInstDataDir} FILES_MATCHING PATTERN REGEX ".*\\.py$")
69
endif (BUILD_THIS_SKIRMISHAI)
70
endmacro (ConfigurePythonSkirmishAI)
72
### END: MACROS_AND_FUNCTIONS
73
################################################################################
77
set(myDir "${CMAKE_CURRENT_SOURCE_DIR}")
78
set(mySourceDirRel "src")
81
# Check if the user wants to compile the interface
82
if ("${AI_TYPES}" STREQUAL "ALL" OR "${AI_TYPES}" STREQUAL "PYTHON")
83
set(AI_TYPES_PYTHON TRUE)
84
else ("${AI_TYPES}" STREQUAL "ALL" OR "${AI_TYPES}" STREQUAL "PYTHON")
85
set(AI_TYPES_PYTHON FALSE)
86
endif ("${AI_TYPES}" STREQUAL "ALL" OR "${AI_TYPES}" STREQUAL "PYTHON")
88
if (AI_TYPES_PYTHON AND myName MATCHES "${AI_EXCLUDE_REGEX}")
89
set(AI_TYPES_PYTHON FALSE)
90
endif (AI_TYPES_PYTHON AND myName MATCHES "${AI_EXCLUDE_REGEX}")
93
FIND_PACKAGE(PythonInterp)
94
FIND_PACKAGE(PythonLibs)
96
# Check dependencies of the interface are met
97
if (PYTHONINTERP_FOUND AND PYTHONLIBS_FOUND AND AI_TYPES_PYTHON)
98
SetGlobal(BUILD_PYTHON_AIINTERFACE TRUE)
99
else (PYTHONINTERP_FOUND AND PYTHONLIBS_FOUND AND AI_TYPES_PYTHON)
100
SetGlobal(BUILD_PYTHON_AIINTERFACE FALSE)
101
message ("warning: Python AI Interface will not be built!")
102
endif (PYTHONINTERP_FOUND AND PYTHONLIBS_FOUND AND AI_TYPES_PYTHON)
105
if (BUILD_PYTHON_AIINTERFACE)
106
GetVersionFromFile(myVersion ${myDir}/VERSION)
108
INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_PATH})
109
set(myTarget "${myName}-AIInterface")
110
set(myNullPython "NullPythonAI")
111
set(myInstLibsDir ${AI_INTERFACES_LIBS}/${myName}/${myVersion})
112
set(myInstDataDir ${AI_INTERFACES_DATA}/${myName}/${myVersion})
113
set(myInstAIDir ${SKIRMISH_AI_LIBS}/${myNullPython}/${myVersion})
114
set(myGeneratedDir "${CMAKE_CURRENT_BINARY_DIR}/src-generated")
115
set(myBuilderDir "${CMAKE_CURRENT_BINARY_DIR}/src-generated-builder")
116
set(engineHeadersDir "${CMAKE_SOURCE_DIR}/rts/ExternalAI/Interface")
118
MakeAbsolute(mySourceDir "${myDir}" "${mySourceDirRel}")
120
AIInterfaceMessage(STATUS "Found AI Interface: ${myTarget} ${myVersion}")
121
AIInterfaceMessage(STATUS "Found Skirmish AI: ${myNullPython} ${myVersion}") # SkirmishAIMessage() not defined here
123
SetGlobal(PYTHON_AIINTERFACE_VERS ${myVersion})
124
SetGlobal(PYTHON_AIINTERFACE_TARGET ${myTarget})
126
"template/__init__.py"
127
"template/context.py"
130
"template/defaulttags.py"
131
"interface_builder.py"
132
"templates/interface.c"
133
"templates/aiInterface.py"
134
"templates/wrappai.c"
135
"templates/converter.c"
136
"templates/callback.c"
137
"templates/command_wrapper.c"
138
"templates/event_wrapper.c"
139
"templates/create_command.c"
143
"callback_parser.py")
144
FOREACH (FILE ${builderFiles})
145
list (APPEND myGeneratedFilesSourceDir "builder/${FILE}")
146
list (APPEND myGeneratedFilesmyBuilderDir "${myBuilderDir}/${FILE}")
149
${myGeneratedFilesmyBuilderDir}
150
"${engineHeadersDir}/SSkirmishAICallback.h"
151
"${engineHeadersDir}/AISEvents.h"
152
"${engineHeadersDir}/AISCommands.h")
154
# Copy python files to generated dir, because python <=2.5 creates .pyc
156
COMMAND "cmake" "-E" "copy_directory" "builder" "${myBuilderDir}"
157
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
158
COMMENT "copying builder/ files to ${myBuilderDir}"
159
DEPENDS ${myGeneratedFilesSourceDir}
160
OUTPUT ${myGeneratedFilesmyBuilderDir}
162
# Create the interface
164
COMMAND ${PYTHON_EXECUTABLE}
165
"${myBuilderDir}/generator.py"
166
${PROJECT_SOURCE_DIR}
167
"${myBuilderDir}/templates"
169
WORKING_DIRECTORY ${myBuilderDir}
170
COMMENT " Generating Python Interface" VERBATIM
171
OUTPUT "${myGeneratedDir}/ai.c"
172
OUTPUT "${myGeneratedDir}/PyAI/interface.py"
173
DEPENDS ${myGenerateFiles}
175
SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "src/ai.c;src/PyAI/interface.py")
176
set_source_files_properties("${myGeneratedDir}/ai.c" PROPERTIES GENERATED TRUE)
177
set_source_files_properties(${myGeneratedFilesmyBuilderDir} PROPERTIES GENERATED TRUE)
179
aux_source_directory(${mySourceDir} mySources)
180
INCLUDE_DIRECTORIES(${mySourceDir})
181
add_library(${myTarget} MODULE ${mySources} ${ai_common_SRC} ${CUtils_SRC} "${myGeneratedDir}/ai.c")
182
FixLibName(${myTarget})
184
set_target_properties(${myTarget} PROPERTIES OUTPUT_NAME "AIInterface")
186
# Install the data files
187
install(DIRECTORY "${myDir}/data/" DESTINATION "${myInstLibsDir}" FILES_MATCHING PATTERN REGEX "InterfaceInfo\\.lua$")
188
install(DIRECTORY "${myDir}/data/" DESTINATION "${myInstDataDir}" FILES_MATCHING PATTERN REGEX "InterfaceInfo\\.lua$" EXCLUDE PATTERN "*")
189
install(DIRECTORY "${myDir}/src/" DESTINATION "${myInstDataDir}" FILES_MATCHING PATTERN REGEX ".*\\.py$")
190
install(DIRECTORY "${myGeneratedDir}/PyAI" DESTINATION "${myInstDataDir}" FILES_MATCHING PATTERN REGEX ".*\\.py$")
191
# Install the library
192
install(TARGETS ${myTarget} DESTINATION "${myInstLibsDir}")
193
# Install the NullPythonAI
194
install(DIRECTORY "${myDir}/${myNullPython}/src/" DESTINATION "${myInstAIDir}" FILES_MATCHING PATTERN REGEX ".*\\.py$")
195
install(DIRECTORY "${myDir}/${myNullPython}/data/" DESTINATION "${myInstAIDir}" FILES_MATCHING PATTERN REGEX ".*\\.lua$")
197
endif (BUILD_PYTHON_AIINTERFACE)