Improved support for MinGW cross compile builds

Cross compile support for Win32 and Win64 has been unified,
simplified and adapted to the new MinGW64-based build environment.
This finally allows to produce working Win64 binaries.
This commit is contained in:
Tobias Doerffel
2010-04-06 11:47:50 +02:00
parent ceacb484a1
commit 51103bb674
12 changed files with 94 additions and 98 deletions

View File

@@ -42,11 +42,6 @@ ENDIF(VERSION_SUFFIX)
INCLUDE(DetectMachine)
IF(LMMS_HOST_X86_64)
SET(STRIP /opt/mingw64/bin/x86_64-pc-mingw32-strip)
ELSE(LMMS_HOST_X86_64)
SET(STRIP /opt/mingw32/bin/i586-pc-mingw32-strip)
ENDIF(LMMS_HOST_X86_64)
OPTION(WANT_ALSA "Include ALSA (Advanced Linux Sound Architecture) support" ON)
OPTION(WANT_CALF "Include CALF LADSPA plugins" ON)
@@ -513,11 +508,6 @@ ENDIF(LMMS_HOST_X86 OR LMMS_HOST_X86_64)
IF(WIN32)
SET(WINRC "${CMAKE_BINARY_DIR}/lmmsrc.obj")
IF(LMMS_HOST_X86_64)
SET(WINDRES /opt/mingw64/bin/x86_64-pc-mingw32-windres)
ELSE(LMMS_HOST_X86_64)
SET(WINDRES /opt/mingw32/bin/i586-pc-mingw32-windres)
ENDIF(LMMS_HOST_X86_64)
ADD_CUSTOM_COMMAND(OUTPUT ${WINRC}
COMMAND ${WINDRES}
-I${CMAKE_SOURCE_DIR}
@@ -555,11 +545,22 @@ IF(LMMS_BUILD_WIN32)
ADD_CUSTOM_COMMAND(TARGET lmms POST_BUILD COMMAND ${STRIP} ${CMAKE_BINARY_DIR}/lmms.exe)
INSTALL(TARGETS lmms RUNTIME DESTINATION .)
IF(LMMS_BUILD_WIN64)
INSTALL(FILES /opt/mingw64/bin/QtCore4.dll /opt/mingw64/bin/QtGui4.dll /opt/mingw64/bin/QtXml4.dll /opt/mingw64/bin/QtNetwork4.dll /opt/mingw64/bin/libsndfile-1.dll /opt/mingw64/bin/libvorbis-0.dll /opt/mingw64/bin/libvorbisenc-2.dll /opt/mingw64/bin/libvorbisfile-3.dll /opt/mingw64/bin/libogg-0.dll /opt/mingw64/bin/libfluidsynth-1.dll /opt/mingw64/bin/libfftw3f-3.dll /opt/mingw64/bin/SDL.dll DESTINATION .)
ELSE(LMMS_BUILD_WIN64)
INSTALL(FILES /opt/mingw32/bin/QtCore4.dll /opt/mingw32/bin/QtGui4.dll /opt/mingw32/bin/QtXml4.dll /opt/mingw32/bin/QtNetwork4.dll /opt/mingw32/bin/libz.dll /opt/mingw32/bin/libsndfile-1.dll /opt/mingw32/bin/libvorbis-0.dll /opt/mingw32/bin/libvorbisenc-2.dll /opt/mingw32/bin/libvorbisfile-3.dll /opt/mingw32/bin/libogg-0.dll /opt/mingw32/bin/libfluidsynth-1.dll /opt/mingw32/bin/libfftw3f-3.dll /opt/mingw32/bin/SDL.dll /opt/mingw32/i586-mingw32/bin/mingwm10.dll DESTINATION .)
ENDIF(LMMS_BUILD_WIN64)
INSTALL(FILES
${MINGW_PREFIX}/bin/QtCore4.dll
${MINGW_PREFIX}/bin/QtGui4.dll
${MINGW_PREFIX}/bin/QtXml4.dll
${MINGW_PREFIX}/bin/QtNetwork4.dll
${MINGW_PREFIX}/bin/libsndfile-1.dll
${MINGW_PREFIX}/bin/libvorbis-0.dll
${MINGW_PREFIX}/bin/libvorbisenc-2.dll
${MINGW_PREFIX}/bin/libvorbisfile-3.dll
${MINGW_PREFIX}/bin/libogg-0.dll
${MINGW_PREFIX}/bin/libfluidsynth-1.dll
${MINGW_PREFIX}/bin/libfftw3f-3.dll
${MINGW_PREFIX}/bin/SDL.dll
${MINGW_PREFIX}/bin/libglib-2.0-0.dll
${MINGW_PREFIX}/bin/libgthread-2.0-0.dll
DESTINATION .)
ELSE(LMMS_BUILD_WIN32)
IF(NOT LMMS_BUILD_APPLE)
@@ -665,7 +666,7 @@ ADD_CUSTOM_TARGET(win32-pkg
COMMAND cp /opt/mingw32/i586-pc-mingw32/bin/mingwm10.dll tmp/lmms
COMMAND cp -L ${CMAKE_SOURCE_DIR}/COPYING tmp/lmms/LICENSE.TXT
COMMAND cp -L ${CMAKE_SOURCE_DIR}/README tmp/lmms/README.TXT
COMMAND /opt/mingw32/bin/i586-pc-mingw32-strip tmp/lmms/lmms.exe tmp/lmms/plugins/*.dll tmp/lmms/plugins/ladspa/*.dll
COMMAND ${STRIP} tmp/lmms/lmms.exe tmp/lmms/plugins/*.dll tmp/lmms/plugins/ladspa/*.dll
COMMAND mv tmp/lmms tmp/lmms-${VERSION}
COMMAND cd tmp && zip -r -9 ../lmms-${VERSION}-bin-win32.zip lmms-${VERSION}/*
COMMAND rm -rf tmp

View File

@@ -1,4 +1,4 @@
MINGW=/opt/mingw32
export PATH=$PATH:$MINGW/bin
cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/modules/Win32Toolchain.cmake
cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/modules/Win32Toolchain.cmake -DCMAKE_MODULE_PATH=`pwd`/../cmake/modules/

4
build_mingw64 Executable file
View File

@@ -0,0 +1,4 @@
MINGW=/opt/mingw64
export PATH=$PATH:$MINGW/bin
cmake .. -DCMAKE_TOOLCHAIN_FILE=../cmake/modules/Win64Toolchain.cmake -DCMAKE_MODULE_PATH=`pwd`/../cmake/modules/

View File

@@ -9,21 +9,29 @@ ELSE(WIN32)
ENDIF(WIN32)
MESSAGE("PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}")
EXEC_PROGRAM( ${CMAKE_C_COMPILER} ARGS "-dumpmachine" OUTPUT_VARIABLE Machine )
MESSAGE("Machine: ${Machine}")
SET(LMMS_HOST_X86 FALSE)
SET(LMMS_HOST_X86_64 FALSE)
STRING(REGEX MATCH "i.86" IS_X86 "${Machine}")
STRING(REGEX MATCH "86_64" IS_X86_64 "${Machine}")
IF(WIN32)
IF(WIN64)
SET(IS_X86_64 TRUE)
SET(LMMS_BUILD_WIN64 TRUE)
ELSE(WIN64)
SET(IS_X86 TRUE)
ENDIF(WIN64)
ELSE(WIN32)
EXEC_PROGRAM( ${CMAKE_C_COMPILER} ARGS "-dumpmachine" OUTPUT_VARIABLE Machine )
MESSAGE("Machine: ${Machine}")
STRING(REGEX MATCH "i.86" IS_X86 "${Machine}")
STRING(REGEX MATCH "86_64" IS_X86_64 "${Machine}")
ENDIF(WIN32)
IF(IS_X86)
MESSAGE("-- Target host is 32 bit")
SET(LMMS_HOST_X86 TRUE)
ELSEIF(IS_X86_64)
MESSAGE("-- Target host is 64 bit")
SET(LMMS_HOST_X86_64 TRUE)
IF(WIN32)
SET(LMMS_BUILD_WIN64 1)
ENDIF(WIN32)
ELSE(IS_X86)
MESSAGE("Can't identify target host. Assuming 32 bit platform.")
ENDIF(IS_X86)

View File

@@ -0,0 +1,41 @@
# this one is important
SET(CMAKE_SYSTEM_NAME Windows)
#this one not so much
SET(CMAKE_SYSTEM_VERSION 1)
# where is the target environment
SET(CMAKE_FIND_ROOT_PATH ${MINGW_PREFIX})
SET(CMAKE_INSTALL_PREFIX ${MINGW_PREFIX})
SET(MINGW_TOOL_PREFIX ${MINGW_PREFIX}/bin/${CMAKE_SYSTEM_PROCESSOR}-w64-mingw32-)
# specify the cross compiler
SET(CMAKE_C_COMPILER ${MINGW_TOOL_PREFIX}gcc)
SET(CMAKE_CXX_COMPILER ${MINGW_TOOL_PREFIX}g++)
# specify location of some tools
SET(STRIP ${MINGW_TOOL_PREFIX}strip)
SET(WINDRES ${MINGW_TOOL_PREFIX}windres)
SET(PKG_CONFIG_EXECUTABLE ${MINGW_TOOL_PREFIX}pkg-config)
SET(QT_BINARY_DIR ${MINGW_PREFIX}/bin)
SET(QT_LIBRARY_DIR ${MINGW_PREFIX}/lib)
SET(QT_QTCORE_LIBRARY ${MINGW_PREFIX}/lib/libQtCore4.a)
SET(QT_INCLUDE_DIR ${MINGW_PREFIX}/include/qt4)
SET(QT_HEADERS_DIR ${MINGW_PREFIX}/include/qt4)
SET(QT_QTCORE_INCLUDE_DIR ${MINGW_PREFIX}/include/qt4/QtCore)
SET(QT_MKSPECS_DIR ${MINGW_PREFIX}/share/qt4/mkspecs)
SET(QT_MOC_EXECUTABLE ${QT_BINARY_DIR}/moc.exe)
SET(QT_RCC_EXECUTABLE ${QT_BINARY_DIR}/rcc.exe)
SET(QT_QMAKE_EXECUTABLE /usr/bin/qmake)
SET(QT_UIC_EXECUTABLE ${QT_BINARY_DIR}/uic.exe)
# search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
INCLUDE_DIRECTORIES(${MINGW_PREFIX}/include)
LINK_DIRECTORIES(${MINGW_PREFIX}/lib ${MINGW_PREFIX}/bin)

View File

@@ -1,44 +1,10 @@
SET(MINGW_PREFIX /opt/mingw32)
# this one is important
SET(CMAKE_SYSTEM_NAME Windows)
#this one not so much
SET(CMAKE_SYSTEM_VERSION 1)
SET(CMAKE_SYSTEM_PROCESSOR i686)
SET(CMAKE_INSTALL_PREFIX ${MINGW_PREFIX})
# specify the cross compiler
SET(CMAKE_C_COMPILER ${MINGW_PREFIX}/bin/i586-pc-mingw32-gcc)
SET(CMAKE_CXX_COMPILER ${MINGW_PREFIX}/bin/i586-pc-mingw32-g++)
# where is the target environment
SET(CMAKE_FIND_ROOT_PATH /opt/mingw32)
SET(QT_BINARY_DIR ${MINGW_PREFIX}/bin)
SET(QT_LIBRARY_DIR ${MINGW_PREFIX}/lib)
SET(QT_QTCORE_LIBRARY ${MINGW_PREFIX}/lib/libQtCore4.a)
SET(QT_INCLUDE_DIR ${MINGW_PREFIX}/include/qt4)
SET(QT_HEADERS_DIR ${MINGW_PREFIX}/include/qt4)
SET(QT_QTCORE_INCLUDE_DIR ${MINGW_PREFIX}/include/qt4/QtCore)
SET(QT_MKSPECS_DIR ${MINGW_PREFIX}/share/qt4/mkspecs)
SET(QT_MOC_EXECUTABLE ${QT_BINARY_DIR}/moc.exe)
SET(QT_RCC_EXECUTABLE ${QT_BINARY_DIR}/rcc.exe)
SET(QT_QMAKE_EXECUTABLE /usr/bin/qmake)
SET(QT_UIC_EXECUTABLE ${QT_BINARY_DIR}/uic.exe)
# search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
SET(PKG_CONFIG_EXECUTABLE ${MINGW_PREFIX}/bin/pkg-config)
SET(CMAKE_C_FLAGS "-march=i686 -mtune=generic")
SET(CMAKE_CXX_FLAGS ${CMAKE_C_FLAGS})
INCLUDE_DIRECTORIES(${MINGW_PREFIX}/include)
LINK_DIRECTORIES(${MINGW_PREFIX}/lib ${MINGW_PREFIX}/bin)
INCLUDE(MinGWCrossCompile)

View File

@@ -1,39 +1,9 @@
# this one is important
SET(CMAKE_SYSTEM_NAME Windows)
#this one not so much
SET(CMAKE_SYSTEM_VERSION 1)
SET(MINGW_PREFIX /opt/mingw64)
SET(CMAKE_SYSTEM_PROCESSOR x86_64)
SET(CMAKE_INSTALL_PREFIX /opt/mingw64)
SET(CC_PREFIX /opt/mingw64)
SET(WIN64 TRUE)
# specify the cross compiler
SET(CMAKE_C_COMPILER ${CC_PREFIX}/bin/x86_64-pc-mingw32-gcc)
SET(CMAKE_CXX_COMPILER ${CC_PREFIX}/bin/x86_64-pc-mingw32-g++)
# where is the target environment
SET(CMAKE_FIND_ROOT_PATH /opt/mingw64)
SET(QT_BINARY_DIR ${CC_PREFIX}/bin)
SET(QT_LIBRARY_DIR ${CC_PREFIX}/lib)
SET(QT_QTCORE_LIBRARY ${CC_PREFIX}/lib/libQtCore4.a)
SET(QT_INCLUDE_DIR ${CC_PREFIX}/include/qt4)
SET(QT_QTCORE_INCLUDE_DIR ${CC_PREFIX}/include/qt4/QtCore)
SET(QT_MKSPECS_DIR ${CC_PREFIX}/share/qt4/mkspecs)
SET(QT_MOC_EXECUTABLE ${QT_BINARY_DIR}/moc.exe)
SET(QT_RCC_EXECUTABLE ${QT_BINARY_DIR}/rcc.exe)
SET(QT_QMAKE_EXECUTABLE /usr/bin/qmake)
SET(QT_UIC_EXECUTABLE ${QT_BINARY_DIR}/uic.exe)
# search for programs in the build host directories
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
# for libraries and headers in the target directories
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
SET(PKG_CONFIG_EXECUTABLE ${CC_PREFIX}/bin/pkg-config)
INCLUDE_DIRECTORIES(${CC_PREFIX}/include)
LINK_DIRECTORIES(${CC_PREFIX}/lib ${CC_PREFIX}/bin)
INCLUDE(MinGWCrossCompile)

View File

@@ -92,7 +92,7 @@ add_subdirectory(src/Samples)
ADD_LIBRARY(ZynAddSubFxCore SHARED LocalZynAddSubFx.cpp ${MXML_SRC})
TARGET_LINK_LIBRARIES(ZynAddSubFxCore ${ZASF_CORE_LIBS} ${FFTW3F_LIBRARIES} -lz -lpthread)
IF(LMMS_BUILD_WIN32)
TARGET_LINK_LIBRARIES(ZynAddSubFxCore -lwsock32)
TARGET_LINK_LIBRARIES(ZynAddSubFxCore -lws2_32)
INSTALL(TARGETS ZynAddSubFxCore DESTINATION ${PLUGIN_DIR})
ELSE(LMMS_BUILD_WIN32)
INSTALL(TARGETS ZynAddSubFxCore LIBRARY DESTINATION ${PLUGIN_DIR})
@@ -132,7 +132,7 @@ IF(LMMS_BUILD_WIN64)
ELSEIF(LMMS_BUILD_WIN32)
SET(FLTK_EXTRA_FLAGS "-DCMAKE_TOOLCHAIN_FILE=${CMAKE_SOURCE_DIR}/cmake/modules/Win32Toolchain.cmake")
ENDIF(LMMS_BUILD_WIN64)
ADD_CUSTOM_TARGET(libfltk COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/fltk && cd ${CMAKE_CURRENT_BINARY_DIR}/fltk && ${CMAKE_COMMAND} ${CMAKE_CURRENT_SOURCE_DIR}/fltk ${FLTK_EXTRA_FLAGS} -DFLTK_USE_SYSTEM_ZLIB:BOOL=ON -DFLTK_USE_SYSTEM_JPEG:BOOL=ON -DFLTK_USE_SYSTEM_PNG:BOOL=ON -DUSE_OPENGL:BOOL=OFF -DBUILD_TESTING:BOOL=OFF -DCMAKE_BUILD_TYPE=release && ${CMAKE_BUILD_TOOL})
ADD_CUSTOM_TARGET(libfltk COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/fltk && cd ${CMAKE_CURRENT_BINARY_DIR}/fltk && ${CMAKE_COMMAND} ${CMAKE_CURRENT_SOURCE_DIR}/fltk ${FLTK_EXTRA_FLAGS} -DCMAKE_MODULE_PATH=${CMAKE_SOURCE_DIR}/cmake/modules/ -DFLTK_USE_SYSTEM_ZLIB:BOOL=ON -DFLTK_USE_SYSTEM_JPEG:BOOL=ON -DFLTK_USE_SYSTEM_PNG:BOOL=ON -DUSE_OPENGL:BOOL=OFF -DBUILD_TESTING:BOOL=OFF -DCMAKE_BUILD_TYPE=release && ${CMAKE_BUILD_TOOL})
ADD_DEPENDENCIES(RemoteZynAddSubFx libfltk)
ENDIF(LMMS_HAVE_FFTW3F)

View File

@@ -241,7 +241,7 @@ struct FL_EXPORT Fl_Menu_Item {
and casting the long to a void* and may not be
portable to some machines.
*/
long argument() const {return (long)user_data_;}
intptr_t argument() const {return (intptr_t)user_data_;}
/**
For convenience you can also define the callback as taking a long
argument. This is implemented by casting this to a Fl_Callback

View File

@@ -31,6 +31,8 @@
#ifndef Fl_Widget_H
#define Fl_Widget_H
#include <stdint.h>
#include "Enumerations.H"
class Fl_Widget;
@@ -592,7 +594,7 @@ public:
/** Gets the current user data (long) argument that is passed to the callback function.
*/
long argument() const {return (long)user_data_;}
intptr_t argument() const {return (intptr_t)user_data_;}
/** Sets the current user data (long) argument that is passed to the callback function.
\todo The user data value must be implemented using a \em union to avoid

View File

@@ -36,6 +36,7 @@
#include <sys/types.h>
#include "flstring.h"
#ifdef WIN32
#include <stdint.h>
# include <windows.h>
# include <shellapi.h>
#else
@@ -112,7 +113,7 @@ fl_open_uri(const char *uri, char *msg, int msglen) {
#ifdef WIN32
if (msg) snprintf(msg, msglen, "open %s", uri);
return (int)ShellExecute(HWND_DESKTOP, "open", uri, NULL, NULL, SW_SHOW) > 32;
return (intptr_t)ShellExecute(HWND_DESKTOP, "open", uri, NULL, NULL, SW_SHOW) > 32;
#elif defined(__APPLE__)
char *argv[3]; // Command-line arguments

View File

@@ -37,6 +37,9 @@
#define PREFETCH_READ(x) PREFETCH_RW(x,0)
#define PREFETCH_WRITE(x) PREFETCH_RW(x,1)
/* workaround for conflicting declarations in GCC and MinGW headers */
#define _aligned_malloc __aligned_malloc
#define _aligned_free __aligned_free
#ifdef X86_OPTIMIZATIONS