From b2c280bed472b034753a5249c6cfb0fb5e20ccf8 Mon Sep 17 00:00:00 2001 From: polos Date: Wed, 27 Feb 2019 21:47:39 +0100 Subject: [PATCH] make 'eql5' executable independant from source installation (e.g. for eql5 -qgui, Slime) --- Qt_EQL/auto-reload.lisp | 2 +- Qt_EQL/looping.lisp | 2 +- Qt_EQL/reload.lisp | 6 +-- Qt_EQL/test.lisp | 2 +- Qt_EQL/trafficlight/run.lisp | 2 +- examples/3-main-window.lisp | 6 +-- examples/5-colliding-mice.lisp | 2 +- examples/7-Sokoban/eql-sokoban.lisp | 4 +- examples/9-simple-lisp-editor/editor.lisp | 10 ++--- .../9-simple-lisp-editor/local-server.lisp | 2 +- .../M-modules/multimedia/camera/camera.lisp | 10 ++--- .../video-graphics-item.lisp | 2 +- .../multimedia/video-widget/video-widget.lisp | 2 +- .../quick/quickwidget/quickwidget.lisp | 2 +- .../Examples-Browser/examples-browser.lisp | 2 +- examples/M-modules/webkit/dom.lisp | 2 +- .../X-extras/move-blocks/move-blocks.lisp | 4 +- examples/X-extras/qimage/qimage.lisp | 6 +-- examples/X-extras/screenshot/screenshot.lisp | 2 +- src/eql.cpp | 2 +- src/eql_exe.pro | 2 + src/eql_exe.qrc | 35 ++++++++++++++++ src/lisp/define-all-wrappers-webengine.lisp | 6 +-- src/lisp/ini.lisp | 10 ++++- src/lisp/package.lisp | 1 + src/main.cpp | 41 +++++++++++++++++++ 26 files changed, 126 insertions(+), 41 deletions(-) create mode 100644 src/eql_exe.qrc diff --git a/Qt_EQL/auto-reload.lisp b/Qt_EQL/auto-reload.lisp index 9176c8a..f93cdca 100644 --- a/Qt_EQL/auto-reload.lisp +++ b/Qt_EQL/auto-reload.lisp @@ -7,7 +7,7 @@ (in-package :eql-user) #+linux -(qauto-reload-c++ *lib* (in-home "Qt_EQL/eql_cpp")) +(qauto-reload-c++ *lib* (in-src "Qt_EQL/eql_cpp")) #+linux (setf *lib-reloaded* 'show-current-apropos) diff --git a/Qt_EQL/looping.lisp b/Qt_EQL/looping.lisp index fa5a723..b59b562 100644 --- a/Qt_EQL/looping.lisp +++ b/Qt_EQL/looping.lisp @@ -2,7 +2,7 @@ (in-package :eql-user) -(defvar *lib* (qload-c++ (in-home "Qt_EQL/eql_fun_cpp"))) +(defvar *lib* (qload-c++ (in-src "Qt_EQL/eql_fun_cpp"))) (defun say-number (n) (format nil "~R" n)) diff --git a/Qt_EQL/reload.lisp b/Qt_EQL/reload.lisp index 8e66f1e..c2cf500 100644 --- a/Qt_EQL/reload.lisp +++ b/Qt_EQL/reload.lisp @@ -17,14 +17,14 @@ (in-package :eql-user) -(defvar *lib* (qload-c++ (in-home "Qt_EQL/eql_cpp"))) +(defvar *lib* (qload-c++ (in-src "Qt_EQL/eql_cpp"))) (defun recompile-c++ () - (qload-c++ (in-home "Qt_EQL/eql_cpp") + (qload-c++ (in-src "Qt_EQL/eql_cpp") :unload) (ext:run-program #+msvc "make.bat" #-msvc "make" #+msvc nil #-msvc '("-C" "cpp/") :output t) - (setf *lib* (qload-c++ (in-home "Qt_EQL/eql_cpp"))) + (setf *lib* (qload-c++ (in-src "Qt_EQL/eql_cpp"))) (assert (qt-object-p *lib*)) (qapropos nil *lib*)) diff --git a/Qt_EQL/test.lisp b/Qt_EQL/test.lisp index 3080d42..5752a5b 100644 --- a/Qt_EQL/test.lisp +++ b/Qt_EQL/test.lisp @@ -1,6 +1,6 @@ (in-package :eql-user) -(defvar *lib* (qload-c++ (in-home "Qt_EQL/eql_cpp"))) +(defvar *lib* (qload-c++ (in-src "Qt_EQL/eql_cpp"))) (assert (qt-object-p *lib*)) diff --git a/Qt_EQL/trafficlight/run.lisp b/Qt_EQL/trafficlight/run.lisp index 9a291fd..789deb5 100644 --- a/Qt_EQL/trafficlight/run.lisp +++ b/Qt_EQL/trafficlight/run.lisp @@ -1,6 +1,6 @@ (in-package :eql-user) -(defvar *trafficlight* (qload-c++ (in-home "Qt_EQL/trafficlight/trafficlight"))) +(defvar *trafficlight* (qload-c++ (in-src "Qt_EQL/trafficlight/trafficlight"))) (defvar *lights* (qfind-children *trafficlight* nil "LightWidget")) (defvar *red* (first *lights*)) (defvar *yellow* (second *lights*)) diff --git a/examples/3-main-window.lisp b/examples/3-main-window.lisp index 74581fc..146a9e3 100644 --- a/examples/3-main-window.lisp +++ b/examples/3-main-window.lisp @@ -5,7 +5,7 @@ (in-package :main-window) -(defvar *main* (qload-ui (in-home "examples/data/main-window.ui"))) +(defvar *main* (qload-ui (in-src "examples/data/main-window.ui"))) (defvar *editor* (qfind-child *main* "editor")) (defvar *action-open* (qfind-child *main* "action_open")) (defvar *action-save* (qfind-child *main* "action_save")) @@ -24,7 +24,7 @@ (defun set-icon-from-file (action name) "Icon from custom pixmap." (|setIcon| action (qnew "QIcon(QString)" - (in-home (format nil "examples/data/icons/~A.png" name))))) + (in-src (format nil "examples/data/icons/~A.png" name))))) (defun start () (x:do-with (qset *main*) @@ -34,7 +34,7 @@ (set-icon *action-save* "document-save") (qconnect *action-open* "triggered()" 'file-open) (qconnect *action-save* "triggered()" 'file-save) - (|setHtml| *editor* (read-file (in-home "examples/data/utf8.htm"))) + (|setHtml| *editor* (read-file (in-src "examples/data/utf8.htm"))) (x:do-with *main* |show| |raise|)) (defun file-open () diff --git a/examples/5-colliding-mice.lisp b/examples/5-colliding-mice.lisp index 6db0c12..bf843db 100644 --- a/examples/5-colliding-mice.lisp +++ b/examples/5-colliding-mice.lisp @@ -181,7 +181,7 @@ (|setRenderHint| |QPainter.Antialiasing|) (|setBackgroundBrush| (qnew "QBrush(QPixmap)" (qnew "QPixmap(QString)" - (in-home "examples/data/icons/cheese.jpg")))) + (in-src "examples/data/icons/cheese.jpg")))) (|setCacheMode| |QGraphicsView.CacheBackground|) (|setViewportUpdateMode| |QGraphicsView.BoundingRectViewportUpdate|) (|setDragMode| |QGraphicsView.ScrollHandDrag|)) diff --git a/examples/7-Sokoban/eql-sokoban.lisp b/examples/7-Sokoban/eql-sokoban.lisp index 95237d1..6eacf01 100644 --- a/examples/7-Sokoban/eql-sokoban.lisp +++ b/examples/7-Sokoban/eql-sokoban.lisp @@ -18,8 +18,8 @@ ;;; ;;; ------------------------------------------------------------------------ -(load (eql:in-home "examples/7-Sokoban/3rd-party/sokoban")) -(load (eql:in-home "examples/7-Sokoban/3rd-party/levels")) +(load (eql:in-src "examples/7-Sokoban/3rd-party/sokoban")) +(load (eql:in-src "examples/7-Sokoban/3rd-party/levels")) (defpackage :eql-sokoban (:use :common-lisp :eql) diff --git a/examples/9-simple-lisp-editor/editor.lisp b/examples/9-simple-lisp-editor/editor.lisp index b6b8a60..4e7285d 100644 --- a/examples/9-simple-lisp-editor/editor.lisp +++ b/examples/9-simple-lisp-editor/editor.lisp @@ -37,11 +37,11 @@ (x:let-it (make-string (file-length s)) (read-sequence x:it s)))) -(defun in-home* (name) - (in-home "examples/9-simple-lisp-editor/" name)) +(defun in-src* (name) + (in-src "examples/9-simple-lisp-editor/" name)) (defun from-file (name) - (eval (read-from-string (read-file (in-home* name) :do-not-set)))) + (eval (read-from-string (read-file (in-src* name) :do-not-set)))) (defparameter *auto-indent* (from-file "data/auto-indent.lisp")) (defparameter *eql-keywords* (from-file "data/eql-keywords.lisp")) @@ -64,7 +64,7 @@ ;;; Qt -(defvar *main* (qload-ui (in-home* "data/editor.ui"))) +(defvar *main* (qload-ui (in-src* "data/editor.ui"))) (defvar-ui *main* *editor* @@ -1029,7 +1029,7 @@ (defun run-on-server (str &optional restart) (flet ((path-to-server (name) - (x:when-it (probe-file (in-home "examples/9-simple-lisp-editor/" name)) + (x:when-it (probe-file (in-src "examples/9-simple-lisp-editor/" name)) (namestring x:it)))) (qprocess-events) (or (local-client:request str) diff --git a/examples/9-simple-lisp-editor/local-server.lisp b/examples/9-simple-lisp-editor/local-server.lisp index 642adce..8a5e73b 100644 --- a/examples/9-simple-lisp-editor/local-server.lisp +++ b/examples/9-simple-lisp-editor/local-server.lisp @@ -111,7 +111,7 @@ (x:let-it (qnew "QPixmap") (! "loadFromData" x:it ;; embed data - #.(file-data (in-home "examples/9-simple-lisp-editor/data/local_server.png")) + #.(file-data (in-src "examples/9-simple-lisp-editor/data/local_server.png")) "PNG"))))) (menu (qnew "QMenu")) (quit (qnew "QAction(QObject*)" menu diff --git a/examples/M-modules/multimedia/camera/camera.lisp b/examples/M-modules/multimedia/camera/camera.lisp index 576d17e..141b351 100644 --- a/examples/M-modules/multimedia/camera/camera.lisp +++ b/examples/M-modules/multimedia/camera/camera.lisp @@ -2,12 +2,12 @@ (qrequire :multimedia) -(require :ui (in-home "examples/M-modules/multimedia/camera/ui/ui-camera")) -(require :ui-image (in-home "examples/M-modules/multimedia/camera/ui/ui-image-settings")) -(require :ui-video (in-home "examples/M-modules/multimedia/camera/ui/ui-video-settings")) +(require :ui (in-src "examples/M-modules/multimedia/camera/ui/ui-camera")) +(require :ui-image (in-src "examples/M-modules/multimedia/camera/ui/ui-image-settings")) +(require :ui-video (in-src "examples/M-modules/multimedia/camera/ui/ui-video-settings")) -(require :image-settings (in-home "examples/M-modules/multimedia/camera/image-settings")) -(require :video-settings (in-home "examples/M-modules/multimedia/camera/video-settings")) +(require :image-settings (in-src "examples/M-modules/multimedia/camera/image-settings")) +(require :video-settings (in-src "examples/M-modules/multimedia/camera/video-settings")) (defpackage :camera (:use :common-lisp :eql) diff --git a/examples/M-modules/multimedia/video-graphics-item/video-graphics-item.lisp b/examples/M-modules/multimedia/video-graphics-item/video-graphics-item.lisp index 2e0ec69..166fe77 100644 --- a/examples/M-modules/multimedia/video-graphics-item/video-graphics-item.lisp +++ b/examples/M-modules/multimedia/video-graphics-item/video-graphics-item.lisp @@ -2,7 +2,7 @@ (qrequire :multimedia) -(require :ui (in-home "examples/M-modules/multimedia/video-graphics-item/ui/ui-video-graphics-item")) +(require :ui (in-src "examples/M-modules/multimedia/video-graphics-item/ui/ui-video-graphics-item")) (defpackage :video-item (:nicknames :vi) diff --git a/examples/M-modules/multimedia/video-widget/video-widget.lisp b/examples/M-modules/multimedia/video-widget/video-widget.lisp index cfb3363..93c9192 100644 --- a/examples/M-modules/multimedia/video-widget/video-widget.lisp +++ b/examples/M-modules/multimedia/video-widget/video-widget.lisp @@ -2,7 +2,7 @@ (qrequire :multimedia) -(require :ui (in-home "examples/M-modules/multimedia/video-widget/ui/ui-video-widget")) +(require :ui (in-src "examples/M-modules/multimedia/video-widget/ui/ui-video-widget")) (defpackage :video-widget (:nicknames :vw) diff --git a/examples/M-modules/quick/quickwidget/quickwidget.lisp b/examples/M-modules/quick/quickwidget/quickwidget.lisp index 26d169e..6d55f2c 100644 --- a/examples/M-modules/quick/quickwidget/quickwidget.lisp +++ b/examples/M-modules/quick/quickwidget/quickwidget.lisp @@ -5,7 +5,7 @@ (qrequire :quick) (defun example-url (name) - (|fromLocalFile.QUrl| (in-home (x:cc "examples/M-modules/quick/quickwidget/qml/" name)))) + (|fromLocalFile.QUrl| (in-src (x:cc "examples/M-modules/quick/quickwidget/qml/" name)))) (defvar *mdi-area* (qnew "QMdiArea")) (defvar *quick-widget-1* (qnew "QQuickWidget(QUrl)" (example-url "example-1.qml"))) diff --git a/examples/M-modules/webkit/Examples-Browser/examples-browser.lisp b/examples/M-modules/webkit/Examples-Browser/examples-browser.lisp index e73f548..65fc667 100644 --- a/examples/M-modules/webkit/Examples-Browser/examples-browser.lisp +++ b/examples/M-modules/webkit/Examples-Browser/examples-browser.lisp @@ -103,7 +103,7 @@ *ini-file* ini-file) ;; QNetworkAccessManager does it all for us (asynchroneous, parallel download) (dolist (name file-names) - (download (|fromUserInput.QUrl| (in-home "examples/" name)) ; change this to a network location + (download (|fromUserInput.QUrl| (in-src "examples/" name)) ; change this to a network location id name)))))) diff --git a/examples/M-modules/webkit/dom.lisp b/examples/M-modules/webkit/dom.lisp index 9b65663..0b35464 100644 --- a/examples/M-modules/webkit/dom.lisp +++ b/examples/M-modules/webkit/dom.lisp @@ -4,7 +4,7 @@ (in-package :eql-user) -(require :ui (in-home "examples/M-modules/webkit/ui/ui-dom")) ; generated: "eql5 -quic dom.ui" +(require :ui (in-src "examples/M-modules/webkit/ui/ui-dom")) ; generated: "eql5 -quic dom.ui" (defun ini (&optional url) (ui:ini t) diff --git a/examples/X-extras/move-blocks/move-blocks.lisp b/examples/X-extras/move-blocks/move-blocks.lisp index b8f3185..5f82868 100644 --- a/examples/X-extras/move-blocks/move-blocks.lisp +++ b/examples/X-extras/move-blocks/move-blocks.lisp @@ -13,7 +13,7 @@ ;;; cpp plugin ;;; -(defvar *c++* (qload-c++ (in-home "examples/X-extras/move-blocks/cpp/easing_curve"))) +(defvar *c++* (qload-c++ (in-src "examples/X-extras/move-blocks/cpp/easing_curve"))) (defvar *custom-easing-curve* (! "easingCurve" (:qt *c++*))) (let ((sub 0) @@ -47,7 +47,7 @@ ;;; user interface ;;; -(defvar *main* (qload-ui (in-home "examples/X-extras/move-blocks/move-blocks.ui"))) +(defvar *main* (qload-ui (in-src "examples/X-extras/move-blocks/move-blocks.ui"))) (defvar-ui *main* *custom* diff --git a/examples/X-extras/qimage/qimage.lisp b/examples/X-extras/qimage/qimage.lisp index 32e2901..8c0cdeb 100644 --- a/examples/X-extras/qimage/qimage.lisp +++ b/examples/X-extras/qimage/qimage.lisp @@ -16,7 +16,7 @@ (in-package :image-manipulation) -(defvar *main* (qload-ui (in-home "examples/X-extras/qimage/qimage.ui"))) +(defvar *main* (qload-ui (in-src "examples/X-extras/qimage/qimage.ui"))) (defvar-ui *main* *display* @@ -35,13 +35,13 @@ *scale*) ;; C++ plugin -(defvar *c++* (qload-c++ (in-home "examples/X-extras/qimage/cpp/qimage"))) +(defvar *c++* (qload-c++ (in-src "examples/X-extras/qimage/cpp/qimage"))) (define-qt-wrappers *c++*) (defvar *file* (x:if-it (third (remove-if (lambda (arg) (x:starts-with "-" arg)) (|arguments.QCoreApplication|))) x:it - (in-home "examples/X-extras/qimage/vernazza.jpg"))) + (in-src "examples/X-extras/qimage/vernazza.jpg"))) (defvar *image* (qnew "QImage(QString)" *file*)) (defvar *color-image* *image*) diff --git a/examples/X-extras/screenshot/screenshot.lisp b/examples/X-extras/screenshot/screenshot.lisp index 57fdf39..84c31c5 100644 --- a/examples/X-extras/screenshot/screenshot.lisp +++ b/examples/X-extras/screenshot/screenshot.lisp @@ -2,7 +2,7 @@ (in-package :eql-user) -(defvar *pixmap* (qnew "QPixmap(QString)" (in-home "examples/X-extras/screenshot/camera.png"))) +(defvar *pixmap* (qnew "QPixmap(QString)" (in-src "examples/X-extras/screenshot/camera.png"))) (defvar *splash* (qnew "QSplashScreen(QPixmap,Qt::WindowFlags)" *pixmap* |Qt.WindowStaysOnTopHint| "font" (x:let-it (|font.QApplication|) diff --git a/src/eql.cpp b/src/eql.cpp index f3f8caa..8629f14 100644 --- a/src/eql.cpp +++ b/src/eql.cpp @@ -8,7 +8,7 @@ #include #include -const char EQL::version[] = "17.10.1"; // October 2017 +const char EQL::version[] = "19.2.1"; // February 2019 extern "C" void ini_EQL(cl_object); diff --git a/src/eql_exe.pro b/src/eql_exe.pro index 15198d0..05bfe08 100644 --- a/src/eql_exe.pro +++ b/src/eql_exe.pro @@ -22,3 +22,5 @@ osx { } SOURCES += main.cpp + +RESOURCES = eql_exe.qrc diff --git a/src/eql_exe.qrc b/src/eql_exe.qrc new file mode 100644 index 0000000..e6088be --- /dev/null +++ b/src/eql_exe.qrc @@ -0,0 +1,35 @@ + + + + ../doc/auto-doc.htm + ../doc/debug-dialog.png + ../doc/Debugging.htm + ../doc/Deploy.htm + ../doc/EQL.png + ../doc/EQL-Slime-Integration.htm + ../doc/index.html + ../doc/Notes.htm + ../doc/QtDesigner.htm + ../doc/QtLinguist.htm + ../doc/Slime.htm + ../doc/Slime-REPL-hook.htm + ../doc/style.css + + ../lib/ecl-readline.lisp + ../lib/gui.lisp + ../lib/gui.ui + ../lib/invokables.lisp + ../lib/properties.lisp + ../lib/properties.ui + ../lib/qselect.lisp + ../lib/quic.lisp + ../lib/restart-dialog.lisp + ../lib/thread-safe.lisp + + ../slime/.swank.lisp + ../slime/eql-start-swank.lisp + ../slime/README.txt + ../slime/repl-hook.lisp + + + diff --git a/src/lisp/define-all-wrappers-webengine.lisp b/src/lisp/define-all-wrappers-webengine.lisp index 4f987c2..5c47205 100644 --- a/src/lisp/define-all-wrappers-webengine.lisp +++ b/src/lisp/define-all-wrappers-webengine.lisp @@ -2,8 +2,8 @@ (eql:qrequire :webengine) -(load (in-home "helper/my-class-lists/webengine/n-names")) -(load (in-home "helper/my-class-lists/webengine/q-names")) +(load (in-src "helper/my-class-lists/webengine/n-names")) +(load (in-src "helper/my-class-lists/webengine/q-names")) (defvar *objects* (qobject-names)) (defvar *webengine-objects* (append *webengine-n-names* *webengine-q-names*)) @@ -122,7 +122,7 @@ ;; add only new function names (checking with 'grep') (dotimes (i 12) ; TODO: keep in sync! (when (zerop (|execute.QProcess| "grep" (list lisp-name - (in-home (format nil "src/lisp/all-wrappers-~D.lisp" (1+ i)))))) + (in-src (format nil "src/lisp/all-wrappers-~D.lisp" (1+ i)))))) (setf found t) (return))) (unless found diff --git a/src/lisp/ini.lisp b/src/lisp/ini.lisp index c1cad51..3e3ee36 100644 --- a/src/lisp/ini.lisp +++ b/src/lisp/ini.lisp @@ -158,13 +158,19 @@ (defun %windows-version () (qfun "QSysInfo" "windowsVersion")) -(let ((eql5-home #.(let ((path (namestring *default-pathname-defaults*))) ; hard-code EQL5 directory - (subseq path 0 (- (length path) 4))))) ; cut "src/" +(let ((eql5-home (namestring (merge-pathnames ".eql5/" (user-homedir-pathname))))) (defun set-home (path) (setf eql5-home path)) (defun in-home (&rest files) (apply 'concatenate 'string eql5-home files))) +(let ((eql5-src #.(let ((path (namestring *default-pathname-defaults*))) ; hard-code EQL5 directory + (subseq path 0 (- (length path) (length "src/")))))) + (defun set-src (path) + (setf eql5-src path)) + (defun in-src (&rest files) + (apply 'concatenate 'string eql5-src files))) + (defun qsignal (name) "args: (name) Needed in functions which expect a const char* Qt signal (not needed in qconnect)." diff --git a/src/lisp/package.lisp b/src/lisp/package.lisp index 5adb90d..e84cab3 100644 --- a/src/lisp/package.lisp +++ b/src/lisp/package.lisp @@ -12,6 +12,7 @@ #:defvar-ui #:ensure-qt-object #:in-home + #:in-src #:make-qimage #:new-qt-object #:qadd-event-filter diff --git a/src/main.cpp b/src/main.cpp index 0351387..bbe70b8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,6 +5,46 @@ #include #include +void ini() { + QString home(QDir::homePath() + "/.eql5/"); + if(!QFile::exists(home + "lib/gui.lisp")) { + QDir dir(QDir::homePath()); + dir.mkdir(".eql5"); + dir.setPath(home); + dir.mkdir("doc"); + dir.mkdir("lib"); + dir.mkdir("slime"); + QStringList files = QStringList() + << "doc/auto-doc.htm" + << "doc/debug-dialog.png" + << "doc/Debugging.htm" + << "doc/Deploy.htm" + << "doc/EQL.png" + << "doc/EQL-Slime-Integration.htm" + << "doc/index.html" + << "doc/Notes.htm" + << "doc/QtDesigner.htm" + << "doc/QtLinguist.htm" + << "doc/Slime.htm" + << "doc/Slime-REPL-hook.htm" + << "doc/style.css" + << "lib/ecl-readline.lisp" + << "lib/gui.lisp" + << "lib/gui.ui" + << "lib/invokables.lisp" + << "lib/properties.lisp" + << "lib/properties.ui" + << "lib/qselect.lisp" + << "lib/quic.lisp" + << "lib/restart-dialog.lisp" + << "lib/thread-safe.lisp" + << "slime/.swank.lisp" + << "slime/eql-start-swank.lisp" + << "slime/README.txt" + << "slime/repl-hook.lisp"; + Q_FOREACH(QString file, files) { + QFile::copy(":/" + file, home + file); }}} + int catch_all_qexec() { int ret = 0; CL_CATCH_ALL_BEGIN(ecl_process_env()) { @@ -22,6 +62,7 @@ int main(int argc, char** argv) { if(args.contains("-h") || (args.contains("--help"))) { std::cout << "Usage: eql5 [file] [-qtpl] [-qgui] [-quic file.ui [:ui-package] [:maximized]] [-slime] [-norc]" << std::endl; exit(0); } + ini(); QTextCodec* utf8 = QTextCodec::codecForName("UTF-8"); QTextCodec::setCodecForLocale(utf8);