From 572c0ab468ea20ec81ba9cb7a551d885eea71754 Mon Sep 17 00:00:00 2001 From: Mike Nolan Date: Wed, 25 Feb 2026 23:36:42 -0600 Subject: [PATCH] Add single file runtime binaries --- .gitea/workflows/tag.yaml | 1 + .gitignore | 5 +- CMakeLists.txt | 88 ++++-- Packaging/Linux/PKGBUILD | 4 +- Packaging/Linux/build-slim.sh | 24 ++ Packaging/Linux/build-slims.sh | 8 + Packaging/Linux/build-tars.sh | 4 +- Packaging/Linux/build-ubuntu-jammy.sh | 4 +- Packaging/Linux/build-ubuntu-plucky.sh | 4 +- Packaging/Windows/build.sh | 14 +- changelog.md | 2 +- include/CrossLang.hpp | 12 +- src/crosslangvm.cpp | 72 ----- src/{ => program_lib}/crossarchivecreate.cpp | 30 +- src/{ => program_lib}/crossarchiveextract.cpp | 20 +- .../crossdump.cpp} | 70 ++--- src/{ => program_lib}/crosslang.cpp | 44 ++- src/program_lib/crosslangcompiler.cpp | 290 ++++++++++++++++++ .../crosslanginterperter.cpp | 55 ++-- src/program_lib/crosslangvm.cpp | 61 ++++ src/programs/crossarchivecreate.cpp | 9 + src/programs/crossarchiveextract.cpp | 9 + src/programs/crosslang.cpp | 25 ++ src/programs/crosslangcompiler.cpp | 23 ++ src/programs/crosslangdump.cpp | 28 ++ src/programs/crosslanginterperter.cpp | 29 ++ src/programs/crosslangvm.cpp | 29 ++ src/programs/slim.cpp | 164 ++++++++++ src/runtime_methods/vm.cpp | 5 + 29 files changed, 898 insertions(+), 235 deletions(-) create mode 100644 Packaging/Linux/build-slim.sh create mode 100644 Packaging/Linux/build-slims.sh delete mode 100644 src/crosslangvm.cpp rename src/{ => program_lib}/crossarchivecreate.cpp (79%) rename src/{ => program_lib}/crossarchiveextract.cpp (57%) rename src/{crosslangdump.cpp => program_lib/crossdump.cpp} (82%) rename src/{ => program_lib}/crosslang.cpp (80%) create mode 100644 src/program_lib/crosslangcompiler.cpp rename src/{ => program_lib}/crosslanginterperter.cpp (69%) create mode 100644 src/program_lib/crosslangvm.cpp create mode 100644 src/programs/crossarchivecreate.cpp create mode 100644 src/programs/crossarchiveextract.cpp create mode 100644 src/programs/crosslang.cpp create mode 100644 src/programs/crosslangcompiler.cpp create mode 100644 src/programs/crosslangdump.cpp create mode 100644 src/programs/crosslanginterperter.cpp create mode 100644 src/programs/crosslangvm.cpp create mode 100644 src/programs/slim.cpp diff --git a/.gitea/workflows/tag.yaml b/.gitea/workflows/tag.yaml index f9bbdde..7b8bddb 100644 --- a/.gitea/workflows/tag.yaml +++ b/.gitea/workflows/tag.yaml @@ -56,6 +56,7 @@ jobs: apt install -y pkg-config git gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64 gcc-mingw-w64-i686 g++-mingw-w64-i686 nsis bash build-ubuntu-plucky.sh bash push-ubuntu-plucky.sh + bash build-slims.sh working-directory: ./Packaging/Linux - name: Build for windows diff --git a/.gitignore b/.gitignore index 0261ce8..e0cc534 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,7 @@ bin *.a *.exe build-x86 -build-x64 \ No newline at end of file +build-x64 +build-x86-slim +build-x64-slim +crosslang-*-temp \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 550d3c9..7fccb46 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,6 +25,7 @@ option(CROSSLANG_FETCHCONTENT "Use fetchcontent" ON) option(CROSSLANG_ENABLE_CONFIG_ENVVAR "Allow setting config directory via the environment variable CROSSLANG_CONFIG" ON) option(CROSSLANG_ENABLE_FFI "Enable libffi" OFF) option(CROSSLANG_ENABLE_RPATH "Enable RPATH" ON) +option(CROSSLANG_ENABLE_SUPERSLIM "Enable crosslang superslim, one binary" OFF) option(CROSSLANG_CUSTOM_CONSOLE "Enable custom Console" OFF) @@ -92,6 +93,10 @@ if(CROSSLANG_ENABLE_FFI AND CROSSLANG_ENABLE_SHARED) target_compile_definitions(${CROSSLANG_TARGET_NAME} PUBLIC CROSSLANG_ENABLE_FFI) target_link_libraries(${CROSSLANG_TARGET_NAME} PUBLIC PkgConfig::LIBFFI) +endif() +if(CROSSLANG_ENABLE_SUPERSLIM) + +target_compile_definitions(${CROSSLANG_TARGET_NAME} PUBLIC CROSSLANG_ENABLE_SUPERSLIM) endif() if(CROSSLANG_ENABLE_TIME) target_compile_definitions(${CROSSLANG_TARGET_NAME} PUBLIC CROSSLANG_ENABLE_TIME) @@ -139,7 +144,8 @@ target_include_directories(${CROSSLANG_TARGET_NAME} ) endfunction() - +configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/CrossLangVersion.h.in "${CMAKE_CURRENT_BINARY_DIR}/include/CrossLangVersion.h" +INSTALL_DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/CrossLangVersion.h) list(APPEND CROSSLANG_SOURCE src/vm/bc/add.cpp src/vm/bc/sub.cpp @@ -198,6 +204,13 @@ src/vm/vm.cpp src/vm/exception.cpp src/archive.cpp src/markedtobject.cpp +src/program_lib/crossarchivecreate.cpp +src/program_lib/crossarchiveextract.cpp +src/program_lib/crossdump.cpp +src/program_lib/crosslang.cpp +src/program_lib/crosslangcompiler.cpp +src/program_lib/crosslanginterperter.cpp +src/program_lib/crosslangvm.cpp ) if(CROSSLANG_OFFLINE_SHELL_PACKAGE STREQUAL "") @@ -244,7 +257,28 @@ list(APPEND TessesCrossLangLibs crosslang_shared) endif() +if(CROSSLANG_ENABLE_SUPERSLIM) +add_executable(crosslang WIN32 src/programs/slim.cpp ${CROSSLANG_WIN32_EXE_SRC}) +if(CROSSLANG_ENABLE_STATIC) + +target_link_libraries(crosslang PUBLIC crosslang_static) +elseif(CROSSLANG_ENABLE_SHARED) +target_link_libraries(crosslang PUBLIC crosslang_shared) +endif() + +if(CROSSLANG_ENABLE_SHARED) + +install(TARGETS crosslang_shared + EXPORT TessesCrossLangTargets + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} +) + +endif() + +install(TARGETS crosslang DESTINATION "${CMAKE_INSTALL_BINDIR}") +else() if(CROSSLANG_INSTALL_DEVELOPMENT) install(TARGETS ${TessesCrossLangLibs} @@ -265,12 +299,12 @@ install(EXPORT TessesCrossLangTargets configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/TessesCrossLangConfig.cmake" INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/TessesCrossLang) -configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/CrossLangVersion.h.in "${CMAKE_CURRENT_BINARY_DIR}/include/CrossLangVersion.h" -INSTALL_DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/CrossLangVersion.h) + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/TessesCrossLangConfig.cmake" DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/TessesCrossLang) else() + if(CROSSLANG_ENABLE_SHARED) install(TARGETS crosslang_shared EXPORT TessesCrossLangTargets @@ -298,13 +332,13 @@ add_executable(crossmerge src/crossmergecli.cpp ${CROSSLANG_WIN32_EXE_SRC}) add_executable(crossasm src/crossasmcli.cpp ${CROSSLANG_WIN32_EXE_SRC}) add_executable(crossdisasm src/crossdisasmcli.cpp ${CROSSLANG_WIN32_EXE_SRC}) -add_executable(crossc src/crosslangcompiler.cpp ${CROSSLANG_WIN32_EXE_SRC}) -add_executable(crossvm src/crosslangvm.cpp ${CROSSLANG_WIN32_EXE_SRC}) -add_executable(crossint src/crosslanginterperter.cpp ${CROSSLANG_WIN32_EXE_SRC}) -add_executable(crossdump src/crosslangdump.cpp ${CROSSLANG_WIN32_EXE_SRC}) -add_executable(crosslang src/crosslang.cpp ${CROSSLANG_WIN32_EXE_SRC}) -add_executable(crossarchiveextract src/crossarchiveextract.cpp ${CROSSLANG_WIN32_EXE_SRC}) -add_executable(crossarchivecreate src/crossarchivecreate.cpp ${CROSSLANG_WIN32_EXE_SRC}) +add_executable(crossc src/programs/crosslangcompiler.cpp ${CROSSLANG_WIN32_EXE_SRC}) +add_executable(crossvm src/programs/crosslangvm.cpp ${CROSSLANG_WIN32_EXE_SRC}) +add_executable(crossint src/programs/crosslanginterperter.cpp ${CROSSLANG_WIN32_EXE_SRC}) +add_executable(crossdump src/programs/crosslangdump.cpp ${CROSSLANG_WIN32_EXE_SRC}) +add_executable(crosslang src/programs/crosslang.cpp ${CROSSLANG_WIN32_EXE_SRC}) +add_executable(crossarchiveextract src/programs/crossarchiveextract.cpp ${CROSSLANG_WIN32_EXE_SRC}) +add_executable(crossarchivecreate src/programs/crossarchivecreate.cpp ${CROSSLANG_WIN32_EXE_SRC}) if(NOT WIN32) add_executable(crossthumbnailer src/crossthumbnailer.cpp ${CROSSLANG_WIN32_EXE_SRC}) endif() @@ -324,13 +358,13 @@ target_link_libraries(crossthumbnailer PUBLIC crosslang_shared) endif() elseif(CROSSLANG_ENABLE_STATIC) -add_executable(crossc src/crosslangcompiler.cpp ${CROSSLANG_WIN32_EXE_SRC}) -add_executable(crossvm src/crosslangvm.cpp ${CROSSLANG_WIN32_EXE_SRC}) -add_executable(crossint src/crosslanginterperter.cpp ${CROSSLANG_WIN32_EXE_SRC}) -add_executable(crossdump src/crosslangdump.cpp ${CROSSLANG_WIN32_EXE_SRC}) -add_executable(crosslang src/crosslang.cpp ${CROSSLANG_WIN32_EXE_SRC}) -add_executable(crossarchiveextract src/crossarchiveextract.cpp ${CROSSLANG_WIN32_EXE_SRC}) -add_executable(crossarchivecreate src/crossarchivecreate.cpp ${CROSSLANG_WIN32_EXE_SRC}) +add_executable(crossc src/programs/crosslangcompiler.cpp ${CROSSLANG_WIN32_EXE_SRC}) +add_executable(crossvm src/programs/crosslangvm.cpp ${CROSSLANG_WIN32_EXE_SRC}) +add_executable(crossint src/programs/crosslanginterperter.cpp ${CROSSLANG_WIN32_EXE_SRC}) +add_executable(crossdump src/programs/crosslangdump.cpp ${CROSSLANG_WIN32_EXE_SRC}) +add_executable(crosslang src/programs/crosslang.cpp ${CROSSLANG_WIN32_EXE_SRC}) +add_executable(crossarchiveextract src/programs/crossarchiveextract.cpp ${CROSSLANG_WIN32_EXE_SRC}) +add_executable(crossarchivecreate src/programs/crossarchivecreate.cpp ${CROSSLANG_WIN32_EXE_SRC}) add_executable(crossasm src/crossasmcli.cpp ${CROSSLANG_WIN32_EXE_SRC}) add_executable(crossdisasm src/crossdisasmcli.cpp ${CROSSLANG_WIN32_EXE_SRC}) add_executable(crossmerge src/crossmergecli.cpp ${CROSSLANG_WIN32_EXE_SRC}) @@ -353,13 +387,13 @@ if(NOT WIN32) target_link_libraries(crossthumbnailer PUBLIC crosslang_static) endif() else() -add_executable(crossc src/crosslangcompiler.cpp ${CROSSLANG_SOURCE} ${CROSSLANG_WIN32_EXE_SRC}) -add_executable(crossvm src/crosslangvm.cpp ${CROSSLANG_SOURCE} ${CROSSLANG_WIN32_EXE_SRC}) -add_executable(crossint src/crosslanginterperter.cpp ${CROSSLANG_SOURCE} ${CROSSLANG_WIN32_EXE_SRC}) -add_executable(crossdump src/crosslangdump.cpp ${CROSSLANG_SOURCE} ${CROSSLANG_WIN32_EXE_SRC}) -add_executable(crosslang src/crosslang.cpp ${CROSSLANG_SOURCE} ${CROSSLANG_WIN32_EXE_SRC}) -add_executable(crossarchiveextract src/crossarchiveextract.cpp ${CROSSLANG_SOURCE} ${CROSSLANG_WIN32_EXE_SRC}) -add_executable(crossarchivecreate src/crossarchivecreate.cpp ${CROSSLANG_SOURCE} ${CROSSLANG_WIN32_EXE_SRC}) +add_executable(crossc src/programs/crosslangcompiler.cpp ${CROSSLANG_SOURCE} ${CROSSLANG_WIN32_EXE_SRC}) +add_executable(crossvm src/programs/crosslangvm.cpp ${CROSSLANG_SOURCE} ${CROSSLANG_WIN32_EXE_SRC}) +add_executable(crossint src/programs/crosslanginterperter.cpp ${CROSSLANG_SOURCE} ${CROSSLANG_WIN32_EXE_SRC}) +add_executable(crossdump src/programs/crosslangdump.cpp ${CROSSLANG_SOURCE} ${CROSSLANG_WIN32_EXE_SRC}) +add_executable(crosslang src/programs/crosslang.cpp ${CROSSLANG_SOURCE} ${CROSSLANG_WIN32_EXE_SRC}) +add_executable(crossarchiveextract src/programs/crossarchiveextract.cpp ${CROSSLANG_SOURCE} ${CROSSLANG_WIN32_EXE_SRC}) +add_executable(crossarchivecreate src/programs/crossarchivecreate.cpp ${CROSSLANG_SOURCE} ${CROSSLANG_WIN32_EXE_SRC}) add_executable(crossasm src/crossasmcli.cpp ${CROSSLANG_SOURCE} ${CROSSLANG_WIN32_EXE_SRC}) add_executable(crossdisasm src/crossdisasmcli.cpp ${CROSSLANG_SOURCE} ${CROSSLANG_WIN32_EXE_SRC}) add_executable(crossmerge src/crossmergecli.cpp ${CROSSLANG_SOURCE} ${CROSSLANG_WIN32_EXE_SRC}) @@ -436,6 +470,7 @@ install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/crosslang.thumbnailer" DESTINATION ${CMAKE_INSTALL_PREFIX}/share/thumbnailers) endif() endif() +endif() include(InstallRequiredSystemLibraries) set(CPACK_PACKAGE_CONTACT "Mike Nolan ") set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.md") @@ -475,5 +510,6 @@ set(CPACK_NSIS_CREATE_ICONS_EXTRA "CreateShortCut '$SMPROGRAMS\\\\$STARTMENU_FOL include(CPack) - -add_subdirectory(pkgconfig) \ No newline at end of file +if(CROSSLANG_INSTALL_DEVELOPMENT) +add_subdirectory(pkgconfig) +endif() \ No newline at end of file diff --git a/Packaging/Linux/PKGBUILD b/Packaging/Linux/PKGBUILD index 5a3c798..f1d3928 100644 --- a/Packaging/Linux/PKGBUILD +++ b/Packaging/Linux/PKGBUILD @@ -32,9 +32,9 @@ build() { mkdir build if [[ -z "$CMAKE_TOOLCHAIN" ]]; then - cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/usr -DCROSSLANG_FETCHCONTENT=OFF -DCMAKE_BUILD_TYPE=RelWithDebInfo + cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/usr -DCROSSLANG_FETCHCONTENT=OFF -DCMAKE_BUILD_TYPE=Release else - cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/usr -DCROSSLANG_FETCHCONTENT=OFF -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_TOOLCHAIN_FILE="$CMAKE_TOOLCHAIN" + cmake -S . -B build -DCMAKE_INSTALL_PREFIX=/usr -DCROSSLANG_FETCHCONTENT=OFF -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE="$CMAKE_TOOLCHAIN" fi cd build diff --git a/Packaging/Linux/build-slim.sh b/Packaging/Linux/build-slim.sh new file mode 100644 index 0000000..6ad1195 --- /dev/null +++ b/Packaging/Linux/build-slim.sh @@ -0,0 +1,24 @@ +#!/bin/bash +mkdir -p ../../artifacts +mkdir -p crosslang-$TOOLCHAIN\-temp +cd crosslang-$TOOLCHAIN\-temp +export DIR="$PWD" +echo "set(CMAKE_C_COMPILER \"$DIR/$TOOLCHAIN\-cross/bin/$TOOLCHAIN\-gcc\")" > toolchain.cmake +echo "set(CMAKE_CXX_COMPILER \"$DIR/$TOOLCHAIN\-cross/bin/$TOOLCHAIN\-g++\")" >> toolchain.cmake +echo "set(CMAKE_C_FLAGS \"-static-libgcc -static-libstdc++ -static\")" >> toolchain.cmake +echo "set(CMAKE_CXX_FLAGS \"-static-libgcc -static-libstdc++ -static\")" >> toolchain.cmake +echo "set(CMAKE_EXE_LINKER_FLAGS \"-static-libgcc -static-libstdc++ -static\")" >> toolchain.cmake +#echo "set(CMAKE_SYSROOT \"$DIR/sysroot\")" >> toolchain.cmake +echo "set(CMAKE_SYSTEM_NAME Linux)" >> toolchain.cmake +echo "set(CMAKE_SYSTEM_PROCESSOR $ARCH)" >> toolchain.cmake +echo "set(CMAKE_POSITION_INDEPENDENT_CODE ON)" >> toolchain.cmake +wget https://downloads.tesses.net/cache/compilers/$TOOLCHAIN\-cross.tgz +#wget https://downloads.tesses.net/cache/libraries/source/mbedtls-3.6.3.1.tar.bz2 +#wget -O tf.tar.gz "https://onedev.site.tesses.net/~downloads/projects/1/archives?revision=master&format=tgz" +tar xvzf $TOOLCHAIN\-cross.tgz +mkdir build +cd build +cmake -S ../../../../ -B . -DTESSESFRAMEWORK_ENABLE_SHARED=OFF -DTESSESFRAMEWORK_FETCHCONTENT=ON -DTESSESFRAMEWORK_ENABLE_STATIC=ON -DCMAKE_TOOLCHAIN_FILE="$DIR/toolchain.cmake" -DCROSSLANG_ENABLE_SUPERSLIM=ON -DCMAKE_BUILD_TYPE=Release +make -j`nproc` +cp crosslang ../../../../artifacts/crosslang-slim-$TOOLCHAIN +rm -rf "$DIR" diff --git a/Packaging/Linux/build-slims.sh b/Packaging/Linux/build-slims.sh new file mode 100644 index 0000000..e5ff137 --- /dev/null +++ b/Packaging/Linux/build-slims.sh @@ -0,0 +1,8 @@ +#ARCH="i686" TOOLCHAIN="i686-linux-musl" bash build-slim.sh +#ARCH="x86_64" TOOLCHAIN="x86_64-linux-musl" bash build-slim.sh +#ARCH="powerpc" TOOLCHAIN="powerpc-linux-musl" bash build-slim.sh +#ARCH="powerpc" TOOLCHAIN="powerpc64-linux-musl" bash build-slim.sh +#ARCH="aarch64" TOOLCHAIN="aarch64-linux-musl" bash build-slim.sh +#ARCH="armv7a" TOOLCHAIN="armv7l-linux-musleabihf" bash build-slim.sh +ARCH="riscv32" TOOLCHAIN="riscv32-linux-musl" bash build-slim.sh +ARCH="riscv64" TOOLCHAIN="riscv64-linux-musl" bash build-slim.sh \ No newline at end of file diff --git a/Packaging/Linux/build-tars.sh b/Packaging/Linux/build-tars.sh index a983575..550bfa9 100644 --- a/Packaging/Linux/build-tars.sh +++ b/Packaging/Linux/build-tars.sh @@ -1,7 +1,7 @@ #!/bin/bash mkdir build-x86_64-tar cd build-x86_64-tar -cmake -S ../../.. -B . -DTESSESFRAMEWORK_ENABLE_SHARED=ON -DTESSESFRAMEWORK_ENABLE_STATIC=OFF -DTESSESFRAMEWORK_FETCHCONTENT=ON +cmake -S ../../.. -B . -DTESSESFRAMEWORK_ENABLE_SHARED=ON -DTESSESFRAMEWORK_ENABLE_STATIC=OFF -DTESSESFRAMEWORK_FETCHCONTENT=ON -DCMAKE_BUILD_TYPE=Release make -j`nproc` make install DESTDIR=./crosslang-x86_64 mkdir -p crosslang-x86_64/share/Tesses/CrossLang @@ -12,7 +12,7 @@ cd .. foreign() { mkdir build-$1\-tar cd build-$1\-tar -cmake -S ../../.. -B . -DTESSESFRAMEWORK_ENABLE_SHARED=ON -DTESSESFRAMEWORK_ENABLE_STATIC=OFF -DTESSESFRAMEWORK_FETCHCONTENT=ON -DCMAKE_TOOLCHAIN_FILE=/opt/toolchains/$1\.cmake +cmake -S ../../.. -B . -DTESSESFRAMEWORK_ENABLE_SHARED=ON -DTESSESFRAMEWORK_ENABLE_STATIC=OFF -DTESSESFRAMEWORK_FETCHCONTENT=ON -DCMAKE_TOOLCHAIN_FILE=/opt/toolchains/$1\.cmake -DCMAKE_RELEASE_TYPE=Release make -j`nproc` make install DESTDIR=./crosslang-$1 mkdir -p crosslang-$1\/share/Tesses/CrossLang diff --git a/Packaging/Linux/build-ubuntu-jammy.sh b/Packaging/Linux/build-ubuntu-jammy.sh index b9e262f..c0de499 100644 --- a/Packaging/Linux/build-ubuntu-jammy.sh +++ b/Packaging/Linux/build-ubuntu-jammy.sh @@ -6,7 +6,7 @@ cd build/jammy wget -O Tesses.CrossLang.ShellPackage-1.0.0.0-prod.crvm https://downloads.tesses.net/ShellPackage.crvm mkdir build-amd64 apt install -y tessesframework -cmake -S ../../../../ -B build-amd64 -DCMAKE_INSTALL_PREFIX=/usr -DCROSSLANG_FETCHCONTENT=OFF +cmake -S ../../../../ -B build-amd64 -DCMAKE_INSTALL_PREFIX=/usr -DCROSSLANG_FETCHCONTENT=OFF -DCMAKE_BUILD_TYPE=Release cd build-amd64 make -j`nproc` make install DESTDIR=../crosslang_$DEB_VERSION\_amd64 @@ -21,7 +21,7 @@ dpkg-deb --build crosslang_$DEB_VERSION\_amd64 foreign() { apt install -y tessesframework:$1 mkdir build-$1 - cmake -S ../../../../ -B build-$1 -DCMAKE_INSTALL_PREFIX=/usr -DCROSSLANG_FETCHCONTENT=OFF -DCMAKE_TOOLCHAIN_FILE=/opt/toolchains/$1\.cmake + cmake -S ../../../../ -B build-$1 -DCMAKE_INSTALL_PREFIX=/usr -DCROSSLANG_FETCHCONTENT=OFF -DCMAKE_TOOLCHAIN_FILE=/opt/toolchains/$1\.cmake -DCMAKE_BUILD_TYPE=Release cd build-$1 make -j`nproc` make install DESTDIR=../crosslang_$DEB_VERSION\_$1 diff --git a/Packaging/Linux/build-ubuntu-plucky.sh b/Packaging/Linux/build-ubuntu-plucky.sh index 49f0f6f..0a68cdb 100644 --- a/Packaging/Linux/build-ubuntu-plucky.sh +++ b/Packaging/Linux/build-ubuntu-plucky.sh @@ -5,7 +5,7 @@ cd build/plucky wget -O Tesses.CrossLang.ShellPackage-1.0.0.0-prod.crvm https://downloads.tesses.net/ShellPackage.crvm mkdir build-amd64 apt install -y tessesframework -cmake -S ../../../../ -B build-amd64 -DCMAKE_INSTALL_PREFIX=/usr -DCROSSLANG_FETCHCONTENT=OFF +cmake -S ../../../../ -B build-amd64 -DCMAKE_INSTALL_PREFIX=/usr -DCROSSLANG_FETCHCONTENT=OFF -DCMAKE_BUILD_TYPE=Release cd build-amd64 make -j`nproc` make install DESTDIR=../crosslang_$DEB_VERSION\_amd64 @@ -20,7 +20,7 @@ dpkg-deb --build crosslang_$DEB_VERSION\_amd64 foreign() { apt install -y tessesframework:$1 mkdir build-$1 - cmake -S ../../../../ -B build-$1 -DCMAKE_INSTALL_PREFIX=/usr -DCROSSLANG_FETCHCONTENT=OFF -DCMAKE_TOOLCHAIN_FILE=/opt/toolchains/$1\.cmake + cmake -S ../../../../ -B build-$1 -DCMAKE_INSTALL_PREFIX=/usr -DCROSSLANG_FETCHCONTENT=OFF -DCMAKE_TOOLCHAIN_FILE=/opt/toolchains/$1\.cmake -DCMAKE_BUILD_TYPE=Release cd build-$1 make -j`nproc` make install DESTDIR=../crosslang_$DEB_VERSION\_$1 diff --git a/Packaging/Windows/build.sh b/Packaging/Windows/build.sh index 6996ed5..03df8a6 100644 --- a/Packaging/Windows/build.sh +++ b/Packaging/Windows/build.sh @@ -1,5 +1,5 @@ #!/bin/bash -cmake -S ../.. -B build-x86 -DCMAKE_TOOLCHAIN_FILE=`pwd`/WindowsToolchains/x86.cmake -DTESSESFRAMEWORK_FETCHCONTENT=ON -DTESSESFRAMEWORK_ENABLE_APPS=OFF -DTESSESFRAMEWORK_ENABLE_EXAMPLES=OFF -DTESSESFRAMEWORK_ENABLE_STATIC=ON -DTESSESFRAMEWORK_ENABLE_SHARED=OFF -DCMAKE_INSTALL_PREFIX=tmp-x86 +cmake -S ../.. -B build-x86 -DCMAKE_TOOLCHAIN_FILE=`pwd`/WindowsToolchains/x86.cmake -DTESSESFRAMEWORK_FETCHCONTENT=ON -DTESSESFRAMEWORK_ENABLE_APPS=OFF -DTESSESFRAMEWORK_ENABLE_EXAMPLES=OFF -DTESSESFRAMEWORK_ENABLE_STATIC=ON -DTESSESFRAMEWORK_ENABLE_SHARED=OFF -DCMAKE_INSTALL_PREFIX=tmp-x86 -DCMAKE_BUILD_TYPE=Release cd build-x86 make -j`nproc` cpack -G NSIS @@ -7,10 +7,20 @@ cpack -G ZIP mv TessesCrossLang-*-win32.exe ../../../artifacts/crosslang-win32.exe mv TessesCrossLang-*-win32.zip ../../../artifacts/crosslang-win32.zip cd .. -cmake -S ../.. -B build-x64 -DCMAKE_TOOLCHAIN_FILE=`pwd`/WindowsToolchains/x64.cmake -DTESSESFRAMEWORK_FETCHCONTENT=ON -DTESSESFRAMEWORK_ENABLE_APPS=OFF -DTESSESFRAMEWORK_ENABLE_EXAMPLES=OFF -DTESSESFRAMEWORK_ENABLE_STATIC=ON -DTESSESFRAMEWORK_ENABLE_SHARED=OFF -DCMAKE_INSTALL_PREFIX=tmp-x64 +cmake -S ../.. -B build-x64 -DCMAKE_TOOLCHAIN_FILE=`pwd`/WindowsToolchains/x64.cmake -DTESSESFRAMEWORK_FETCHCONTENT=ON -DTESSESFRAMEWORK_ENABLE_APPS=OFF -DTESSESFRAMEWORK_ENABLE_EXAMPLES=OFF -DTESSESFRAMEWORK_ENABLE_STATIC=ON -DTESSESFRAMEWORK_ENABLE_SHARED=OFF -DCMAKE_INSTALL_PREFIX=tmp-x64 -DCMAKE_BUILD_TYPE=Release cd build-x64 make -j`nproc` cpack -G NSIS cpack -G ZIP mv TessesCrossLang-*-win64.exe ../../../artifacts/crosslang-win64.exe mv TessesCrossLang-*-win64.zip ../../../artifacts/crosslang-win64.zip + +cmake -S ../.. -B build-x86-slim -DCMAKE_TOOLCHAIN_FILE=`pwd`/WindowsToolchains/x86.cmake -DTESSESFRAMEWORK_FETCHCONTENT=ON -DTESSESFRAMEWORK_ENABLE_APPS=OFF -DTESSESFRAMEWORK_ENABLE_EXAMPLES=OFF -DTESSESFRAMEWORK_ENABLE_STATIC=ON -DTESSESFRAMEWORK_ENABLE_SHARED=OFF -DCMAKE_INSTALL_PREFIX=tmp-x86 -DCMAKE_BUILD_TYPE=Release -DCROSSLANG_ENABLE_SUPERSLIM=ON +cd build-x86-slim +make -j`nproc` +mv crosslang.exe ../../../artifacts/crosslang-slim-win32.exe +cd .. +cmake -S ../.. -B build-x64-slim -DCMAKE_TOOLCHAIN_FILE=`pwd`/WindowsToolchains/x64.cmake -DTESSESFRAMEWORK_FETCHCONTENT=ON -DTESSESFRAMEWORK_ENABLE_APPS=OFF -DTESSESFRAMEWORK_ENABLE_EXAMPLES=OFF -DTESSESFRAMEWORK_ENABLE_STATIC=ON -DTESSESFRAMEWORK_ENABLE_SHARED=OFF -DCMAKE_INSTALL_PREFIX=tmp-x64 -DCMAKE_BUILD_TYPE=Release -DCROSSLANG_ENABLE_SUPERSLIM=ON +cd build-x64-slim +make -j`nproc` +mv crosslang.exe ../../../artifacts/crosslang-slim-win64.exe \ No newline at end of file diff --git a/changelog.md b/changelog.md index ebd8e31..e92ab97 100644 --- a/changelog.md +++ b/changelog.md @@ -1,7 +1,7 @@ # Changelog ## 0.0.2 -Add uuids and bytestreams +Add uuids, bytestreams and single file runtime binaries ## 0.0.1 Start versioning \ No newline at end of file diff --git a/include/CrossLang.hpp b/include/CrossLang.hpp index 6029cb3..4aea2da 100644 --- a/include/CrossLang.hpp +++ b/include/CrossLang.hpp @@ -2615,5 +2615,15 @@ class GC { Tesses::Framework::Filesystem::VFSPath SystemToVFSPath(std::string path); }; - + namespace Programs { + int64_t CrossArchiveCreate(std::vector& argv); + int64_t CrossArchiveExtract(std::vector& argv); + TObject CrossLangInterperter(GCList& ls,TRootEnvironment* env,std::vector& argv); + TObject CrossLangShell(GCList& ls, std::vector& argv); + + TObject CrossLangVM(GCList& ls,TRootEnvironment* env, std::vector& argv); + + void CrossLangDump(std::shared_ptr strm); + void CrossLangCompiler(std::vector& argv); + } }; diff --git a/src/crosslangvm.cpp b/src/crosslangvm.cpp deleted file mode 100644 index 1071f3f..0000000 --- a/src/crosslangvm.cpp +++ /dev/null @@ -1,72 +0,0 @@ -#include "CrossLang.hpp" -using namespace Tesses::Framework; -using namespace Tesses::CrossLang; -int main(int argc, char** argv) -{ - TF_InitWithConsole(); - - if(argc < 2) - { - printf("USAGE: %s \n",argv[0]); - return 1; - } - if(argc > 0) - TF_AllowPortable(argv[0]); - - GC gc; - gc.Start(); - GCList ls(gc); - TRootEnvironment* env = TRootEnvironment::Create(ls, TDictionary::Create(ls)); - - TStd::RegisterStd(&gc,env); - env->LoadFileWithDependencies(&gc, Tesses::Framework::Filesystem::LocalFS, Tesses::Framework::Filesystem::LocalFS->SystemToVFSPath(argv[1])); - - if(env->HasVariable("WebAppMain")) - { - Args args(argc, argv); - int port = 4206; - for(auto& item : args.options) - { - if(item.first == "port") - { - port = std::stoi(item.second); - } - } - - env->EnsureDictionary(&gc,"Net")->SetValue("WebServerPort", (int64_t)port); - TList* args2 = TList::Create(ls); - for(auto& item : args.positional) - { - args2->Add(item); - } - - auto res = env->CallFunctionWithFatalError(ls, "WebAppMain", {args2}); - auto svr2 = Tesses::CrossLang::ToHttpServer(&gc,res); - if(svr2 == nullptr) return 1; - Tesses::Framework::Http::HttpServer svr(port,svr2); - svr.StartAccepting(); - TF_RunEventLoop(); - TDictionary* _dict; - TClassObject* _co; - if(GetObjectHeap(res,_dict)) - { - _dict->CallMethod(ls,"Close",{}); - } - if(GetObjectHeap(res,_co)) - { - _co->CallMethod(ls,"","Close",{}); - } - TF_Quit(); - } - else { - TList* args = TList::Create(ls); - for(int arg=1;argAdd(std::string(argv[arg])); - - auto res = env->CallFunctionWithFatalError(ls,"main",{args}); - int64_t iresult; - if(GetObject(res,iresult)) - return (int)iresult; - } - return 0; -} \ No newline at end of file diff --git a/src/crossarchivecreate.cpp b/src/program_lib/crossarchivecreate.cpp similarity index 79% rename from src/crossarchivecreate.cpp rename to src/program_lib/crossarchivecreate.cpp index f35cc76..19e7006 100644 --- a/src/crossarchivecreate.cpp +++ b/src/program_lib/crossarchivecreate.cpp @@ -1,11 +1,11 @@ #include "CrossLang.hpp" #include -using namespace Tesses::CrossLang; +namespace Tesses::CrossLang::Programs { using namespace Tesses::Framework::Filesystem; using namespace Tesses::Framework::Streams; -void Help(const char* filename) +static void Help(std::string& filename) { - printf("USAGE: %s [OPTIONS] \n", filename); + std::cout << "USAGE: " << filename << " [OPTIONS] " << std::endl; printf("OPTIONS:\n"); printf(" -i: Set info (ex {\"maintainer\": \"Mike Nolan\", \"repo\": \"https://example.com/\", \"homepage\": \"https://example.com/\",\"license\":\"MIT\"})\n"); printf(" -I: Set icon name (relative to dirasroot), should be a 128x128 png\n"); @@ -15,7 +15,8 @@ void Help(const char* filename) printf("Options except for help have flag with arg like this: -F ARG\n"); exit(1); } -int main(int argc, char** argv) + +int64_t CrossArchiveCreate(std::vector& argv) { Tesses::Framework::TF_Init(); std::string name="out"; @@ -23,40 +24,40 @@ int main(int argc, char** argv) TVMVersion version; std::string icon=""; std::vector args; - for(int i = 1; i < argc; i++) + for(int i = 1; i < argv.size(); i++) { - if(strcmp(argv[i],"--help") == 0 || strcmp(argv[i],"-h")==0) + if(argv[i] == "--help" || argv[i] == "-h") { Help(argv[0]); } - else if(strcmp(argv[i], "-i") == 0) + else if(argv[i] == "-i") { i++; - if(i < argc) + if(i < argv.size()) { info = argv[i]; } } - else if(strcmp(argv[i], "-I") == 0) + else if(argv[i] == "-I") { i++; - if(i < argc) + if(i < argv.size()) { icon = argv[i]; } } - else if(strcmp(argv[i], "-n") == 0) + else if(argv[i] == "-n") { i++; - if(i < argc) + if(i < argv.size()) { name = argv[i]; } } - else if(strcmp(argv[i], "-v") == 0) + else if(argv[i] == "-v") { i++; - if(i < argc) + if(i < argv.size()) { if(!TVMVersion::TryParse(argv[i],version)) @@ -90,4 +91,5 @@ int main(int argc, char** argv) CrossArchiveCreate(sdfs,strm,name,version,info,icon); return 0; +} } \ No newline at end of file diff --git a/src/crossarchiveextract.cpp b/src/program_lib/crossarchiveextract.cpp similarity index 57% rename from src/crossarchiveextract.cpp rename to src/program_lib/crossarchiveextract.cpp index 61ee23d..610b680 100644 --- a/src/crossarchiveextract.cpp +++ b/src/program_lib/crossarchiveextract.cpp @@ -1,34 +1,34 @@ #include "CrossLang.hpp" #include -using namespace Tesses::CrossLang; + +namespace Tesses::CrossLang::Programs { using namespace Tesses::Framework::Filesystem; using namespace Tesses::Framework::Streams; -int main(int argc, char** argv) +int64_t CrossArchiveExtract(std::vector& argv) { Tesses::Framework::TF_Init(); - if(argc < 3) + if(argv.size() < 3) { - printf("USAGE: %s \n", argv[0]); + std::cout << "USAGE: " << argv[0] << " " << std::endl; return 1; } auto sdfs= std::make_shared(Tesses::Framework::Filesystem::LocalFS,std::string(argv[2])); - - FILE* f = fopen(argv[1],"rb"); - if(f == NULL) + auto strm= LocalFS->OpenFile(argv[1], "rb"); + if(strm->CanRead()) { - printf("ERROR: could not open %s\n", argv[1]); + std::cout << "ERROR: could not open " << argv[1] << std::endl; return 1; } - auto strm = std::make_shared(f,true,"rb",true); - auto res = CrossArchiveExtract(strm,sdfs); + auto res = Tesses::CrossLang::CrossArchiveExtract(strm,sdfs); std::cout << "Crvm Name: " << res.first.first << std::endl; std::cout << "Crvm Version: " << res.first.second.ToString() << std::endl; std::cout << "Crvm Info: " << std::endl << res.second << std::endl; return 0; +} } \ No newline at end of file diff --git a/src/crosslangdump.cpp b/src/program_lib/crossdump.cpp similarity index 82% rename from src/crosslangdump.cpp rename to src/program_lib/crossdump.cpp index 7b845fc..67c9d89 100644 --- a/src/crosslangdump.cpp +++ b/src/program_lib/crossdump.cpp @@ -1,20 +1,20 @@ #include "CrossLang.hpp" #include -using namespace Tesses::CrossLang; -void Ensure(Tesses::Framework::Streams::Stream& strm,uint8_t* buffer, size_t len) +namespace Tesses::CrossLang::Programs { +static void Ensure(std::shared_ptr strm,uint8_t* buffer, size_t len) { - if(strm.ReadBlock(buffer,len) != len) + if(strm->ReadBlock(buffer,len) != len) { throw VMException("Could not read " + std::to_string(len) + " byte(s)."); } } -uint32_t EnsureInt(Tesses::Framework::Streams::Stream& strm) +static uint32_t EnsureInt(std::shared_ptr strm) { uint8_t buff[4]; Ensure(strm,buff,sizeof(buff)); return BitConverter::ToUint32BE(buff[0]); } -std::string EnsureString(Tesses::Framework::Streams::Stream& strm) +static std::string EnsureString(std::shared_ptr strm) { size_t len = (size_t)EnsureInt(strm); std::string myStr={}; @@ -22,30 +22,24 @@ std::string EnsureString(Tesses::Framework::Streams::Stream& strm) Ensure(strm,(uint8_t*)myStr.data(), len); return myStr; } -void DumpFile(std::filesystem::path p) +void CrossLangDump(std::shared_ptr strm) { - if(std::filesystem::is_regular_file(p)) + uint8_t main_header[18]; + Ensure(strm,main_header,sizeof(main_header)); + if(strncmp((const char*)main_header,"TCROSSVM",8) != 0) throw VMException("Invalid TCrossVM image."); + TVMVersion version(main_header+8); + if(version.CompareToRuntime() == 1) { - try - { - std::cout << "File: " << p.string() << std::endl; - Tesses::Framework::Streams::FileStream strm(p,"rb"); - uint8_t main_header[18]; - Ensure(strm,main_header,sizeof(main_header)); - if(strncmp((const char*)main_header,"TCROSSVM",8) != 0) throw VMException("Invalid TCrossVM image."); - TVMVersion version(main_header+8); - if(version.CompareToRuntime() == 1) - { - throw VMException("Runtime is too old."); - } - TVMVersion v2(main_header+13); - std::cout << "Version: " << v2.ToString() << std::endl; + throw VMException("Runtime is too old."); + } + TVMVersion v2(main_header+13); + std::cout << "Version: " << v2.ToString() << std::endl; - size_t _len = (size_t)EnsureInt(strm); + size_t _len = (size_t)EnsureInt(strm); - std::cout << "SectionCount: " << _len << std::endl; + std::cout << "SectionCount: " << _len << std::endl; - std::vector strs; + std::vector strs; std::unordered_map> funs; std::vector> closures; @@ -177,7 +171,7 @@ void DumpFile(std::filesystem::path p) } auto len = EnsureInt(strm); - strm.Seek(len,Tesses::Framework::Streams::SeekOrigin::Current); + strm->Seek(len,Tesses::Framework::Streams::SeekOrigin::Current); closures.push_back(args); } @@ -208,7 +202,7 @@ void DumpFile(std::filesystem::path p) } else { - strm.Seek((int64_t)tableLen,Tesses::Framework::Streams::SeekOrigin::Current); + strm->Seek((int64_t)tableLen,Tesses::Framework::Streams::SeekOrigin::Current); } } if(hasIcon) @@ -252,22 +246,10 @@ void DumpFile(std::filesystem::path p) for(auto str : strs) { std::cout << EscapeString(str, true) << std::endl; } - } - catch(std::exception& ex) - { - std::cout << "Error when reading file \"" << p.string() << "\" " << ex.what() << std::endl; - } - } - else - { - std::cout << "CrossVM file \"" << p.string() << "\" does not exist." << std::endl; - } -} -int main(int argc, char** argv) -{ - Tesses::Framework::TF_Init(); - for(int i = 1; i < argc; i++) - { - DumpFile(argv[i]); - } + + + + } + +} \ No newline at end of file diff --git a/src/crosslang.cpp b/src/program_lib/crosslang.cpp similarity index 80% rename from src/crosslang.cpp rename to src/program_lib/crosslang.cpp index 89daaa5..4f3ca01 100644 --- a/src/crosslang.cpp +++ b/src/program_lib/crosslang.cpp @@ -3,10 +3,12 @@ #include using namespace Tesses::Framework; -using namespace Tesses::CrossLang; using namespace Tesses::Framework::Http; -bool Download(Tesses::Framework::Filesystem::VFSPath filename,std::shared_ptr vfs) +namespace Tesses::CrossLang::Programs +{ + +static bool Download(Tesses::Framework::Filesystem::VFSPath filename,std::shared_ptr vfs) { while(true) { @@ -22,7 +24,7 @@ bool Download(Tesses::Framework::Filesystem::VFSPath filename,std::shared_ptr& argv) { - TF_InitWithConsole(); - if(argc > 0) - TF_AllowPortable(argv[0]); - - - + Tesses::Framework::Filesystem::VFSPath dir = GetCrossLangConfigDir(); Tesses::Framework::Filesystem::VFSPath filename = dir / "Shell" / "Shell.crvm"; auto p = Tesses::Framework::Platform::Environment::GetRealExecutablePath(Tesses::Framework::Filesystem::LocalFS->SystemToVFSPath(argv[0])).GetParent().GetParent() / "share" / "Tesses" / "CrossLang" / "Tesses.CrossLang.ShellPackage-1.0.0.0-prod.crvm"; - if(argc == 2 && strcmp(argv[1],"configdir") == 0) + if(argv.size() == 2 && argv[1] == "configdir") { std::cout << dir.ToString() << std::endl; return 0; } - if(argc > 1 && strcmp(argv[1],"update-shell") == 0) + if(argv.size() > 1 && argv[1] == "update-shell") { auto subdir = std::make_shared(Tesses::Framework::Filesystem::LocalFS,dir); @@ -76,7 +73,7 @@ int main(int argc, char** argv) if(resp.statusCode == StatusCode::OK) { auto strm = resp.ReadAsStream(); - CrossArchiveExtract(strm, subdir); + CrossLang::CrossArchiveExtract(strm, subdir); return 0; } @@ -97,7 +94,7 @@ int main(int argc, char** argv) auto strm = Tesses::Framework::Filesystem::LocalFS->OpenFile(p,"rb"); if(strm != nullptr) { - CrossArchiveExtract(strm, subdir); + CrossLang::CrossArchiveExtract(strm, subdir); } else @@ -113,29 +110,24 @@ int main(int argc, char** argv) } - GC gc; - gc.Start(); - - GCList ls(gc); TRootEnvironment* env = TRootEnvironment::Create(ls, TDictionary::Create(ls)); - TStd::RegisterStd(&gc,env); + TStd::RegisterStd(ls.GetGC(),env); - env->LoadFileWithDependencies(&gc, Tesses::Framework::Filesystem::LocalFS, filename); + env->LoadFileWithDependencies(ls.GetGC(), Tesses::Framework::Filesystem::LocalFS, filename); TList* args = TList::Create(ls); args->Add(filename.ToString()); - for(int arg=1;argAdd(std::string(argv[arg])); - auto res = env->CallFunctionWithFatalError(ls,"main",{args}); - int64_t iresult; - if(GetObject(res,iresult)) - return (int)iresult; - return 0; + return env->CallFunctionWithFatalError(ls,"main",{args}); + } + +} \ No newline at end of file diff --git a/src/program_lib/crosslangcompiler.cpp b/src/program_lib/crosslangcompiler.cpp new file mode 100644 index 0000000..a29b29a --- /dev/null +++ b/src/program_lib/crosslangcompiler.cpp @@ -0,0 +1,290 @@ +#include "CrossLang.hpp" +#include +#include +using namespace Tesses::Framework; +using namespace Tesses::Framework::Filesystem; +namespace Tesses::CrossLang::Programs { +static void Help(std::string filename) +{ + std::cout << "USAGE: " << filename << " [OPTIONS] source_file1 source_file2 source_file_n" << std::endl; + printf("OPTIONS:\n"); + printf(" -o: Output directory (OUTDIR, defaults to ./bin)\n"); + printf(" -i: Set info (ex {\"maintainer\": \"Mike Nolan\", \"repo\": \"https://example.com/\", \"homepage\": \"https://example.com/\",\"license\":\"MIT\"})\n"); + printf(" -I: Set icon resource name (in the resource folder), should be a 128x128 png\n"); + printf(" -v: Set version (1.0.0.0-prod defaults to 1.0.0.0-dev)\n"); + printf(" -d: Add dependency (DependencyName-1.0.0.0-prod)\n"); + printf(" -D: enable debug)\n"); + printf(" -t: Declare a tool (ToolName-1.0.0.0-prod)\n"); + printf(" -n: Set name (MyAppOrLibName defaults to out)\n"); + printf(" -r: Set resource directory (RESDIR defaults to res)\n"); + printf(" -h, --help: Prints help\n"); + printf(" -e: Set comptime permissions defaults to none, none for no support, \"secure\" for sane without file access, \"secure_file\" for sane with file access to current directory and sub directories, \"full\" has full runtime.\n"); + printf("Options except for help have flag with arg like this: -F ARG\n"); + exit(1); +} +void CrossLangCompiler(std::vector& argv) +{ + /*std::ifstream strm(argv[1],std::ios_base::in|std::ios_base::binary); + std::vector tokens; + Lex(argv[1],strm,tokens); + + Parser parser(tokens); + + CodeGen gen; + gen.GenRoot(parser.ParseRoot()); + std::vector data; + ByteCodeVectorWriter w(data); + gen.Save(std::filesystem::current_path(),w); + */ + TF_InitWithConsole(); + std::filesystem::path outputDir = std::filesystem::current_path() / "bin"; + std::vector source; + std::filesystem::path resourceDir = std::filesystem::current_path() / "res"; + std::vector> dependencies; + std::vector> tools; + std::string name="out"; + std::string info="{}"; + std::string icon=""; + std::string comptime="none"; + TVMVersion version; + bool debug=false; + + + + for(size_t i = 1; i < argv.size(); i++) + { + if(argv[i] == "--help" || argv[i] == "-h") + { + Help(argv[0]); + } + + else if(argv[i] == "-o") + { + i++; + if(i < argv.size()) + { + outputDir = argv[i]; + } + } + else if(argv[i] == "-r") + { + i++; + if(i < argv.size()) + { + resourceDir = argv[i]; + } + } + else if(argv[i] == "-e") + { + i++; + if(i < argv.size()) + { + comptime = argv[i]; + } + } + + else if(argv[i] == "-i") + { + i++; + if(i < argv.size()) + { + info = argv[i]; + } + } + else if(argv[i] == "-I") + { + i++; + if(i < argv.size()) + { + icon = argv[i]; + } + } + else if(argv[i] == "-d") + { + i++; + if(i < argv.size()) + { + std::string str = argv[i]; + auto lastDash = str.find_last_of('-'); + if(lastDash < str.size()) + { + std::string str2 = str.substr(lastDash+1); + if(str2 == "dev" || str2 == "alpha" || str2 == "beta" || str2 == "prod") + { + lastDash = str.find_last_of('-',lastDash-1); + } + std::string str1 = str.substr(0,lastDash); + str2 = str.substr(lastDash+1); + + TVMVersion v2; + if(!TVMVersion::TryParse(str2,v2)) + { + printf("ERROR: Invalid syntax for version\n"); + printf("Expected MAJOR[.MINOR[.PATCH[.BUILD[-dev,-alpha,-beta,-prod]]]]\n"); + exit(1); + } + dependencies.push_back(std::pair(str1,v2)); + + } + else + { + printf("ERROR: Dependency must have version\n"); + exit(1); + } + } + } + else if(argv[i] == "-t") + { + i++; + if(i < argv.size()) + { + std::string str = argv[i]; + auto lastDash = str.find_last_of('-'); + if(lastDash < str.size()) + { + std::string str2 = str.substr(lastDash+1); + if(str2 == "dev" || str2 == "alpha" || str2 == "beta" || str2 == "prod") + { + lastDash = str.find_last_of('-',lastDash-1); + } + std::string str1 = str.substr(0,lastDash); + str2 = str.substr(lastDash+1); + + TVMVersion v2; + if(!TVMVersion::TryParse(str2,v2)) + { + printf("ERROR: Invalid syntax for version\n"); + printf("Expected MAJOR[.MINOR[.PATCH[.BUILD[-dev,-alpha,-beta,-prod]]]]\n"); + exit(1); + } + tools.push_back(std::pair(str1,v2)); + + } + else + { + printf("ERROR: Tool must have version\n"); + exit(1); + } + } + } + else if(argv[i] == "-n") + { + i++; + if(i < argv.size()) + { + name = argv[i]; + } + } + else if(argv[i] == "-v") + { + i++; + if(i < argv.size()) + { + + if(!TVMVersion::TryParse(argv[i],version)) + { + printf("ERROR: Invalid syntax for version\n"); + printf("Expected MAJOR[.MINOR[.PATCH[.BUILD[-dev,-alpha,-beta,-prod]]]]\n"); + exit(1); + } + } + } + else if(argv[i] == "-D" || argv[i] == "--debug") + { + debug = true; + } + else { + source.push_back(argv[i]); + } + } + if(source.empty()) + { + Help(argv[0]); + } + + + std::vector tokens; + + for(auto src : source) + { + std::ifstream strm(src,std::ios_base::in|std::ios_base::binary); + int res = Lex(std::filesystem::absolute(src).string(),strm,tokens); + + } + + GC* gc=nullptr; + GCList* ls=nullptr; + TRootEnvironment* env=nullptr; + if(comptime != "none") + { + gc = new GC(); + gc->Start(); + ls = new GCList(gc); + env = TRootEnvironment::Create(ls,TDictionary::Create(ls)); + + if(comptime == "secure") + { + TStd::RegisterConsole(gc,env); + TStd::RegisterClass(gc,env); + TStd::RegisterCrypto(gc,env); + TStd::RegisterDictionary(gc,env); + TStd::RegisterJson(gc,env); + TStd::RegisterRoot(gc,env); + TStd::RegisterIO(gc,env,false); + env->permissions.locked=true; + } + else if(comptime == "secure_file") + { + TStd::RegisterConsole(gc,env); + TStd::RegisterClass(gc,env); + TStd::RegisterCrypto(gc,env); + TStd::RegisterDictionary(gc,env); + TStd::RegisterJson(gc,env); + TStd::RegisterRoot(gc,env); + TStd::RegisterIO(gc,env,false); + env->permissions.locked=true; + auto fs = env->EnsureDictionary(gc,"FS"); + fs->SetValue("Local", std::make_shared(LocalFS,Tesses::Framework::Filesystem::VFSPath::GetAbsoluteCurrentDirectory())); + } + else if(comptime == "full") + { + TStd::RegisterStd(gc,env); + env->permissions.locked=true; + } + } + + Parser parser(tokens,gc,env); + parser.debug = debug; + CodeGen gen; + + auto sfs = std::make_shared(LocalFS,LocalFS->SystemToVFSPath(resourceDir.string())); + gen.embedFS = sfs; + + gen.GenRoot(parser.ParseRoot()); + gen.name = name; + gen.version = version; + gen.info = info; + gen.icon = icon; + for(auto deps : dependencies) + { + gen.dependencies.push_back(deps); + } + for(auto tool : tools) + { + gen.tools.push_back(tool); + } + + std::filesystem::create_directory(outputDir); + + { + auto strm = std::make_shared(outputDir / (name + "-" + version.ToString() + ".crvm"),"wb"); + + gen.Save(strm); + } + if(gc != nullptr) + { + delete ls; + delete gc; + } +} +} \ No newline at end of file diff --git a/src/crosslanginterperter.cpp b/src/program_lib/crosslanginterperter.cpp similarity index 69% rename from src/crosslanginterperter.cpp rename to src/program_lib/crosslanginterperter.cpp index 85eb52c..fbfa823 100644 --- a/src/crosslanginterperter.cpp +++ b/src/program_lib/crosslanginterperter.cpp @@ -4,20 +4,13 @@ #include #include using namespace Tesses::Framework; -using namespace Tesses::CrossLang; using namespace Tesses::Framework::Filesystem; -int main(int argc, char** argv) + +namespace Tesses::CrossLang::Programs { +TObject CrossLangInterperter(GCList& ls,TRootEnvironment* env,std::vector& argv) { - TF_InitWithConsole(); - if(argc > 0) - TF_AllowPortable(argv[0]); - GC gc; - gc.Start(); - GCList ls(gc); - TRootEnvironment* env = TRootEnvironment::Create(ls, TDictionary::Create(ls)); - TStd::RegisterStd(&gc,env); - - if(argc > 1) + GC* gc = ls.GetGC(); + if(argv.size() > 1) { std::ifstream strm(argv[1],std::ios_base::in|std::ios_base::binary); std::vector tokens; @@ -32,30 +25,28 @@ int main(int argc, char** argv) gen.GenRoot(parser.ParseRoot()); std::vector data; { - auto strm2 = std::make_shared(true); - gen.Save(strm2); + auto strm2 = std::make_shared(true); + gen.Save(strm2); - { - TFile* file = TFile::Create(ls); + { + TFile* file = TFile::Create(ls); - strm2->Seek(0,Tesses::Framework::Streams::SeekOrigin::Begin); - file->Load(&gc,strm2); + strm2->Seek(0,Tesses::Framework::Streams::SeekOrigin::Begin); + file->Load(gc,strm2); - env->LoadFile(&gc, file); + env->LoadFile(gc, file); + } } - } - TList* args = TList::Create(ls); - for(int arg=1;argAdd(std::string(argv[arg])); + TList* args = TList::Create(ls); + for(int arg=1;argAdd(std::string(argv[arg])); - auto res = env->CallFunctionWithFatalError(ls,"main",{args}); - int64_t iresult; - if(GetObject(res,iresult)) - return (int)iresult; + return env->CallFunctionWithFatalError(ls,"main",{args}); + } else @@ -91,7 +82,7 @@ int main(int argc, char** argv) } else if(source == "exit") { - return 0; + return (int64_t)0; } else { @@ -116,9 +107,9 @@ int main(int argc, char** argv) TFile* file = TFile::Create(ls); strm2->Seek(0,Tesses::Framework::Streams::SeekOrigin::Begin); - file->Load(&gc,strm2); + file->Load(gc,strm2); - env->LoadFile(&gc, file); + env->LoadFile(gc, file); } @@ -126,4 +117,8 @@ int main(int argc, char** argv) } } + + return (int64_t)0; } + +} \ No newline at end of file diff --git a/src/program_lib/crosslangvm.cpp b/src/program_lib/crosslangvm.cpp new file mode 100644 index 0000000..96e0da3 --- /dev/null +++ b/src/program_lib/crosslangvm.cpp @@ -0,0 +1,61 @@ +#include "CrossLang.hpp" +using namespace Tesses::Framework; +namespace Tesses::CrossLang::Programs { + TObject CrossLangVM(GCList& ls,TRootEnvironment* env, std::vector& argv) + { + if(argv.size() < 2) + { + std::cout << "USAGE: " << (argv.empty() ? (std::string)"crossvm" : argv[0]) << " " << std::endl; + return 1; + } + + env->LoadFileWithDependencies(ls.GetGC(), Tesses::Framework::Filesystem::LocalFS, Tesses::Framework::Filesystem::LocalFS->SystemToVFSPath(argv[1])); + + if(env->HasVariable("WebAppMain")) + { + Args args(argv); + int port = 4206; + for(auto& item : args.options) + { + if(item.first == "port") + { + port = std::stoi(item.second); + } + } + + env->EnsureDictionary(ls.GetGC(),"Net")->SetValue("WebServerPort", (int64_t)port); + TList* args2 = TList::Create(ls); + for(auto& item : args.positional) + { + args2->Add(item); + } + + auto res = env->CallFunctionWithFatalError(ls, "WebAppMain", {args2}); + auto svr2 = Tesses::CrossLang::ToHttpServer(ls.GetGC(),res); + if(svr2 == nullptr) return 1; + Tesses::Framework::Http::HttpServer svr(port,svr2); + svr.StartAccepting(); + TF_RunEventLoop(); + TDictionary* _dict; + TClassObject* _co; + if(GetObjectHeap(res,_dict)) + { + _dict->CallMethod(ls,"Close",{}); + } + if(GetObjectHeap(res,_co)) + { + _co->CallMethod(ls,"","Close",{}); + } + TF_Quit(); + return 0; + } + else { + TList* args = TList::Create(ls); + for(size_t arg=1;argAdd(std::string(argv[arg])); + + return env->CallFunctionWithFatalError(ls,"main",{args}); + + } + } +} \ No newline at end of file diff --git a/src/programs/crossarchivecreate.cpp b/src/programs/crossarchivecreate.cpp new file mode 100644 index 0000000..b20d00c --- /dev/null +++ b/src/programs/crossarchivecreate.cpp @@ -0,0 +1,9 @@ +#include "CrossLang.hpp" + +int main(int argc, char** argv) +{ + std::vector args(argc); + for(int i = 0; i < argc; i++) + args[i] = argv[i]; + return (int)Tesses::CrossLang::Programs::CrossArchiveCreate(args); +} \ No newline at end of file diff --git a/src/programs/crossarchiveextract.cpp b/src/programs/crossarchiveextract.cpp new file mode 100644 index 0000000..dc24378 --- /dev/null +++ b/src/programs/crossarchiveextract.cpp @@ -0,0 +1,9 @@ +#include "CrossLang.hpp" + +int main(int argc, char** argv) +{ + std::vector args(argc); + for(int i = 0; i < argc; i++) + args[i] = argv[i]; + return (int)Tesses::CrossLang::Programs::CrossArchiveExtract(args); +} \ No newline at end of file diff --git a/src/programs/crosslang.cpp b/src/programs/crosslang.cpp new file mode 100644 index 0000000..c785fdf --- /dev/null +++ b/src/programs/crosslang.cpp @@ -0,0 +1,25 @@ +#include "CrossLang.hpp" + +using namespace Tesses::Framework; +using namespace Tesses::CrossLang; +using namespace Tesses::Framework::Filesystem; +int main(int argc, char** argv) +{ + TF_InitWithConsole(); + if(argc > 0) + TF_AllowPortable(argv[0]); + GC gc; + gc.Start(); + GCList ls(gc); + + + std::vector args(argc); + for(int i = 0; i < argc; i++) + args[i] = argv[i]; + auto res = Programs::CrossLangShell(ls, args); + + int64_t myi64; + if(GetObject(res,myi64)) + return (int)myi64; + return 0; +} \ No newline at end of file diff --git a/src/programs/crosslangcompiler.cpp b/src/programs/crosslangcompiler.cpp new file mode 100644 index 0000000..d57f0d7 --- /dev/null +++ b/src/programs/crosslangcompiler.cpp @@ -0,0 +1,23 @@ +#include "CrossLang.hpp" +#include +#include +#include +#include +using namespace Tesses::Framework; +using namespace Tesses::CrossLang; +using namespace Tesses::Framework::Filesystem; +int main(int argc, char** argv) +{ + TF_InitWithConsole(); + if(argc > 0) + TF_AllowPortable(argv[0]); + + + + std::vector args(argc); + for(int i = 0; i < argc; i++) + args[i] = argv[i]; + Programs::CrossLangCompiler(args); + + return 0; +} \ No newline at end of file diff --git a/src/programs/crosslangdump.cpp b/src/programs/crosslangdump.cpp new file mode 100644 index 0000000..ae4d10b --- /dev/null +++ b/src/programs/crosslangdump.cpp @@ -0,0 +1,28 @@ +#include "CrossLang.hpp" +#include +#include +#include +#include +using namespace Tesses::Framework; +using namespace Tesses::CrossLang; +using namespace Tesses::Framework::Filesystem; +int main(int argc, char** argv) +{ + TF_InitWithConsole(); + if(argc > 0) + TF_AllowPortable(argv[0]); + + for(int i = 1; i < argc; i++) + { + VFSPath path(argv[i]); + if(LocalFS->FileExists(path)) + { + std::cout << "File: " << path.ToString() << std::endl; + auto strm = LocalFS->OpenFile(path, "rb"); + Programs::CrossLangDump(strm); + } + else { + std::cout << "File: " << path.ToString() << " does not exist." << std::endl; + } + } +} \ No newline at end of file diff --git a/src/programs/crosslanginterperter.cpp b/src/programs/crosslanginterperter.cpp new file mode 100644 index 0000000..5a0876c --- /dev/null +++ b/src/programs/crosslanginterperter.cpp @@ -0,0 +1,29 @@ +#include "CrossLang.hpp" +#include +#include +#include +#include +using namespace Tesses::Framework; +using namespace Tesses::CrossLang; +using namespace Tesses::Framework::Filesystem; +int main(int argc, char** argv) +{ + TF_InitWithConsole(); + if(argc > 0) + TF_AllowPortable(argv[0]); + GC gc; + gc.Start(); + GCList ls(gc); + TRootEnvironment* env = TRootEnvironment::Create(ls, TDictionary::Create(ls)); + TStd::RegisterStd(&gc,env); + + std::vector args(argc); + for(int i = 0; i < argc; i++) + args[i] = argv[i]; + auto res = Programs::CrossLangInterperter(ls, env, args); + + int64_t myi64; + if(GetObject(res,myi64)) + return (int)myi64; + return 0; +} \ No newline at end of file diff --git a/src/programs/crosslangvm.cpp b/src/programs/crosslangvm.cpp new file mode 100644 index 0000000..e0e846c --- /dev/null +++ b/src/programs/crosslangvm.cpp @@ -0,0 +1,29 @@ +#include "CrossLang.hpp" +#include +#include +#include +#include +using namespace Tesses::Framework; +using namespace Tesses::CrossLang; +using namespace Tesses::Framework::Filesystem; +int main(int argc, char** argv) +{ + TF_InitWithConsole(); + if(argc > 0) + TF_AllowPortable(argv[0]); + GC gc; + gc.Start(); + GCList ls(gc); + TRootEnvironment* env = TRootEnvironment::Create(ls, TDictionary::Create(ls)); + TStd::RegisterStd(&gc,env); + + std::vector args(argc); + for(int i = 0; i < argc; i++) + args[i] = argv[i]; + auto res = Programs::CrossLangVM(ls, env, args); + + int64_t myi64; + if(GetObject(res,myi64)) + return (int)myi64; + return 0; +} \ No newline at end of file diff --git a/src/programs/slim.cpp b/src/programs/slim.cpp new file mode 100644 index 0000000..29a8c4e --- /dev/null +++ b/src/programs/slim.cpp @@ -0,0 +1,164 @@ +#include "CrossLang.hpp" +#include "TessesFramework/Filesystem/VFS.hpp" +using namespace Tesses::Framework; +using namespace Tesses::CrossLang; +using namespace Tesses::Framework::Filesystem; + +int main(int argc, char** argv) +{ + //crosslang crossint + //crosslang + //crosslang ... + + std::string programName = "crosslang"; + + TF_InitWithConsole(); + if(argc > 0) + { + TF_AllowPortable(argv[0]); + Tesses::Framework::Filesystem::VFSPath path=(std::string)argv[0]; + path.RemoveExtension(); + programName = path.GetFileName(); + } + + std::vector args(argc); + for(int i = 0; i < argc; i++) + args[i] = argv[i]; + if(programName == "crossint") + { + GC gc; + gc.Start(); + GCList ls(gc); + TRootEnvironment* env = TRootEnvironment::Create(ls, TDictionary::Create(ls)); + TStd::RegisterStd(&gc,env); + auto res= Programs::CrossLangInterperter(ls, env, args); + int64_t myi64; + if(GetObject(res,myi64)) + return (int)myi64; + return 0; + } + else if(programName == "crossc") + { + Programs::CrossLangCompiler(args); + return 0; + } + else if(programName == "crossarchivecreate") + { + Programs::CrossArchiveCreate(args); + return 0; + } + else if(programName == "crossarchiveextract") + { + Programs::CrossArchiveExtract(args); + return 0; + } + else if(programName == "crossdump") + { + for(size_t i = 1; i < args.size(); i++) + { + VFSPath path = args[i]; + if(LocalFS->FileExists(path)) + { + std::cout << "File: " << path.ToString() << std::endl; + auto strm = LocalFS->OpenFile(path, "rb"); + Programs::CrossLangDump(strm); + } + else { + std::cout << "File: " << path.ToString() << " does not exist." << std::endl; + } + } + return 0; + } + else if(programName == "crossvm") + { + GC gc; + gc.Start(); + GCList ls(gc); + TRootEnvironment* env = TRootEnvironment::Create(ls, TDictionary::Create(ls)); + TStd::RegisterStd(&gc,env); + auto res= Programs::CrossLangVM(ls, env, args); + int64_t myi64; + if(GetObject(res,myi64)) + return (int)myi64; + return 0; + } + else if(args.size() > 1) + { + + if(args[1] == "crossint") + { + args.erase(args.begin()); + GC gc; + gc.Start(); + GCList ls(gc); + TRootEnvironment* env = TRootEnvironment::Create(ls, TDictionary::Create(ls)); + TStd::RegisterStd(&gc,env); + auto res= Programs::CrossLangInterperter(ls, env, args); + int64_t myi64; + if(GetObject(res,myi64)) + return (int)myi64; + return 0; + } + else if(args[1] == "crossc") + { + args.erase(args.begin()); + Programs::CrossLangCompiler(args); + return 0; + } + else if(args[1] == "crossarchivecreate") + { + args.erase(args.begin()); + Programs::CrossArchiveCreate(args); + return 0; + } + else if(args[1] == "crossarchiveextract") + { + args.erase(args.begin()); + Programs::CrossArchiveExtract(args); + return 0; + } + else if(args[1] == "crossdump") + { + for(size_t i = 2; i < args.size(); i++) + { + VFSPath path = args[i]; + if(LocalFS->FileExists(path)) + { + std::cout << "File: " << path.ToString() << std::endl; + auto strm = LocalFS->OpenFile(path, "rb"); + Programs::CrossLangDump(strm); + } + else { + std::cout << "File: " << path.ToString() << " does not exist." << std::endl; + } + } + return 0; + } + else if(args[1] == "crossvm") + { + args.erase(args.begin()); + GC gc; + gc.Start(); + GCList ls(gc); + TRootEnvironment* env = TRootEnvironment::Create(ls, TDictionary::Create(ls)); + TStd::RegisterStd(&gc,env); + auto res= Programs::CrossLangVM(ls, env, args); + int64_t myi64; + if(GetObject(res,myi64)) + return (int)myi64; + return 0; + } + } + + + GC gc; + gc.Start(); + GCList ls(gc); + auto res= Programs::CrossLangShell(ls, args); + int64_t myi64; + if(GetObject(res,myi64)) + return (int)myi64; + return 0; + return 0; + +} \ No newline at end of file diff --git a/src/runtime_methods/vm.cpp b/src/runtime_methods/vm.cpp index 461aaeb..2720f9a 100644 --- a/src/runtime_methods/vm.cpp +++ b/src/runtime_methods/vm.cpp @@ -354,6 +354,11 @@ namespace Tesses::CrossLang } return nullptr; }); + #if defined(CROSSLANG_ENABLE_SUPERSLIM) + dict->SetValue("SuperSlim", true); + #else + dict->SetValue("SuperSlim", false); + #endif dict->DeclareFunction(gc, "Eval", "Eval source code",{"source"}, VM_Eval); dict->DeclareFunction(gc, "Compile", "Compile Source",{"dict"},VM_Compile);