Permalink
Browse files

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.
  • Loading branch information...
1 parent c4dcd7d commit 6a5fc90cd41edea74eab2823f8e0567b0449b482 @janisozaur janisozaur committed Dec 28, 2015
Showing with 38 additions and 28 deletions.
  1. +32 −16 CMakeLists.txt
  2. +0 −12 CMakeLists_mingw.txt
  3. +6 −0 src/platform/windows.c
View
@@ -56,23 +56,38 @@ if (APPLE)
set_source_files_properties(${ORCT2_MM_SOURCES} PROPERTIES COMPILE_FLAGS "-x objective-c -fmodules")
endif (APPLE)
-if (UNIX)
- # 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_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_EXE_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS})
-endif (UNIX)
+# 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_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_EXE_LINKER_FLAGS ${CMAKE_SHARED_LINKER_FLAGS})
+
+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
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)
PKG_CHECK_MODULES(LIBCURL REQUIRED libcurl)
- PKG_CHECK_MODULES(JANSSON REQUIRED jansson)
- SET(HTTPLIBS ${LIBCURL_LIBRARIES} ${JANSSON_LIBRARIES})
+ PKG_CHECK_MODULES(JANSSON REQUIRED jansson>=2.7)
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 (NOT DISABLE_HTTP_TWITCH)
@@ -108,11 +123,6 @@ else (WIN32)
add_custom_target(g2 DEPENDS ${PROJECT} g2.dat)
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)
# FontConfig for TrueType fonts.
PKG_CHECK_MODULES(FONTCONFIG REQUIRED fontconfig)
@@ -176,7 +186,13 @@ endif (UNIX)
# libopenrct2.dll -> openrct2.dll
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
# targets, like `install`, so we have to trick it and execute dependency ourselves.
View
@@ -1,4 +1,3 @@
-SET(ACTUAL_SYSTEM ${CMAKE_SYSTEM_NAME})
SET(CMAKE_SYSTEM_NAME Windows)
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(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)
SET(TARGET_ENVIRONMENT /usr/local/mingw-w32-bin_i686-darwin/i686-w64-mingw32)
else()
@@ -58,13 +58,19 @@ utf8 **windows_get_command_line_args(int *outNumArgs);
// 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.
*/
BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, LPVOID lpReserved)
{
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

0 comments on commit 6a5fc90

Please sign in to comment.