Browse Source

Merge pull request #25 from Mixaill/cmake-2

Make CMake functional on Windows
Ivan Savenko 11 years ago
parent
commit
59586df402
7 changed files with 156 additions and 132 deletions
  1. 44 32
      CMakeLists.txt
  2. 4 0
      Global.h
  3. 83 85
      client/CMakeLists.txt
  4. 1 1
      client/CVideoHandler.cpp
  5. 7 2
      launcher/CMakeLists.txt
  6. 7 2
      lib/CMakeLists.txt
  7. 10 10
      server/CMakeLists.txt

+ 44 - 32
CMakeLists.txt

@@ -9,7 +9,7 @@ set(CMAKE_MODULE_PATH ${CMAKE_HOME_DIRECTORY}/cmake_modules)
 
 # enable Release mode but only if it was not set
 if (NOT CMAKE_BUILD_TYPE)
-        set(CMAKE_BUILD_TYPE RelWithDebInfo)
+		set(CMAKE_BUILD_TYPE RelWithDebInfo)
 endif()
 
 # VCMI version
@@ -54,11 +54,46 @@ if (APPLE)
 	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ftemplate-depth=256")
 endif()
 
+if (WIN32)
+	add_definitions(-DBOOST_THREAD_USE_LIB)
+	add_definitions(-D_WIN32_WINNT=0x0501)
+	set(SYSTEM_LIBS ${SYSTEM_LIBS} ole32 oleaut32 ws2_32 mswsock)
+
+	#check for iconv (may be needed for boost.locale)
+	include(CheckLibraryExists)
+	check_library_exists(iconv libiconv_open "" ICONV_FOUND)
+	if(ICONV_FOUND)
+		set(SYSTEM_LIBS ${SYSTEM_LIBS} iconv)
+	endif()
+
+	set(CMAKE_SHARED_LIBRARY_PREFIX "") #delete lib prefix for dlls
+endif()
+
+if(APPLE)
+	set(SYSTEM_LIBS ${SYSTEM_LIBS} libiconv.dylib)
+endif()
+
+if(NOT WIN32)
+	INCLUDE(CheckLibraryExists)
+
+	#check if some platform-specific libraries are needed for linking
+	CHECK_LIBRARY_EXISTS(rt shm_open "" HAVE_RT_LIB)
+	if(HAVE_RT_LIB)
+		set(SYSTEM_LIBS ${SYSTEM_LIBS} rt)
+	endif()
+
+	CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_DL_LIB)
+	if(HAVE_DL_LIB)
+		set(SYSTEM_LIBS ${SYSTEM_LIBS} dl)
+	endif()
+endif()
+
+set(FFmpeg_FIND_COMPONENTS AVFORMAT SWSCALE)
 find_package(Boost 1.48.0 COMPONENTS program_options filesystem system thread locale REQUIRED)
 find_package(ZLIB REQUIRED)
+find_package(FFmpeg REQUIRED)
 
 if (ENABLE_SDL2)
-	include (FindPkgConfig)
 	find_package(SDL2 REQUIRED)
 	find_package(SDL2_image REQUIRED)
 	find_package(SDL2_mixer REQUIRED)
@@ -87,31 +122,8 @@ if (ENABLE_LAUNCHER)
 endif()
 
 if(ENABLE_TEST)
-	# find_package overwrites BOOST_* variables which are already set, so all components have to be
-	# included again
-        find_package(Boost 1.48.0 COMPONENTS program_options filesystem system thread locale unit_test_framework REQUIRED)
-endif()
-
-if(APPLE)
-	set(Boost_LIBRARIES ${Boost_LIBRARIES} libiconv.dylib) # Our prebuilt boost_locale for OS X depends on iconv
-endif()
-
-if(NOT WIN32)
-	set(FFmpeg_FIND_COMPONENTS AVFORMAT SWSCALE)
-	find_package(FFmpeg REQUIRED)
-
-	INCLUDE(CheckLibraryExists)
-
-        #check if some platform-specific libraries are needed for linking
-	CHECK_LIBRARY_EXISTS(rt shm_open "" HAVE_RT_LIB)
-	if(HAVE_RT_LIB)
-		set(RT_LIB -lrt)
-	endif()
-
-	CHECK_LIBRARY_EXISTS(dl dlopen "" HAVE_DL_LIB)
-	if(HAVE_DL_LIB)
-		set(DL_LIB -ldl)
-	endif()
+	# find_package overwrites BOOST_* variables which are already set, so all components have to be included again
+	find_package(Boost 1.48.0 COMPONENTS program_options filesystem system thread locale unit_test_framework REQUIRED)
 endif()
 
 if(CMAKE_COMPILER_IS_GNUCXX OR NOT WIN32) #so far all *nix compilers support such parameters
@@ -127,9 +139,9 @@ if(CMAKE_COMPILER_IS_GNUCXX OR NOT WIN32) #so far all *nix compilers support suc
 endif()
 
 if(WIN32) # on Win everything goes into H3 root directory
-	set(BIN_DIR "" CACHE STRING "Where to install binaries")
-	set(LIB_DIR "" CACHE STRING "Where to install main library")
-	set(DATA_DIR "" CACHE STRING "Where to install data files")
+	set(BIN_DIR "." CACHE STRING "Where to install binaries")
+	set(LIB_DIR "." CACHE STRING "Where to install main library")
+	set(DATA_DIR "." CACHE STRING "Where to install data files")
 elseif(APPLE)
 	# includes lib path which determines where to install shared libraries (either /lib or /lib64)
 	include(GNUInstallDirs)
@@ -142,7 +154,7 @@ else()
 	include(GNUInstallDirs)
 
 	if (NOT BIN_DIR)
-        set(BIN_DIR "bin" CACHE STRING "Where to install binaries")
+		set(BIN_DIR "bin" CACHE STRING "Where to install binaries")
 	endif()
 	if (NOT LIB_DIR)
 		set(LIB_DIR "${CMAKE_INSTALL_LIBDIR}/vcmi" CACHE STRING "Where to install main library")
@@ -171,7 +183,7 @@ SET(PCH_PROPERTIES
 )
 
 if (ENABLE_ERM)
-        add_subdirectory(scripting/erm)
+		add_subdirectory(scripting/erm)
 endif()
 add_subdirectory(lib)
 add_subdirectory(client)

+ 4 - 0
Global.h

@@ -117,6 +117,10 @@ static_assert(sizeof(bool) == 1, "Bool needs to be 1 byte in size.");
 #include <android/log.h>
 #endif
 
+#ifndef M_PI
+#define M_PI 3.14159265358979323846
+#endif
+
 /* ---------------------------------------------------------------------------- */
 /* Usings */
 /* ---------------------------------------------------------------------------- */

+ 83 - 85
client/CMakeLists.txt

@@ -7,107 +7,105 @@ include_directories(${Boost_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIR} ${FFMPEG_INCLUDE_D
 
 set(client_SRCS
 		StdInc.cpp
-        ../CCallback.cpp
+		../CCallback.cpp
 
 		battle/CBattleInterface.cpp
-        battle/CBattleAnimations.cpp
-        battle/CBattleInterfaceClasses.cpp
-        battle/CCreatureAnimation.cpp
-
-        gui/CGuiHandler.cpp
-        gui/CIntObject.cpp
-        gui/CIntObjectClasses.cpp
-        gui/Fonts.cpp
-        gui/Geometries.cpp
-        gui/CCursorHandler.cpp
-        gui/SDL_Extensions.cpp
+		battle/CBattleAnimations.cpp
+		battle/CBattleInterfaceClasses.cpp
+		battle/CCreatureAnimation.cpp
+
+		gui/CGuiHandler.cpp
+		gui/CIntObject.cpp
+		gui/CIntObjectClasses.cpp
+		gui/Fonts.cpp
+		gui/Geometries.cpp
+		gui/CCursorHandler.cpp
+		gui/SDL_Extensions.cpp
 
 		CPreGame.cpp
 		Client.cpp
 		CPlayerInterface.cpp
 		CMT.cpp
 		GUIClasses.cpp
-        AdventureMapClasses.cpp
-        CAdvmapInterface.cpp
-        CAnimation.cpp
-        CBitmapHandler.cpp
-        CCastleInterface.cpp
-        CCreatureWindow.cpp
-        CDefHandler.cpp
-        CGameInfo.cpp
-        CHeroWindow.cpp
-        CKingdomInterface.cpp
-        CMessage.cpp
-        CMusicHandler.cpp
-        CSpellWindow.cpp
-        CVideoHandler.cpp
-        CQuestLog.cpp
-        Graphics.cpp
-        mapHandler.cpp
-        NetPacksClient.cpp
+		AdventureMapClasses.cpp
+		CAdvmapInterface.cpp
+		CAnimation.cpp
+		CBitmapHandler.cpp
+		CCastleInterface.cpp
+		CCreatureWindow.cpp
+		CDefHandler.cpp
+		CGameInfo.cpp
+		CHeroWindow.cpp
+		CKingdomInterface.cpp
+		CMessage.cpp
+		CMusicHandler.cpp
+		CSpellWindow.cpp
+		CVideoHandler.cpp
+		CQuestLog.cpp
+		Graphics.cpp
+		mapHandler.cpp
+		NetPacksClient.cpp
 )
 
-set(client_HEADERS
-		gui/SDL_Pixels.h
-)
-
-if(WIN32)
-	add_executable(vcmiclient WIN32 ${client_SRCS} ${client_HEADERS})
-elseif(APPLE)
-    # OS X specific includes
-    include_directories(${SPARKLE_INCLUDE_DIR})
+if(APPLE)
+	# OS X specific includes
+	include_directories(${SPARKLE_INCLUDE_DIR})
 
-    # OS X specific source files
-    set(client_SRCS ${client_SRCS} SDLMain.m OSX.mm Info.plist vcmi.icns ../osx/vcmi_dsa_public.pem)
+	# OS X specific source files
+	set(client_SRCS ${client_SRCS} SDLMain.m OSX.mm Info.plist vcmi.icns ../osx/vcmi_dsa_public.pem)
 	add_executable(vcmiclient MACOSX_BUNDLE ${client_SRCS} ${client_HEADERS})
 
-    # OS X specific libraries
-    target_link_libraries(vcmiclient ${SPARKLE_FRAMEWORK})
-
-    # Because server and AI libs would be copies to bundle they need to be built before client
-    add_dependencies(vcmiclient vcmiserver VCAI EmptyAI StupidAI BattleAI minizip)
-
-    # Custom Info.plist
-    set_target_properties(vcmiclient PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist)
-
-    # Copy icon file and public key for Sparkle
-    set_source_files_properties(vcmi.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
-    set_source_files_properties(../osx/vcmi_dsa_public.pem PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
-
-    set_target_properties(vcmiclient PROPERTIES XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../Frameworks @executable_path/")
-
-    # Copy server executable, libs and game data to bundle
-    set(BUNDLE_PATH ${CMAKE_HOME_DIRECTORY}/bin/$(CONFIGURATION)/vcmiclient.app/Contents)
-    set(MakeVCMIBundle
-        # Copy all needed binaries
-        mkdir -p ${BUNDLE_PATH}/MacOS/AI &&
-        cp ${CMAKE_HOME_DIRECTORY}/bin/$(CONFIGURATION)/vcmiserver ${BUNDLE_PATH}/MacOS/vcmiserver &&
-        cp ${CMAKE_HOME_DIRECTORY}/bin/$(CONFIGURATION)/libvcmi.dylib ${BUNDLE_PATH}/MacOS/libvcmi.dylib &&
-        cp ${CMAKE_HOME_DIRECTORY}/bin/$(CONFIGURATION)/libminizip.dylib ${BUNDLE_PATH}/MacOS/libminizip.dylib &&
-        cp ${CMAKE_HOME_DIRECTORY}/bin/$(CONFIGURATION)/libVCAI.dylib ${BUNDLE_PATH}/MacOS/AI/libVCAI.dylib &&
-        cp ${CMAKE_HOME_DIRECTORY}/bin/$(CONFIGURATION)/libStupidAI.dylib ${BUNDLE_PATH}/MacOS/AI/libStupidAI.dylib &&
-        cp ${CMAKE_HOME_DIRECTORY}/bin/$(CONFIGURATION)/libEmptyAI.dylib ${BUNDLE_PATH}/MacOS/AI/libEmptyAI.dylib &&
-        cp ${CMAKE_HOME_DIRECTORY}/bin/$(CONFIGURATION)/libBattleAI.dylib ${BUNDLE_PATH}/MacOS/AI/libBattleAI.dylib &&
-        cp -r ${CMAKE_HOME_DIRECTORY}/osx/vcmibuilder.app ${BUNDLE_PATH}/MacOS/vcmibuilder.app &&
-
-        # Copy frameworks
-        cp -r ${CMAKE_HOME_DIRECTORY}/${CMAKE_FRAMEWORK_PATH} ${BUNDLE_PATH}/Frameworks/ &&
-
-        # Copy vcmi data
-        mkdir -p ${BUNDLE_PATH}/Data &&
-        mkdir -p ${BUNDLE_PATH}/Data/Mods &&
-        mkdir -p ${BUNDLE_PATH}/Data/launcher &&
-        cp -r ${CMAKE_HOME_DIRECTORY}/config/ ${BUNDLE_PATH}/Data/config/ &&
-        cp -r ${CMAKE_HOME_DIRECTORY}/Mods/vcmi/ ${BUNDLE_PATH}/Data/Mods/vcmi/ &&
-        cp -r ${CMAKE_HOME_DIRECTORY}/Mods/WoG/ ${BUNDLE_PATH}/Data/Mods/WoG/ &&
-        cp -r ${CMAKE_HOME_DIRECTORY}/launcher/icons/ ${BUNDLE_PATH}/Data/launcher/icons/)
-        
-    add_custom_command(TARGET vcmiclient POST_BUILD COMMAND ${MakeVCMIBundle})
+	# OS X specific libraries
+	target_link_libraries(vcmiclient ${SPARKLE_FRAMEWORK})
+
+	# Because server and AI libs would be copies to bundle they need to be built before client
+	add_dependencies(vcmiclient vcmiserver VCAI EmptyAI StupidAI BattleAI minizip)
+
+	# Custom Info.plist
+	set_target_properties(vcmiclient PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/Info.plist)
+
+	# Copy icon file and public key for Sparkle
+	set_source_files_properties(vcmi.icns PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
+	set_source_files_properties(../osx/vcmi_dsa_public.pem PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
+
+	set_target_properties(vcmiclient PROPERTIES XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../Frameworks @executable_path/")
+
+	# Copy server executable, libs and game data to bundle
+	set(BUNDLE_PATH ${CMAKE_HOME_DIRECTORY}/bin/$(CONFIGURATION)/vcmiclient.app/Contents)
+	set(MakeVCMIBundle
+		# Copy all needed binaries
+		mkdir -p ${BUNDLE_PATH}/MacOS/AI &&
+		cp ${CMAKE_HOME_DIRECTORY}/bin/$(CONFIGURATION)/vcmiserver ${BUNDLE_PATH}/MacOS/vcmiserver &&
+		cp ${CMAKE_HOME_DIRECTORY}/bin/$(CONFIGURATION)/libvcmi.dylib ${BUNDLE_PATH}/MacOS/libvcmi.dylib &&
+		cp ${CMAKE_HOME_DIRECTORY}/bin/$(CONFIGURATION)/libminizip.dylib ${BUNDLE_PATH}/MacOS/libminizip.dylib &&
+		cp ${CMAKE_HOME_DIRECTORY}/bin/$(CONFIGURATION)/libVCAI.dylib ${BUNDLE_PATH}/MacOS/AI/libVCAI.dylib &&
+		cp ${CMAKE_HOME_DIRECTORY}/bin/$(CONFIGURATION)/libStupidAI.dylib ${BUNDLE_PATH}/MacOS/AI/libStupidAI.dylib &&
+		cp ${CMAKE_HOME_DIRECTORY}/bin/$(CONFIGURATION)/libEmptyAI.dylib ${BUNDLE_PATH}/MacOS/AI/libEmptyAI.dylib &&
+		cp ${CMAKE_HOME_DIRECTORY}/bin/$(CONFIGURATION)/libBattleAI.dylib ${BUNDLE_PATH}/MacOS/AI/libBattleAI.dylib &&
+		cp -r ${CMAKE_HOME_DIRECTORY}/osx/vcmibuilder.app ${BUNDLE_PATH}/MacOS/vcmibuilder.app &&
+
+		# Copy frameworks
+		cp -r ${CMAKE_HOME_DIRECTORY}/${CMAKE_FRAMEWORK_PATH} ${BUNDLE_PATH}/Frameworks/ &&
+
+		# Copy vcmi data
+		mkdir -p ${BUNDLE_PATH}/Data &&
+		mkdir -p ${BUNDLE_PATH}/Data/Mods &&
+		mkdir -p ${BUNDLE_PATH}/Data/launcher &&
+		cp -r ${CMAKE_HOME_DIRECTORY}/config/ ${BUNDLE_PATH}/Data/config/ &&
+		cp -r ${CMAKE_HOME_DIRECTORY}/Mods/vcmi/ ${BUNDLE_PATH}/Data/Mods/vcmi/ &&
+		cp -r ${CMAKE_HOME_DIRECTORY}/Mods/WoG/ ${BUNDLE_PATH}/Data/Mods/WoG/ &&
+		cp -r ${CMAKE_HOME_DIRECTORY}/launcher/icons/ ${BUNDLE_PATH}/Data/launcher/icons/)
+		
+	add_custom_command(TARGET vcmiclient POST_BUILD COMMAND ${MakeVCMIBundle})
 else()
-	add_executable(vcmiclient ${client_SRCS} ${client_HEADERS})
+	add_executable(vcmiclient ${client_SRCS})
+endif()
+
+if(WIN32)
+	set_target_properties(vcmiclient PROPERTIES OUTPUT_NAME VCMI_client)
 endif()
 
-target_link_libraries(vcmiclient vcmi ${Boost_LIBRARIES} ${SDL_LIBRARY} ${SDLIMAGE_LIBRARY} ${SDLMIXER_LIBRARY} ${SDLTTF_LIBRARY} ${ZLIB_LIBRARIES} ${FFMPEG_LIBRARIES} ${RT_LIB} ${DL_LIB})
+target_link_libraries(vcmiclient vcmi ${Boost_LIBRARIES} ${SDL_LIBRARY} ${SDLIMAGE_LIBRARY} ${SDLMIXER_LIBRARY} ${SDLTTF_LIBRARY} ${ZLIB_LIBRARIES} ${FFMPEG_LIBRARIES} ${SYSTEM_LIBS})
 
 set_target_properties(vcmiclient PROPERTIES ${PCH_PROPERTIES})
 cotire(vcmiclient)

+ 1 - 1
client/CVideoHandler.cpp

@@ -143,7 +143,7 @@ bool CBIKHandler::open(std::string name)
 	}
 	//GCC wants scope of waveout to don`t cross labels/swith/goto
 	{
-		void *waveout = GetProcAddress(dll,"_BinkOpenWaveOut@4");
+		void *waveout = (void *)GetProcAddress(dll,"_BinkOpenWaveOut@4");
 		if(waveout)
 			binkSetSoundSystem(waveout,nullptr);
 

+ 7 - 2
launcher/CMakeLists.txt

@@ -51,7 +51,12 @@ set(CMAKE_CXX_FLAGS "${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS} ${CMAKE_CXX_FLAGS}")
 
 qt5_wrap_ui(launcher_UI_HEADERS ${launcher_FORMS})
 
-add_executable(vcmilauncher ${launcher_SRCS} ${launcher_UI_HEADERS})
+if(WIN32)
+	add_executable(vcmilauncher WIN32 ${launcher_SRCS} ${launcher_UI_HEADERS})
+	set_target_properties(vcmilauncher PROPERTIES OUTPUT_NAME VCMI_launcher)
+else()
+	add_executable(vcmilauncher ${launcher_SRCS} ${launcher_UI_HEADERS})
+endif()
 
 # The Qt5Widgets_LIBRARIES variable also includes QtGui and QtCore
 target_link_libraries(vcmilauncher vcmi ${Qt5Widgets_LIBRARIES} ${Qt5Network_LIBRARIES})
@@ -61,7 +66,7 @@ target_link_libraries(vcmilauncher vcmi ${Qt5Widgets_LIBRARIES} ${Qt5Network_LIB
 #cotire(vcmilauncher)
 
 if (NOT APPLE) # Already inside bundle
-    install(TARGETS vcmilauncher DESTINATION ${BIN_DIR})
+	install(TARGETS vcmilauncher DESTINATION ${BIN_DIR})
 	# copy whole directory but .svn control files
 	install(DIRECTORY icons DESTINATION ${DATA_DIR}/launcher PATTERN ".svn" EXCLUDE)
 endif()

+ 7 - 2
lib/CMakeLists.txt

@@ -95,7 +95,7 @@ set(lib_SRCS
 		registerTypes/TypesClientPacks2.cpp
 		registerTypes/TypesMapObjects1.cpp
 		registerTypes/TypesMapObjects2.cpp
-                registerTypes/TypesMapObjects3.cpp
+				registerTypes/TypesMapObjects3.cpp
 		registerTypes/TypesPregamePacks.cpp
 		registerTypes/TypesServerPacks.cpp
 )
@@ -132,7 +132,12 @@ set(lib_HEADERS
 
 add_library(vcmi SHARED ${lib_SRCS} ${lib_HEADERS})
 set_target_properties(vcmi PROPERTIES XCODE_ATTRIBUTE_LD_DYLIB_INSTALL_NAME "@rpath/libvcmi.dylib")
-target_link_libraries(vcmi minizip ${Boost_LIBRARIES} ${SDL_LIBRARY} ${ZLIB_LIBRARIES} ${RT_LIB} ${DL_LIB})
+set_target_properties(vcmi PROPERTIES COMPILE_DEFINITIONS "VCMI_DLL=1")
+target_link_libraries(vcmi minizip ${Boost_LIBRARIES} ${SDL_LIBRARY} ${ZLIB_LIBRARIES} ${SYSTEM_LIBS})
+
+if(WIN32)
+	set_target_properties(vcmi PROPERTIES OUTPUT_NAME VCMI_lib)
+endif()
 
 set_target_properties(vcmi PROPERTIES ${PCH_PROPERTIES})
 cotire(vcmi)

+ 10 - 10
server/CMakeLists.txt

@@ -6,25 +6,25 @@ include_directories(${Boost_INCLUDE_DIRS})
 
 set(server_SRCS
 		StdInc.cpp
-        CGameHandler.cpp
-        CVCMIServer.cpp
-        CQuery.cpp
-        NetPacksServer.cpp
+		CGameHandler.cpp
+		CVCMIServer.cpp
+		CQuery.cpp
+		NetPacksServer.cpp
 )
 
+add_executable(vcmiserver ${server_SRCS})
+
+target_link_libraries(vcmiserver vcmi ${Boost_LIBRARIES} ${SYSTEM_LIBS})
+
 if(WIN32)
-    add_executable(vcmiserver WIN32 ${server_SRCS})
-else()
-    add_executable(vcmiserver ${server_SRCS})
+	set_target_properties(vcmiserver PROPERTIES OUTPUT_NAME VCMI_server)
 endif()
 
-target_link_libraries(vcmiserver vcmi ${Boost_LIBRARIES} ${RT_LIB} ${DL_LIB})
-
 set_target_properties(vcmiserver PROPERTIES ${PCH_PROPERTIES})
 set_target_properties(vcmiserver PROPERTIES XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/../Frameworks @executable_path/")
 cotire(vcmiserver)
 
 if (NOT APPLE) # Already inside vcmiclient bundle
-    install(TARGETS vcmiserver DESTINATION ${BIN_DIR})
+	install(TARGETS vcmiserver DESTINATION ${BIN_DIR})
 endif()