mirror of https://github.com/OpenRCT2/OpenRCT2.git
Fix CMakeLists for MinGW cross-compilation
This makes sure that shared library built with MinGW toolchain is linked statically to *all* its dependencies, including libc, libstdc++, libsdl2 and all the others. This allows producing of working `openrct2.dll` by cross-compiling. I hit a bug with libcrypto, a dependency of libssl, which in turn is a dependency of curl, which creates a `DllMain` entrypoint for static lib too, but since we don't do anything in ours, this should be safe. I have only had chance to try it out when cross-compiling, ideally it should be tested under Cygwin/MSYS too, but it is too bothersome to setup for me.
This commit is contained in:
parent
c4dcd7d3fe
commit
6a5fc90cd4
|
@ -56,23 +56,38 @@ if (APPLE)
|
||||||
set_source_files_properties(${ORCT2_MM_SOURCES} PROPERTIES COMPILE_FLAGS "-x objective-c -fmodules")
|
set_source_files_properties(${ORCT2_MM_SOURCES} PROPERTIES COMPILE_FLAGS "-x objective-c -fmodules")
|
||||||
endif (APPLE)
|
endif (APPLE)
|
||||||
|
|
||||||
if (UNIX)
|
|
||||||
# force 32bit build for now and set necessary flags to compile code as is
|
# force 32bit build for now and set necessary flags to compile code as is
|
||||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32 -std=gnu99 -fno-omit-frame-pointer -fno-pie")
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32 -std=gnu99 -fno-omit-frame-pointer -fno-pie")
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32 -std=gnu++11 -fno-omit-frame-pointer -fno-pie")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32 -std=gnu++11 -fno-omit-frame-pointer -fno-pie")
|
||||||
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -m32")
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -m32")
|
||||||
set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS})
|
set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS})
|
||||||
endif (UNIX)
|
|
||||||
|
if (MINGW)
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fpack-struct=1")
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpack-struct=1")
|
||||||
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -static-libgcc -static-libstdc++")
|
||||||
|
if (CMAKE_HOST_UNIX)
|
||||||
|
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -static")
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
|
||||||
# find and include SDL2
|
# find and include SDL2
|
||||||
PKG_CHECK_MODULES(SDL2 REQUIRED sdl2 SDL2_ttf)
|
PKG_CHECK_MODULES(SDL2 REQUIRED sdl2 SDL2_ttf)
|
||||||
|
if (WIN32)
|
||||||
|
# FreeType is required by SDL2_ttf, but not wired up properly in package
|
||||||
|
PKG_CHECK_MODULES(FREETYPE REQUIRED freetype2)
|
||||||
|
SET(SDL2LIBS ${SDL2_STATIC_LIBRARIES} ${FREETYPE_STATIC_LIBRARIES})
|
||||||
|
else (WIN32)
|
||||||
|
SET(SDL2LIBS ${SDL2_LIBRARIES})
|
||||||
|
endif (WIN32)
|
||||||
|
|
||||||
if (NOT DISABLE_HTTP_TWITCH)
|
if (NOT DISABLE_HTTP_TWITCH)
|
||||||
PKG_CHECK_MODULES(LIBCURL REQUIRED libcurl)
|
PKG_CHECK_MODULES(LIBCURL REQUIRED libcurl)
|
||||||
PKG_CHECK_MODULES(JANSSON REQUIRED jansson)
|
PKG_CHECK_MODULES(JANSSON REQUIRED jansson>=2.7)
|
||||||
SET(HTTPLIBS ${LIBCURL_LIBRARIES} ${JANSSON_LIBRARIES})
|
|
||||||
if (WIN32)
|
if (WIN32)
|
||||||
SET(HTTPLIBS ${HTTPLIBS} ssl crypto winmm.lib ws2_32)
|
SET(HTTPLIBS ${LIBCURL_STATIC_LIBRARIES} ${JANSSON_STATIC_LIBRARIES} ssl crypto winmm.lib ws2_32)
|
||||||
|
else (WIN32)
|
||||||
|
SET(HTTPLIBS ${LIBCURL_LIBRARIES} ${JANSSON_LIBRARIES})
|
||||||
endif (WIN32)
|
endif (WIN32)
|
||||||
endif (NOT DISABLE_HTTP_TWITCH)
|
endif (NOT DISABLE_HTTP_TWITCH)
|
||||||
|
|
||||||
|
@ -108,11 +123,6 @@ else (WIN32)
|
||||||
add_custom_target(g2 DEPENDS ${PROJECT} g2.dat)
|
add_custom_target(g2 DEPENDS ${PROJECT} g2.dat)
|
||||||
endif (WIN32)
|
endif (WIN32)
|
||||||
|
|
||||||
if (APPLE)
|
|
||||||
FIND_LIBRARY(ICONV_LIBRARIES NAMES iconv libiconv libiconv-2 c)
|
|
||||||
TARGET_LINK_LIBRARIES(${PROJECT} ${ICONV_LIBRARIES})
|
|
||||||
endif (APPLE)
|
|
||||||
|
|
||||||
if (UNIX AND NOT APPLE)
|
if (UNIX AND NOT APPLE)
|
||||||
# FontConfig for TrueType fonts.
|
# FontConfig for TrueType fonts.
|
||||||
PKG_CHECK_MODULES(FONTCONFIG REQUIRED fontconfig)
|
PKG_CHECK_MODULES(FONTCONFIG REQUIRED fontconfig)
|
||||||
|
@ -176,7 +186,13 @@ endif (UNIX)
|
||||||
# libopenrct2.dll -> openrct2.dll
|
# libopenrct2.dll -> openrct2.dll
|
||||||
set_target_properties(${PROJECT} PROPERTIES PREFIX "")
|
set_target_properties(${PROJECT} PROPERTIES PREFIX "")
|
||||||
|
|
||||||
TARGET_LINK_LIBRARIES(${PROJECT} ${SDL2_LIBRARIES} ${ORCTLIBS_LIB} ${HTTPLIBS} ${NETWORKLIBS} ${SPEEX_LIBRARIES} ${DLLIB} ${RCT2_SECTIONS})
|
TARGET_LINK_LIBRARIES(${PROJECT} ${SDL2LIBS} ${ORCTLIBS_LIB} ${HTTPLIBS} ${NETWORKLIBS} ${SPEEX_LIBRARIES} ${DLLIB} ${RCT2_SECTIONS})
|
||||||
|
|
||||||
|
if (APPLE OR WIN32)
|
||||||
|
FIND_LIBRARY(ICONV_LIBRARIES NAMES iconv libiconv libiconv-2 c)
|
||||||
|
TARGET_LINK_LIBRARIES(${PROJECT} ${ICONV_LIBRARIES})
|
||||||
|
endif (APPLE OR WIN32)
|
||||||
|
|
||||||
|
|
||||||
# CMake does not allow specifying a dependency chain which includes built-in
|
# CMake does not allow specifying a dependency chain which includes built-in
|
||||||
# targets, like `install`, so we have to trick it and execute dependency ourselves.
|
# targets, like `install`, so we have to trick it and execute dependency ourselves.
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
SET(ACTUAL_SYSTEM ${CMAKE_SYSTEM_NAME})
|
|
||||||
SET(CMAKE_SYSTEM_NAME Windows)
|
SET(CMAKE_SYSTEM_NAME Windows)
|
||||||
|
|
||||||
SET(COMPILER_PREFIX i686-w64-mingw32)
|
SET(COMPILER_PREFIX i686-w64-mingw32)
|
||||||
|
@ -8,17 +7,6 @@ SET(CMAKE_RC_COMPILER ${COMPILER_PREFIX}-windres)
|
||||||
SET(CMAKE_PKGCONFIG_EXECUTABLE ${COMPILER_PREFIX}-pkg-config)
|
SET(CMAKE_PKGCONFIG_EXECUTABLE ${COMPILER_PREFIX}-pkg-config)
|
||||||
SET(PKG_CONFIG_EXECUTABLE ${COMPILER_PREFIX}-pkg-config)
|
SET(PKG_CONFIG_EXECUTABLE ${COMPILER_PREFIX}-pkg-config)
|
||||||
|
|
||||||
# potential flags to make code more similar to MSVC:
|
|
||||||
# -fshort-wchar -fshort-enums -mms-bitfields
|
|
||||||
#
|
|
||||||
set(CMAKE_C_FLAGS "-std=gnu99 -fpack-struct=1" CACHE STRING "" FORCE)
|
|
||||||
set(CMAKE_CXX_FLAGS "-std=c++0x -std=gnu++0x -fpack-struct=1" CACHE STRING "" FORCE)
|
|
||||||
if(${ACTUAL_SYSTEM} MATCHES "Linux")
|
|
||||||
set(CMAKE_SHARED_LINKER_FLAGS "-O3 -static-libgcc -static-libstdc++ -static -lpthread" CACHE STRING "" FORCE)
|
|
||||||
else()
|
|
||||||
set(CMAKE_SHARED_LINKER_FLAGS "-static-libgcc -static-libstdc++" CACHE STRING "" FORCE)
|
|
||||||
endif(${ACTUAL_SYSTEM} MATCHES "Linux")
|
|
||||||
|
|
||||||
if(APPLE)
|
if(APPLE)
|
||||||
SET(TARGET_ENVIRONMENT /usr/local/mingw-w32-bin_i686-darwin/i686-w64-mingw32)
|
SET(TARGET_ENVIRONMENT /usr/local/mingw-w32-bin_i686-darwin/i686-w64-mingw32)
|
||||||
else()
|
else()
|
||||||
|
|
|
@ -58,6 +58,11 @@ utf8 **windows_get_command_line_args(int *outNumArgs);
|
||||||
// return 0;
|
// return 0;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
|
/* DllMain is already defined in one of static libraries we implicitly depend
|
||||||
|
* on (libcrypto), which is their bug really, but since we don't do anything in
|
||||||
|
* here, just comment it out.
|
||||||
|
*/
|
||||||
|
#ifndef __MINGW32__
|
||||||
/**
|
/**
|
||||||
* Entry point for when the DLL is loaded. This will be removed when OpenRCT2 can be built as a stand alone application.
|
* Entry point for when the DLL is loaded. This will be removed when OpenRCT2 can be built as a stand alone application.
|
||||||
*/
|
*/
|
||||||
|
@ -65,6 +70,7 @@ BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
|
||||||
{
|
{
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
#endif // __MINGW32__
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The function that is called directly from the host application (rct2.exe)'s WinMain. This will be removed when OpenRCT2 can
|
* The function that is called directly from the host application (rct2.exe)'s WinMain. This will be removed when OpenRCT2 can
|
||||||
|
|
Loading…
Reference in New Issue