From cc19d978babbf2fe0ce5396c78839d2870faa139 Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Sun, 22 Oct 2023 19:15:38 +0200
Subject: [PATCH] BUILD: Now we have a thing that compiles with mingw +
 launches with wine, still need to debug the thing (must be path problems...)

---
 README.md                     | 12 ++++++-
 lektord/c/CMakeLists.txt      | 67 +++++++++++++++++++----------------
 lektord/c/common.h            |  2 ++
 lektord/c/module_qt_window.cc | 24 ++++++-------
 lektord/c/module_qt_window.hh | 24 ++++++-------
 5 files changed, 73 insertions(+), 56 deletions(-)

diff --git a/README.md b/README.md
index 11603003..9cd6adb9 100644
--- a/README.md
+++ b/README.md
@@ -114,12 +114,22 @@ Windows 64 bit binaries are built from a linux system. On arch, install the pack
 Make sure that you have the windows toolchain for 64 bit installed. Run the followinf commands:
 
     (cd utils/arch-pkgs/mingw-w64-shaderc && makepkg -si)
-    yay -Sy mingw-w64-gcc mingw-w64-cmake mingw-w64-make mingw-w64-dlfcn
+    yay -Sy mingw-w64-gcc mingw-w64-cmake mingw-w64-make mingw-w64-dlfcn x86_64-w64-mingw32-ldd
     yay -Sy mingw-w64-mpv   # Be sure to install it after building shaderc from source
     yay -Sy mingw-w64-qt6-* # You may specify the packages
     rustup target add x86_64-pc-windows-gnu
     MAKE=x86_64-w64-mingw32-make CMAKE=x86_64-w64-mingw32-cmake CXX=x86_64-w64-mingw32-g++ cargo build --target x86_64-pc-windows-gnu
 
+To run on linux, don't forget to tell wine where to find all the dlls for Qt/mpv, from the build
+folder run either commands:
+
+    # With wine
+    WINEPATH=/usr/x86_64-w64-mingw32/bin lektord.exe
+
+    # Copy DLL files
+    for F in $(WINEPATH=/usr/x86_64-w64-mingw32/bin x86_64-w64-mingw32-ldd lektor_c.dll | grep -v "not found" | awk '{print $3}'); do cp "$F" .; done
+    ./lektord.exe
+
 > Be sure to have the multilib repos and install the bootstrap `minwg-w64-*-bootstrap` packages
 > first, to avoid the circular dependencies... And be sure to have a lot of time to waste.
 
diff --git a/lektord/c/CMakeLists.txt b/lektord/c/CMakeLists.txt
index c2964094..ec9b6d5e 100644
--- a/lektord/c/CMakeLists.txt
+++ b/lektord/c/CMakeLists.txt
@@ -83,6 +83,12 @@ set(GNU_C_FLAGS
 # FIND DEPENDENCIES #
 ###               ###
 
+if(WIN32)
+    # list(PREPEND CMAKE_FIND_LIBRARY_SUFFIXES .a .dll.a .lib)
+    set(Qt6_USE_STATIC_LIBS ON)    
+    set(Qt6_USE_STATIC_RUNTIME ON)
+endif()
+
 find_library(MPV_LIBRARY mpv REQUIRED)                              # tested with 0.36.0
 find_package(Qt6 COMPONENTS Widgets OpenGL OpenGLWidgets REQUIRED)  # tested with 6.4.0-1
 
@@ -127,35 +133,34 @@ endif()
 qt_add_library(lektor_c SHARED ${LEKTOR_C_SRC})
 qt_set_finalizer_mode(lektor_c ENABLE MODES static_plugins)
 
-foreach(target lektor_c)
-    set_property(TARGET ${target} PROPERTY CXX_STANDARD 20)
-    target_include_directories(${target} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
-    target_compile_definitions(${target} PRIVATE
-        LKT_ARCH="${CMAKE_SYSTEM_PROCESSOR}"
-        _POSIX_C_SOURCE=200809L # POSIX 2008/09
-        LKT_VERSION="${LKT_VERSION}"
-        MPV_ENABLE_DEPRECATED=0
-        QT_DISABLE_DEPRECATED_BEFORE=0x050F00
-        QT_NO_CAST_TO_ASCII
-        QT_RESTRICTED_CAST_FROM_ASCII
-        QTCREATOR_UTILS_STATIC_LIB
-    )
-    target_compile_options(${target} PRIVATE
-        ${COMMON_C_FLAGS}
-        ${${CMAKE_C_COMPILER_ID}_C_FLAGS}
-        ${${CMAKE_CXX_COMPILER_ID}_CXX_FLAGS}
-        ${${CMAKE_BUILD_TYPE}_${CMAKE_C_COMPILER_ID}_C_FLAGS}
-        ${${CMAKE_BUILD_TYPE}_${CMAKE_CXX_COMPILER_ID}_C_FLAGS}
-    )
-    target_link_libraries(${target} PRIVATE ${MPV_LIBRARY} ${CMAKE_DL_LIBS})
-    target_link_libraries(${target} PRIVATE Qt::Widgets Qt::OpenGL Qt::OpenGLWidgets)
-
-    if(UNIX)
-        target_link_options(${target} PRIVATE -Wl,-rpath,. -rdynamic)
-    endif()
-    if(WIN32)
-        # target_link_options(${target} PRIVATE -Wl,--export-all-symbols)
-        target_link_libraries(${target} PRIVATE regex dlfcn-win32::dl ws2_32)
-    endif()
-endforeach()
+set_property(TARGET lektor_c PROPERTY CXX_STANDARD 20)
+set_property(TARGET lektor_c PROPERTY AUTOSTATICPLUGINS ON)
+target_include_directories(lektor_c PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
+target_compile_definitions(lektor_c PRIVATE
+    LKT_ARCH="${CMAKE_SYSTEM_PROCESSOR}"
+    _POSIX_C_SOURCE=200809L # POSIX 2008/09
+    LKT_VERSION="${LKT_VERSION}"
+    MPV_ENABLE_DEPRECATED=0
+    QT_DISABLE_DEPRECATED_BEFORE=0x050F00
+    QT_NO_CAST_TO_ASCII
+    QT_RESTRICTED_CAST_FROM_ASCII
+    QTCREATOR_UTILS_STATIC_LIB
+)
+target_compile_options(lektor_c PRIVATE
+    ${COMMON_C_FLAGS}
+    ${${CMAKE_C_COMPILER_ID}_C_FLAGS}
+    ${${CMAKE_CXX_COMPILER_ID}_CXX_FLAGS}
+    ${${CMAKE_BUILD_TYPE}_${CMAKE_C_COMPILER_ID}_C_FLAGS}
+    ${${CMAKE_BUILD_TYPE}_${CMAKE_CXX_COMPILER_ID}_C_FLAGS}
+)
+target_link_libraries(lektor_c PRIVATE ${MPV_LIBRARY} ${CMAKE_DL_LIBS})
+target_link_libraries(lektor_c PRIVATE Qt::Widgets Qt::OpenGL Qt::OpenGLWidgets)
+
+if(UNIX)
+    target_link_options(lektor_c PRIVATE -Wl,-rpath,. -rdynamic)
+elseif(WIN32)
+    target_link_options(lektor_c PRIVATE -Wl,-rpath,. -Wl,-allow-multiple-definition -static
+        -Wl,-exclude-all-symbols)
+    target_link_libraries(lektor_c PRIVATE regex dlfcn-win32::dl ws2_32)
+endif()
 
diff --git a/lektord/c/common.h b/lektord/c/common.h
index 7ca89891..c24b3a09 100644
--- a/lektord/c/common.h
+++ b/lektord/c/common.h
@@ -30,9 +30,11 @@
 #include <sys/types.h>
 #include <sys/time.h>
 #define DLL_IMPORT extern
+#define DLL_EXPORT
 
 #elif defined(LKT_OS_MINGW) && (LKT_OS_MINGW == 1)
 #define DLL_IMPORT __declspec(dllimport)
+#define DLL_EXPORT __declspec(dllexport)
 
 #endif
 
diff --git a/lektord/c/module_qt_window.cc b/lektord/c/module_qt_window.cc
index e6e06a6d..d9d03f2d 100644
--- a/lektord/c/module_qt_window.cc
+++ b/lektord/c/module_qt_window.cc
@@ -21,7 +21,7 @@ ___create_mpv_widget(void *arg)
 }
 
 extern "C" {
-int
+DLL_EXPORT int
 mod_new(void)
 {
     LOG_DEBUG("WINDOW", "initializing a new window");
@@ -45,7 +45,7 @@ mod_new(void)
     }
 }
 
-int
+DLL_EXPORT int
 mod_close(void)
 {
     module->main_window->acceptCloseEvent();
@@ -56,55 +56,55 @@ mod_close(void)
     return (int)ret;
 }
 
-int
+DLL_EXPORT int
 mod_stop_playback(void)
 {
     return !module->mpv_widget->stop();
 }
 
-int
+DLL_EXPORT int
 mod_toggle_pause(void)
 {
     return !module->mpv_widget->togglePause();
 }
 
-int
+DLL_EXPORT int
 mod_load_file(const char *file, uint64_t id)
 {
     return !module->mpv_widget->loadFile(file, id);
 }
 
-int
+DLL_EXPORT int
 mod_set_volume(int volume)
 {
     return !module->mpv_widget->setVolume(volume);
 }
 
-int
+DLL_EXPORT int
 mod_set_paused(int paused)
 {
     return !module->mpv_widget->setPaused(paused);
 }
 
-int
+DLL_EXPORT int
 mod_set_position(int seconds)
 {
     return !module->mpv_widget->setPosition(seconds);
 }
 
-int
+DLL_EXPORT int
 mod_get_duration(int *duration)
 {
     return !module->mpv_widget->getDuration(duration);
 }
 
-int
+DLL_EXPORT int
 mod_get_elapsed(int *elapsed)
 {
     return !module->mpv_widget->getElapsed(elapsed);
 }
 
-int
+DLL_EXPORT int
 mod_set_msg_options(const char *font, uint64_t size, uint64_t msg_len_sec)
 {
     if (strlen(font) >= LKT_LINE_MAX) {
@@ -118,7 +118,7 @@ mod_set_msg_options(const char *font, uint64_t size, uint64_t msg_len_sec)
     }
 }
 
-int
+DLL_EXPORT int
 mod_set_force_x11(bool force_x11)
 {
     module_force_x11 = force_x11;
diff --git a/lektord/c/module_qt_window.hh b/lektord/c/module_qt_window.hh
index 16c5bcbf..bede7baa 100644
--- a/lektord/c/module_qt_window.hh
+++ b/lektord/c/module_qt_window.hh
@@ -13,18 +13,18 @@ struct module_qt_window_s {
 };
 
 extern "C" {
-int mod_new(void);
-int mod_close(void);
-int mod_toggle_pause(void);
-int mod_stop_playback(void);
-int mod_load_file(const char *, uint64_t);
-int mod_set_volume(int);
-int mod_set_paused(int);
-int mod_set_position(int);
-int mod_get_duration(int *);
-int mod_get_elapsed(int *);
-int mod_set_msg_options(const char *, uint64_t, uint64_t);
-int mod_set_force_x11(bool);
+DLL_EXPORT int mod_new(void);
+DLL_EXPORT int mod_close(void);
+DLL_EXPORT int mod_toggle_pause(void);
+DLL_EXPORT int mod_stop_playback(void);
+DLL_EXPORT int mod_load_file(const char *, uint64_t);
+DLL_EXPORT int mod_set_volume(int);
+DLL_EXPORT int mod_set_paused(int);
+DLL_EXPORT int mod_set_position(int);
+DLL_EXPORT int mod_get_duration(int *);
+DLL_EXPORT int mod_get_elapsed(int *);
+DLL_EXPORT int mod_set_msg_options(const char *, uint64_t, uint64_t);
+DLL_EXPORT int mod_set_force_x11(bool);
 
 static inline char module_font_name[LKT_LINE_MAX] = { 0 };
 static inline uint64_t module_font_size           = 0;
-- 
GitLab