aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt178
-rw-r--r--cmake/PCH.cmake315
-rw-r--r--src/game/CMakeLists.txt12
-rw-r--r--src/game/pchlinux.cpp1
-rw-r--r--src/game/pchlinux.h12
-rw-r--r--src/scripts/CMakeLists.txt14
6 files changed, 445 insertions, 87 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e2e579ca508..ad5a8384bfe 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,4 +1,4 @@
-PROJECT(Trinity)
+project(Trinity)
cmake_minimum_required(VERSION 2.6)
cmake_policy(SET CMP0005 OLD)
@@ -7,78 +7,94 @@ include(cmake/FindAce.cmake)
include(cmake/FindMySql.cmake)
include(cmake/FindReadline.cmake)
include(cmake/FindTermcap.cmake)
+include(cmake/PCH.cmake)
+
+# Force out-of-source build
+string(COMPARE EQUAL "${CMAKE_SOURCE_DIR}" "${CMAKE_BINARY_DIR}" BUILDING_IN_SOURCE)
+if(BUILDING_IN_SOURCE)
+ message(FATAL_ERROR "This project requires an out of source build. Please create a separate build directory and run 'cmake path_to_project [options]' there.")
+endif(BUILDING_IN_SOURCE)
+
+# Select the Release build configuration by default.
+if(NOT CMAKE_BUILD_TYPE)
+ set(CMAKE_BUILD_TYPE "Release")
+endif(NOT CMAKE_BUILD_TYPE)
+
CONFIGURE_FILE(
- "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
- "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
- IMMEDIATE @ONLY)
-ADD_CUSTOM_TARGET(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
-
-OPTION(DO_MYSQL "With MySQL support" 1)
-OPTION(DO_SCRIPTS "With trinityscripts" 1)
-OPTION(DO_CLI "With CLI" 1)
-OPTION(DO_RA "With RA" 0)
-OPTION(DO_DEBUG "Debug mode" 0)
-OPTION(DO_WARN "Enable all compile warnings" 0)
-OPTION(CENTOS "CENTOS" 0)
-OPTION(DO_SQL "Copy SQL files" 0)
-
-SET(GENREV_SRC
+ "${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
+ "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"
+ IMMEDIATE @ONLY)
+add_custom_target(uninstall "${CMAKE_COMMAND}" -P "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake")
+
+option(DO_MYSQL "With MySQL support" 1)
+option(DO_SCRIPTS "With trinityscripts" 1)
+option(DO_CLI "With CLI" 1)
+option(DO_RA "With RA" 0)
+option(DO_DEBUG "Debug mode" 0)
+option(DO_WARN "Enable all compile warnings" 0)
+option(DO_WARN "Enable all compile warnings" 0)
+option(CENTOS "CENTOS" 0)
+option(DO_SQL "Copy SQL files" 0)
+option(DO_PCH "Use precompiled headers" 1)
+
+set(GENREV_SRC
src/tools/genrevision/genrevision.cpp
)
-if (DO_DEBUG)
- ADD_EXECUTABLE(genrev
+if(DO_DEBUG)
+ add_executable(genrev
${GENREV_SRC}
)
- ADD_CUSTOM_TARGET("revision.h" ALL
- COMMAND "${Trinity_BINARY_DIR}/genrev"
- ${Trinity_SOURCE_DIR}
- WORKING_DIRECTORY "${Trinity_SOURCE_DIR}/src/shared"
+ add_custom_target("revision.h" ALL
+ COMMAND "${CMAKE_BINARY_DIR}/genrev"
+ ${CMAKE_SOURCE_DIR}
+ WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/src/shared"
DEPENDS genrev
)
else (DO_DEBUG)
- ADD_EXECUTABLE(genrev
+ add_executable(genrev
${GENREV_SRC}
)
- ADD_CUSTOM_TARGET("revision.h" ALL
- COMMAND "${Trinity_BINARY_DIR}/genrev"
- ${Trinity_SOURCE_DIR}
- WORKING_DIRECTORY "${Trinity_SOURCE_DIR}/src/shared"
+ add_custom_target("revision.h" ALL
+ COMMAND "${CMAKE_BINARY_DIR}/genrev"
+ ${CMAKE_SOURCE_DIR}
+ WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}/src/shared"
DEPENDS genrev
)
-endif (DO_DEBUG)
+endif(DO_DEBUG)
-EXECUTE_PROCESS(
+execute_process(
COMMAND hg tip --template {rev}
+ WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}"
OUTPUT_VARIABLE HG_REVISION
)
message("* TrinityCore revision: ${HG_REVISION}")
-IF (PREFIX)
- SET(CMAKE_INSTALL_PREFIX ${PREFIX})
-ENDIF (PREFIX)
+if(PREFIX)
+ set(CMAKE_INSTALL_PREFIX ${PREFIX})
+endif(PREFIX)
if(CONF_DIR)
else(CONF_DIR)
-SET(CONF_DIR ${PREFIX}/etc)
+ set(CONF_DIR ${PREFIX}/etc)
endif(CONF_DIR)
-SET(LIBSDIR ${CMAKE_INSTALL_PREFIX}/lib)
+set(LIBSDIR ${CMAKE_INSTALL_PREFIX}/lib)
message("* Will install to: ${CMAKE_INSTALL_PREFIX}")
message("* With config dir at: ${CONF_DIR}")
message("* Libs install dir at: ${LIBSDIR}")
-FIND_LIBRARY(SSLLIB NAMES ssl DOC "SSL library")
-FIND_LIBRARY(ZLIB z "Zlib library")
+find_library(SSLLIB NAMES ssl DOC "SSL library")
+find_library(ZLIB z "Zlib library")
-IF(DO_MYSQL)
- MESSAGE("* With MySQL")
+if(DO_MYSQL)
+ message("* With MySQL")
FIND_MYSQL()
ADD_DEFINITIONS(-DDO_MYSQL)
-ENDIF(DO_MYSQL)
+endif(DO_MYSQL)
if(DO_SCRIPTS)
message("* With Trinity Scripts")
@@ -91,22 +107,22 @@ endif(DO_SCRIPTS)
message("-- Miscellaneus options:")
if(DO_CLI)
-message("* With CLI")
-add_definitions(-DENABLE_CLI)
+ message("* With CLI")
+ add_definitions(-DENABLE_CLI)
else (DO_CLI)
-message(* Without CLI)
+ message(* Without CLI)
endif(DO_CLI)
if(DO_RA)
-message("* With RA")
-add_definitions(-DENABLE_RA)
+ message("* With RA")
+ add_definitions(-DENABLE_RA)
else(DO_RA)
-message("* Without RA")
+ message("* Without RA")
endif(DO_RA)
if(DO_DEBUG)
-message("* Debug mode ON")
-add_definitions(-g -DTRINITY_DEBUG)
+ message("* Debug mode ON")
+ add_definitions(-g -DTRINITY_DEBUG)
endif(DO_DEBUG)
if(DO_WARN)
@@ -114,63 +130,63 @@ if(DO_WARN)
add_definitions(-Wall -Wfatal-errors -Wextra)
endif(DO_WARN)
-IF(UNIX)
- IF(CENTOS)
+if(UNIX)
+ if(CENTOS)
add_definitions(-DCENTOS)
- MESSAGE("* Building with termcap")
+ message("* Building with termcap")
FIND_TERMCAP()
- ELSE(CENTOS)
- MESSAGE("* Building with readline")
+ else(CENTOS)
+ message("* Building with readline")
FIND_READLINE()
- ENDIF(CENTOS)
-ENDIF(UNIX)
+ endif(CENTOS)
+endif(UNIX)
FIND_ACE(ACE)
if(ACE_FOUND)
-message(STATUS "Found ACE library: ${ACE_LIBRARY}")
-message(STATUS "Include dir is: ${ACE_INCLUDE_DIR}")
+ message(STATUS "Found ACE library: ${ACE_LIBRARY}")
+ message(STATUS "Include dir is: ${ACE_INCLUDE_DIR}")
else(ACE_FOUND)
-message(SEND_ERROR "** ACE library not found! Trinity Core cannot be compiled!")
-message(SEND_ERROR "** Please build ACE from http://www.cs.wustl.edu/~schmidt/ACE.html")
-#For now remove msg about install from repo, as ubuntu/debian don't have needed ver in repos.
-#message(SEND_ERROR "** your distro may provide a binary for ACE e.g. for ubuntu try apt-get install libace-dev")
-return()
-#SET(BUILD_ACE 1)
-#SET(ACE_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/dep/ACE_wrappers ${CMAKE_BINARY_DIR}/dep/ACE_wrappers")
-#SET(ACE_LIBRARY ACE)
-#message(STATUS "I will try to build ACE from: ${ACE_INCLUDE_DIR}")
-#message(STATUS "And link using: ${ACE_LIBRARY}")
+ message(SEND_ERROR "** ACE library not found! Trinity Core cannot be compiled!")
+ message(SEND_ERROR "** Please build ACE from http://www.cs.wustl.edu/~schmidt/ACE.html")
+ #For now remove msg about install from repo, as ubuntu/debian don't have needed ver in repos.
+ #message(SEND_ERROR "** your distro may provide a binary for ACE e.g. for ubuntu try apt-get install libace-dev")
+ return()
+ #set(BUILD_ACE 1)
+ #set(ACE_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/dep/ACE_wrappers ${CMAKE_BINARY_DIR}/dep/ACE_wrappers")
+ #set(ACE_LIBRARY ACE)
+ #message(STATUS "I will try to build ACE from: ${ACE_INCLUDE_DIR}")
+ #message(STATUS "And link using: ${ACE_LIBRARY}")
endif(ACE_FOUND)
#somehow line below don't work. so for now change it to if exist
#check_include_files(${ACE_INCLUDE_DIR}/ace/Stack_Trace.h HAVE_ACE_STACK_TRACE_H)
-IF(EXISTS ${ACE_INCLUDE_DIR}/ace/Stack_Trace.h)
- SET(HAVE_ACE_STACK_TRACE_H 1)
-ELSE(EXISTS ${ACE_INCLUDE_DIR}/ace/Stack_Trace.h)
+if(EXISTS ${ACE_INCLUDE_DIR}/ace/Stack_Trace.h)
+ set(HAVE_ACE_STACK_TRACE_H 1)
+else(EXISTS ${ACE_INCLUDE_DIR}/ace/Stack_Trace.h)
message(STATUS "** Your libace is out of date. Please update your libace!")
-ENDIF(EXISTS ${ACE_INCLUDE_DIR}/ace/Stack_Trace.h)
+endif(EXISTS ${ACE_INCLUDE_DIR}/ace/Stack_Trace.h)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)
-IF (CMAKE_SYSTEM_NAME MATCHES "Darwin")
- SET(MACOSX 1)
- SET(OSX_LIBS /opt/local/lib/libcrypto.dylib)
+if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
+ set(MACOSX 1)
+ set(OSX_LIBS /opt/local/lib/libcrypto.dylib)
add_definitions(-D__ASSERTMACROS__)
-ENDIF (CMAKE_SYSTEM_NAME MATCHES "Darwin")
+endif(CMAKE_SYSTEM_NAME MATCHES "Darwin")
add_definitions(--no-warnings) #to make build look nice, no gcc nazi warnings.
-SET(CMAKE_SKIP_BUILD_RPATH FALSE)
-SET(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
-SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
-SET(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
+set(CMAKE_SKIP_BUILD_RPATH FALSE)
+set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
+set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
+set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
-add_subdirectory(dep)
#add_subdirectory(doc)
+add_subdirectory(dep)
add_subdirectory(src)
if(DO_SQL)
-message("* Copy SQL files ON")
-add_subdirectory(sql)
+ message("* Copy SQL files ON")
+ add_subdirectory(sql)
endif(DO_SQL)
diff --git a/cmake/PCH.cmake b/cmake/PCH.cmake
new file mode 100644
index 00000000000..e7da9349cb6
--- /dev/null
+++ b/cmake/PCH.cmake
@@ -0,0 +1,315 @@
+#
+# This file is for CMake 2.6
+#
+# - Try to find precompiled headers support for GCC 3.4 and 4.x
+# Once done this will define:
+#
+# Variable:
+# PCHSupport_FOUND
+#
+# Macro:
+# ADD_PRECOMPILED_HEADER _targetName _input _dowarn
+# ADD_PRECOMPILED_HEADER_TO_TARGET _targetName _input _pch_output_to_use _dowarn
+# ADD_NATIVE_PRECOMPILED_HEADER _targetName _input _dowarn
+# GET_NATIVE_PRECOMPILED_HEADER _targetName _input
+
+IF(CMAKE_COMPILER_IS_GNUCXX)
+
+ EXEC_PROGRAM(
+ ${CMAKE_CXX_COMPILER}
+ ARGS ${CMAKE_CXX_COMPILER_ARG1} -dumpversion
+ OUTPUT_VARIABLE gcc_compiler_version)
+ #MESSAGE("GCC Version: ${gcc_compiler_version}")
+ IF(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]")
+ SET(PCHSupport_FOUND TRUE)
+ ENDIF(gcc_compiler_version MATCHES "4\\.[0-9]\\.[0-9]")
+
+ SET(_PCH_include_prefix "-I")
+
+ENDIF(CMAKE_COMPILER_IS_GNUCXX)
+
+MACRO(_PCH_GET_COMPILE_FLAGS _out_compile_flags)
+
+
+ STRING(TOUPPER "CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}" _flags_var_name)
+ SET(return_value ${${_flags_var_name}} )
+
+ IF(CMAKE_COMPILER_IS_GNUCXX)
+
+ GET_TARGET_PROPERTY(_targetType ${_PCH_current_target} TYPE)
+ IF(${_targetType} STREQUAL SHARED_LIBRARY)
+ LIST(APPEND return_value "${return_value} -fPIC")
+ ENDIF(${_targetType} STREQUAL SHARED_LIBRARY)
+
+ ENDIF(CMAKE_COMPILER_IS_GNUCXX)
+
+ GET_DIRECTORY_PROPERTY(DIRINC INCLUDE_DIRECTORIES )
+ FOREACH(item ${DIRINC})
+ LIST(APPEND return_value "${_PCH_include_prefix}${item}")
+ ENDFOREACH(item)
+
+ SET(_build_type "${CMAKE_BUILD_TYPE}")
+
+ #MESSAGE(STATUS "build type: `${CMAKE_BUILD_TYPE}'")
+
+ IF (NOT _build_type)
+ SET(_build_type "Debug")
+ ENDIF (NOT _build_type)
+
+ string(TOUPPER ${_build_type} _build_type)
+ SET(_def_name "COMPILE_DEFINITIONS_${_build_type}")
+ GET_DIRECTORY_PROPERTY(_directory_flags ${_def_name})
+ FOREACH(item ${_directory_flags})
+ LIST(APPEND return_value "-D${item}")
+ ENDFOREACH(item)
+ GET_DIRECTORY_PROPERTY(_directory_flags COMPILE_DEFINITIONS)
+ LIST(APPEND ${_out_compile_flags} ${return_value})
+ FOREACH(_def ${_directory_flags})
+ LIST(APPEND ${_out_compile_flags} "-D${_def}")
+ ENDFOREACH(_def)
+ LIST(APPEND ${_out_compile_flags} ${CMAKE_CXX_FLAGS} )
+
+ SEPARATE_ARGUMENTS(${_out_compile_flags})
+
+ENDMACRO(_PCH_GET_COMPILE_FLAGS)
+
+#
+#
+#
+
+MACRO(_PCH_WRITE_PCHDEP_CXX _targetName _include_file _dephelp)
+
+ SET(${_dephelp} ${CMAKE_CURRENT_BINARY_DIR}/${_targetName}_pch_dephelp.cxx)
+ FILE(WRITE ${${_dephelp}}
+"#include \"${_include_file}\"
+int testfunction()
+{
+ return 0;
+}
+"
+ )
+
+ENDMACRO(_PCH_WRITE_PCHDEP_CXX )
+
+#
+#
+#
+
+MACRO(_PCH_GET_COMPILE_COMMAND out_command _input _output)
+
+ FILE(TO_NATIVE_PATH ${_input} _native_input)
+ FILE(TO_NATIVE_PATH ${_output} _native_output)
+
+
+ IF(CMAKE_COMPILER_IS_GNUCXX)
+ SET(${out_command}
+ ${CMAKE_CXX_COMPILER} ${_compile_FLAGS} -x c++-header -o ${_output} ${_input}
+ )
+ ENDIF(CMAKE_COMPILER_IS_GNUCXX)
+
+ENDMACRO(_PCH_GET_COMPILE_COMMAND )
+
+#
+#
+#
+
+MACRO(_PCH_GET_TARGET_COMPILE_FLAGS _cflags _header_name _pch_path _dowarn )
+
+ FILE(TO_NATIVE_PATH ${_pch_path} _native_pch_path)
+
+ IF(CMAKE_COMPILER_IS_GNUCXX)
+ # for use with distcc and gcc >4.0.1 if preprocessed files are accessible
+ # on all remote machines set
+ # PCH_ADDITIONAL_COMPILER_FLAGS to -fpch-preprocess
+ # if you want warnings for invalid header files (which is very inconvenient
+ # if you have different versions of the headers for different build types
+ # you may set _pch_dowarn
+ IF (_dowarn)
+ SET(${_cflags} "${PCH_ADDITIONAL_COMPILER_FLAGS} -include ${CMAKE_CURRENT_BINARY_DIR}/${_header_name} -Winvalid-pch " )
+ ELSE (_dowarn)
+ SET(${_cflags} "${PCH_ADDITIONAL_COMPILER_FLAGS} -include ${CMAKE_CURRENT_BINARY_DIR}/${_header_name} " )
+ ENDIF (_dowarn)
+ ELSE(CMAKE_COMPILER_IS_GNUCXX)
+
+ set(${_cflags} "/Fp${_native_pch_path} /Yu${_header_name}" )
+
+ ENDIF(CMAKE_COMPILER_IS_GNUCXX)
+
+ENDMACRO(_PCH_GET_TARGET_COMPILE_FLAGS )
+
+MACRO(GET_PRECOMPILED_HEADER_OUTPUT _targetName _input _output)
+ GET_FILENAME_COMPONENT(_name ${_input} NAME)
+ GET_FILENAME_COMPONENT(_path ${_input} PATH)
+ SET(_output "${CMAKE_CURRENT_BINARY_DIR}/${_name}.gch/${_targetName}_${CMAKE_BUILD_TYPE}.h++")
+ENDMACRO(GET_PRECOMPILED_HEADER_OUTPUT _targetName _input)
+
+
+MACRO(ADD_PRECOMPILED_HEADER_TO_TARGET _targetName _input _pch_output_to_use )
+
+ # to do: test whether compiler flags match between target _targetName
+ # and _pch_output_to_use
+ GET_FILENAME_COMPONENT(_name ${_input} NAME)
+
+ IF( "${ARGN}" STREQUAL "0")
+ SET(_dowarn 0)
+ ELSE( "${ARGN}" STREQUAL "0")
+ SET(_dowarn 1)
+ ENDIF("${ARGN}" STREQUAL "0")
+
+
+ _PCH_GET_TARGET_COMPILE_FLAGS(_target_cflags ${_name} ${_pch_output_to_use} ${_dowarn})
+ # MESSAGE("Add flags ${_target_cflags} to ${_targetName} " )
+ SET_TARGET_PROPERTIES(${_targetName}
+ PROPERTIES
+ COMPILE_FLAGS ${_target_cflags}
+ )
+
+ ADD_CUSTOM_TARGET(pch_Generate_${_targetName}
+ DEPENDS ${_pch_output_to_use}
+ )
+
+ ADD_DEPENDENCIES(${_targetName} pch_Generate_${_targetName} )
+
+ENDMACRO(ADD_PRECOMPILED_HEADER_TO_TARGET)
+
+MACRO(ADD_PRECOMPILED_HEADER _targetName _input)
+
+ SET(_PCH_current_target ${_targetName})
+
+ IF(NOT CMAKE_BUILD_TYPE)
+ MESSAGE(FATAL_ERROR
+ "This is the ADD_PRECOMPILED_HEADER macro. "
+ "You must set CMAKE_BUILD_TYPE!"
+ )
+ ENDIF(NOT CMAKE_BUILD_TYPE)
+
+ IF( "${ARGN}" STREQUAL "0")
+ SET(_dowarn 0)
+ ELSE( "${ARGN}" STREQUAL "0")
+ SET(_dowarn 1)
+ ENDIF("${ARGN}" STREQUAL "0")
+
+
+ GET_FILENAME_COMPONENT(_name ${_input} NAME)
+ GET_FILENAME_COMPONENT(_path ${_input} PATH)
+ GET_PRECOMPILED_HEADER_OUTPUT( ${_targetName} ${_input} _output)
+
+ GET_FILENAME_COMPONENT(_outdir ${_output} PATH )
+
+ GET_TARGET_PROPERTY(_targetType ${_PCH_current_target} TYPE)
+ _PCH_WRITE_PCHDEP_CXX(${_targetName} ${_input} _pch_dephelp_cxx)
+
+ IF(${_targetType} STREQUAL SHARED_LIBRARY)
+ ADD_LIBRARY(${_targetName}_pch_dephelp SHARED ${_pch_dephelp_cxx} )
+ ELSE(${_targetType} STREQUAL SHARED_LIBRARY)
+ ADD_LIBRARY(${_targetName}_pch_dephelp STATIC ${_pch_dephelp_cxx})
+ ENDIF(${_targetType} STREQUAL SHARED_LIBRARY)
+
+ FILE(MAKE_DIRECTORY ${_outdir})
+
+ _PCH_GET_COMPILE_FLAGS(_compile_FLAGS)
+
+ #MESSAGE("_compile_FLAGS: ${_compile_FLAGS}")
+ #message("COMMAND ${CMAKE_CXX_COMPILER} ${_compile_FLAGS} -x c++-header -o ${_output} ${_input}")
+ SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_BINARY_DIR}/${_name} PROPERTIES GENERATED 1)
+ ADD_CUSTOM_COMMAND(
+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${_name}
+ COMMAND ${CMAKE_COMMAND} -E copy ${_input} ${CMAKE_CURRENT_BINARY_DIR}/${_name} # ensure same directory! Required by gcc
+ DEPENDS ${_input}
+ )
+
+ #message("_command ${_input} ${_output}")
+ _PCH_GET_COMPILE_COMMAND(_command ${CMAKE_CURRENT_BINARY_DIR}/${_name} ${_output} )
+ #message("${_command}")
+
+ #message(${_input} )
+ #message("_output ${_output}")
+
+ ADD_CUSTOM_COMMAND(
+ OUTPUT ${_output}
+ COMMAND ${_command}
+ DEPENDS ${_input} ${CMAKE_CURRENT_BINARY_DIR}/${_name} ${_targetName}_pch_dephelp
+ )
+
+
+ ADD_PRECOMPILED_HEADER_TO_TARGET(${_targetName} ${_input} ${_output} ${_dowarn})
+ENDMACRO(ADD_PRECOMPILED_HEADER)
+
+
+# Generates the use of precompiled in a target,
+# without using depency targets (2 extra for each target)
+# Using Visual, must also add ${_targetName}_pch to sources
+# Not needed by Xcode
+
+MACRO(GET_NATIVE_PRECOMPILED_HEADER _targetName _input)
+
+ if(CMAKE_GENERATOR MATCHES Visual*)
+
+ SET(_dummy_str "#include \"${_input}\"\n"
+ "// This is required to suppress LNK4221. Very annoying.\n"
+ "void *g_${_targetName}Dummy = 0\;\n")
+
+ # Use of cxx extension for generated files (as Qt does)
+ SET(${_targetName}_pch ${CMAKE_CURRENT_BINARY_DIR}/${_targetName}_pch.cxx)
+ if(EXISTS ${${_targetName}_pch})
+ # Check if contents is the same, if not rewrite
+ # todo
+ else(EXISTS ${${_targetName}_pch})
+ FILE(WRITE ${${_targetName}_pch} ${_dummy_str})
+ endif(EXISTS ${${_targetName}_pch})
+ endif(CMAKE_GENERATOR MATCHES Visual*)
+
+ENDMACRO(GET_NATIVE_PRECOMPILED_HEADER)
+
+
+MACRO(ADD_NATIVE_PRECOMPILED_HEADER _targetName _input)
+
+ IF( "${ARGN}" STREQUAL "0")
+ SET(_dowarn 0)
+ ELSE( "${ARGN}" STREQUAL "0")
+ SET(_dowarn 1)
+ ENDIF("${ARGN}" STREQUAL "0")
+
+ if(CMAKE_GENERATOR MATCHES Visual*)
+ # Auto include the precompile (useful for moc processing, since the use of
+ # precompiled is specified at the target level
+ # and I don't want to specifiy /F- for each moc/res/ui generated files (using Qt)
+
+ GET_TARGET_PROPERTY(oldProps ${_targetName} COMPILE_FLAGS)
+ if (${oldProps} MATCHES NOTFOUND)
+ SET(oldProps "")
+ endif(${oldProps} MATCHES NOTFOUND)
+
+ SET(newProperties "${oldProps} /Yu\"${_input}\" /FI\"${_input}\"")
+ SET_TARGET_PROPERTIES(${_targetName} PROPERTIES COMPILE_FLAGS "${newProperties}")
+
+ #also inlude ${oldProps} to have the same compile options
+ SET_SOURCE_FILES_PROPERTIES(${${_targetName}_pch} PROPERTIES COMPILE_FLAGS "${oldProps} /Yc\"${_input}\"")
+
+ else(CMAKE_GENERATOR MATCHES Visual*)
+
+ if (CMAKE_GENERATOR MATCHES Xcode)
+ # For Xcode, cmake needs my patch to process
+ # GCC_PREFIX_HEADER and GCC_PRECOMPILE_PREFIX_HEADER as target properties
+
+ GET_TARGET_PROPERTY(oldProps ${_targetName} COMPILE_FLAGS)
+ if (${oldProps} MATCHES NOTFOUND)
+ SET(oldProps "")
+ endif(${oldProps} MATCHES NOTFOUND)
+
+ # When buiding out of the tree, precompiled may not be located
+ # Use full path instead.
+ GET_FILENAME_COMPONENT(fullPath ${_input} ABSOLUTE)
+
+ SET_TARGET_PROPERTIES(${_targetName} PROPERTIES XCODE_ATTRIBUTE_GCC_PREFIX_HEADER "${fullPath}")
+ SET_TARGET_PROPERTIES(${_targetName} PROPERTIES XCODE_ATTRIBUTE_GCC_PRECOMPILE_PREFIX_HEADER "YES")
+
+ else (CMAKE_GENERATOR MATCHES Xcode)
+
+ #Fallback to the "old" precompiled suppport
+ #ADD_PRECOMPILED_HEADER(${_targetName} ${_input} ${_dowarn})
+ endif(CMAKE_GENERATOR MATCHES Xcode)
+ endif(CMAKE_GENERATOR MATCHES Visual*)
+
+ENDMACRO(ADD_NATIVE_PRECOMPILED_HEADER)
+
diff --git a/src/game/CMakeLists.txt b/src/game/CMakeLists.txt
index 68913a6d2d2..ab5ef6c2f56 100644
--- a/src/game/CMakeLists.txt
+++ b/src/game/CMakeLists.txt
@@ -1,5 +1,7 @@
-
-########### next target ###############
+# Enable precompiled headers when using the GCC compiler.
+IF(DO_PCH AND CMAKE_COMPILER_IS_GNUCXX)
+ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
+ENDIF(DO_PCH AND CMAKE_COMPILER_IS_GNUCXX)
SET(game_STAT_SRCS
AccountMgr.cpp
@@ -317,6 +319,7 @@ include_directories(
${CMAKE_SOURCE_DIR}/src/shared
${CMAKE_SOURCE_DIR}/src/shared/vmap
${CMAKE_SOURCE_DIR}/src/shared/Database
+ ${CMAKE_SOURCE_DIR}/src/game
${MYSQL_INCLUDE_DIR}
)
@@ -343,3 +346,8 @@ endif(NOT DO_SCRIPTS)
add_library(game STATIC ${game_STAT_SRCS})
ADD_DEPENDENCIES(game revision.h)
+# Generate precompiled header
+IF(DO_PCH AND CMAKE_COMPILER_IS_GNUCXX)
+ ADD_PRECOMPILED_HEADER(game ${CMAKE_SOURCE_DIR}/src/game/pchlinux.h)
+ENDIF(DO_PCH AND CMAKE_COMPILER_IS_GNUCXX)
+
diff --git a/src/game/pchlinux.cpp b/src/game/pchlinux.cpp
new file mode 100644
index 00000000000..e588392689e
--- /dev/null
+++ b/src/game/pchlinux.cpp
@@ -0,0 +1 @@
+#include "pchdef.h" \ No newline at end of file
diff --git a/src/game/pchlinux.h b/src/game/pchlinux.h
new file mode 100644
index 00000000000..7252e980e7d
--- /dev/null
+++ b/src/game/pchlinux.h
@@ -0,0 +1,12 @@
+//add here most rarely modified headers to speed up debug build compilation
+#include "WorldSocket.h" // must be first to make ACE happy with ACE includes in it
+#include "Common.h"
+
+#include "MapManager.h"
+#include "Log.h"
+#include "ObjectAccessor.h"
+#include "ObjectDefines.h"
+#include "Database/SQLStorage.h"
+#include "Opcodes.h"
+#include "SharedDefines.h"
+#include "ObjectMgr.h"
diff --git a/src/scripts/CMakeLists.txt b/src/scripts/CMakeLists.txt
index 54627091ec2..e51130881f6 100644
--- a/src/scripts/CMakeLists.txt
+++ b/src/scripts/CMakeLists.txt
@@ -1,11 +1,13 @@
-
-########### next target ###############
+# Enable precompiled headers when using the GCC compiler.
+IF(DO_PCH AND CMAKE_COMPILER_IS_GNUCXX)
+ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
+ENDIF(DO_PCH AND CMAKE_COMPILER_IS_GNUCXX)
SET(scripts_STAT_SRCS
- ../game/ScriptedEscortAI.cpp
- ../game/ScriptedEscortAI.h
../game/ScriptedPch.cpp
../game/ScriptedPch.h
+ ../game/ScriptedEscortAI.cpp
+ ../game/ScriptedEscortAI.h
../game/ScriptedCreature.cpp
../game/ScriptedCreature.h
../game/ScriptedFollowerAI.cpp
@@ -586,3 +588,7 @@ include_directories(
add_library(scripts STATIC ${scripts_STAT_SRCS})
+# Generate precompiled header
+IF(DO_PCH AND CMAKE_COMPILER_IS_GNUCXX)
+ ADD_PRECOMPILED_HEADER(scripts ${CMAKE_SOURCE_DIR}/src/game/ScriptedPch.h)
+ENDIF(DO_PCH AND CMAKE_COMPILER_IS_GNUCXX)