From 761fc4aa90353cce129c449c17e62576ef4ae42e Mon Sep 17 00:00:00 2001 From: Fabien Freling Date: Sat, 11 May 2019 15:56:42 +0200 Subject: [PATCH] Switch to CMake for Qt build --- Makefile | 15 +++++++++------ src/core/dune | 8 ++++++-- src/core/oboy.ml | 9 +++++---- src/core/version.ml | 4 ---- src/qt/CMakeLists.txt | 24 ++++++++++++++++++++++++ src/qt/deployment.pri | 13 ------------- src/qt/main.cpp | 32 +++++++++++++++++++++++++++++--- src/qt/oboy.pro | 21 --------------------- 8 files changed, 73 insertions(+), 53 deletions(-) create mode 100644 src/qt/CMakeLists.txt delete mode 100644 src/qt/deployment.pri delete mode 100644 src/qt/oboy.pro diff --git a/Makefile b/Makefile index 6ddd0b4..28f5537 100644 --- a/Makefile +++ b/Makefile @@ -1,12 +1,15 @@ -all: - dune build src/lib/oboy.exe +BUILD:=_build + +# all: +# dune build src/core/oboy.exe core: - dune build src/core/oboy.a + dune build src/core/oboy.so + cp _build/default/src/core/oboy.so $(BUILD)/liboboycore.so -check: - ocamlbuild -use-ocamlfind -I src -lflag -g test/test_bit.byte -- - ocamlbuild -use-ocamlfind -I src -lflag -g test/test_interrupt.byte -- +# check: +# ocamlbuild -use-ocamlfind -I src -lflag -g test/test_bit.byte -- +# ocamlbuild -use-ocamlfind -I src -lflag -g test/test_interrupt.byte -- clean: dune clean diff --git a/src/core/dune b/src/core/dune index e5fac97..2226067 100644 --- a/src/core/dune +++ b/src/core/dune @@ -1,3 +1,7 @@ -(library +; oboy.ml as the top-level file +; building a shared library because we are relying on pthread and we cannot +; combine static pthread with dynamic libc +(executable (name oboy) - (libraries threads)) + (libraries threads) + (modes shared_object)) diff --git a/src/core/oboy.ml b/src/core/oboy.ml index efd1338..6fd7568 100644 --- a/src/core/oboy.ml +++ b/src/core/oboy.ml @@ -60,7 +60,7 @@ let power_up cartridge = run cpu mem screen -let main = +(** let main = if Array.length Sys.argv < 2 then begin prerr_endline "Please specify a ROM."; eprintf "Usage: %s path/to/rom\n" Sys.argv.(0); @@ -70,7 +70,8 @@ let main = let cartridge = Cartridge.read_cartridge Sys.argv.(1) in match cartridge with | None -> print_endline "Invalid ROM file." - | Some c -> power_up c + | Some c -> power_up c *) -(** let () = - main *) +let () = + Callback.register "name" Version.name; + Callback.register "version" Version.version; diff --git a/src/core/version.ml b/src/core/version.ml index f4a02c3..c0ad70e 100644 --- a/src/core/version.ml +++ b/src/core/version.ml @@ -1,6 +1,2 @@ let name () = "oboy" let version () = "1.0a" - -let () = - Callback.register "name" name; - Callback.register "version" version; diff --git a/src/qt/CMakeLists.txt b/src/qt/CMakeLists.txt new file mode 100644 index 0000000..1f8cca3 --- /dev/null +++ b/src/qt/CMakeLists.txt @@ -0,0 +1,24 @@ +cmake_minimum_required(VERSION 3.1) + +project(oboy LANGUAGES CXX) + +set(CMAKE_INCLUDE_CURRENT_DIR ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +find_package(Qt5 COMPONENTS Core Quick REQUIRED) + +add_executable(${PROJECT_NAME} "main.cpp" "qml.qrc") +target_compile_definitions(${PROJECT_NAME} PRIVATE $<$,$>:QT_QML_DEBUG>) +target_link_libraries(${PROJECT_NAME} PRIVATE Qt5::Core Qt5::Quick) + +# OCaml +set(OCAML_ROOT "/usr/lib/ocaml") +target_include_directories(${PROJECT_NAME} PRIVATE ${OCAML_ROOT}) +target_link_directories(${PROJECT_NAME} PRIVATE ${OCAML_ROOT} ${CMAKE_SOURCE_DIR}/../../_build) +target_link_libraries(${PROJECT_NAME} PRIVATE oboycore m dl asmrun) + +#target_link_options(${PROJECT_NAME} PRIVATE -L${CMAKE_SOURCE_DIR}/../../_build -loboy) +#target_link_options(${PROJECT_NAME} PRIVATE -L${OCAML_ROOT} -lm -ldl -lasmrun) diff --git a/src/qt/deployment.pri b/src/qt/deployment.pri deleted file mode 100644 index 265ce71..0000000 --- a/src/qt/deployment.pri +++ /dev/null @@ -1,13 +0,0 @@ -unix:!android { - isEmpty(target.path) { - qnx { - target.path = /tmp/$${TARGET}/bin - } else { - target.path = /opt/$${TARGET}/bin - } - export(target.path) - } - INSTALLS += target -} - -export(INSTALLS) diff --git a/src/qt/main.cpp b/src/qt/main.cpp index 023fb6d..0c060ec 100644 --- a/src/qt/main.cpp +++ b/src/qt/main.cpp @@ -1,5 +1,7 @@ -#include +#include #include +#include +#include #include #include @@ -9,14 +11,38 @@ void load_caml(char *argv[]) caml_main(argv); } +void print_closure(const std::string &closure_name) { + value * closure_f = caml_named_value(closure_name.c_str()); + if (closure_f == nullptr) { + std::cerr << "ERROR: Unreachable closure " << closure_name << "\n"; + return; + } + + const char *str = String_val(caml_callback(*closure_f, Val_unit)); + std::cout << closure_name << ": " << str << "\n"; +} + + int main(int argc, char *argv[]) { - QApplication app(argc, argv); + QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + QGuiApplication app(argc, argv); QQmlApplicationEngine engine; - engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); + const QUrl url(QStringLiteral("qrc:/main.qml")); + QObject::connect(&engine, &QQmlApplicationEngine::objectCreated, + &app, [url](QObject *obj, const QUrl &objUrl) { + if (!obj && url == objUrl) + QCoreApplication::exit(-1); + }, Qt::QueuedConnection); + engine.load(url); load_caml(argv); + std::cout << "test std::cout" << "\n"; + std::cerr << "test std::cerr" << "\n"; + print_closure("name"); + print_closure("version"); + return app.exec(); } diff --git a/src/qt/oboy.pro b/src/qt/oboy.pro deleted file mode 100644 index b0433a6..0000000 --- a/src/qt/oboy.pro +++ /dev/null @@ -1,21 +0,0 @@ -TEMPLATE = app - -QT += qml quick widgets - -CONFIG += c++11 - -SOURCES += main.cpp - -# `ocamlc -where` = /usr/lib/ocaml -INCLUDEPATH += /usr/lib/ocaml - -LIBS += -L/home/fabs/Code/oboy/_build/default/src/core -loboy # TODO: fix path to OCaml library -LIBS += -L/usr/lib/ocaml -lm -ldl -lasmrun # /usr/lib/ocaml/Makefile.config | grep NATIVECCLIBS - -RESOURCES += qml.qrc - -# Additional import path used to resolve QML modules in Qt Creator's code model -QML_IMPORT_PATH = - -# Default rules for deployment. -include(deployment.pri)