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