--- a/hedgewars/CMakeLists.txt Thu Jun 13 22:04:22 2013 +0200
+++ b/hedgewars/CMakeLists.txt Thu Jun 13 22:27:23 2013 +0200
@@ -5,166 +5,143 @@
find_package(SDL_mixer)
include (CheckLibraryExists)
-#Mix_Init/Mix_Quit from SDL_mixer 1.2.10
-check_library_exists(${SDLMIXER_LIBRARY} Mix_Init "" HAVE_MIXINIT)
-if(HAVE_MIXINIT)
- list(APPEND pascal_flags "-dSDL_MIXER_NEWER")
-endif()
-#IMG_Init/IMG_Quit from SDL_image 1.2.8
-check_library_exists(${SDLIMAGE_LIBRARY} IMG_Init "" HAVE_IMGINIT)
-if(HAVE_IMGINIT)
- list(APPEND pascal_flags "-dSDL_IMAGE_NEWER")
-endif()
+
+
+enable_language(Pascal)
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.inc.in ${CMAKE_CURRENT_BINARY_DIR}/config.inc)
+include_directories(${CMAKE_CURRENT_BINARY_DIR})
-configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.inc.in ${CMAKE_CURRENT_BINARY_DIR}/config.inc)
-
-#SOURCE AND PROGRAMS SECTION
-if(${BUILD_ENGINE_LIBRARY})
- set(engine_output_name "${CMAKE_SHARED_LIBRARY_PREFIX}hwengine${CMAKE_SHARED_LIBRARY_SUFFIX}")
- set(hwengine_project hwLibrary.pas)
-else()
- set(engine_output_name "hwengine${CMAKE_EXECUTABLE_SUFFIX}")
- set(hwengine_project hwengine.pas)
-endif()
-
-if (APPLE)
- set(required_fpc_version 2.6)
-else()
- set(required_fpc_version 2.2)
-endif()
-
set(engine_sources
- ${hwengine_project}
+ SDLh.pas
+ uSinTable.pas
+ uFloat.pas
+ uConsts.pas
LuaPas.pas
PNGh.pas
- SDLh.pas
- uAI.pas
- uAIActions.pas
+ uTypes.pas
+ uUtils.pas
+ uVariables.pas
+ uMisc.pas
+ uConsole.pas
+ uDebug.pas
+ uCommands.pas
+ uInputHandler.pas
+ uTextures.pas
+ uRenderUtils.pas
+ uRender.pas
+ uCaptions.pas
+ uLandTexture.pas
+ uIO.pas
+ uChat.pas
+ uPhysFSLayer.pas
+ uStore.pas
+ uSound.pas
+ uRandom.pas
+ uLocale.pas
+ uStats.pas
+ uCursor.pas
+ uVideoRec.pas
uAILandMarks.pas
- uAIAmmoTests.pas
- uAIMisc.pas
+ adler32.pas
+ uLandTemplates.pas
+ uLandGraphics.pas
+ uLandPainted.pas
+ uLandOutline.pas
+ uLandGenMaze.pas
+ uLandObjects.pas
+ uLand.pas
uAmmos.pas
- uCaptions.pas
- uChat.pas
+
+ uAIMisc.pas
+ uAIActions.pas
+ uAI.pas
+ uWorld.pas
+ uVisualGears.pas
+ uTeams.pas
+
+ uGearsList.pas
uCollisions.pas
- uCommands.pas
+ uAIAmmoTests.pas
+ uGears.pas
+ uGame.pas
uCommandHandlers.pas
- uConsole.pas
- uConsts.pas
- uCursor.pas
- uDebug.pas
- uFloat.pas
- uGame.pas
- uGears.pas
uGearsHandlers.pas
uGearsHandlersRope.pas
uGearsHedgehog.pas
- uGearsList.pas
uGearsRender.pas
uGearsUtils.pas
- uIO.pas
- uInputHandler.pas
- uLand.pas
- uLandGenMaze.pas
- uLandGraphics.pas
- uLandObjects.pas
- uLandOutline.pas
- uLandPainted.pas
- uLandTemplates.pas
- uLandTexture.pas
- uLocale.pas
- uMisc.pas
- uPhysFSLayer.pas
- uRandom.pas
- uRender.pas
- uRenderUtils.pas
uScript.pas
- uSinTable.pas
- uSound.pas
- uStats.pas
- uStore.pas
- uTeams.pas
- uTextures.pas
- uTouch.pas
- uTypes.pas
- uUtils.pas
- uVariables.pas
- uVideoRec.pas
- uVisualGears.pas
- uWorld.pas
+ hwengine.pas
+
GSHandlers.inc
VGSHandlers.inc
ArgParsers.inc
options.inc
- adler32.pas
${CMAKE_CURRENT_BINARY_DIR}/config.inc
)
if(${BUILD_ENGINE_LIBRARY})
message("*** Engine will be built as library (experimental) ***")
list(APPEND pascal_flags "-dHWLIBRARY")
-
- # create position independent code, only required for x68_64 builds, similar to -fPIC
- if(CMAKE_SIZEOF_VOID_P MATCHES "8")
- list(APPEND pascal_flags "-Cg")
- endif(CMAKE_SIZEOF_VOID_P MATCHES "8")
-
- # due to compiler/linker issues on Max OS X 10.6 -k-no_order_inits is needed to avoid linking fail
- if(APPLE AND current_macosx_version VERSION_GREATER "10.5")
- list(APPEND pascal_flags "-k-no_order_inits")
- endif()
- set(destination_dir ${target_library_install_dir})
-else(${BUILD_ENGINE_LIBRARY})
- set(destination_dir ${target_binary_install_dir})
-endif(${BUILD_ENGINE_LIBRARY})
-
+endif()
include(${CMAKE_MODULE_PATH}/utils.cmake)
-find_package_or_fail(FreePascal)
-
-#when cmake-2.6 support is dropped, this ought to be inside FindFreePascal.cmake
-if (FREEPASCAL_VERSION VERSION_LESS required_fpc_version)
- message(FATAL_ERROR "Freepascal ${FREEPASCAL_VERSION} is too old, minimum version required is ${required_fpc_version}")
+if (${CMAKE_Pascal_COMPILER_VERSION} VERSION_LESS 2.2 OR # older versions are just ancient
+ (${CMAKE_Pascal_COMPILER_VERSION} VERSION_LESS 2.6 AND APPLE)) # because of 64bit and opengl bindings
+ message(FATAL_ERROR "Your FreePascal installation is too old (fpc ${CMAKE_Pascal_COMPILER_VERSION})!")
+elseif(CMAKE_Pascal_COMPILER_VERSION VERSION_GREATER 2.4)
+ #enable INLINE only with a recent version of fpc
+ add_flag_prepend(CMAKE_Pascal_FLAGS_RELEASE -Si)
endif()
#DEPENDECIES AND EXECUTABLES SECTION
if(APPLE)
- string(REGEX MATCH "[pP][pP][cC]+" powerpc_build "${CMAKE_OSX_ARCHITECTURES}")
- string(REGEX MATCH "[iI]386+" i386_build "${CMAKE_OSX_ARCHITECTURES}")
- string(REGEX MATCH "[xX]86_64+" x86_64_build "${CMAKE_OSX_ARCHITECTURES}")
-
- if(powerpc_build)
- set(powerpc_build "powerpc")
+ if(CMAKE_OSX_ARCHITECTURES)
+ #parse this system variable and adjust only the powerpc syntax to be compatible with -P
+ string(REGEX MATCH "[pP][pP][cC]+" powerpc_build "${CMAKE_OSX_ARCHITECTURES}")
+ string(REGEX MATCH "[iI]386+" i386_build "${CMAKE_OSX_ARCHITECTURES}")
+ string(REGEX MATCH "[xX]86_64+" x86_64_build "${CMAKE_OSX_ARCHITECTURES}")
+ if(x86_64_build)
+ add_flag_prepend(CMAKE_Pascal_FLAGS -Px86_64)
+ elseif(i386_build)
+ add_flag_prepend(CMAKE_Pascal_FLAGS -Pi386)
+ elseif(powerpc_build)
+ add_flag_prepend(CMAKE_Pascal_FLAGS -Ppowerpc)
+ else()
+ message(FATAL_ERROR "Unknown architecture present in CMAKE_OSX_ARCHITECTURES (${CMAKE_OSX_ARCHITECTURES})")
+ endif()
+ list(LENGTH CMAKE_OSX_ARCHITECTURES num_of_archs)
+ if(num_of_archs GREATER 1)
+ message(${WARNING} "Only one architecture in CMAKE_OSX_ARCHITECTURES is currently supported, picking the first one")
+ endif()
+ elseif(CMAKE_SIZEOF_VOID_P MATCHES "8")
+ #if that variable is not set check if we are on x86_64 and if so force it, else use default
+ add_flag_prepend(CMAKE_Pascal_FLAGS -Px86_64)
endif()
#on OSX we need to provide the SDL_main() function when building as executable
- if(NOT ${BUILD_ENGINE_LIBRARY})
- #let's look for the installed sdlmain file; if it is not found, let's build our own
- find_package(SDL REQUIRED)
- #remove the ";-framework Cocoa" from the SDL_LIBRARY variable
- string(REGEX REPLACE "(.*);-.*" "\\1" sdl_library_only "${SDL_LIBRARY}")
- #find libsdmain.a
- find_file(SDLMAIN_LIB libSDLMain.a PATHS ${sdl_library_only}/Resources/)
-
- if(SDLMAIN_LIB MATCHES "SDLMAIN_LIB-NOTFOUND")
- include_directories(${SDL_INCLUDE_DIR})
- add_library (SDLmain STATIC SDLMain.m)
- #add a dependency to the hwengine target
- list(APPEND engine_sources SDLmain)
- set(SDLMAIN_LIB "${LIBRARY_OUTPUT_PATH}/libSDLmain.a")
- endif()
-
- list(APPEND pascal_flags "-k${SDLMAIN_LIB}")
+ if(NOT BUILD_ENGINE_LIBRARY)
+ add_subdirectory(sdlmain)
+ list(APPEND HW_LINK_LIBS SDLmain)
+ add_flag_append(CMAKE_Pascal_FLAGS -Fl${LIBRARY_OUTPUT_PATH})
endif()
- #when you have multiple ld installation make sure you get the one bundled with the compiler
- get_filename_component(compiler_dir ${CMAKE_C_COMPILER} PATH)
- list(APPEND pascal_flags "-FD${compiler_dir}")
+ #when sysroot is set, make sure that fpc picks it
+ if(CMAKE_OSX_SYSROOT)
+ set(add_flag_append "-XD${CMAKE_OSX_SYSROOT}")
+ endif(CMAKE_OSX_SYSROOT)
endif(APPLE)
+if(FFMPEG_FOUND)
+ add_subdirectory(avwrapper)
+ list(APPEND HW_LINK_LIBS avwrapper)
+ add_definitions(-dUSE_VIDEO_RECORDING)
+ add_flag_append(CMAKE_Pascal_FLAGS -Fl${LIBRARY_OUTPUT_PATH})
+endif()
+
find_package_or_disable_msg(PNG NOPNG "Screenshots will be saved in BMP")
if(PNG_FOUND)
list(REMOVE_AT PNG_LIBRARIES 1) #removing the zlib library path
@@ -183,94 +160,55 @@
"-XLAlua=${LUA_LIBRARY_NAME}")
endif()
-#this command is a workaround to some inlining issues present in older FreePascal versions and fixed in 2.6
-if(FREEPASCAL_VERSION VERSION_LESS "2.6")
- #under some configurations CMAKE_BUILD_TOOL fails to pass on the jobserver, breaking parallel compilation
- if(UNIX)
- set(SAFE_BUILD_TOOL $(MAKE))
- else()
- set(SAFE_BUILD_TOOL ${CMAKE_BUILD_TOOL})
- endif()
- add_custom_target(ENGINECLEAN COMMAND ${SAFE_BUILD_TOOL} "clean" "${PROJECT_BINARY_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}")
+
+if(NOT PHYSFS_FOUND)
+ add_definitions(-dPHYSFS_INTERNAL)
+ list(APPEND HW_LINK_LIBS physfs)
+ #-XLA is a beta fpc flag that renames libraries before passing them to the linker
+ #we also have to pass PHYSFS_INTERNAL to satisfy windows runtime requirements
+ #(should be harmless on other platforms)
+ add_flag_append(CMAKE_Pascal_FLAGS "-XLAphysfs=${physfs_output_name}")
endif()
+list(APPEND HW_LINK_LIBS physlayer)
+#Mix_Init/Mix_Quit from SDL_mixer 1.2.10
+check_library_exists(${SDLMIXER_LIBRARY} Mix_Init "" HAVE_MIXINIT)
+if(HAVE_MIXINIT)
+ add_definitions(-dSDL_MIXER_NEWER)
+endif(HAVE_MIXINIT)
+
+#IMG_Init/IMG_Quit from SDL_image 1.2.8
+check_library_exists(${SDLIMAGE_LIBRARY} IMG_Init "" HAVE_IMGINIT)
+if(HAVE_IMGINIT)
+ add_definitions(-dSDL_IMAGE_NEWER)
+endif(HAVE_IMGINIT)
-if(${FFMPEG_FOUND})
- list(APPEND pascal_flags "-dUSE_VIDEO_RECORDING")
+#needs to be last
+add_definitions(-dDEBUGFILE)
- # TODO: this check is only for SDL < 2
- # fpc will take care of linking but we need to have this library installed
- find_package(GLUT REQUIRED)
+#SOURCE AND PROGRAMS SECTION
+if(BUILD_ENGINE_LIBRARY)
+ message(${WARNING} "Engine will be built as library (experimental)")
+ if(APPLE AND current_macosx_version VERSION_GREATER "10.5")
+ # due to compiler/linker issues on Max OS X 10.6 -k-no_order_inits is needed to avoid linking fail
+ add_flag_prepend(CMAKE_Pascal_FLAGS "-k-no_order_inits")
+ endif()
- include_directories(${FFMPEG_INCLUDE_DIR})
- add_library(avwrapper avwrapper.c)
- #TODO: find good VERSION and SOVERSION values
- target_link_libraries(avwrapper ${FFMPEG_LIBRARIES})
- install(TARGETS avwrapper RUNTIME DESTINATION ${target_binary_install_dir}
- LIBRARY DESTINATION ${target_library_install_dir}
- ARCHIVE DESTINATION ${target_library_install_dir})
+ #workaround for missing <TARGET> support during object generation
+ set(engine_output_name "${CMAKE_SHARED_LIBRARY_PREFIX}hwengine${CMAKE_SHARED_LIBRARY_SUFFIX}")
+ set(destination_dir ${target_library_install_dir})
+ add_flag_prepend(CMAKE_Pascal_FLAGS "-o${LIBRARY_OUTPUT_PATH}/${engine_output_name}")
+
+ add_definitions(-dHWLIBRARY)
+ add_library(hwengine SHARED ${engine_sources} hwLibrary.pas)
+else()
+ # no need to change name here because target has same name
+ set(engine_output_name "hwengine${CMAKE_EXECUTABLE_SUFFIX}")
+ set(destination_dir ${target_binary_install_dir})
+ add_executable(hwengine ${engine_sources})
endif()
-
-set(fpc_flags ${pascal_flags} ${hwengine_project})
-
-if(NOT APPLE)
- #here is the command for standard executables or for shared library
- add_custom_command(OUTPUT "${EXECUTABLE_OUTPUT_PATH}/${engine_output_name}"
- COMMAND "${FREEPASCAL_EXECUTABLE}"
- ARGS ${fpc_flags} -o${engine_output_name}
- DEPENDS ${engine_sources}
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
- )
-else()
- #these are the dependencies for building a universal binary on Mac OS X
- foreach (build_arch ${powerpc_build} ${i386_build} ${x86_64_build})
- list(APPEND lipo_args_list "${EXECUTABLE_OUTPUT_PATH}/hwengine.${build_arch}")
- add_custom_command(OUTPUT "${EXECUTABLE_OUTPUT_PATH}/hwengine.${build_arch}"
- COMMAND "${FREEPASCAL_EXECUTABLE}"
- ARGS ${fpc_flags} -ohwengine.${build_arch} -P${build_arch}
- DEPENDS ${engine_sources}
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
- )
- add_custom_target(hwengine.${build_arch} ALL DEPENDS "${EXECUTABLE_OUTPUT_PATH}/hwengine.${build_arch}")
- add_custom_command(TARGET hwengine.${build_arch} POST_BUILD
- COMMAND "install_name_tool"
- ARGS -id @executable_path/../Frameworks/${engine_output_name}
- ${EXECUTABLE_OUTPUT_PATH}/hwengine.${build_arch}
- )
- endforeach()
-
- add_custom_command(OUTPUT "${EXECUTABLE_OUTPUT_PATH}/${engine_output_name}"
- COMMAND "lipo"
- ARGS ${lipo_args_list} -create -output ${EXECUTABLE_OUTPUT_PATH}/${engine_output_name}
- DEPENDS ${lipo_args_list}
- )
-endif()
-
-
-add_custom_target(hwengine ALL DEPENDS "${EXECUTABLE_OUTPUT_PATH}/${engine_output_name}")
-
-#when system Lua is not found we need to compile it before engine
-if(NOT LUA_FOUND)
- add_dependencies(hwengine lua)
-endif()
-
-# same for physfs
-if(NOT PHYSFS_FOUND)
- add_dependencies(hwengine physfs)
-endif()
-
-add_dependencies(hwengine physlayer)
-
-#when ffmpeg/libav is found we need to compile it before engine
-#TODO: convert avwrapper to .pas unit so we can skip this step
-if(${FFMPEG_FOUND})
- add_dependencies(hwengine avwrapper)
-endif()
-
-#this command is a workaround to some inlining issues present in older FreePascal versions and fixed in 2.6
-if((FREEPASCAL_VERSION VERSION_LESS "2.6") AND (NOT ${FFMPEG_FOUND}))
- add_dependencies(hwengine ENGINECLEAN)
-endif()
+#even though not actually used, this will trigger relink if any lib changes
+target_link_libraries(hwengine ${HW_LINK_LIBS})
install(PROGRAMS "${EXECUTABLE_OUTPUT_PATH}/${engine_output_name}" DESTINATION ${destination_dir})