Avidemux Forum

Avidemux => Main version 2.6 => Topic started by: eumagga0x2a on November 15, 2016, 12:08:38 PM

Title: Environment setup for cross-compiling on Linux for Windows
Post by: eumagga0x2a on November 15, 2016, 12:08:38 PM
It happens from time to time that I do need an ability to check whether my changes don't have detrimental effects on Windows. Currently, an attempt to cross compile ends in

Run Build Command:"/usr/bin/gmake" "cmTC_f177f/fast"
/usr/bin/gmake -f CMakeFiles/cmTC_f177f.dir/build.make CMakeFiles/cmTC_f177f.dir/build
gmake[1]: Entering directory '/home/eumagga/adm/git/avidemux2/buildMingwCore/CMakeFiles/CMakeTmp'
Building CXX object CMakeFiles/cmTC_f177f.dir/execinfo.cpp.obj
/usr/bin/x86_64-w64-mingw32-g++    @CMakeFiles/cmTC_f177f.dir/includes_CXX.rsp  -o CMakeFiles/cmTC_f177f.dir/execinfo.cpp.obj -c /home/eumagga/adm/git/avidemux2/cmake/cmake_compile_check/execinfo.cpp
In file included from /home/eumagga/adm/git/avidemux2/cmake/cmake_compile_check/execinfo.cpp:2:0:
/usr/include/stdio.h:102:19: error: conflicting declaration 'typedef __ssize_t ssize_t'
typedef __ssize_t ssize_t;
                   ^~~~~~~
In file included from /usr/x86_64-w64-mingw32/sys-root/mingw/include/stddef.h:7:0,
                 from /usr/lib/gcc/x86_64-w64-mingw32/6.2.0/include/stddef.h:1,
                 from /usr/include/stdio.h:33,
                 from /home/eumagga/adm/git/avidemux2/cmake/cmake_compile_check/execinfo.cpp:2:
/usr/x86_64-w64-mingw32/sys-root/mingw/include/crtdefs.h:45:35: note: previous declaration as 'typedef long long int ssize_t'
__MINGW_EXTENSION typedef __int64 ssize_t;
                                   ^~~~~~~
In file included from /usr/include/sys/types.h:132:0,
                 from /usr/include/stdlib.h:314,
                 from /home/eumagga/adm/git/avidemux2/cmake/cmake_compile_check/execinfo.cpp:3:
/usr/include/time.h:75:18: error: conflicting declaration 'typedef __time_t time_t'
typedef __time_t time_t;
                  ^~~~~~
In file included from /usr/x86_64-w64-mingw32/sys-root/mingw/include/stddef.h:7:0,
                 from /usr/lib/gcc/x86_64-w64-mingw32/6.2.0/include/stddef.h:1,
                 from /usr/include/stdio.h:33,
                 from /home/eumagga/adm/git/avidemux2/cmake/cmake_compile_check/execinfo.cpp:2:
/usr/x86_64-w64-mingw32/sys-root/mingw/include/crtdefs.h:138:20: note: previous declaration as 'typedef __time64_t time_t'
typedef __time64_t time_t;
                    ^~~~~~
CMakeFiles/cmTC_f177f.dir/build.make:66: recipe for target 'CMakeFiles/cmTC_f177f.dir/execinfo.cpp.obj' failed
gmake[1]: *** [CMakeFiles/cmTC_f177f.dir/execinfo.cpp.obj] Error 1


configure error or, with the execinfo part in cmake/admCheckMiscLibs.cmake commented out, with

cd /home/eumagga/adm/git/avidemux2/buildMingwCore/ADM_coreUtils/src/Source && /usr/bin/x86_64-w64-mingw32-g++   -DNDEBUG -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES @CMakeFiles/ADM_json.dir/includes_CXX.rsp -fmessage-length=0 -O2 -DNDEBUG   -Werror=attributes -o CMakeFiles/ADM_json.dir/internalJSONNode.cpp.obj -c /home/eumagga/adm/git/avidemux2/avidemux_core/ADM_coreUtils/src/Source/internalJSONNode.cpp
In file included from /usr/x86_64-w64-mingw32/sys-root/mingw/include/c++/cstdint:41:0,
                 from /usr/x86_64-w64-mingw32/sys-root/mingw/include/c++/bits/char_traits.h:420,
                 from /usr/x86_64-w64-mingw32/sys-root/mingw/include/c++/string:40,
                 from /home/eumagga/adm/git/avidemux2/avidemux_core/ADM_coreUtils/src/Source/JSONDefs/Strings_Defs.h:26,
                 from /home/eumagga/adm/git/avidemux2/avidemux_core/ADM_coreUtils/src/Source/JSONDefs.h:14,
                 from /home/eumagga/adm/git/avidemux2/avidemux_core/ADM_coreUtils/src/Source/JSONDebug.h:4,
                 from /home/eumagga/adm/git/avidemux2/avidemux_core/ADM_coreUtils/src/Source/internalJSONNode.h:4,
                 from /home/eumagga/adm/git/avidemux2/avidemux_core/ADM_coreUtils/src/Source/internalJSONNode.cpp:1:
/usr/include/stdint.h:122:27: error: conflicting declaration 'typedef long unsigned int uintptr_t'
typedef unsigned long int uintptr_t;
                           ^~~~~~~~~


build error, which lets me wonder why it picks headers from /usr/include instead of /usr/x86_64-w64-mingw32/sys-root/mingw/include.

What am I missing?

My patch for bootStrapCrossMingw_w64Qt5.sh to reflect the paths used in Fedora:

diff --git a/bootStrapCrossMingw_w64Qt5.sh b/bootStrapCrossMingw_w64Qt5.sh
index 7d18d85..7a77862 100644
--- a/bootStrapCrossMingw_w64Qt5.sh
+++ b/bootStrapCrossMingw_w64Qt5.sh
@@ -1,15 +1,15 @@
#!/bin/bash
# ** Put your config here **
export QT_SELECT=5
-export PATH=$PATH:/mingw/bin
+export PATH=$PATH:/usr/x86_64-w64-mingw32
export CROSS_PREFIX=x86_64-w64-mingw32
-export SDLDIR=/mingw
-export MINGW=/mingw
-export MINGWDEV=/mingw_dev
-export QT_HOME=/mingw/Qt/current
-export CFLAGS="-I/mingw/include -L/mingw/lib"
+export SDLDIR=/usr/x86_64-w64-mingw32/
+export MINGW=/usr/x86_64-w64-mingw32/sys-root/mingw
+export MINGWDEV=/home/eumagga/adm/cross
+export QT_HOME=/usr/x86_64-w64-mingw32/sys-root/mingw
+export CFLAGS="-I/usr/x86_64-w64-mingw32/sys-root/mingw/include -L/usr/x86_64-w64-mingw32/sys-root/mingw/lib"
export O_PARAL="-j 2"
-export TOOLCHAIN_LOCATION=/mingw
+export TOOLCHAIN_LOCATION=/usr
export CROSS_C_COMPILER=gcc
export CROSS_CXX_COMPILER=g++


By the way, does Avidemux need a mingw64 build of x264 to be able to encode in h264 as well?

Any hints or help would be greatly appreciated.
Title: Re: Environment setup for cross-compiling on Linux for Windows
Post by: mean on November 15, 2016, 12:43:58 PM
In my setup
/mingw contains everything needed to cross compile
(the compilers & friends are there as symlinks to their real location)
Specifically to avoid these problems, i.e. having a sysroot clearly separated from host system

Yes, you need a mingw64 build

Funnily enough, the resulting binaries works great with wine, including sound and D3D display
Even dxva2 should work (does not in my case)


Title: Re: Environment setup for cross-compiling on Linux for Windows
Post by: eumagga0x2a on November 16, 2016, 12:06:29 AM
Thank you for shedding some light on specifics of your setup.

Quote from: mean on November 15, 2016, 12:43:58 PM
Yes, you need a mingw64 build

This was the only step where I had success with

--host=x86_64-w64-mingw32 --cross-prefix="x86_64-w64-mingw32-" --prefix=/usr/x86_64-w64-mingw32/sys-root/mingw --enable-shared --enable-static

as options for ./configure (the mingw64-configure wrapper turned out to be unusable with x264).
Title: Re: Environment setup for cross-compiling on Linux for Windows
Post by: mean on November 16, 2016, 05:14:34 AM
The 32 bits mxe is the simpler way to compile it
As for x264, this is what i use

PFX="i686-w64-mingw32.shared"
#
export CC=$PFX-gcc
export LD=$PFX-ld
export AR=$PFX-ar
export RANLIB=$PFX-ranlib
export STRIP=$PFX-strip
export CFLAGS="-I/mingw/include"
export LDFLAGS="-L/mingw/bin -L/mingw/lib"

./configure \
   --enable-shared=yes \
   --disable-static \
--enable-pthread \
   --host=$PFX \
   --prefix=/mingw \
   --disable-static --enable-shared \
  --disable-avs --disable-lavf --disable-gpac --disable-swscale

Title: Re: Environment setup for cross-compiling on Linux for Windows
Post by: AQUAR on November 16, 2016, 05:18:13 AM
This topic is of interest to me.
Could you please maintain this discussion live on the forum.
(As opposed to going private - has happened before with code contributing members).

Title: Re: Environment setup for cross-compiling on Linux for Windows
Post by: mean on November 16, 2016, 07:09:02 AM
To give a bit more detail

I'm using a LXC container, based on recent debian with MXE compiled in it
As a result, i have minimal host contamination, i.e. no host Qt etc...

With ccache, it takes ~ 3 mn to rebuild the 32 bits windows binary

Title: Re: Environment setup for cross-compiling on Linux for Windows
Post by: eumagga0x2a on November 16, 2016, 07:29:34 AM
Thank you, I suspect cmake issues behind the problems I faced trying to cross-compile Avidemux in Fedora using the tools provided by the distribution. I'll try to replicate your setup once I find spare time again (but still ASAP).

By the way, building Qt 5.7.0 from source on Windows in MSYS2 (I tried to setup a build environment on Windows first, but this turned out to be a no-go) took just short of 6 hours on my hardware  ;D
Title: Re: Environment setup for cross-compiling on Linux for Windows
Post by: mean on November 16, 2016, 07:33:36 AM
you could try win build, it pulls binaries by default
But it is tricky, you need the right setup for cmake & gcc, else it will not work at all
Title: Re: Environment setup for cross-compiling on Linux for Windows
Post by: eumagga0x2a on November 16, 2016, 08:53:14 PM
Quote from: mean on November 16, 2016, 07:09:02 AM
I'm using a LXC container, based on recent debian with MXE compiled in it

Where do you actually put the mxe directory? Into /mingw?
Title: Re: Environment setup for cross-compiling on Linux for Windows
Post by: mean on November 17, 2016, 05:12:18 AM
It is in /opt/mxe
but there are symlinks to the bare minimum from /mingw to /opt/mxe (i.e. binutils etc...)

All the other depenedancies are copied or installed to /mingw also


Core is pretty easy to crosscompile

The run starts with the Qt version

Title: Re: Environment setup for cross-compiling on Linux for Windows
Post by: eumagga0x2a on November 17, 2016, 07:28:27 AM
Thank you very much, do you use some kind of LOCAL_PKG_LIST in settings.mk to avoid quite wasteful compiling of packages not needed for Avidemux like oce or openscenegraph, and if yes, could you please share it?

Do you use i686-w64-mingw32.shared as MXE_TARGETS to build the toolchain for a 32 bit Avidemux and x86_64-w64-mingw32.shared for 64 bit? (MXE defaults to i686-w64-mingw32.static)
Title: Re: Environment setup for cross-compiling on Linux for Windows
Post by: mean on November 17, 2016, 07:32:18 AM
settings.mk attached

Title: Re: Environment setup for cross-compiling on Linux for Windows
Post by: mean on November 17, 2016, 07:33:18 AM
From memory, i targeted Qt and it pulled pretty much all was needed for base system
Title: Re: Environment setup for cross-compiling on Linux for Windows
Post by: eumagga0x2a on November 17, 2016, 07:45:35 AM
Thank you very much, will try out this configuration later today.
Title: Re: Environment setup for cross-compiling on Linux for Windows
Post by: eumagga0x2a on November 18, 2016, 07:31:17 PM
I think, the cross build problems on Fedora which I experienced in the Debian container as well are related to CMAKE_FIND_ROOT_PATH not set to the target mingw environment root. With the following modifications

diff --git a/foreignBuilds/cross_mingw64_core b/foreignBuilds/cross_mingw64_core
index 0c1a855..04a3e23 100644
--- a/foreignBuilds/cross_mingw64_core
+++ b/foreignBuilds/cross_mingw64_core
@@ -1,11 +1,12 @@
#!/bin/bash
export PKG_CONFIG_PATH=$MINGW/lib/pkgconfig
export PKG_CONFIG_LIBDIR=$MINGW/lib/pkgconfig
-export PATH=$MINGW/bin:$PATH
+#export PATH=$MINGW/bin:$PATH
pkg-config --list-all
#export DEBUG="-DVERBOSE=1 -DDEBUG=1  -DCMAKE_BUILD_TYPE=Debug    "
echo "<<<<<<<<<<<<Cross compiling core ($MINGW)>>>>>>>>>>>>>>>>"
cmake   -DCROSS=$MINGW \
+        -DCMAKE_FIND_ROOT_PATH=$MINGW \
-DTOOLCHAIN_LOCATION=$TOOLCHAIN_LOCATION \
         -DCMAKE_INSTALL_PREFIX=$MINGW/Release \
-DCMAKE_CROSS_PREFIX=$CROSS_PREFIX \
@@ -14,7 +15,7 @@ cmake   -DCROSS=$MINGW \
         -DCMAKE_LINKER:STRING=$CROSS_PREFIX-ld \
         -DCMAKE_AR:STRING=$CROSS_PREFIX-ar \
         -DCMAKE_SYSTEM_NAME:STRING=Windows \
-        -DCMAKE_RC_COMPILER:STRING=$MINGW/bin/$CROSS_PREFIX-windres \
+        -DCMAKE_RC_COMPILER:STRING=$CROSS_PREFIX-windres \
         ${EXTRA_CMAKE_ARG} \
         -DAVIDEMUX_TOP_SOURCE_DIR="$TOP"  \
         -G "Unix Makefiles" \
diff --git a/foreignBuilds/cross_mingw64_plugins b/foreignBuilds/cross_mingw64_plugins
index 8b4768f..f01ed14 100644
--- a/foreignBuilds/cross_mingw64_plugins
+++ b/foreignBuilds/cross_mingw64_plugins
@@ -1,20 +1,21 @@
#!/bin/bash
export PKG_CONFIG_PATH=$MINGW/lib/pkgconfig
export PKG_CONFIG_LIBDIR=$MINGW/lib/pkgconfig
-export PATH=$MINGW/bin:$PATH
+#export PATH=$MINGW/bin:$PATH
pkg-config --list-all
#export DEBUG="-DVERBOSE=1   -DCMAKE_BUILD_TYPE=Debug -G \"CodeBlocks - Unix Makefiles\"   "
export DEBUG="-G \"Unix Makefiles\""
echo "<<<<<<<<<<<<Cross compiling plugins>>>>>>>>>>>>>>>"
cmake   -DCROSS=$MINGW \
-DTOOLCHAIN_LOCATION=$TOOLCHAIN_LOCATION \
+ -DCMAKE_FIND_ROOT_PATH=$MINGW \
         -DCMAKE_INSTALL_PREFIX=$MINGW/Release \
-DCMAKE_CROSS_PREFIX=$CROSS_PREFIX \
         -DCMAKE_C_COMPILER:STRING=$CROSS_PREFIX-${CROSS_C_COMPILER} \
         -DCMAKE_CXX_COMPILER:STRING=$CROSS_PREFIX-${CROSS_CXX_COMPILER} \
         -DCMAKE_LINKER:STRING=$CROSS_PREFIX-ld \
         -DCMAKE_AR:STRING=$CROSS_PREFIX-ar \
-DCMAKE_RC_COMPILER:STRING=$MINGW/bin/$CROSS_PREFIX-windres \
-DCMAKE_RC_COMPILER:STRING=$CROSS_PREFIX-windres \
         -DCMAKE_SYSTEM_NAME:STRING=Windows \
         -DQT_HOME:STRING=$QT_HOME \
         ${EXTRA_CMAKE_ARG} \
diff --git a/foreignBuilds/cross_mingw64_qt5 b/foreignBuilds/cross_mingw64_qt5
index 4356362..13185bf 100644
--- a/foreignBuilds/cross_mingw64_qt5
+++ b/foreignBuilds/cross_mingw64_qt5
@@ -2,24 +2,25 @@
#
export PKG_CONFIG_PATH=$MINGW/lib/pkgconfig
export PKG_CONFIG_LIBDIR=$MINGW/lib/pkgconfig
-export PATH=$MINGW/bin:$PATH
+export PATH=$PATH:$QT_HOME/bin
pkg-config --list-all
#export DEBUG="-DVERBOSE=1   -DCMAKE_BUILD_TYPE=Debug -G \"CodeBlocks - Unix Makefiles\"   "
export DEBUG="-G \"Unix Makefiles\""
echo "<<<<<<<<<<<<Cross compiling core>>>>>>>>>>>>>>>"
cmake   -DCROSS=$MINGW \
-DENABLE_QT5=True \
+ -DCMAKE_FIND_ROOT_PATH=$MINGW \
-DTOOLCHAIN_LOCATION=$TOOLCHAIN_LOCATION  \
         -DCMAKE_INSTALL_PREFIX=$MINGW/Release \
         -DQT_HOME:STRING=$QT_HOME \
-DCMAKE_CROSS_PREFIX=$CROSS_PREFIX \
         -DCMAKE_SYSTEM_NAME:STRING=Windows \
         -DAVIDEMUX_TOP_SOURCE_DIR="$TOP"  \
- -DCMAKE_RC_COMPILER:STRING=$MINGW/bin/$CROSS_PREFIX-windres \
-        -DCMAKE_C_COMPILER:STRING=$MINGW/bin/$CROSS_PREFIX-${CROSS_C_COMPILER} \
-        -DCMAKE_CXX_COMPILER:STRING=$MINGW/bin/$CROSS_PREFIX-${CROSS_CXX_COMPILER} \
-        -DCMAKE_LINKER:STRING=$MINGW/bin/$CROSS_PREFIX-ld \
+ -DCMAKE_RC_COMPILER:STRING=$CROSS_PREFIX-windres \
+        -DCMAKE_C_COMPILER:STRING=$CROSS_PREFIX-${CROSS_C_COMPILER} \
+        -DCMAKE_CXX_COMPILER:STRING=$CROSS_PREFIX-${CROSS_CXX_COMPILER} \
+        -DCMAKE_LINKER:STRING=$CROSS_PREFIX-ld \
         ${EXTRA_CMAKE_ARG} \
-        -DCMAKE_AR:STRING=$MINGW/bin/$CROSS_PREFIX-ar \
+        -DCMAKE_AR:STRING=$CROSS_PREFIX-ar \
         -G "Unix Makefiles" \
         $TOP/avidemux/qt4
diff --git a/foreignBuilds/cross_mingw64_qt5_plugins b/foreignBuilds/cross_mingw64_qt5_plugins
index 662ad7f..a7ceb2b 100644
--- a/foreignBuilds/cross_mingw64_qt5_plugins
+++ b/foreignBuilds/cross_mingw64_qt5_plugins
@@ -1,13 +1,14 @@
#!/bin/bash
export PKG_CONFIG_PATH=$MINGW/lib/pkgconfig
export PKG_CONFIG_LIBDIR=$MINGW/lib/pkgconfig
-export PATH=$MINGW/bin:$PATH
+#export PATH=$MINGW/bin:$PATH
pkg-config --list-all
#export DEBUG="-DVERBOSE=1   -DCMAKE_BUILD_TYPE=Debug -G \"CodeBlocks - Unix Makefiles\"   "
export DEBUG="-G \"Unix Makefiles\""
echo "<<<<<<<<<<<<Cross compiling plugins>>>>>>>>>>>>>>>"
cmake   -DCROSS=$MINGW \
-DTOOLCHAIN_LOCATION=$TOOLCHAIN_LOCATION \
+ -DCMAKE_FIND_ROOT_PATH=$MINGW \
         -DCMAKE_INSTALL_PREFIX=$MINGW/Release \
-DENABLE_QT5=True \
-DCMAKE_CROSS_PREFIX=$CROSS_PREFIX \
@@ -15,7 +16,7 @@ cmake   -DCROSS=$MINGW \
         -DCMAKE_CXX_COMPILER:STRING=$CROSS_PREFIX-${CROSS_CXX_COMPILER} \
         -DCMAKE_LINKER:STRING=$CROSS_PREFIX-ld \
         -DCMAKE_AR:STRING=$CROSS_PREFIX-ar \
-DCMAKE_RC_COMPILER:STRING=$MINGW/bin/$CROSS_PREFIX-windres \
-DCMAKE_RC_COMPILER:STRING=$CROSS_PREFIX-windres \
         -DCMAKE_SYSTEM_NAME:STRING=Windows \
         -DQT_HOME:STRING=$QT_HOME \
         ${EXTRA_CMAKE_ARG} \
diff --git a/foreignBuilds/cross_mingw_cli b/foreignBuilds/cross_mingw_cli
index 8933f10..40a85b4 100644
--- a/foreignBuilds/cross_mingw_cli
+++ b/foreignBuilds/cross_mingw_cli
@@ -2,15 +2,16 @@
#
export PKG_CONFIG_PATH=$MINGW/lib/pkgconfig
export PKG_CONFIG_LIBDIR=$MINGW/lib/pkgconfig
-export PATH=$MINGW/bin:$PATH
+#export PATH=$MINGW/bin:$PATH
pkg-config --list-all
#export DEBUG="-DVERBOSE=1   -DCMAKE_BUILD_TYPE=Debug -G \"CodeBlocks - Unix Makefiles\"   "
export DEBUG="-G \"Unix Makefiles\""
echo "<<<<<<<<<<<<Cross compiling core>>>>>>>>>>>>>>>"
cmake   -DCROSS=$MINGW \
+        -DCMAKE_FIND_ROOT_PATH=$MINGW \
         -DCMAKE_INCLUDE_PATH=$MINGW/include -DCMAKE_LIBRARY_PATH=$MINGW/lib \
         -DCMAKE_INSTALL_PREFIX=$MINGW/Release \
- -DCMAKE_RC_COMPILER:STRING=$MINGW/bin/$CROSS_PREFIX-windres \
+ -DCMAKE_RC_COMPILER:STRING=$CROSS_PREFIX-windres \
         -DCMAKE_C_COMPILER:STRING=$CROSS_PREFIX-${CROSS_C_COMPILER} \
         -DCMAKE_CXX_COMPILER:STRING=$CROSS_PREFIX-${CROSS_CXX_COMPILER} \
         -DCMAKE_LINKER:STRING=$CROSS_PREFIX-ld \


I was able to cross compile 32bit Avidemux core successfully. Qt5 fails ATM because it doesn't find Qt headers despite QT_HEADERS_DIR and QT_INCLUDES from admCheckQt5.cmake being set correcty. Investigating.
Title: Re: Environment setup for cross-compiling on Linux for Windows
Post by: eumagga0x2a on November 18, 2016, 08:16:02 PM
I must have been sort of selectively blind  :) QT_INCLUDES were NOT set correctly, with

diff --git a/cmake/admCheckQt5.cmake b/cmake/admCheckQt5.cmake
index cd9335b..2e0fbe0 100644
--- a/cmake/admCheckQt5.cmake
+++ b/cmake/admCheckQt5.cmake
@@ -8,7 +8,7 @@ MACRO(checkQt5)
         MESSAGE(STATUS "******************")
         IF(CROSS)
                 MESSAGE(STATUS "Cross compiling override for QT5")
-                SET(CROSS5 /usr/lib/x86_64-linux-gnu/cmake/)
+                SET(CROSS5 ${CROSS}/qt5/lib/cmake)
                 SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CROSS5}/Qt5 ${CROSS5}/Qt5Core ${CROSS5}/Qt5Widgets)
                 SET(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${CROSS5}/Qt5 ${CROSS5}/Qt5Core ${CROSS5}/Qt5Widgets)
                 MESSAGE(STATUS "Search path ${CMAKE_MODULE_PATH}")
@@ -20,8 +20,8 @@ MACRO(checkQt5)
                 SET(QT_QTOPENGL_LIBRARIES Qt5OpenGL)
                 SET(QT_QTOPENGL_INCLUDE_DIR ${QT_HOME}/include/QtOpenGL)

-                SET(QT_HEADERS_DIR   ${QT_HOME}/include/qt5  ${QT_HOME}/include/qt5/QtGui ${QT_HOME}/include/qt5/QtCore ${QT_HOME}/include/qt5/QtWidgets ${QT_HOME}/include/qt5/QtNetwork)
-                SET(QT_INCLUDES    -I${QT_HOME}/include/qt5 -I${QT_HOME}/include/qt5/QtGui -I${QT_HOME}/include/qt5/QtCore -I${QT_HOME}/include/qt5/QtWidgets -I${QT_HOME}/include/qt5/QtNetwork)
+                SET(QT_HEADERS_DIR   ${QT_HOME}/include  ${QT_HOME}/include/QtGui ${QT_HOME}/include/QtCore ${QT_HOME}/include/QtWidgets ${QT_HOME}/include/QtNetwork)
+                SET(QT_INCLUDES    -I${QT_HOME}/include -I${QT_HOME}/include/QtGui -I${QT_HOME}/include/QtCore -I${QT_HOME}/include/QtWidgets -I${QT_HOME}/include/QtNetwork)
                 SET(QT_INCLUDE_DIR   ${QT_HEADERS_DIR})
                 SET(QT_BINARY_DIR    ${QT_HOME}/bin)
                 SET(QT_LIBRARY_DIR   ${QT_HOME}/lib ${QT_HOME}/bin)
@@ -34,7 +34,7 @@ MACRO(checkQt5)
                 SET(QT_LIBRARY_EXTENSION QT5)
                 SET(QT5_FOUND True)
                 SET(ADM_QT_VERSION 5)
-                SET(QT5_ROOT_DIR /usr/lib/x86_64-linux-gnu/qt5/bin)
+                SET(QT5_ROOT_DIR ${QT_HOME}/bin)
                 SET(QT_RCC_EXECUTABLE ${QT5_ROOT_DIR}/rcc)
                 SET(QT_MOC_EXECUTABLE ${QT5_ROOT_DIR}/moc)
                 SET(QT_UIC_EXECUTABLE ${QT5_ROOT_DIR}/uic)


everything is fine (except of qtwinextras MXE package missing because I just selected qtbase and qttools to save time while setting up the cross-compile environment).
Title: Re: Environment setup for cross-compiling on Linux for Windows
Post by: mean on November 18, 2016, 08:47:30 PM
The last part is to collect all the needed libs and stuff and put everything in one place
Then run wine on it and watch it crash :)
Title: Re: Environment setup for cross-compiling on Linux for Windows
Post by: eumagga0x2a on November 18, 2016, 09:30:26 PM
That's true, collecting all the necessary libs and Qt platform stuff required a couple of reboots, but anyway, my first cross-compiled 32 bit Avidemux runs (loads and plays a video via DXVA2 decoder and driver) fine on Windows 7 :) Some features are missing because I borked some components like the x265 install, which is not available via MXE.

I get almost identical CPU usage (~28%) when decoding and playing a 720p video via VDPAU on Linux and via DXVA2 on Windows 7.

edit: I'll try to collect all the necessary patches and push them to my Avidemux git repo over the next days.

edit: A nice screenshot of the video filter manager with the patch from http://avidemux.org/smif/index.php/topic,12493.msg77852.html#msg77852 (http://avidemux.org/smif/index.php/topic,12493.msg77852.html#msg77852) as proof: only the right column, where the background color is hardcoded white via stylesheet, doesn't suffer from redraw issues.
Title: Re: Environment setup for cross-compiling on Linux for Windows
Post by: eumagga0x2a on December 09, 2016, 05:27:31 PM
I'll probably abandon Debian 8 as base for MXE to build 64 bit Avidemux and install MXE on top of Fedora because x265 v2.1 fails to build with yasm 1.2 from Debian (it succeeds with yasm 1.3).
Title: Re: Environment setup for cross-compiling on Linux for Windows
Post by: mean on December 09, 2016, 08:43:07 PM
yes, i had to switch back and forth yasm version
Title: Re: Environment setup for cross-compiling on Linux for Windows
Post by: eumagga0x2a on December 10, 2016, 09:43:03 AM
This doesn't bode well if this implies that 1.3 doesn't work for 32 bit cross-builds...
Title: Re: Environment setup for cross-compiling on Linux for Windows
Post by: eumagga0x2a on December 10, 2016, 11:52:35 PM
x265 has cross-compiled OK on Fedora, no issues with yasm there no matter x86_64 or i686. I've built 64 and 32 bit Avidemux using MXE (total size of the MXE directory: 2,2G) on Fedora, both run without a hitch on Windows 7. The redundant huge Debian container is ditched now.

I'll try to cleanup and push the enhanced mxe bootstrap script along with the scripts to collect all the required libs, the patched scripts from the foreignBuilds directory and a brief howto to my git repository in the near future.
Title: Re: Environment setup for cross-compiling on Linux for Windows
Post by: eumagga0x2a on December 11, 2016, 12:38:16 PM
By the way, when cross-compiling, I had to build against the system libass if fribidi was present in MXE. I used a patch based on https://pkgs.rpmfusion.org/cgit/free/avidemux.git/tree/avidemux-2.6.10-bundled_libs.patch (https://pkgs.rpmfusion.org/cgit/free/avidemux.git/tree/avidemux-2.6.10-bundled_libs.patch) for this task, with slight modifications to fix include paths when building with bundled liba52, libmad and libass:

diff --git a/avidemux_plugins/ADM_audioDecoders/ADM_ad_ac3/ADM_ad_a52.cpp b/avidemux_plugins/ADM_audioDecoders/ADM_ad_ac3/ADM_ad_a52.cpp
index 6eddc3a..d2fdb49 100644
--- a/avidemux_plugins/ADM_audioDecoders/ADM_ad_ac3/ADM_ad_a52.cpp
+++ b/avidemux_plugins/ADM_audioDecoders/ADM_ad_ac3/ADM_ad_a52.cpp
@@ -18,8 +18,13 @@
#include "ADM_ad_plugin.h"

extern "C" {
-#include "ADM_liba52/a52.h"
-#include "ADM_liba52/mm_accel.h"
+#ifdef USE_EXTERNAL_LIBA52
+    #include "a52dec/a52.h"
+    #include "a52dec/mm_accel.h"
+#else
+    #include "ADM_liba52/a52.h"
+    #include "ADM_liba52/mm_accel.h"
+#endif
};

#define AC3_HANDLE ((a52_state_t *)ac3_handle)
diff --git a/avidemux_plugins/ADM_audioDecoders/ADM_ad_ac3/CMakeLists.txt b/avidemux_plugins/ADM_audioDecoders/ADM_ad_ac3/CMakeLists.txt
index 04fbdc6..f769ded 100644
--- a/avidemux_plugins/ADM_audioDecoders/ADM_ad_ac3/CMakeLists.txt
+++ b/avidemux_plugins/ADM_audioDecoders/ADM_ad_ac3/CMakeLists.txt
@@ -1,11 +1,18 @@
INCLUDE(ad_plugin)

-ADD_SUBDIRECTORY(ADM_liba52)
+IF(NOT USE_EXTERNAL_LIBA52)
+    ADD_SUBDIRECTORY(ADM_liba52)
+ENDIF()

SET(ADM_ad_a52_SRCS ADM_ad_a52.cpp)

ADD_AUDIO_DECODER( ADM_ad_a52  ${ADM_ad_a52_SRCS})
-TARGET_LINK_LIBRARIES(ADM_ad_a52 ADM_liba52)
+
+IF(USE_EXTERNAL_LIBA52)
+    TARGET_LINK_LIBRARIES(ADM_ad_a52 ${LIBA52_LIBRARIES})
+ELSE()
+    TARGET_LINK_LIBRARIES(ADM_ad_a52 ADM_liba52)
+ENDIF()

INIT_AUDIO_PLUGIN(ADM_ad_a52)
INSTALL_AUDIODECODER(ADM_ad_a52)
diff --git a/avidemux_plugins/ADM_audioDecoders/ADM_ad_mad/ADM_ad_mad.cpp b/avidemux_plugins/ADM_audioDecoders/ADM_ad_mad/ADM_ad_mad.cpp
index 171b413..d71fc68 100644
--- a/avidemux_plugins/ADM_audioDecoders/ADM_ad_mad/ADM_ad_mad.cpp
+++ b/avidemux_plugins/ADM_audioDecoders/ADM_ad_mad/ADM_ad_mad.cpp
@@ -16,7 +16,12 @@
  ***************************************************************************/
#include "ADM_default.h"
#include "ADM_ad_plugin.h"
-#include "ADM_libMad/mad.h"
+
+#ifdef USE_EXTERNAL_LIBMAD
+    #include "mad.h"
+#else
+    #include "ADM_libMad/mad.h"
+#endif

#define Stream ((mad_stream *)_stream)
#define Frame ((mad_frame *)_frame)
diff --git a/avidemux_plugins/ADM_audioDecoders/ADM_ad_mad/CMakeLists.txt b/avidemux_plugins/ADM_audioDecoders/ADM_ad_mad/CMakeLists.txt
index e5e317b..22d28e1 100644
--- a/avidemux_plugins/ADM_audioDecoders/ADM_ad_mad/CMakeLists.txt
+++ b/avidemux_plugins/ADM_audioDecoders/ADM_ad_mad/CMakeLists.txt
@@ -14,13 +14,20 @@ ELSEIF (ADM_CPU_ARMEL)
ADD_DEFINITIONS("-DFPM_ARM")
ENDIF (ADM_CPU_X86_32)

-ADD_SUBDIRECTORY(ADM_libMad)
+IF(NOT USE_EXTERNAL_LIBMAD)
+    ADD_SUBDIRECTORY(ADM_libMad)
+ENDIF()

ADD_DEFINITIONS("-DHAVE_ASSERT_H")
SET(ADM_ad_Mad_SRCS ADM_ad_mad.cpp)

ADD_AUDIO_DECODER( ADM_ad_Mad ${ADM_ad_Mad_SRCS})
-TARGET_LINK_LIBRARIES(ADM_ad_Mad ADM_libMad)
+
+IF(USE_EXTERNAL_LIBMAD)
+    TARGET_LINK_LIBRARIES(ADM_ad_Mad ${LIBMAD_LIBRARIES})
+ELSE()
+    TARGET_LINK_LIBRARIES(ADM_ad_Mad ADM_libMad)
+ENDIF()

INIT_AUDIO_PLUGIN(ADM_ad_Mad)
INSTALL_AUDIODECODER(ADM_ad_Mad)
diff --git a/avidemux_plugins/ADM_videoFilters6/ass/ADM_vidASS.cpp b/avidemux_plugins/ADM_videoFilters6/ass/ADM_vidASS.cpp
index baadf0c..1a0c948 100644
--- a/avidemux_plugins/ADM_videoFilters6/ass/ADM_vidASS.cpp
+++ b/avidemux_plugins/ADM_videoFilters6/ass/ADM_vidASS.cpp
@@ -24,7 +24,11 @@
#include "prefs.h"
extern "C"
{
-#include "ADM_libass/ass.h"
+#ifdef USE_EXTERNAL_LIBASS
+    #include "ass/ass.h"
+#else
+    #include "ADM_libass/ass.h"
+#endif
}

/**
diff --git a/avidemux_plugins/ADM_videoFilters6/ass/CMakeLists.txt b/avidemux_plugins/ADM_videoFilters6/ass/CMakeLists.txt
index f793fe0..f101863 100644
--- a/avidemux_plugins/ADM_videoFilters6/ass/CMakeLists.txt
+++ b/avidemux_plugins/ADM_videoFilters6/ass/CMakeLists.txt
@@ -1,24 +1,27 @@
-INCLUDE(admCheckFreeType)
-INCLUDE(admCheckFridibi)
-ADD_CORE_INCLUDE(ADM_coreSubtitles)
-checkFreeType()
-checkFridibi("0.19")
-
-IF (USE_FREETYPE AND USE_FRIDIBI)
- ADD_SUBDIRECTORY(ADM_libass)
-
- INCLUDE(vf_plugin)
- SET(ADM_vf_ssa_SRCS ADM_vidASS.cpp)
-
- ADD_VIDEO_FILTER(ADM_vf_ssa ${ADM_vf_ssa_SRCS})
-
- IF(DO_COMMON)
- TARGET_LINK_LIBRARIES(ADM_vf_ssa ADM_libass ${FREETYPE2_LDFLAGS} ${FRIDIBI_LDFLAGS} ADM_coreSubtitle)
-                # We force the use of fontconfig
-                ADD_DEFINITIONS("-DUSE_FONTCONFIG")
-                TARGET_LINK_LIBRARIES(ADM_vf_ssa ${FONTCONFIG_LDFLAGS})
- ENDIF(DO_COMMON)
-
- INIT_VIDEO_FILTER(ADM_vf_ssa)
- INSTALL_VIDEO_FILTER(ADM_vf_ssa)
-ENDIF (USE_FREETYPE AND USE_FRIDIBI)
+INCLUDE(admCheckFreeType)
+INCLUDE(admCheckFridibi)
+ADD_CORE_INCLUDE(ADM_coreSubtitles)
+checkFreeType()
+checkFridibi("0.19")
+
+IF (USE_FREETYPE AND USE_FRIDIBI)
+    INCLUDE(vf_plugin)
+    SET(ADM_vf_ssa_SRCS ADM_vidASS.cpp)
+
+    ADD_VIDEO_FILTER(ADM_vf_ssa ${ADM_vf_ssa_SRCS})
+
+    IF(DO_COMMON)
+        IF(USE_EXTERNAL_LIBASS)
+            TARGET_LINK_LIBRARIES(ADM_vf_ssa ${LIBASS_LIBRARIES} ${FREETYPE2_LDFLAGS} ${FRIDIBI_LDFLAGS} ADM_coreSubtitle)
+        ELSE(USE_EXTERNAL_LIBASS)
+            ADD_SUBDIRECTORY(ADM_libass)
+            TARGET_LINK_LIBRARIES(ADM_vf_ssa ADM_libass ${FREETYPE2_LDFLAGS} ${FRIDIBI_LDFLAGS} ADM_coreSubtitle)
+        ENDIF(USE_EXTERNAL_LIBASS)
+        # We force the use of fontconfig
+        ADD_DEFINITIONS("-DUSE_FONTCONFIG")
+        TARGET_LINK_LIBRARIES(ADM_vf_ssa ${FONTCONFIG_LDFLAGS})
+    ENDIF(DO_COMMON)
+
+    INIT_VIDEO_FILTER(ADM_vf_ssa)
+    INSTALL_VIDEO_FILTER(ADM_vf_ssa)
+ENDIF (USE_FREETYPE AND USE_FRIDIBI)
diff --git a/avidemux_plugins/CMakeLists.txt b/avidemux_plugins/CMakeLists.txt
index 0333abd..96fc895 100644
--- a/avidemux_plugins/CMakeLists.txt
+++ b/avidemux_plugins/CMakeLists.txt
@@ -64,6 +64,41 @@ include(admCoreIncludes)
LINK_DIRECTORIES("${AVIDEMUX_SEARCH_LIB_DIR}")
INCLUDE_DIRECTORIES("${AVIDEMUX_SEARCH_INCLUDE_DIR}/avidemux/2.6")

+#########################################
+# Unbundle some libraries here
+#########################################
+OPTION(USE_EXTERNAL_LIBASS "Use system installed libass library." OFF)
+OPTION(USE_EXTERNAL_LIBMAD "Use system installed libmad library." OFF)
+OPTION(USE_EXTERNAL_LIBA52 "Use system installed liba52 library." OFF)
+OPTION(USE_EXTERNAL_LIBTWOLAME "Use system installed libtwolame library." OFF)
+
+INCLUDE(FindPkgConfig)
+
+# libass
+IF(USE_EXTERNAL_LIBASS)
+        PKG_CHECK_MODULES(LIBASS REQUIRED libass)
+        INCLUDE_DIRECTORIES(SYSTEM ${LIBASS_INCLUDE_DIRS})
+ENDIF()
+
+# libmad
+IF(USE_EXTERNAL_LIBMAD)
+        FIND_PATH(LIBMAD_INCLUDE_DIR mad.h)
+        FIND_LIBRARY(LIBMAD_LIBRARIES mad)
+        INCLUDE_DIRECTORIES(SYSTEM ${LIBMAD_INCLUDE_DIRS})
+ENDIF()
+
+# liba52
+IF(USE_EXTERNAL_LIBA52)
+        FIND_PATH(LIBA52_INCLUDE_DIR a52dec/a52.h)
+        FIND_LIBRARY(LIBA52_LIBRARIES a52)
+        INCLUDE_DIRECTORIES(SYSTEM ${LIBA52_INCLUDE_DIR})
+ENDIF()
+
+# twolame
+IF(USE_EXTERNAL_TWOLAME)
+        PKG_CHECK_MODULES(LIBTWOLAME REQUIRED twolame)
+        INCLUDE_DIRECTORIES(SYSTEM ${LIBTWOLAME_INCLUDE_DIRS})
+ENDIF()

IF (FRESH_BUILD)
MESSAGE("")


By the way, it would be great if all cmake files were converted to Unix line terminators, the current mix causes headaches depending on text editor (vim is capable of handling mixed line endings within a file, gedit is not). The list of remaining files to convert:

avidemux_core/ADM_coreSubtitles/src/CMakeLists.txt
avidemux/common/ADM_audioCodec/src/CMakeLists.txt
avidemux/common/ADM_render/CMakeLists.txt
avidemux/common/ADM_script2/CMakeLists.txt
avidemux/common/ADM_videoCodec/CMakeLists.txt
avidemux/common/ADM_libraries/CMakeLists.txt
avidemux/common/ADM_libraries/ADM_libsdl/CMakeLists.txt
avidemux/qt4/CMakeLists.txt
avidemux/qt4/ADM_openGL/CMakeLists.txt
avidemux/qt4/ADM_openGL/src/CMakeLists.txt
avidemux/qt4/ADM_update/CMakeLists.txt
avidemux/qt4/ADM_update/src/CMakeLists.txt
avidemux/qt4/i18n/CMakeLists.txt
avidemux/qt4/ADM_jobs/CMakeLists.txt
avidemux/qt4/ADM_jobs/src/CMakeLists.txt
avidemux/qt4/ADM_userInterfaces/ADM_filters/CMakeLists.txt
avidemux/qt4/ADM_userInterfaces/ADM_gui/CMakeLists.txt
avidemux/qt4/ADM_userInterfaces/ADM_ocr/CMakeLists.txt
avidemux/qt4/ADM_UIs/CMakeLists.txt
avidemux/qt4/ADM_UIs/src/CMakeLists.txt
avidemux/cli/CMakeLists.txt
# gtk skipped
avidemux_plugins/ADM_demuxers/VapourSynth/qt4/CMakeLists.txt
avidemux_plugins/ADM_videoFilters6/CMakeLists.txt
avidemux_plugins/ADM_videoFilters6/ass/ADM_libass/CMakeLists.txt
avidemux_plugins/ADM_videoDecoder/CMakeLists.txt
avidemux_plugins/ADM_videoDecoder/vpx/CMakeLists.txt
avidemux_plugins/ADM_videoEncoder/CMakeLists.txt
avidemux_plugins/ADM_videoEncoder/jpeg/CMakeLists.txt
avidemux_plugins/ADM_videoEncoder/libva/CMakeLists.txt
avidemux_plugins/ADM_videoEncoder/png/CMakeLists.txt
avidemux_plugins/ADM_videoEncoder/yv12/CMakeLists.txt
avidemux_plugins/ADM_videoEncoder/huff/CMakeLists.txt
avidemux_plugins/ADM_videoFilters/CMakeLists.txt
avidemux_plugins/ADM_videoFilters/Srt/CMakeLists.txt
avidemux_plugins/ADM_muxers/muxerMplex/CMakeLists.txt
# spiderMonkey skipped
avidemux_plugins/ADM_audioDecoders/ADM_ad_mad/ADM_libMad/CMakeLists.txt
avidemux_plugins/ADM_autoScrips/CMakeLists.txt

Title: Re: Environment setup for cross-compiling on Linux for Windows
Post by: eumagga0x2a on December 13, 2016, 11:36:42 PM
The bash script which automates cross-compiling and packaging for Windows has been merged into the git master. A howto (https://raw.githubusercontent.com/mean00/avidemux2/master/cross-compiling.txt) explains the pretty straightforward setup of the build environment.

Please note that as of now you must add the --with-system-libass option to bootStrapCrossMingwQt5_mxe.sh, otherwise the cross-compilation will fail in pluginsCommon.