diff --git a/.travis.yml b/.travis.yml index 58e982b9..5661ed7a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,7 +18,7 @@ notifications: # build on both Linux and OSX os: - linux - - osx +# - osx # build with both gcc and clang to ensure compatibility compiler: diff --git a/CMakeLists.txt b/CMakeLists.txt index bbf7e44e..e9e2c5d3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,7 +45,7 @@ option(SCRIPT_LIB_ELUNA "Compile with support for Eluna scripts" ON) option(SCRIPT_LIB_SD3 "Compile with support for ScriptDev3 scripts" ON) option(PLAYERBOTS "Enable Player Bots" OFF) option(SOAP "Enable remote access via SOAP" OFF) -option(PCH "Enable precompiled headers" OFF) +option(PCH "Enable precompiled headers" ON) option(DEBUG "Enable debug build (only on non IDEs)" OFF) #================================================================================== message("") diff --git a/cmake/PCHSupport.cmake b/cmake/PCHSupport.cmake index b068b69c..c0810aa0 100644 --- a/cmake/PCHSupport.cmake +++ b/cmake/PCHSupport.cmake @@ -1,104 +1,123 @@ -FUNCTION(GET_COMMON_PCH_PARAMS PCH_HEADER PCH_FE INCLUDE_PREFIX) - GET_FILENAME_COMPONENT(PCH_HEADER_N ${PCH_HEADER} NAME) - GET_DIRECTORY_PROPERTY(TARGET_INCLUDES INCLUDE_DIRECTORIES) +# CMake precompiled header macro +# Distributed under the MIT Software License +# Copyright (c) 2015-2017 Borislav Stanimirov +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +# +# ADD_CXX_PCH +# +# Sets a precompiled header for a given target +# Args: +# TARGET_NAME - Name of the target. Only valid after add_library or add_executable +# PRECOMPILED_HEADER - Header file to precompile +# PRECOMPILED_SOURCE - MSVC specific source to do the actual precompilation. Ignored on other platforms - FOREACH(ITEM ${TARGET_INCLUDES}) - LIST(APPEND INCLUDE_FLAGS_LIST "${INCLUDE_PREFIX}\"${ITEM}\" ") - ENDFOREACH(ITEM) +function(ADD_CXX_PCH TARGET_NAME PRECOMPILED_HEADER PRECOMPILED_SOURCE) - SET(PCH_HEADER_NAME ${PCH_HEADER_N} PARENT_SCOPE) - SET(PCH_HEADER_OUT ${CMAKE_CURRENT_BINARY_DIR}/${PCH_HEADER_N}.${PCH_FE} PARENT_SCOPE) - SET(INCLUDE_FLAGS ${INCLUDE_FLAGS_LIST} PARENT_SCOPE) -ENDFUNCTION(GET_COMMON_PCH_PARAMS) + get_filename_component(PRECOMPILED_HEADER_NAME ${PRECOMPILED_HEADER} NAME) -FUNCTION(GENERATE_CXX_PCH_COMMAND TARGET_NAME INCLUDE_FLAGS IN PCH_SRC OUT) - IF (CMAKE_BUILD_TYPE) - STRING(TOUPPER _${CMAKE_BUILD_TYPE} CURRENT_BUILD_TYPE) - ENDIF () + if(MSVC) + get_filename_component(PRECOMPILED_HEADER_PATH ${PRECOMPILED_HEADER} DIRECTORY) + target_include_directories(${TARGET_NAME} PRIVATE ${PRECOMPILED_HEADER_PATH}) # fixes occasional IntelliSense glitches - SET(COMPILE_FLAGS ${CMAKE_CXX_FLAGS${CURRENT_BUILD_TYPE}}) - LIST(APPEND COMPILE_FLAGS ${CMAKE_CXX_FLAGS}) + get_filename_component(PRECOMPILED_HEADER_WE ${PRECOMPILED_HEADER} NAME_WE) + set(PRECOMPILED_BINARY "$(IntDir)/${PRECOMPILED_HEADER_WE}.pch") - IF ("${CMAKE_SYSTEM_NAME}" MATCHES "Darwin") - IF (NOT "${CMAKE_OSX_ARCHITECTURES}" STREQUAL "") - LIST(APPEND COMPILE_FLAGS "-arch ${CMAKE_OSX_ARCHITECTURES}") - ENDIF () - IF (NOT "${CMAKE_OSX_SYSROOT}" STREQUAL "") - LIST(APPEND COMPILE_FLAGS "-isysroot ${CMAKE_OSX_SYSROOT}") - ENDIF () - IF (NOT "${CMAKE_OSX_DEPLOYMENT_TARGET}" STREQUAL "") - LIST(APPEND COMPILE_FLAGS "-mmacosx-version-min=${CMAKE_OSX_DEPLOYMENT_TARGET}") - ENDIF () - ENDIF () + get_target_property(SOURCE_FILES ${TARGET_NAME} SOURCES) + set(SOURCE_FILE_FOUND FALSE) + foreach(SOURCE_FILE ${SOURCE_FILES}) + if(SOURCE_FILE MATCHES \\.\(c|cc|cxx|cpp\)$) + if(${PRECOMPILED_SOURCE} MATCHES ${SOURCE_FILE}) + # Set source file to generate header + set_source_files_properties( + ${SOURCE_FILE} + PROPERTIES + COMPILE_FLAGS "/Yc\"${PRECOMPILED_HEADER_NAME}\" /Fp\"${PRECOMPILED_BINARY}\"" + OBJECT_OUTPUTS "${PRECOMPILED_BINARY}") + set(SOURCE_FILE_FOUND TRUE) + else() + # Set and automatically include precompiled header + set_source_files_properties( + ${SOURCE_FILE} + PROPERTIES + COMPILE_FLAGS "/Yu\"${PRECOMPILED_HEADER_NAME}\" /Fp\"${PRECOMPILED_BINARY}\" /FI\"${PRECOMPILED_HEADER_NAME}\"" + OBJECT_DEPENDS "${PRECOMPILED_BINARY}") + endif() + endif() + endforeach() + if(NOT SOURCE_FILE_FOUND) + message(FATAL_ERROR "A source file for ${PRECOMPILED_HEADER} was not found. Required for MSVC builds.") + endif(NOT SOURCE_FILE_FOUND) + elseif(CMAKE_GENERATOR STREQUAL Xcode) + set_target_properties( + ${TARGET_NAME} + PROPERTIES + XCODE_ATTRIBUTE_GCC_PREFIX_HEADER "${PRECOMPILED_HEADER}" + XCODE_ATTRIBUTE_GCC_PRECOMPILE_PREFIX_HEADER "YES" + ) + elseif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + if(CMAKE_COMPILER_IS_GNUCC) + set(SFX gch) + else() + set(SFX pch) + endif() - GET_DIRECTORY_PROPERTY(TARGET_DEFINITIONS COMPILE_DEFINITIONS) - FOREACH(ITEM ${TARGET_DEFINITIONS}) - LIST(APPEND DEFINITION_FLAGS "-D${ITEM} ") - ENDFOREACH(ITEM) + # Create and set output directory. + set(OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}") + set(OUTPUT_NAME "${OUTPUT_DIR}/${PRECOMPILED_HEADER_NAME}.${SFX}") - SEPARATE_ARGUMENTS(COMPILE_FLAGS) - SEPARATE_ARGUMENTS(INCLUDE_FLAGS) - SEPARATE_ARGUMENTS(DEFINITION_FLAGS) + make_directory(${OUTPUT_DIR}) - GET_FILENAME_COMPONENT(PCH_SRC_N ${PCH_SRC} NAME) - ADD_LIBRARY(${PCH_SRC_N}_dephelp MODULE ${PCH_SRC}) + # Export compiler flags via a generator to a response file + set(PCH_FLAGS_FILE "${OUTPUT_DIR}/${PRECOMPILED_HEADER_NAME}.rsp") + set(_include_directories "$") + set(_compile_definitions "$") + set(_compile_flags "$") + set(_compile_options "$") + set(_include_directories "$<$:-I$\n>") + set(_compile_definitions "$<$:-D$\n>") + set(_compile_flags "$<$:$\n>") + set(_compile_options "$<$:$\n>") + file(GENERATE OUTPUT "${PCH_FLAGS_FILE}" CONTENT "${_compile_definitions}${_include_directories}${_compile_flags}${_compile_options}\n") - ADD_CUSTOM_COMMAND( - OUTPUT ${OUT} - COMMAND ${CMAKE_CXX_COMPILER} - ARGS ${DEFINITION_FLAGS} ${COMPILE_FLAGS} ${INCLUDE_FLAGS} -x c++-header ${IN} -o ${OUT} - DEPENDS ${IN} ${PCH_SRC_N}_dephelp - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - ) + # Gather global compiler options, definitions, etc. + string(TOUPPER "CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}" CXX_FLAGS) + set(COMPILER_FLAGS "${${CXX_FLAGS}} ${CMAKE_CXX_FLAGS}") + separate_arguments(COMPILER_FLAGS) - ADD_CUSTOM_TARGET(generate_${PCH_SRC_N} - DEPENDS ${OUT} - ) + set(CXX_STD c++11) - ADD_DEPENDENCIES(${TARGET_NAME} generate_${PCH_SRC_N}) -ENDFUNCTION(GENERATE_CXX_PCH_COMMAND) + add_custom_command( + OUTPUT ${OUTPUT_NAME} + COMMAND ${CMAKE_CXX_COMPILER} @${PCH_FLAGS_FILE} ${COMPILER_FLAGS} -x c++-header -std=${CXX_STD} -o ${OUTPUT_NAME} ${PRECOMPILED_HEADER} + DEPENDS ${PRECOMPILED_HEADER} + ) -FUNCTION(ADD_CXX_PCH_GCC TARGET_NAME PCH_HEADER PCH_SOURCE) - GET_COMMON_PCH_PARAMS(${PCH_HEADER} "gch" "-I") - GENERATE_CXX_PCH_COMMAND(${TARGET_NAME} "${INCLUDE_FLAGS}" ${PCH_HEADER} ${PCH_SOURCE} ${PCH_HEADER_OUT}) - SET_TARGET_PROPERTIES( - ${TARGET_NAME} PROPERTIES - COMPILE_FLAGS "-include ${CMAKE_CURRENT_BINARY_DIR}/${PCH_HEADER_NAME}" - ) -ENDFUNCTION(ADD_CXX_PCH_GCC) + add_custom_target(${TARGET_NAME}_${SFX} DEPENDS ${OUTPUT_NAME}) + add_dependencies(${TARGET_NAME} ${TARGET_NAME}_${SFX}) -FUNCTION(ADD_CXX_PCH_CLANG TARGET_NAME PCH_HEADER PCH_SOURCE) - GET_COMMON_PCH_PARAMS(${PCH_HEADER} "pch" "-I") - GENERATE_CXX_PCH_COMMAND(${TARGET_NAME} "${INCLUDE_FLAGS}" ${PCH_HEADER} ${PCH_SOURCE} ${PCH_HEADER_OUT}) - SET_TARGET_PROPERTIES( - ${TARGET_NAME} PROPERTIES - COMPILE_FLAGS "-include-pch ${PCH_HEADER_OUT}" - ) -ENDFUNCTION(ADD_CXX_PCH_CLANG) + get_target_property(SOURCE_FILES ${TARGET_NAME} SOURCES) -FUNCTION(ADD_CXX_PCH_MSVC TARGET_NAME PCH_HEADER PCH_SOURCE) - GET_COMMON_PCH_PARAMS(${PCH_HEADER} "pch" "/I") - SET_TARGET_PROPERTIES( - ${TARGET_NAME} PROPERTIES - COMPILE_FLAGS "/FI${PCH_HEADER_NAME} /Yu${PCH_HEADER_NAME}" - ) - SET_SOURCE_FILES_PROPERTIES( - ${PCH_SOURCE} PROPERTIES - COMPILE_FLAGS "/Yc${PCH_HEADER_NAME}" - ) -ENDFUNCTION(ADD_CXX_PCH_MSVC) - -FUNCTION(ADD_CXX_PCH TARGET_NAME PCH_HEADER PCH_SOURCE) - IF (MSVC) - ADD_CXX_PCH_MSVC(${TARGET_NAME} ${PCH_HEADER} ${PCH_SOURCE}) - ELSEIF ("${CMAKE_GENERATOR}" MATCHES "Xcode") - SET_TARGET_PROPERTIES(${TARGET_NAME} PROPERTIES - XCODE_ATTRIBUTE_GCC_PRECOMPILE_PREFIX_HEADER YES - XCODE_ATTRIBUTE_GCC_PREFIX_HEADER "${CMAKE_CURRENT_SOURCE_DIR}/${PCH_HEADER}" - ) - ELSEIF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") - ADD_CXX_PCH_CLANG(${TARGET_NAME} ${PCH_HEADER} ${PCH_SOURCE}) - ELSEIF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU") - ADD_CXX_PCH_GCC(${TARGET_NAME} ${PCH_HEADER} ${PCH_SOURCE}) - ENDIF () -ENDFUNCTION(ADD_CXX_PCH) + foreach(SOURCE_FILE ${SOURCE_FILES}) + if(SOURCE_FILE MATCHES \\.\(cxx|cpp\)$) + set_source_files_properties(${SOURCE_FILE} PROPERTIES + COMPILE_FLAGS "-include ${OUTPUT_DIR}/${PRECOMPILED_HEADER_NAME} -Winvalid-pch" + ) + endif() + endforeach() + endif() +endfunction() diff --git a/cmake/SetDefinitions.cmake b/cmake/SetDefinitions.cmake index 7468af21..0d41a85d 100644 --- a/cmake/SetDefinitions.cmake +++ b/cmake/SetDefinitions.cmake @@ -78,6 +78,8 @@ if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "MSVC") /Gw #whole program global optimization /GS- #no buffer security check /GF #string pooling + > + /wd4996 /wd4267 /wd4244 @@ -91,7 +93,6 @@ if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "MSVC") /wd4127 /wd4100 /wd4389 - > ) endif () @@ -116,6 +117,7 @@ if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU") $<$: --no-warnings > + $<$: --no-warnings -Wno-narrowing @@ -127,6 +129,12 @@ endif () if("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang") set(DEFAULT_COMPILE_OPTS ${DEFAULT_COMPILE_OPTS} + $<$: + -Wno-c++11-narrowing + -Wno-inconsistent-missing-override + -Wno-deprecated-register + -Wno-switch + > $<$: -W -Wall diff --git a/dep b/dep index 06ec71ee..ab9e244c 160000 --- a/dep +++ b/dep @@ -1 +1 @@ -Subproject commit 06ec71ee298ba708d044ed6f1317bd46118dfbf2 +Subproject commit ab9e244cf77a325a05dea816cd287763b418bf23 diff --git a/src/game/CMakeLists.txt b/src/game/CMakeLists.txt index e5170a85..e566d1a4 100644 --- a/src/game/CMakeLists.txt +++ b/src/game/CMakeLists.txt @@ -224,8 +224,8 @@ add_library(game STATIC ${SRC_GRP_WARDEN} ${SRC_GRP_WARDEN_MODULES} ${SRC_GRP_WORLD_HANDLERS} - $<$:${SRC_GRP_ELUNA}> - $<$:${SRC_GRP_BOTS}> + $<$:${SRC_GRP_ELUNA}> + $<$:${SRC_GRP_BOTS}> ) target_include_directories(game @@ -273,7 +273,7 @@ target_link_libraries(game # Generate precompiled header if(PCH) - ADD_CXX_PCH(game pchdef.h pchdef.cpp) + ADD_CXX_PCH(game ${CMAKE_CURRENT_SOURCE_DIR}/pchdef.h ${CMAKE_CURRENT_SOURCE_DIR}/pchdef.cpp) endif() install( diff --git a/src/game/WorldHandlers/ScriptMgr.cpp b/src/game/WorldHandlers/ScriptMgr.cpp index 2f8623c7..5bded640 100644 --- a/src/game/WorldHandlers/ScriptMgr.cpp +++ b/src/game/WorldHandlers/ScriptMgr.cpp @@ -44,6 +44,7 @@ #ifdef ENABLE_ELUNA #include "LuaEngine.h" #endif /* ENABLE_ELUNA */ + #ifdef ENABLE_SD3 #include "system/ScriptDevMgr.h" #endif diff --git a/src/game/pchdef.h b/src/game/pchdef.h index 7e9263c7..12348d7a 100644 --- a/src/game/pchdef.h +++ b/src/game/pchdef.h @@ -25,19 +25,16 @@ #ifndef GAME_PCH_H #define GAME_PCH_H -// 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 "ObjectGuid.h" -#include "SQLStorages.h" -#include "Opcodes.h" -#include "SharedDefines.h" -#include "GuildMgr.h" #include "ObjectMgr.h" -#include "ScriptMgr.h" +#include "WorldPacket.h" +#include "ObjectGuid.h" +#include "WorldSession.h" +#include "Creature.h" +#include "Player.h" + +#include +#include #endif \ No newline at end of file diff --git a/src/mangosd/CMakeLists.txt b/src/mangosd/CMakeLists.txt index 639c44b8..a7037f3c 100644 --- a/src/mangosd/CMakeLists.txt +++ b/src/mangosd/CMakeLists.txt @@ -65,6 +65,8 @@ target_link_libraries(mangosd PUBLIC game $<$:gsoap> + Threads::Threads + DL::DL ) install( diff --git a/src/modules/Bots/playerbot/PlayerbotFactory.cpp b/src/modules/Bots/playerbot/PlayerbotFactory.cpp index 53264e15..daedcbc8 100644 --- a/src/modules/Bots/playerbot/PlayerbotFactory.cpp +++ b/src/modules/Bots/playerbot/PlayerbotFactory.cpp @@ -6,7 +6,7 @@ #include "ItemPrototype.h" #include "PlayerbotAIConfig.h" #include "AccountMgr.h" -#include "Datastores/DBCStore.h" +#include "DBCStore.h" #include "SharedDefines.h" diff --git a/src/modules/SD3 b/src/modules/SD3 index f9711863..7b7f0ccb 160000 --- a/src/modules/SD3 +++ b/src/modules/SD3 @@ -1 +1 @@ -Subproject commit f9711863b59268ae3072bf11339434a90f53a1ca +Subproject commit 7b7f0ccb98723f731195be2f06f0954f236365fc diff --git a/src/shared/Utilities/Util.h b/src/shared/Utilities/Util.h index 79c232f9..99932a53 100644 --- a/src/shared/Utilities/Util.h +++ b/src/shared/Utilities/Util.h @@ -31,6 +31,7 @@ #include #include +#include /** * @brief @@ -554,7 +555,7 @@ inline bool isEastAsianString(const std::wstring &wstr, bool numericOrSpace) */ inline void strToUpper(std::string& str) { - std::transform(str.begin(), str.end(), str.begin(), toupper); + std::transform(str.begin(), str.end(), str.begin(), [](unsigned char c) { return std::toupper(c); }); } /** @@ -564,7 +565,7 @@ inline void strToUpper(std::string& str) */ inline void strToLower(std::string& str) { - std::transform(str.begin(), str.end(), str.begin(), tolower); + std::transform(str.begin(), str.end(), str.begin(), [](unsigned char c) { return std::tolower(c); }); } /** @@ -643,7 +644,7 @@ inline wchar_t wcharToLower(wchar_t wchar) */ inline void wstrToUpper(std::wstring& str) { - std::transform(str.begin(), str.end(), str.begin(), wcharToUpper); + std::transform(str.begin(), str.end(), str.begin(), [](wchar_t w) {return wcharToUpper(w); }); } /** @@ -653,7 +654,7 @@ inline void wstrToUpper(std::wstring& str) */ inline void wstrToLower(std::wstring& str) { - std::transform(str.begin(), str.end(), str.begin(), wcharToLower); + std::transform(str.begin(), str.end(), str.begin(), [](wchar_t w) {return wcharToLower(w); }); } /**