### Java OO AI Wrapper # # Global variables set in this file: # * BUILD_JavaOO_AIWRAPPER # #enable_language(Java) # includes rts/build/cmake/UtilJava.cmake INCLUDE(UtilJava) set(myName "JavaOO") # Check if the user wants to compile the wrapper if ("${AI_TYPES}" STREQUAL "ALL" OR "${AI_TYPES}" STREQUAL "JAVA") set(AIWRAPPERS_JAVA TRUE) else ("${AI_TYPES}" STREQUAL "ALL" OR "${AI_TYPES}" STREQUAL "JAVA") set(AIWRAPPERS_JAVA FALSE) endif ("${AI_TYPES}" STREQUAL "ALL" OR "${AI_TYPES}" STREQUAL "JAVA") # Check dependencies of the wrapper are met if (AIWRAPPERS_JAVA AND BUILD_Java_AIINTERFACE AND AWK_FOUND AND NOT myName MATCHES "${AI_EXCLUDE_REGEX}") SetGlobal(BUILD_${myName}_AIWRAPPER TRUE) else (AIWRAPPERS_JAVA AND BUILD_Java_AIINTERFACE AND AWK_FOUND AND NOT myName MATCHES "${AI_EXCLUDE_REGEX}") SetGlobal(BUILD_${myName}_AIWRAPPER FALSE) message("warning: Java OO AI Wrapper will not be built!") endif (AIWRAPPERS_JAVA AND BUILD_Java_AIINTERFACE AND AWK_FOUND AND NOT myName MATCHES "${AI_EXCLUDE_REGEX}") # Build if (BUILD_${myName}_AIWRAPPER) set(myDir "${CMAKE_CURRENT_SOURCE_DIR}") GetLastPathPart(dirName ${myDir}) set(myName "${dirName}") set(myTarget "${myName}-AIWrapper") set(myGenTarget "${myTarget}-generateSources") set(myJavaTarget "${myTarget}-java") set(myPomTarget "${myTarget}-pom") set(myMavenInstallTarget "${myTarget}-mavenInstall") set(mySourceDirRel "src/main/java") MakeAbsolute(mySourceDir "${myDir}" "${mySourceDirRel}") AIWrapperMessage(STATUS "Found AI Wrapper: ${myName}") # Build library set(myPkgFirstPart "com") set(myParentPkg "${myPkgFirstPart}/springrts/ai") set(myPkg "${myParentPkg}/oo") set(myBinDir "${myDir}/bin") set(commonAwkScriptsDir "${CMAKE_SOURCE_DIR}/AI/Wrappers/CUtils/bin") set(myBuildDir "${CMAKE_CURRENT_BINARY_DIR}") set(myGeneratedSourceDir "${myBuildDir}/src-generated/main/java") set(myJavaBuildDir "${myBuildDir}/classes") set(myJarFile "${myName}-AIWrapper") set(myBinJarFile "${myJarFile}.jar") set(mySrcJarFile "${myJarFile}-src.jar") set(myJLibDir "${myDir}/jlib") FindJavaLib(vecmath_jar "vecmath" "${myJLibDir}") set(myJLibs "${vecmath_jar}") set(jAiIntJavaSourceDir "${JAVA_SRC_DIR_Java_AIINTERFACE}") set(jAiIntJavaGeneratedSourceDir "${JAVA_GEN_SRC_DIR_Java_AIINTERFACE}") set(myClassPath "${myJLibs}${PATH_DELIM_H}${CLASSPATH_Java_AIINTERFACE}") SetGlobal(${myName}_AIWRAPPER_JAR_BIN "${myBuildDir}/${myBinJarFile}") SetGlobal(${myName}_AIWRAPPER_JAR_SRC "${myBuildDir}/${mySrcJarFile}") SetGlobal(${myName}_AIWRAPPER_JAR_CLASSPATH "${myJLibs}${PATH_DELIM_H}${${myName}_AIWRAPPER_JAR_BIN}") SetGlobal(${myName}_AIWRAPPER_TARGET "${myTarget}") SetGlobal(${myName}_AIWRAPPER_TARGET_MVN_INSTALL "${myMavenInstallTarget}") SetGlobal(SOURCE_ROOT_${myName}_AIWRAPPER "${myDir}") SetGlobal(BUILD_ROOT_${myName}_AIWRAPPER "${CMAKE_CURRENT_BINARY_DIR}") # Locate the manifest file FindManifestFile("${myDir}" myManifestFile) if (myManifestFile) set(myBinJarArgs "cmf" "${myManifestFile}") else (myManifestFile) set(myBinJarArgs "cf") endif (myManifestFile) # remove all generated sources from build dir, if it exists # (required for build dirs of git:master from before 21. September 2010) file(REMOVE_RECURSE "${myGeneratedSourceDir}/${myPkg}") # Generate sources # ---------------- set(commonAwkScriptArgs "-v" "INTERFACE_SOURCE_DIR=${jAiIntJavaSourceDir}" "-v" "INTERFACE_GENERATED_SOURCE_DIR=${jAiIntJavaGeneratedSourceDir}" "-v" "JAVA_GENERATED_SOURCE_DIR=${myGeneratedSourceDir}" "-f" "${commonAwkScriptsDir}/common.awk" "-f" "${commonAwkScriptsDir}/commonDoc.awk" ) set(mySources "${mySourceDir}/${myPkg}/AIEvent.java" "${mySourceDir}/${myPkg}/AIFloat3.java" "${mySourceDir}/${myPkg}/AIException.java" "${mySourceDir}/${myPkg}/CallbackAIException.java" "${mySourceDir}/${myPkg}/EventAIException.java" ) set(myGenClbClasses "Camera" "Cheats" "CommandDescription" "Command" "Damage" "DataDirs" "Debug" "Drawer" "Economy" "Engine" "FeatureDef" "Feature" "Figure" "FlankingBonus" "Game" "GameRulesParam" "GraphDrawer" "GraphLine" "Group" "Gui" "Info" "Line" "Log" # "Lua" "Map" "Mod" "MoveData" "OOAICallback" "OptionValues" "OrderPreview" "Pathing" "PathDrawer" "Point" "Resource" "Roots" "Shield" "SkirmishAI" "SkirmishAIs" "Team" "TeamRulesParam" "Teams" "OverlayTexture" "UnitDef" "Unit" "UnitRulesParam" "Version" "WeaponDef" "WeaponMount" ) set(myGeneratedCallbackSources ) foreach (className ${myGenClbClasses}) list(APPEND myGeneratedCallbackSources "${myGeneratedSourceDir}/${myPkg}/clb/${className}.java" "${myGeneratedSourceDir}/${myPkg}/clb/Abstract${className}.java" "${myGeneratedSourceDir}/${myPkg}/clb/Stub${className}.java" ) if ("${className}" STREQUAL "CommandDescription") list(APPEND myGeneratedCallbackSources "${myGeneratedSourceDir}/${myPkg}/clb/WrappGroupSupportedCommand.java" "${myGeneratedSourceDir}/${myPkg}/clb/WrappUnitSupportedCommand.java" ) elseif ("${className}" STREQUAL "Command") list(APPEND myGeneratedCallbackSources "${myGeneratedSourceDir}/${myPkg}/clb/WrappCurrentCommand.java" ) else () list(APPEND myGeneratedCallbackSources "${myGeneratedSourceDir}/${myPkg}/clb/Wrapp${className}.java" ) endif () endforeach (className) set(myGeneratedEventSources "${myGeneratedSourceDir}/${myPkg}/AbstractOOAI.java" "${myGeneratedSourceDir}/${myPkg}/IOOAI.java" "${myGeneratedSourceDir}/${myPkg}/OOAI.java" "${myGeneratedSourceDir}/${myPkg}/IOOEventAI.java" "${myGeneratedSourceDir}/${myPkg}/OOEventAI.java" "${myGeneratedSourceDir}/${myPkg}/evt/UnitAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/UnitLifeStateAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/UnitTeamChangeAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/EnemyAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/LoadSaveAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/CommandFinishedAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/EnemyCreatedAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/EnemyDamagedAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/EnemyDestroyedAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/EnemyFinishedAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/EnemyEnterLOSAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/EnemyEnterRadarAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/EnemyLeaveLOSAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/EnemyLeaveRadarAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/InitAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/LoadAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/MessageAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/LuaMessageAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/PlayerCommandAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/ReleaseAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/SaveAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/SeismicPingAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/UnitCapturedAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/UnitCreatedAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/UnitDamagedAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/UnitDestroyedAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/UnitFinishedAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/UnitGivenAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/UnitIdleAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/UnitMoveFailedAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/UpdateAIEvent.java" "${myGeneratedSourceDir}/${myPkg}/evt/WeaponFiredAIEvent.java" ) set(myGeneratedSources ${myGeneratedCallbackSources} ${myGeneratedEventSources} ) set_source_files_properties(${myGeneratedSources} PROPERTIES GENERATED TRUE) set(jAiIntJavaGeneratedSources "${jAiIntJavaGeneratedSourceDir}/${myParentPkg}/AI.java" "${jAiIntJavaGeneratedSourceDir}/${myParentPkg}/AICallback.java" ) set_source_files_properties(${jAiIntJavaGeneratedSources} PROPERTIES GENERATED TRUE) # Assemble project generated targets (and their libraries) we depend on set(myDependTargets "${Java_AIINTERFACE_TARGET}") set(myDependLibFiles "${Java_AIINTERFACE_JAR_BIN}") set_source_files_properties(${myDependLibFiles} PROPERTIES GENERATED TRUE) add_custom_target(${myJavaTarget} DEPENDS "${myBuildDir}/${myBinJarFile}" "${myBuildDir}/${mySrcJarFile}") add_dependencies(${myJavaTarget} ${myDependTargets}) # generate sources: callback add_custom_command( OUTPUT ${myGeneratedCallbackSources} COMMAND "${CMAKE_COMMAND}" "-E" "remove_directory" "${myGeneratedSourceDir}/${myPkg}/clb" COMMAND "${CMAKE_COMMAND}" "-E" "make_directory" "${myGeneratedSourceDir}/${myPkg}/clb" COMMAND "${AWK_BIN}" ${commonAwkScriptArgs} "-f" "${commonAwkScriptsDir}/commonOOCallback.awk" "-f" "${myBinDir}/wrappCallback.awk" "${jAiIntJavaGeneratedSourceDir}/${myParentPkg}/AICallback.java" DEPENDS "${commonAwkScriptsDir}/common.awk" "${commonAwkScriptsDir}/commonDoc.awk" "${commonAwkScriptsDir}/commonOOCallback.awk" "${myBinDir}/wrappCallback.awk" # Handled through a target level dependency, see below #"${jAiIntJavaGeneratedSourceDir}/${myParentPkg}/AICallback.java" WORKING_DIRECTORY "${myBinDir}" COMMENT " ${myTarget}: Generating callback sources" VERBATIM ) # generate sources: events add_custom_command( OUTPUT ${myGeneratedEventSources} COMMAND "${CMAKE_COMMAND}" "-E" "remove_directory" "${myGeneratedSourceDir}/${myPkg}/evt" COMMAND "${CMAKE_COMMAND}" "-E" "make_directory" "${myGeneratedSourceDir}/${myPkg}/evt" COMMAND "${AWK_BIN}" ${commonAwkScriptArgs} "-f" "${myBinDir}/wrappEvents.awk" "${jAiIntJavaGeneratedSourceDir}/${myParentPkg}/AI.java" DEPENDS "${commonAwkScriptsDir}/common.awk" "${commonAwkScriptsDir}/commonDoc.awk" "${myBinDir}/wrappEvents.awk" "${jAiIntJavaGeneratedSourceDir}/${myParentPkg}/AI.java" WORKING_DIRECTORY "${myBinDir}" COMMENT " ${myTarget}: Generating event sources" VERBATIM ) add_custom_target(${myGenTarget} DEPENDS ${myGeneratedSources}) add_dependencies(${myGenTarget} ${Java_AIINTERFACE_TARGET_GENERATE_SOURCES}) # for AICallback.java add_dependencies(generateSources ${myGenTarget}) # Build the jars # -------------- # Write list of source files to an arg-file set(mySrcArgFile "${CMAKE_CURRENT_BINARY_DIR}/sourceFiles.txt") if (EXISTS "${mySrcArgFile}") file(REMOVE "${mySrcArgFile}") endif (EXISTS "${mySrcArgFile}") foreach (srcFile ${mySources} ${myGeneratedSources}) file(APPEND "${mySrcArgFile}" "\"${srcFile}\"\n") endforeach (srcFile) # compile and pack library add_custom_command( OUTPUT "${myBuildDir}/${myBinJarFile}" COMMAND "${CMAKE_COMMAND}" "-E" "remove_directory" "${myJavaBuildDir}" COMMAND "${CMAKE_COMMAND}" "-E" "make_directory" "${myJavaBuildDir}" COMMAND "${JAVA_COMPILE}" "${JAVA_COMPILE_FLAG_CONDITIONAL}" "-Xlint:deprecation" "-cp" "${myClassPath}" "-d" "${myJavaBuildDir}" "@${mySrcArgFile}" COMMAND "${JAVA_ARCHIVE}" ARGS ${myBinJarArgs} "${myBuildDir}/${myBinJarFile}" "-C" "${myJavaBuildDir}" "${myPkgFirstPart}" DEPENDS ${myDependLibFiles} ${mySources} ${myGeneratedSources} WORKING_DIRECTORY "${myBinDir}" COMMENT " ${myTarget}: Compiling sources and packing library ${myBinJarFile}" VERBATIM ) # pack sources add_custom_command( OUTPUT "${myBuildDir}/${mySrcJarFile}" COMMAND "${JAVA_ARCHIVE}" ARGS "cf" "${${myName}_AIWRAPPER_JAR_SRC}" "-C" "${mySourceDir}" "${myPkgFirstPart}" COMMAND "${JAVA_ARCHIVE}" ARGS "uf" "${${myName}_AIWRAPPER_JAR_SRC}" "-C" "${myGeneratedSourceDir}" "${myPkgFirstPart}" DEPENDS ${myJavaSources} ${myJavaGeneratedSources} WORKING_DIRECTORY "${myBuildDir}" COMMENT " ${myTarget}: Creating sources archive ${mySrcJarFile}" VERBATIM ) # This sets the version in pom.xml # as we have no separate version for the wrapper, # we use the one from the interrface set(myMavenProperties "-Dmy.version=${Java_AIINTERFACE_VERS}") add_custom_command( OUTPUT "${myBuildDir}/pom-generated.xml" COMMAND "${CMAKE_COMMAND}" "-Dfile.in=${myDir}/pom.xml" "-Dfile.out=${myBuildDir}/pom-generated.xml" ${myMavenProperties} "-P" "${CMAKE_MODULES_SPRING}/ConfigureFile.cmake" DEPENDS "${myDir}/pom.xml" WORKING_DIRECTORY "${myDir}" COMMENT " ${myTarget}: Configure pom.xml" VERBATIM ) set_source_files_properties("${myBuildDir}/pom-generated.xml" PROPERTIES GENERATED TRUE) add_custom_target(${myPomTarget} DEPENDS "${myBuildDir}/pom-generated.xml") add_custom_target(${myTarget} ALL) Find_Package(Maven) if (MAVEN_FOUND) # This is required because the local Maven install does not create a # file (whichs path we could know), and thus we would not be able to # create a nice dependency chain without this. set(myMavenInstallStubFile "${myBuildDir}/mavenInstallStub.txt") set_source_files_properties("${myMavenInstallStubFile}" PROPERTIES GENERATED TRUE) add_custom_command( OUTPUT "${myMavenInstallStubFile}" COMMAND "${MVN_BIN}" ${MVN_ATTRIBUTES_DEFAULT} "-DpomFile=${myBuildDir}/pom-generated.xml" "-Dfile=${myBuildDir}/${myBinJarFile}" "-Dsources=${myBuildDir}/${mySrcJarFile}" "install:install-file" COMMAND "${CMAKE_COMMAND}" "-E" "touch" "${myMavenInstallStubFile}" DEPENDS # We have to handle these through target level dependencies, or # else their generating custom commands may be executed multiple # times. #"${myBuildDir}/pom-generated.xml" #"${myBuildDir}/${myBinJarFile}" #"${myBuildDir}/${mySrcJarFile}" WORKING_DIRECTORY "${myDir}" COMMENT " ${myTarget}: Installing to local maven repository" VERBATIM ) add_custom_target(${myMavenInstallTarget} DEPENDS "${myMavenInstallStubFile}" ) add_dependencies(${myMavenInstallTarget} ${myJavaTarget} ${myPomTarget} ${Java_AIINTERFACE_TARGET_MVN_INSTALL}) add_dependencies(${myTarget} ${myMavenInstallTarget}) else (MAVEN_FOUND) add_dependencies(${myTarget} ${myJavaTarget}) endif (MAVEN_FOUND) endif (BUILD_${myName}_AIWRAPPER)