mirror of
https://git.vladimir.cc/vladimir/lazopenglcontextex.git
synced 2026-08-25 17:37:31 +00:00
Форк штатного пакета LazOpenGLContext (Lazarus components/opengl). Qt5/Qt6-бэкенд (glqtnativecontext.pas) использует собственный контекст настоящего QOpenGLWidget вместо ручного GLX на winId(): EGL на Wayland, GLX на X11, WGL/CGL на Windows/macOS под ws=qt6. QOpenGLWidget-наследник с paintGL-хуком живёт в маленькой C++-либе csrc/qlclglwidget.cpp (QLCLOpenGLWidget из libQt6Pas — не QOpenGLWidget, а голый QWidget под внешний GLX). Сборка: csrc/Makefile (linux/macos/windows-кросс mingw-w64/windows-native MSYS2, install, install-app) + build-msvc.bat для MSVC-Qt. Либа грузится в рантайме рядом с бинарником приложения. Бэкенды gtk2/gtk3/win32/cocoa скопированы из стока без изменений (юниты переименованы с суффиксом Ex). Детали и нюансы — в README.md. Проверено: EWSDR, спектр/водопад через GL в нативном Wayland (KDE, qt6), живой эфир QO-100. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
145 lines
5.3 KiB
Makefile
145 lines
5.3 KiB
Makefile
# ----------------------------------------------------------------------------
|
|
# libqlclglwidget — QOpenGLWidget helper library for LazOpenGLContextEx
|
|
#
|
|
# Build variants:
|
|
# make / make linux native Linux build -> ../libqlclglwidget.so
|
|
# make macos native macOS build (on a Mac) -> ../libqlclglwidget.dylib
|
|
# make windows qlclglwidget.dll with a MinGW toolchain:
|
|
# * cross-build from Linux (mingw-w64), OR
|
|
# * natively on Windows with a Qt MinGW kit that has
|
|
# no pkg-config — override the variables:
|
|
# make windows MINGW_CXX=g++ \
|
|
# WIN_QT_INC=C:/Qt/6.x.x/mingw_64/include \
|
|
# WIN_QT_LIB=C:/Qt/6.x.x/mingw_64/lib
|
|
# make windows-native natively on Windows in an MSYS2 MinGW64 shell
|
|
# (uses pkg-config; auto-selected by plain `make` there)
|
|
# build-msvc.bat natively on Windows with MSVC (see the .bat file);
|
|
# required when the target Qt6/libQt6Pas is an MSVC
|
|
# build — MinGW and MSVC C++ ABIs are incompatible
|
|
#
|
|
# make install install the host-platform artifact into $(PREFIX)/lib
|
|
# (DESTDIR supported; run ldconfig yourself on Linux)
|
|
# make install-app APPDIR=/path/to/app/dir
|
|
# copy every built artifact next to the app binary
|
|
# (the Pascal loader looks there first)
|
|
# make clean
|
|
#
|
|
# Windows cross-build requirements (on the Linux build machine):
|
|
# - mingw-w64 toolchain: x86_64-w64-mingw32-g++
|
|
# - a *MinGW* build of Qt6 (headers + import libs), one of:
|
|
# * Arch AUR: mingw-w64-qt6-base (installs to /usr/x86_64-w64-mingw32)
|
|
# * MXE (https://mxe.cc) with qt6 (set MINGW_PREFIX to the MXE usr dir)
|
|
# * a Qt "MinGW" kit copied from a Windows Qt install
|
|
# (set WIN_QT_INC / WIN_QT_LIB manually)
|
|
#
|
|
# Windows native (MSYS2 MinGW64 shell) requirements:
|
|
# pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-qt6-base pkgconf make
|
|
#
|
|
# The MinGW-built DLL works only with MinGW Qt6 DLLs on the target machine,
|
|
# the MSVC-built DLL only with MSVC Qt6 DLLs (incompatible C++ ABIs).
|
|
#
|
|
# macOS notes: needs Xcode command line tools + Qt6 with pkg-config files,
|
|
# e.g. Homebrew: brew install qt pkgconf
|
|
# export PKG_CONFIG_PATH="$(brew --prefix qt)/libexec/lib/pkgconfig"
|
|
# ----------------------------------------------------------------------------
|
|
|
|
NAME := qlclglwidget
|
|
SRC := qlclglwidget.cpp
|
|
OUTDIR := ..
|
|
|
|
PREFIX ?= /usr/local
|
|
DESTDIR ?=
|
|
|
|
CXXFLAGS ?= -O2
|
|
CXXSTD := -std=c++17
|
|
|
|
PKG_CONFIG ?= pkg-config
|
|
QT_PKGS := Qt6Widgets Qt6OpenGLWidgets
|
|
|
|
# Windows cross toolchain / Qt location (override as needed)
|
|
MINGW_CXX ?= x86_64-w64-mingw32-g++
|
|
MINGW_PREFIX ?= /usr/x86_64-w64-mingw32
|
|
WIN_QT_INC ?= $(MINGW_PREFIX)/include/qt6
|
|
WIN_QT_LIB ?= $(MINGW_PREFIX)/lib
|
|
WIN_QT_LIBS ?= -lQt6Widgets -lQt6OpenGLWidgets -lQt6Gui -lQt6Core
|
|
|
|
LINUX_OUT := $(OUTDIR)/lib$(NAME).so
|
|
MACOS_OUT := $(OUTDIR)/lib$(NAME).dylib
|
|
WIN_OUT := $(OUTDIR)/$(NAME).dll
|
|
|
|
UNAME := $(shell uname -s)
|
|
ifeq ($(UNAME),Darwin)
|
|
HOST_OUT := $(MACOS_OUT)
|
|
HOST_TARGET := macos
|
|
else ifneq (,$(findstring MINGW,$(UNAME))$(findstring MSYS,$(UNAME)))
|
|
# MSYS2 MinGW64 shell on Windows
|
|
HOST_OUT := $(WIN_OUT)
|
|
HOST_TARGET := windows-native
|
|
else
|
|
HOST_OUT := $(LINUX_OUT)
|
|
HOST_TARGET := linux
|
|
endif
|
|
|
|
.PHONY: all linux macos windows windows-native install install-app clean
|
|
|
|
all: $(HOST_TARGET)
|
|
|
|
linux: $(LINUX_OUT)
|
|
|
|
$(LINUX_OUT): $(SRC)
|
|
$(CXX) $(CXXFLAGS) $(CXXSTD) -shared -fPIC \
|
|
$(shell $(PKG_CONFIG) --cflags $(QT_PKGS)) \
|
|
-o $@ $(SRC) \
|
|
$(shell $(PKG_CONFIG) --libs $(QT_PKGS))
|
|
|
|
macos: $(MACOS_OUT)
|
|
|
|
$(MACOS_OUT): $(SRC)
|
|
$(CXX) $(CXXFLAGS) $(CXXSTD) -dynamiclib -fPIC \
|
|
$(shell $(PKG_CONFIG) --cflags $(QT_PKGS)) \
|
|
-o $@ $(SRC) \
|
|
$(shell $(PKG_CONFIG) --libs $(QT_PKGS)) \
|
|
-Wl,-install_name,@rpath/lib$(NAME).dylib
|
|
|
|
# MinGW build: cross from Linux, or native on Windows with a Qt MinGW kit
|
|
# (no pkg-config needed — plain include/lib paths)
|
|
windows: $(WIN_OUT)
|
|
|
|
$(WIN_OUT): $(SRC)
|
|
$(MINGW_CXX) $(CXXFLAGS) $(CXXSTD) -shared \
|
|
-I$(WIN_QT_INC) \
|
|
-I$(WIN_QT_INC)/QtCore \
|
|
-I$(WIN_QT_INC)/QtGui \
|
|
-I$(WIN_QT_INC)/QtWidgets \
|
|
-I$(WIN_QT_INC)/QtOpenGL \
|
|
-I$(WIN_QT_INC)/QtOpenGLWidgets \
|
|
-o $@ $(SRC) \
|
|
-L$(WIN_QT_LIB) $(WIN_QT_LIBS) \
|
|
-static-libgcc -static-libstdc++ \
|
|
-Wl,--out-implib,$(OUTDIR)/lib$(NAME).dll.a
|
|
|
|
# native Windows build in an MSYS2 MinGW64 shell (pkg-config available)
|
|
windows-native:
|
|
$(CXX) $(CXXFLAGS) $(CXXSTD) -shared \
|
|
$(shell $(PKG_CONFIG) --cflags $(QT_PKGS)) \
|
|
-o $(WIN_OUT) $(SRC) \
|
|
$(shell $(PKG_CONFIG) --libs $(QT_PKGS)) \
|
|
-static-libgcc -static-libstdc++ \
|
|
-Wl,--out-implib,$(OUTDIR)/lib$(NAME).dll.a
|
|
|
|
install: $(HOST_OUT)
|
|
install -d $(DESTDIR)$(PREFIX)/lib
|
|
install -m755 $(HOST_OUT) $(DESTDIR)$(PREFIX)/lib/
|
|
|
|
install-app:
|
|
@test -n "$(APPDIR)" || { echo "usage: make install-app APPDIR=/path/to/app/dir"; exit 1; }
|
|
install -d $(APPDIR)
|
|
@for f in $(LINUX_OUT) $(MACOS_OUT) $(WIN_OUT); do \
|
|
if [ -f $$f ]; then install -m755 $$f $(APPDIR)/ && echo "installed $$f -> $(APPDIR)/"; fi; \
|
|
done
|
|
|
|
clean:
|
|
rm -f $(LINUX_OUT) $(MACOS_OUT) $(WIN_OUT) \
|
|
$(OUTDIR)/lib$(NAME).dll.a $(OUTDIR)/$(NAME).lib $(OUTDIR)/$(NAME).exp \
|
|
$(NAME).obj
|