10 Commits

Author SHA1 Message Date
fca18e63a6 Commit before replacing GC* with std::shared_ptr<GC> 2026-04-30 10:07:14 -05:00
63b00ebbcb Use alpine for Docker 2026-04-16 22:24:18 -05:00
7badbeb217 Use alpine for Docker 2026-04-16 22:18:53 -05:00
66f5b704ee Fixed cmake, unnecessary itteration on dictionary, and a crosslang binary bug when shell is not installed
Some checks failed
Build and Deploy on Tag / build-jammy (push) Has been cancelled
Build and Deploy on Tag / build-plucky (push) Has been cancelled
Build and Deploy on Tag / build-arch (push) Has been cancelled
2026-04-16 19:08:18 -05:00
c2d9627405 Add uuids, bytestreams and single file runtime binaries
Some checks failed
Build and Deploy on Tag / build-jammy (push) Has been cancelled
Build and Deploy on Tag / build-plucky (push) Has been cancelled
Build and Deploy on Tag / build-arch (push) Has been cancelled
2026-02-26 03:29:25 -06:00
8e1ea768b0 Add uuids, bytestreams and single file runtime binaries 2026-02-26 03:26:58 -06:00
dc1e02cb9f Fix tag 2026-02-26 02:43:19 -06:00
e9b4057e32 Fix tag.yaml 2026-02-26 01:40:54 -06:00
fa5bc42908 Fix v0.0.2 2026-02-26 01:32:19 -06:00
572c0ab468 Add single file runtime binaries 2026-02-25 23:36:42 -06:00
49 changed files with 1757 additions and 1189 deletions

View File

@@ -11,7 +11,6 @@ jobs:
build-arch: build-arch:
runs-on: arch-builder runs-on: arch-builder
steps: steps:
- run: pacman --noconfirm -Sy nodejs npm
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- run: wget -O /root/repository.key https://git.tesseslanguage.com/api/packages/tesses50/arch/repository.key - run: wget -O /root/repository.key https://git.tesseslanguage.com/api/packages/tesses50/arch/repository.key
- run: pacman-key --add /root/repository.key - run: pacman-key --add /root/repository.key
@@ -40,6 +39,7 @@ jobs:
bash build-tars.sh bash build-tars.sh
working-directory: ./Packaging/Linux working-directory: ./Packaging/Linux
- uses: akkuman/gitea-release-action@v1 - uses: akkuman/gitea-release-action@v1
prerelease: true
env: env:
NODE_OPTIONS: '--experimental-fetch' # if nodejs < 18 NODE_OPTIONS: '--experimental-fetch' # if nodejs < 18
with: with:
@@ -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 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 build-ubuntu-plucky.sh
bash push-ubuntu-plucky.sh bash push-ubuntu-plucky.sh
bash build-slims.sh
working-directory: ./Packaging/Linux working-directory: ./Packaging/Linux
- name: Build for windows - name: Build for windows
@@ -63,6 +64,7 @@ jobs:
working-directory: ./Packaging/Windows working-directory: ./Packaging/Windows
- uses: akkuman/gitea-release-action@v1 - uses: akkuman/gitea-release-action@v1
prerelease: true
env: env:
NODE_OPTIONS: '--experimental-fetch' # if nodejs < 18 NODE_OPTIONS: '--experimental-fetch' # if nodejs < 18
with: with:

3
.gitignore vendored
View File

@@ -11,3 +11,6 @@ bin
*.exe *.exe
build-x86 build-x86
build-x64 build-x64
build-x86-slim
build-x64-slim
crosslang-*-temp

View File

@@ -1,57 +1,42 @@
version: 43 version: 43
jobs: jobs:
- name: Build for x86_64 - name: Build for x86_64
steps: steps:
- type: CheckoutStep - type: CheckoutStep
name: Checkout name: Checkout
cloneCredential: cloneCredential:
type: DefaultCredential type: DefaultCredential
withLfs: true withLfs: true
withSubmodules: false withSubmodules: false
condition: SUCCESSFUL condition: SUCCESSFUL
optional: false optional: false
- type: CommandStep - type: BuildImageStep
name: Execute build name: Build Docker Image
runInContainer: true dockerfile: Dockerfile
image: onedev.site.tesses.net/tesses-framework/tesses-framework:latest output:
interpreter: type: RegistryOutput
type: DefaultInterpreter tags: onedev.site.tesses.net/crosslang/crosslang:latest onedev.site.tesses.net/crosslang/crosslang:@commit_hash@
commands: | registryLogins:
mkdir build - registryUrl: "@server_url@"
cd build userName: "@job_token@"
cmake -S .. -B . -DCROSSLANG_FETCHCONTENT=OFF passwordSecret: dockersecret
make -j12 platforms: linux/amd64
make install DESTDIR=../out condition: SUCCESSFUL
useTTY: true optional: false
condition: SUCCESSFUL triggers:
optional: false - type: DependencyFinishedTrigger
- type: BuildImageStep projects: tesses-framework
name: Build Docker Image - type: BranchUpdateTrigger
dockerfile: Dockerfile.run branches: master
output: userMatch: anyone
type: RegistryOutput projects: crosslang
tags: onedev.site.tesses.net/crosslang/crosslang:latest onedev.site.tesses.net/crosslang/crosslang:@commit_hash@ projectDependencies:
registryLogins: - projectPath: tesses-framework
- registryUrl: '@server_url@' buildProvider:
userName: '@job_token@' type: LastFinishedBuild
passwordSecret: dockersecret jobName: Build for x86_64
platforms: linux/amd64 artifacts: "*"
condition: SUCCESSFUL retryCondition: never
optional: false maxRetries: 3
triggers: retryDelay: 30
- type: DependencyFinishedTrigger timeout: 14400
projects: tesses-framework
- type: BranchUpdateTrigger
branches: master
userMatch: anyone
projects: crosslang
projectDependencies:
- projectPath: tesses-framework
buildProvider:
type: LastFinishedBuild
jobName: Build for x86_64
artifacts: '*'
retryCondition: never
maxRetries: 3
retryDelay: 30
timeout: 14400

View File

@@ -1,8 +1,7 @@
cmake_minimum_required(VERSION 3.16) cmake_minimum_required(VERSION 3.16)
set(CROSSLANG_MAJOR_VERSION 0) include(cmake/version.cmake)
set(CROSSLANG_MINOR_VERSION 0) include(cmake/options.cmake)
set(CROSSLANG_PATCH_VERSION 2)
project(TessesCrossLang VERSION ${CROSSLANG_MAJOR_VERSION}.${CROSSLANG_MINOR_VERSION}.${CROSSLANG_PATCH_VERSION}) project(TessesCrossLang VERSION ${CROSSLANG_MAJOR_VERSION}.${CROSSLANG_MINOR_VERSION}.${CROSSLANG_PATCH_VERSION})
@@ -12,38 +11,12 @@ set(CMAKE_CXX_STANDARD 17)
include(CMakePackageConfigHelpers) include(CMakePackageConfigHelpers)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
#option(CROSSLANG_ENABLE_DOXYGEN "Enable doxygen" ON)
option(CROSSLANG_ENABLE_STATIC "Enable Tesses CrossLang static libraries" ON)
option(CROSSLANG_ENABLE_SHARED "Enable Tesses CrossLang shared libraries" ON)
option(CROSSLANG_ENABLE_BINARIES "Enable Tesses CrossLang binaries" ON)
option(CROSSLANG_INSTALL_DEVELOPMENT "Enable Tesses CrossLang development files" ON)
option(CROSSLANG_ENABLE_THREADING "Enable Tesses CrossLang threading" ON)
option(CROSSLANG_ENABLE_TERMIOS "Enable termios (For changing terminal options)" ON)
option(CROSSLANG_SHARED_EXECUTABLES "Link with libcrosslang_shared" ON)
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_CUSTOM_CONSOLE "Enable custom Console" OFF)
#if(CROSSLANG_ENABLE_DOXYGEN)
#find_package(Doxygen REQUIRED)
#doxygen_add_docs(doxygen-crosslang "${CMAKE_CURRENT_SOURCE_DIR}/include/CrossLang.hpp" "${CMAKE_CURRENT_SOURCE_DIR}/docs" "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
#add_custom_target(crosslang_doxygen ALL
# COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile.doxygen-crosslang
# WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
#)
#endif()
if(CROSSLANG_CUSTOM_CONSOLE) if(CROSSLANG_CUSTOM_CONSOLE)
set(CROSSLANG_ENABLE_BINARIES OFF) set(CROSSLANG_ENABLE_BINARIES OFF)
set(CROSSLANG_ENABLE_SHARED OFF) set(CROSSLANG_ENABLE_SHARED OFF)
endif() endif()
set(CROSSLANG_OFFLINE_SHELL_PACKAGE "" CACHE FILEPATH "Path to the shell package generated from https://onedev.site.tesses.net/CrossLang/CrossLangExtras")
if(CROSSLANG_FETCHCONTENT) if(CROSSLANG_FETCHCONTENT)
@@ -77,128 +50,13 @@ endif()
if(CROSSLANG_ENABLE_FFI) if(CROSSLANG_ENABLE_FFI)
find_package(PkgConfig) find_package(PkgConfig)
endif() endif()
include(cmake/linkdeps.cmake)
if(CROSSLANG_ENABLE_FFI AND CROSSLANG_ENABLE_SHARED) if(CROSSLANG_ENABLE_FFI AND CROSSLANG_ENABLE_SHARED)
pkg_check_modules(LIBFFI REQUIRED IMPORTED_TARGET libffi) pkg_check_modules(LIBFFI REQUIRED IMPORTED_TARGET libffi)
endif() endif()
function(CROSSLANG_LINK_DEPS CROSSLANG_TARGET_NAME) configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/CrossLangVersion.h.in "${CMAKE_CURRENT_BINARY_DIR}/include/CrossLangVersion.h"
target_include_directories(${CROSSLANG_TARGET_NAME} INSTALL_DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/CrossLangVersion.h)
PUBLIC include(cmake/sources.cmake)
"$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
)
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_TIME)
target_compile_definitions(${CROSSLANG_TARGET_NAME} PUBLIC CROSSLANG_ENABLE_TIME)
endif()
if(CROSSLANG_ENABLE_CONFIG_ENVVAR)
target_compile_definitions(${CROSSLANG_TARGET_NAME} PUBLIC CROSSLANG_ENABLE_CONFIG_ENVVAR)
endif()
if(CROSSLANG_ENABLE_PROCESS)
target_compile_definitions(${CROSSLANG_TARGET_NAME} PUBLIC CROSSLANG_ENABLE_PROCESS)
endif()
if(CROSSLANG_ENABLE_THREADING)
target_compile_definitions(${CROSSLANG_TARGET_NAME} PUBLIC CROSSLANG_ENABLE_THREADING)
endif()
if(CROSSLANG_ENABLE_TERMIOS)
target_compile_definitions(${CROSSLANG_TARGET_NAME} PUBLIC CROSSLANG_ENABLE_TERMIOS)
endif()
if(CROSSLANG_ENABLE_SQLITE)
target_compile_definitions(${CROSSLANG_TARGET_NAME} PUBLIC CROSSLANG_ENABLE_SQLITE)
endif()
if(CROSSLANG_CUSTOM_CONSOLE)
target_compile_definitions(${CROSSLANG_TARGET_NAME} PUBLIC CROSSLANG_CUSTOM_CONSOLE)
endif()
if(CROSSLANG_ENABLE_PLATFORM_FOLDERS)
target_compile_definitions(${CROSSLANG_TARGET_NAME} PUBLIC CROSSLANG_ENABLE_PLATFORM_FOLDERS)
endif()
if(CROSSLANG_ENABLE_SHARED)
target_compile_definitions(${CROSSLANG_TARGET_NAME} PUBLIC CROSSLANG_ENABLE_SHARED)
endif()
if("${CMAKE_SYSTEM_NAME}" STREQUAL "NintendoWii" OR "${CMAKE_SYSTEM_NAME}" STREQUAL "NintendoGameCube")
target_link_libraries(${CROSSLANG_TARGET_NAME} PUBLIC fat)
endif()
if("${CMAKE_SYSTEM_NAME}" STREQUAL "NintendoWii")
target_link_libraries(${CROSSLANG_TARGET_NAME} PUBLIC wiisocket)
endif()
if(CROSSLANG_ENABLE_SHARED AND NOT ("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows"))
target_link_libraries(${CROSSLANG_TARGET_NAME} PUBLIC dl)
endif()
target_include_directories(${CROSSLANG_TARGET_NAME}
PUBLIC
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
)
endfunction()
list(APPEND CROSSLANG_SOURCE
src/vm/bc/add.cpp
src/vm/bc/sub.cpp
src/vm/bc/getfield.cpp
src/vm/bc/setfield.cpp
src/vm/bc/tostring.cpp
src/vm/bc/equals.cpp
src/vm/bc/invokemethod.cpp
src/vm/bc/executemethod2.cpp
src/vm/bc/invoketwo.cpp
src/vm/bc/tobool.cpp
src/assembler/asm.cpp
src/assembler/disasm.cpp
src/assembler/merge.cpp
src/compiler/codegen.cpp
src/compiler/lexer.cpp
src/compiler/parser.cpp
src/compiler/ast.cpp
src/runtime_methods/uuid.cpp
src/runtime_methods/class.cpp
src/runtime_methods/console.cpp
src/runtime_methods/io.cpp
src/runtime_methods/std.cpp
src/runtime_methods/net.cpp
src/runtime_methods/vm.cpp
src/runtime_methods/json.cpp
src/runtime_methods/sqlite.cpp
src/runtime_methods/dictionary.cpp
src/runtime_methods/crypto.cpp
src/runtime_methods/ogc.cpp
src/runtime_methods/path.cpp
src/runtime_methods/env.cpp
src/runtime_methods/process.cpp
src/runtime_methods/helpers.cpp
src/types/embed.cpp
src/types/async.cpp
src/types/associativearray.cpp
src/types/any.cpp
src/types/ittr.cpp
src/types/closure.cpp
src/types/dictionary.cpp
src/types/externalmethod.cpp
src/types/list.cpp
src/types/native.cpp
src/types/rootenvironment.cpp
src/types/subenvironment.cpp
src/types/vfsheapobject.cpp
src/types/streamheapobject.cpp
src/types/class.cpp
src/types/classenvironment.cpp
src/types/random.cpp
src/vm/filereader.cpp
src/vm/gc.cpp
src/vm/gclist.cpp
src/vm/vm.cpp
src/vm/exception.cpp
src/archive.cpp
src/markedtobject.cpp
)
if(CROSSLANG_OFFLINE_SHELL_PACKAGE STREQUAL "") if(CROSSLANG_OFFLINE_SHELL_PACKAGE STREQUAL "")
@@ -244,173 +102,22 @@ list(APPEND TessesCrossLangLibs crosslang_shared)
endif() endif()
if(CROSSLANG_ENABLE_SUPERSLIM)
include(cmake/slim.cmake)
if(CROSSLANG_INSTALL_DEVELOPMENT)
install(TARGETS ${TessesCrossLangLibs}
EXPORT TessesCrossLangTargets
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)
install(FILES include/CrossLang.hpp DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/include/CrossLangVersion.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(EXPORT TessesCrossLangTargets
FILE TessesCrossLangTargets.cmake
NAMESPACE TessesCrossLang::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/TessesCrossLang
)
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() else()
if(CROSSLANG_ENABLE_SHARED) include(cmake/shared.cmake)
install(TARGETS crosslang_shared
EXPORT TessesCrossLangTargets
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
endif()
endif()
if(CROSSLANG_ENABLE_BINARIES) if(CROSSLANG_ENABLE_BINARIES)
if(CROSSLANG_ENABLE_SHARED AND CROSSLANG_SHARED_EXECUTABLES) if(CROSSLANG_ENABLE_SHARED AND CROSSLANG_SHARED_EXECUTABLES)
if(CROSSLANG_ENABLE_RPATH) include(cmake/shared_exec.cmake)
set(CMAKE_MACOSX_RPATH 1)
set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE)
if (APPLE)
set(CMAKE_INSTALL_RPATH "@executable_path/../${CMAKE_INSTALL_LIBDIR}")
else()
set(CMAKE_INSTALL_RPATH "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}")
endif()
endif()
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})
if(NOT WIN32)
add_executable(crossthumbnailer src/crossthumbnailer.cpp ${CROSSLANG_WIN32_EXE_SRC})
endif()
target_link_libraries(crossc PUBLIC crosslang_shared)
target_link_libraries(crossvm PUBLIC crosslang_shared)
target_link_libraries(crossint PUBLIC crosslang_shared)
target_link_libraries(crossdump PUBLIC crosslang_shared)
target_link_libraries(crosslang PUBLIC crosslang_shared)
target_link_libraries(crossarchiveextract PUBLIC crosslang_shared)
target_link_libraries(crossarchivecreate PUBLIC crosslang_shared)
target_link_libraries(crossasm PUBLIC crosslang_shared)
target_link_libraries(crossdisasm PUBLIC crosslang_shared)
target_link_libraries(crossmerge PUBLIC crosslang_shared)
if(NOT WIN32)
target_link_libraries(crossthumbnailer PUBLIC crosslang_shared)
endif()
elseif(CROSSLANG_ENABLE_STATIC) elseif(CROSSLANG_ENABLE_STATIC)
include(cmake/static_exec.cmake)
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(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})
if(NOT WIN32)
add_executable(crossthumbnailer src/crossthumbnailer.cpp ${CROSSLANG_WIN32_EXE_SRC})
endif()
target_link_libraries(crossc PUBLIC crosslang_static)
target_link_libraries(crossvm PUBLIC crosslang_static)
target_link_libraries(crossint PUBLIC crosslang_static)
target_link_libraries(crossdump PUBLIC crosslang_static)
target_link_libraries(crosslang PUBLIC crosslang_static)
target_link_libraries(crossarchiveextract PUBLIC crosslang_static)
target_link_libraries(crossarchivecreate PUBLIC crosslang_static)
target_link_libraries(crossmerge PUBLIC crosslang_static)
target_link_libraries(crossasm PUBLIC crosslang_static)
target_link_libraries(crossdisasm PUBLIC crosslang_static)
if(NOT WIN32)
target_link_libraries(crossthumbnailer PUBLIC crosslang_static)
endif()
else() else()
add_executable(crossc src/crosslangcompiler.cpp ${CROSSLANG_SOURCE} ${CROSSLANG_WIN32_EXE_SRC}) include(cmake/exec.cmake)
add_executable(crossvm src/crosslangvm.cpp ${CROSSLANG_SOURCE} ${CROSSLANG_WIN32_EXE_SRC}) endif()
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(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})
if(NOT WIN32)
add_executable(crossthumbnailer src/crossthumbnailer.cpp ${CROSSLANG_SOURCE} ${CROSSLANG_WIN32_EXE_SRC})
endif()
CROSSLANG_LINK_DEPS(crossc)
CROSSLANG_LINK_DEPS(crossvm)
CROSSLANG_LINK_DEPS(crossint)
CROSSLANG_LINK_DEPS(crosslang)
CROSSLANG_LINK_DEPS(crossdump)
CROSSLANG_LINK_DEPS(crossarchiveextract)
CROSSLANG_LINK_DEPS(crossarchivecreate)
CROSSLANG_LINK_DEPS(crossmerge)
CROSSLANG_LINK_DEPS(crossdisasm)
CROSSLANG_LINK_DEPS(crossasm)
if(NOT WIN32)
CROSSLANG_LINK_DEPS(crossthumbnailer)
endif()
if(CROSSLANG_FETCHCONTENT)
target_link_libraries(crossc PUBLIC tessesframework)
target_link_libraries(crossvm PUBLIC tessesframework)
target_link_libraries(crossint PUBLIC tessesframework)
target_link_libraries(crosslang PUBLIC tessesframework)
target_link_libraries(crossdump PUBLIC tessesframework)
target_link_libraries(crossarchiveextract PUBLIC tessesframework)
target_link_libraries(crossarchivecreate PUBLIC tessesframework)
target_link_libraries(crossasm PUBLIC tessesframework)
target_link_libraries(crossdisasm PUBLIC tessesframework)
target_link_libraries(crossmerge PUBLIC tessesframework)
if(NOT WIN32)
target_link_libraries(crossthumbnailer PUBLIC tessesframework)
endif()
else()
target_link_libraries(crossc PUBLIC TessesFramework::tessesframework)
target_link_libraries(crossvm PUBLIC TessesFramework::tessesframework)
target_link_libraries(crossint PUBLIC TessesFramework::tessesframework)
target_link_libraries(crosslang PUBLIC TessesFramework::tessesframework)
target_link_libraries(crossdump PUBLIC TessesFramework::tessesframework)
target_link_libraries(crossarchiveextract PUBLIC TessesFramework::tessesframework)
target_link_libraries(crossarchivecreate PUBLIC TessesFramework::tessesframework)
target_link_libraries(crossasm PUBLIC TessesFramework::tessesframework)
target_link_libraries(crossdisasm PUBLIC TessesFramework::tessesframework)
target_link_libraries(crossmerge PUBLIC TessesFramework::tessesframework)
if(NOT WIN32)
target_link_libraries(crossthumbnailer PUBLIC TessesFramework::tessesframework)
endif()
endif()
endif()
install(TARGETS crossc DESTINATION "${CMAKE_INSTALL_BINDIR}") install(TARGETS crossc DESTINATION "${CMAKE_INSTALL_BINDIR}")
install(TARGETS crossvm DESTINATION "${CMAKE_INSTALL_BINDIR}") install(TARGETS crossvm DESTINATION "${CMAKE_INSTALL_BINDIR}")
install(TARGETS crossint DESTINATION "${CMAKE_INSTALL_BINDIR}") install(TARGETS crossint DESTINATION "${CMAKE_INSTALL_BINDIR}")
@@ -436,6 +143,7 @@ install(FILES "${CMAKE_CURRENT_SOURCE_DIR}/crosslang.thumbnailer"
DESTINATION ${CMAKE_INSTALL_PREFIX}/share/thumbnailers) DESTINATION ${CMAKE_INSTALL_PREFIX}/share/thumbnailers)
endif() endif()
endif() endif()
endif()
include(InstallRequiredSystemLibraries) include(InstallRequiredSystemLibraries)
set(CPACK_PACKAGE_CONTACT "Mike Nolan <tesses@tesses.net>") set(CPACK_PACKAGE_CONTACT "Mike Nolan <tesses@tesses.net>")
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.md") set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.md")
@@ -475,5 +183,6 @@ set(CPACK_NSIS_CREATE_ICONS_EXTRA "CreateShortCut '$SMPROGRAMS\\\\$STARTMENU_FOL
include(CPack) include(CPack)
if(CROSSLANG_INSTALL_DEVELOPMENT)
add_subdirectory(pkgconfig) add_subdirectory(pkgconfig)
endif()

View File

@@ -1,8 +1,17 @@
FROM onedev.site.tesses.net/tesses-framework/tesses-framework:latest FROM alpine:latest AS build
RUN apt update -y && \
apt install -y --no-install-recommends \ RUN apk update
libjansson-dev wget && \ RUN apk add --no-cache cmake g++ make git
apt clean -y && \
rm -rf /var/lib/apt/lists/* COPY ./ /src
RUN mkdir /src && cd /src && git clone https://onedev.site.tesses.net/crosslang . && cd /src && mkdir build && cd build && cmake -S .. -B . && make -j4 && make install && cd / && rm -r /src
WORKDIR /
RUN cd /src && mkdir build && cd build && cmake -S .. -B . -DTESSESFRAMEWORK_ENABLE_EXAMPLES=OFF -DTESSESFRAMEWORK_ENABLE_APPS=ON -DCMAKE_BUILD_TYPE=Release ; make -j`nproc` && make install DESTDIR=/out
FROM alpine:latest
RUN apk update
RUN apk add --no-cache libstdc++
COPY --from=build /out/usr /usr
ENV CROSSLANG_CONTAINER=1
ENTRYPOINT ["/usr/local/bin/crossint"]

View File

@@ -1,2 +0,0 @@
FROM onedev.site.tesses.net/tesses-framework/tesses-framework:latest
COPY out /

39
Dockerfile.superslim Normal file
View File

@@ -0,0 +1,39 @@
FROM --platform=linux/386 scratch
COPY --from=i686 . /
ENV CROSSLANG_CONTAINER=1
ENTRYPOINT ["/usr/bin/crossint"]
FROM --platform=linux/amd64 scratch
COPY --from=x86_64 . /
ENV CROSSLANG_CONTAINER=1
ENTRYPOINT ["/usr/bin/crossint"]
FROM --platform=linux/ppc scratch
COPY --from=powerpc . /
ENV CROSSLANG_CONTAINER=1
ENTRYPOINT ["/usr/bin/crossint"]
FROM --platform=linux/ppc64 scratch
COPY --from=powerpc64 . /
ENV CROSSLANG_CONTAINER=1
ENTRYPOINT ["/usr/bin/crossint"]
FROM --platform=linux/arm scratch
COPY --from=armv7a . /
ENV CROSSLANG_CONTAINER=1
ENTRYPOINT ["/usr/bin/crossint"]
FROM --platform=linux/arm64 scratch
COPY --from=aarch64 . /
ENV CROSSLANG_CONTAINER=1
ENTRYPOINT ["/usr/bin/crossint"]
FROM --platform=linux/riscv32 scratch
COPY --from=riscv32 . /
ENV CROSSLANG_CONTAINER=1
ENTRYPOINT ["/usr/bin/crossint"]
FROM --platform=linux/riscv64 scratch
COPY --from=riscv64 . /
ENV CROSSLANG_CONTAINER=1
ENTRYPOINT ["/usr/bin/crossint"]

View File

@@ -1,13 +1,13 @@
# Maintainer: Mike Nolan <tesses@tesses.net> # Maintainer: Mike Nolan <tesses@tesses.net>
pkgname=crosslang # '-bzr', '-git', '-hg' or '-svn' pkgname=crosslang # '-bzr', '-git', '-hg' or '-svn'
pkgver=0.0.2 pkgver=0.0.3
pkgrel=1 pkgrel=1
pkgdesc="" pkgdesc=""
arch=('x86_64' 'powerpc') arch=('x86_64' 'powerpc')
url="https://onedev.site.tesses.net/crosslang" url="https://onedev.site.tesses.net/crosslang"
license=('GPLv3') license=('GPLv3')
groups=() groups=()
depends=('mbedtls' 'tesses-framework') depends=('mbedtls' 'tesses-framework=0.0.2')
makedepends=('git' 'cmake' 'make' 'base-devel' 'wget') # 'bzr', 'git', 'mercurial' or 'subversion' makedepends=('git' 'cmake' 'make' 'base-devel' 'wget') # 'bzr', 'git', 'mercurial' or 'subversion'
install= install=
source=('crosslang::git+https://onedev.site.tesses.net/crosslang') source=('crosslang::git+https://onedev.site.tesses.net/crosslang')
@@ -32,9 +32,9 @@ build() {
mkdir build mkdir build
if [[ -z "$CMAKE_TOOLCHAIN" ]]; then 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 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 fi
cd build cd build
@@ -49,4 +49,3 @@ package() {
cd "$srcdir/${pkgname}/build" cd "$srcdir/${pkgname}/build"
make install DESTDIR="$pkgdir/" make install DESTDIR="$pkgdir/"
} }

View File

@@ -0,0 +1,32 @@
#!/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
mkdir -p ../../../../builds/containers/$ARCH/usr/bin
cp crosslang ../../../../builds/containers/$ARCH/usr/bin/crosslang
ln -s crosslang ../../../../builds/containers/$ARCH/usr/bin/crossint
ln -s crosslang ../../../../builds/containers/$ARCH/usr/bin/crossc
ln -s crosslang ../../../../builds/containers/$ARCH/usr/bin/crossvm
ln -s crosslang ../../../../builds/containers/$ARCH/usr/bin/crossarchivecreate
ln -s crosslang ../../../../builds/containers/$ARCH/usr/bin/crossarchiveextract
ln -s crosslang ../../../../builds/containers/$ARCH/usr/bin/crossdump
rm -rf "$DIR"

View File

@@ -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="powerpc64" TOOLCHAIN="powerpc64-linux-musl" bash build-slim.sh
ARCH="armv7a" TOOLCHAIN="armv7l-linux-musleabihf" bash build-slim.sh
ARCH="aarch64" TOOLCHAIN="aarch64-linux-musl" bash build-slim.sh
ARCH="riscv32" TOOLCHAIN="riscv32-linux-musl" bash build-slim.sh
ARCH="riscv64" TOOLCHAIN="riscv64-linux-musl" bash build-slim.sh

View File

@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
mkdir build-x86_64-tar mkdir build-x86_64-tar
cd 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 -j`nproc`
make install DESTDIR=./crosslang-x86_64 make install DESTDIR=./crosslang-x86_64
mkdir -p crosslang-x86_64/share/Tesses/CrossLang mkdir -p crosslang-x86_64/share/Tesses/CrossLang
@@ -12,7 +12,7 @@ cd ..
foreign() { foreign() {
mkdir build-$1\-tar mkdir build-$1\-tar
cd 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 -j`nproc`
make install DESTDIR=./crosslang-$1 make install DESTDIR=./crosslang-$1
mkdir -p crosslang-$1\/share/Tesses/CrossLang mkdir -p crosslang-$1\/share/Tesses/CrossLang

View File

@@ -6,7 +6,7 @@ cd build/jammy
wget -O Tesses.CrossLang.ShellPackage-1.0.0.0-prod.crvm https://downloads.tesses.net/ShellPackage.crvm wget -O Tesses.CrossLang.ShellPackage-1.0.0.0-prod.crvm https://downloads.tesses.net/ShellPackage.crvm
mkdir build-amd64 mkdir build-amd64
apt install -y tessesframework 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 cd build-amd64
make -j`nproc` make -j`nproc`
make install DESTDIR=../crosslang_$DEB_VERSION\_amd64 make install DESTDIR=../crosslang_$DEB_VERSION\_amd64
@@ -21,7 +21,7 @@ dpkg-deb --build crosslang_$DEB_VERSION\_amd64
foreign() { foreign() {
apt install -y tessesframework:$1 apt install -y tessesframework:$1
mkdir build-$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 cd build-$1
make -j`nproc` make -j`nproc`
make install DESTDIR=../crosslang_$DEB_VERSION\_$1 make install DESTDIR=../crosslang_$DEB_VERSION\_$1

View File

@@ -5,7 +5,7 @@ cd build/plucky
wget -O Tesses.CrossLang.ShellPackage-1.0.0.0-prod.crvm https://downloads.tesses.net/ShellPackage.crvm wget -O Tesses.CrossLang.ShellPackage-1.0.0.0-prod.crvm https://downloads.tesses.net/ShellPackage.crvm
mkdir build-amd64 mkdir build-amd64
apt install -y tessesframework 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 cd build-amd64
make -j`nproc` make -j`nproc`
make install DESTDIR=../crosslang_$DEB_VERSION\_amd64 make install DESTDIR=../crosslang_$DEB_VERSION\_amd64
@@ -20,7 +20,7 @@ dpkg-deb --build crosslang_$DEB_VERSION\_amd64
foreign() { foreign() {
apt install -y tessesframework:$1 apt install -y tessesframework:$1
mkdir build-$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 cd build-$1
make -j`nproc` make -j`nproc`
make install DESTDIR=../crosslang_$DEB_VERSION\_$1 make install DESTDIR=../crosslang_$DEB_VERSION\_$1

View File

@@ -1,2 +1,2 @@
export DEB_VERSION=0.0.2 export DEB_VERSION=0.0.3

View File

@@ -1,5 +1,5 @@
#!/bin/bash #!/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 cd build-x86
make -j`nproc` make -j`nproc`
cpack -G NSIS cpack -G NSIS
@@ -7,10 +7,20 @@ cpack -G ZIP
mv TessesCrossLang-*-win32.exe ../../../artifacts/crosslang-win32.exe mv TessesCrossLang-*-win32.exe ../../../artifacts/crosslang-win32.exe
mv TessesCrossLang-*-win32.zip ../../../artifacts/crosslang-win32.zip mv TessesCrossLang-*-win32.zip ../../../artifacts/crosslang-win32.zip
cd .. 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 cd build-x64
make -j`nproc` make -j`nproc`
cpack -G NSIS cpack -G NSIS
cpack -G ZIP cpack -G ZIP
mv TessesCrossLang-*-win64.exe ../../../artifacts/crosslang-win64.exe mv TessesCrossLang-*-win64.exe ../../../artifacts/crosslang-win64.exe
mv TessesCrossLang-*-win64.zip ../../../artifacts/crosslang-win64.zip 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

View File

@@ -1,7 +1,10 @@
# Changelog # Changelog
## 0.0.3
Fixed cmake, unnecessary itteration on dictionary, and a crosslang binary bug when shell is not installed
## 0.0.2 ## 0.0.2
Add uuids and bytestreams Add uuids, bytestreams and single file runtime binaries
## 0.0.1 ## 0.0.1
Start versioning Start versioning

57
cmake/exec.cmake Normal file
View File

@@ -0,0 +1,57 @@
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})
if(NOT WIN32)
add_executable(crossthumbnailer src/crossthumbnailer.cpp ${CROSSLANG_SOURCE} ${CROSSLANG_WIN32_EXE_SRC})
endif()
CROSSLANG_LINK_DEPS(crossc)
CROSSLANG_LINK_DEPS(crossvm)
CROSSLANG_LINK_DEPS(crossint)
CROSSLANG_LINK_DEPS(crosslang)
CROSSLANG_LINK_DEPS(crossdump)
CROSSLANG_LINK_DEPS(crossarchiveextract)
CROSSLANG_LINK_DEPS(crossarchivecreate)
CROSSLANG_LINK_DEPS(crossmerge)
CROSSLANG_LINK_DEPS(crossdisasm)
CROSSLANG_LINK_DEPS(crossasm)
if(NOT WIN32)
CROSSLANG_LINK_DEPS(crossthumbnailer)
endif()
if(CROSSLANG_FETCHCONTENT)
target_link_libraries(crossc PUBLIC tessesframework)
target_link_libraries(crossvm PUBLIC tessesframework)
target_link_libraries(crossint PUBLIC tessesframework)
target_link_libraries(crosslang PUBLIC tessesframework)
target_link_libraries(crossdump PUBLIC tessesframework)
target_link_libraries(crossarchiveextract PUBLIC tessesframework)
target_link_libraries(crossarchivecreate PUBLIC tessesframework)
target_link_libraries(crossasm PUBLIC tessesframework)
target_link_libraries(crossdisasm PUBLIC tessesframework)
target_link_libraries(crossmerge PUBLIC tessesframework)
if(NOT WIN32)
target_link_libraries(crossthumbnailer PUBLIC tessesframework)
endif()
else()
target_link_libraries(crossc PUBLIC TessesFramework::tessesframework)
target_link_libraries(crossvm PUBLIC TessesFramework::tessesframework)
target_link_libraries(crossint PUBLIC TessesFramework::tessesframework)
target_link_libraries(crosslang PUBLIC TessesFramework::tessesframework)
target_link_libraries(crossdump PUBLIC TessesFramework::tessesframework)
target_link_libraries(crossarchiveextract PUBLIC TessesFramework::tessesframework)
target_link_libraries(crossarchivecreate PUBLIC TessesFramework::tessesframework)
target_link_libraries(crossasm PUBLIC TessesFramework::tessesframework)
target_link_libraries(crossdisasm PUBLIC TessesFramework::tessesframework)
target_link_libraries(crossmerge PUBLIC TessesFramework::tessesframework)
if(NOT WIN32)
target_link_libraries(crossthumbnailer PUBLIC TessesFramework::tessesframework)
endif()
endif()

62
cmake/linkdeps.cmake Normal file
View File

@@ -0,0 +1,62 @@
function(CROSSLANG_LINK_DEPS CROSSLANG_TARGET_NAME)
target_include_directories(${CROSSLANG_TARGET_NAME}
PUBLIC
"$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/include>"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
)
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)
endif()
if(CROSSLANG_ENABLE_CONFIG_ENVVAR)
target_compile_definitions(${CROSSLANG_TARGET_NAME} PUBLIC CROSSLANG_ENABLE_CONFIG_ENVVAR)
endif()
if(CROSSLANG_ENABLE_PROCESS)
target_compile_definitions(${CROSSLANG_TARGET_NAME} PUBLIC CROSSLANG_ENABLE_PROCESS)
endif()
if(CROSSLANG_ENABLE_THREADING)
target_compile_definitions(${CROSSLANG_TARGET_NAME} PUBLIC CROSSLANG_ENABLE_THREADING)
endif()
if(CROSSLANG_ENABLE_TERMIOS)
target_compile_definitions(${CROSSLANG_TARGET_NAME} PUBLIC CROSSLANG_ENABLE_TERMIOS)
endif()
if(CROSSLANG_ENABLE_SQLITE)
target_compile_definitions(${CROSSLANG_TARGET_NAME} PUBLIC CROSSLANG_ENABLE_SQLITE)
endif()
if(CROSSLANG_CUSTOM_CONSOLE)
target_compile_definitions(${CROSSLANG_TARGET_NAME} PUBLIC CROSSLANG_CUSTOM_CONSOLE)
endif()
if(CROSSLANG_ENABLE_PLATFORM_FOLDERS)
target_compile_definitions(${CROSSLANG_TARGET_NAME} PUBLIC CROSSLANG_ENABLE_PLATFORM_FOLDERS)
endif()
if(CROSSLANG_ENABLE_SHARED)
target_compile_definitions(${CROSSLANG_TARGET_NAME} PUBLIC CROSSLANG_ENABLE_SHARED)
endif()
if("${CMAKE_SYSTEM_NAME}" STREQUAL "NintendoWii" OR "${CMAKE_SYSTEM_NAME}" STREQUAL "NintendoGameCube")
target_link_libraries(${CROSSLANG_TARGET_NAME} PUBLIC fat)
endif()
if("${CMAKE_SYSTEM_NAME}" STREQUAL "NintendoWii")
target_link_libraries(${CROSSLANG_TARGET_NAME} PUBLIC wiisocket)
endif()
if(CROSSLANG_ENABLE_SHARED AND NOT ("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows"))
target_link_libraries(${CROSSLANG_TARGET_NAME} PUBLIC dl)
endif()
target_include_directories(${CROSSLANG_TARGET_NAME}
PUBLIC
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>"
"$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
)
endfunction()

18
cmake/options.cmake Normal file
View File

@@ -0,0 +1,18 @@
option(CROSSLANG_ENABLE_STATIC "Enable Tesses CrossLang static libraries" ON)
option(CROSSLANG_ENABLE_SHARED "Enable Tesses CrossLang shared libraries" ON)
option(CROSSLANG_ENABLE_BINARIES "Enable Tesses CrossLang binaries" ON)
option(CROSSLANG_INSTALL_DEVELOPMENT "Enable Tesses CrossLang development files" ON)
option(CROSSLANG_ENABLE_THREADING "Enable Tesses CrossLang threading" ON)
option(CROSSLANG_ENABLE_TERMIOS "Enable termios (For changing terminal options)" ON)
option(CROSSLANG_SHARED_EXECUTABLES "Link with libcrosslang_shared" ON)
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)
set(CROSSLANG_OFFLINE_SHELL_PACKAGE "" CACHE FILEPATH "Path to the shell package generated from https://onedev.site.tesses.net/CrossLang/CrossLangExtras")

34
cmake/shared.cmake Normal file
View File

@@ -0,0 +1,34 @@
if(CROSSLANG_INSTALL_DEVELOPMENT)
install(TARGETS ${TessesCrossLangLibs}
EXPORT TessesCrossLangTargets
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)
install(FILES include/CrossLang.hpp DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/include/CrossLangVersion.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(EXPORT TessesCrossLangTargets
FILE TessesCrossLangTargets.cmake
NAMESPACE TessesCrossLang::
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/TessesCrossLang
)
configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/TessesCrossLangConfig.cmake"
INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/TessesCrossLang)
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
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)
endif()
endif()

37
cmake/shared_exec.cmake Normal file
View File

@@ -0,0 +1,37 @@
if(CROSSLANG_ENABLE_RPATH)
set(CMAKE_MACOSX_RPATH 1)
set(CMAKE_BUILD_RPATH_USE_ORIGIN TRUE)
if (APPLE)
set(CMAKE_INSTALL_RPATH "@executable_path/../${CMAKE_INSTALL_LIBDIR}")
else()
set(CMAKE_INSTALL_RPATH "$ORIGIN/../${CMAKE_INSTALL_LIBDIR}")
endif()
endif()
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/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()
target_link_libraries(crossc PUBLIC crosslang_shared)
target_link_libraries(crossvm PUBLIC crosslang_shared)
target_link_libraries(crossint PUBLIC crosslang_shared)
target_link_libraries(crossdump PUBLIC crosslang_shared)
target_link_libraries(crosslang PUBLIC crosslang_shared)
target_link_libraries(crossarchiveextract PUBLIC crosslang_shared)
target_link_libraries(crossarchivecreate PUBLIC crosslang_shared)
target_link_libraries(crossasm PUBLIC crosslang_shared)
target_link_libraries(crossdisasm PUBLIC crosslang_shared)
target_link_libraries(crossmerge PUBLIC crosslang_shared)
if(NOT WIN32)
target_link_libraries(crossthumbnailer PUBLIC crosslang_shared)
endif()

21
cmake/slim.cmake Normal file
View File

@@ -0,0 +1,21 @@
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}")

66
cmake/sources.cmake Normal file
View File

@@ -0,0 +1,66 @@
list(APPEND CROSSLANG_SOURCE
src/vm/bc/add.cpp
src/vm/bc/sub.cpp
src/vm/bc/getfield.cpp
src/vm/bc/setfield.cpp
src/vm/bc/tostring.cpp
src/vm/bc/equals.cpp
src/vm/bc/invokemethod.cpp
src/vm/bc/executemethod2.cpp
src/vm/bc/invoketwo.cpp
src/vm/bc/tobool.cpp
src/assembler/asm.cpp
src/assembler/disasm.cpp
src/assembler/merge.cpp
src/compiler/codegen.cpp
src/compiler/lexer.cpp
src/compiler/parser.cpp
src/compiler/ast.cpp
src/runtime_methods/uuid.cpp
src/runtime_methods/class.cpp
src/runtime_methods/console.cpp
src/runtime_methods/io.cpp
src/runtime_methods/std.cpp
src/runtime_methods/net.cpp
src/runtime_methods/vm.cpp
src/runtime_methods/json.cpp
src/runtime_methods/sqlite.cpp
src/runtime_methods/dictionary.cpp
src/runtime_methods/crypto.cpp
src/runtime_methods/ogc.cpp
src/runtime_methods/path.cpp
src/runtime_methods/env.cpp
src/runtime_methods/process.cpp
src/runtime_methods/helpers.cpp
src/types/embed.cpp
src/types/async.cpp
src/types/associativearray.cpp
src/types/any.cpp
src/types/ittr.cpp
src/types/closure.cpp
src/types/dictionary.cpp
src/types/externalmethod.cpp
src/types/list.cpp
src/types/native.cpp
src/types/rootenvironment.cpp
src/types/subenvironment.cpp
src/types/vfsheapobject.cpp
src/types/streamheapobject.cpp
src/types/class.cpp
src/types/classenvironment.cpp
src/types/random.cpp
src/vm/filereader.cpp
src/vm/gc.cpp
src/vm/gclist.cpp
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
)

28
cmake/static_exec.cmake Normal file
View File

@@ -0,0 +1,28 @@
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})
if(NOT WIN32)
add_executable(crossthumbnailer src/crossthumbnailer.cpp ${CROSSLANG_WIN32_EXE_SRC})
endif()
target_link_libraries(crossc PUBLIC crosslang_static)
target_link_libraries(crossvm PUBLIC crosslang_static)
target_link_libraries(crossint PUBLIC crosslang_static)
target_link_libraries(crossdump PUBLIC crosslang_static)
target_link_libraries(crosslang PUBLIC crosslang_static)
target_link_libraries(crossarchiveextract PUBLIC crosslang_static)
target_link_libraries(crossarchivecreate PUBLIC crosslang_static)
target_link_libraries(crossmerge PUBLIC crosslang_static)
target_link_libraries(crossasm PUBLIC crosslang_static)
target_link_libraries(crossdisasm PUBLIC crosslang_static)
if(NOT WIN32)
target_link_libraries(crossthumbnailer PUBLIC crosslang_static)
endif()

3
cmake/version.cmake Normal file
View File

@@ -0,0 +1,3 @@
set(CROSSLANG_MAJOR_VERSION 0)
set(CROSSLANG_MINOR_VERSION 0)
set(CROSSLANG_PATCH_VERSION 3)

View File

@@ -1456,7 +1456,7 @@ class GC {
~GCList(); ~GCList();
friend class GC;
}; };
@@ -2028,19 +2028,11 @@ class GC {
GCList* ls; GCList* ls;
TObjectVFS(GC* gc, TObject obj); TObjectVFS(GC* gc, TObject obj);
std::shared_ptr<Tesses::Framework::Streams::Stream> OpenFile(Tesses::Framework::Filesystem::VFSPath path, std::string mode); std::shared_ptr<Tesses::Framework::Streams::Stream> OpenFile(Tesses::Framework::Filesystem::VFSPath path, std::string mode);
Tesses::Framework::Filesystem::FIFOCreationResult CreateFIFO(Tesses::Framework::Filesystem::VFSPath path);
void CreateDirectory(Tesses::Framework::Filesystem::VFSPath path); void CreateDirectory(Tesses::Framework::Filesystem::VFSPath path);
void DeleteDirectory(Tesses::Framework::Filesystem::VFSPath path); void DeleteDirectory(Tesses::Framework::Filesystem::VFSPath path);
bool RegularFileExists(Tesses::Framework::Filesystem::VFSPath path);
bool SymlinkExists(Tesses::Framework::Filesystem::VFSPath path);
bool CharacterDeviceExists(Tesses::Framework::Filesystem::VFSPath path);
bool BlockDeviceExists(Tesses::Framework::Filesystem::VFSPath path);
bool SocketFileExists(Tesses::Framework::Filesystem::VFSPath path);
bool FIFOFileExists(Tesses::Framework::Filesystem::VFSPath path);
bool FileExists(Tesses::Framework::Filesystem::VFSPath path);
bool SpecialFileExists(Tesses::Framework::Filesystem::VFSPath path);
void CreateSymlink(Tesses::Framework::Filesystem::VFSPath existingFile, Tesses::Framework::Filesystem::VFSPath symlinkFile); void CreateSymlink(Tesses::Framework::Filesystem::VFSPath existingFile, Tesses::Framework::Filesystem::VFSPath symlinkFile);
void CreateHardlink(Tesses::Framework::Filesystem::VFSPath existingFile, Tesses::Framework::Filesystem::VFSPath newName); void CreateHardlink(Tesses::Framework::Filesystem::VFSPath existingFile, Tesses::Framework::Filesystem::VFSPath newName);
bool DirectoryExists(Tesses::Framework::Filesystem::VFSPath path);
void DeleteFile(Tesses::Framework::Filesystem::VFSPath path); void DeleteFile(Tesses::Framework::Filesystem::VFSPath path);
void Lock(Tesses::Framework::Filesystem::VFSPath path); void Lock(Tesses::Framework::Filesystem::VFSPath path);
void Unlock(Tesses::Framework::Filesystem::VFSPath path); void Unlock(Tesses::Framework::Filesystem::VFSPath path);
@@ -2052,10 +2044,13 @@ class GC {
Tesses::Framework::Filesystem::VFSPath ReadLink(Tesses::Framework::Filesystem::VFSPath path); Tesses::Framework::Filesystem::VFSPath ReadLink(Tesses::Framework::Filesystem::VFSPath path);
std::string VFSPathToSystem(Tesses::Framework::Filesystem::VFSPath path); std::string VFSPathToSystem(Tesses::Framework::Filesystem::VFSPath path);
Tesses::Framework::Filesystem::VFSPath SystemToVFSPath(std::string path); Tesses::Framework::Filesystem::VFSPath SystemToVFSPath(std::string path);
void GetDate(Tesses::Framework::Filesystem::VFSPath path, Tesses::Framework::Date::DateTime& lastWrite, Tesses::Framework::Date::DateTime& lastAccess);
void SetDate(Tesses::Framework::Filesystem::VFSPath path, Tesses::Framework::Date::DateTime lastWrite, Tesses::Framework::Date::DateTime lastAccess); void SetDate(Tesses::Framework::Filesystem::VFSPath path, Tesses::Framework::Date::DateTime lastWrite, Tesses::Framework::Date::DateTime lastAccess);
void Chmod(Tesses::Framework::Filesystem::VFSPath path, uint32_t mode); void Chmod(Tesses::Framework::Filesystem::VFSPath path, uint32_t mode);
void Chown(Tesses::Framework::Filesystem::VFSPath path, uint32_t uid, uint32_t gid);
bool StatVFS(Tesses::Framework::Filesystem::VFSPath path, Tesses::Framework::Filesystem::StatVFSData& data); bool StatVFS(Tesses::Framework::Filesystem::VFSPath path, Tesses::Framework::Filesystem::StatVFSData& data);
bool Stat(Tesses::Framework::Filesystem::VFSPath path, Tesses::Framework::Filesystem::StatData& data);
void Close(); void Close();
~TObjectVFS(); ~TObjectVFS();
}; };
@@ -2615,5 +2610,15 @@ class GC {
Tesses::Framework::Filesystem::VFSPath SystemToVFSPath(std::string path); Tesses::Framework::Filesystem::VFSPath SystemToVFSPath(std::string path);
}; };
namespace Programs {
int64_t CrossArchiveCreate(std::vector<std::string>& argv);
int64_t CrossArchiveExtract(std::vector<std::string>& argv);
TObject CrossLangInterperter(GCList& ls,TRootEnvironment* env,std::vector<std::string>& argv);
TObject CrossLangShell(GCList& ls, std::vector<std::string>& argv);
TObject CrossLangVM(GCList& ls,TRootEnvironment* env, std::vector<std::string>& argv);
void CrossLangDump(std::shared_ptr<Tesses::Framework::Streams::Stream> strm);
void CrossLangCompiler(std::vector<std::string>& argv);
}
}; };

View File

@@ -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 <filename.crvm> <args...>\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;arg<argc;arg++)
args->Add(std::string(argv[arg]));
auto res = env->CallFunctionWithFatalError(ls,"main",{args});
int64_t iresult;
if(GetObject(res,iresult))
return (int)iresult;
}
return 0;
}

View File

@@ -1,11 +1,11 @@
#include "CrossLang.hpp" #include "CrossLang.hpp"
#include <iostream> #include <iostream>
using namespace Tesses::CrossLang; namespace Tesses::CrossLang::Programs {
using namespace Tesses::Framework::Filesystem; using namespace Tesses::Framework::Filesystem;
using namespace Tesses::Framework::Streams; using namespace Tesses::Framework::Streams;
void Help(const char* filename) static void Help(std::string& filename)
{ {
printf("USAGE: %s [OPTIONS] <dirasroot> <archive.crvm>\n", filename); std::cout << "USAGE: " << filename << " [OPTIONS] <dirasroot> <archive.crvm>" << std::endl;
printf("OPTIONS:\n"); 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 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"); 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"); printf("Options except for help have flag with arg like this: -F ARG\n");
exit(1); exit(1);
} }
int main(int argc, char** argv)
int64_t CrossArchiveCreate(std::vector<std::string>& argv)
{ {
Tesses::Framework::TF_Init(); Tesses::Framework::TF_Init();
std::string name="out"; std::string name="out";
@@ -23,40 +24,40 @@ int main(int argc, char** argv)
TVMVersion version; TVMVersion version;
std::string icon=""; std::string icon="";
std::vector<std::string> args; std::vector<std::string> 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]); Help(argv[0]);
} }
else if(strcmp(argv[i], "-i") == 0) else if(argv[i] == "-i")
{ {
i++; i++;
if(i < argc) if(i < argv.size())
{ {
info = argv[i]; info = argv[i];
} }
} }
else if(strcmp(argv[i], "-I") == 0) else if(argv[i] == "-I")
{ {
i++; i++;
if(i < argc) if(i < argv.size())
{ {
icon = argv[i]; icon = argv[i];
} }
} }
else if(strcmp(argv[i], "-n") == 0) else if(argv[i] == "-n")
{ {
i++; i++;
if(i < argc) if(i < argv.size())
{ {
name = argv[i]; name = argv[i];
} }
} }
else if(strcmp(argv[i], "-v") == 0) else if(argv[i] == "-v")
{ {
i++; i++;
if(i < argc) if(i < argv.size())
{ {
if(!TVMVersion::TryParse(argv[i],version)) if(!TVMVersion::TryParse(argv[i],version))
@@ -91,3 +92,4 @@ int main(int argc, char** argv)
return 0; return 0;
} }
}

View File

@@ -1,30 +1,29 @@
#include "CrossLang.hpp" #include "CrossLang.hpp"
#include <iostream> #include <iostream>
using namespace Tesses::CrossLang;
namespace Tesses::CrossLang::Programs {
using namespace Tesses::Framework::Filesystem; using namespace Tesses::Framework::Filesystem;
using namespace Tesses::Framework::Streams; using namespace Tesses::Framework::Streams;
int main(int argc, char** argv) int64_t CrossArchiveExtract(std::vector<std::string>& argv)
{ {
Tesses::Framework::TF_Init(); Tesses::Framework::TF_Init();
if(argc < 3) if(argv.size() < 3)
{ {
printf("USAGE: %s <archive.crvm> <dirasroot>\n", argv[0]); std::cout << "USAGE: " << argv[0] << " <archive.crvm> <dirasroot>" << std::endl;
return 1; return 1;
} }
auto sdfs= std::make_shared<SubdirFilesystem>(Tesses::Framework::Filesystem::LocalFS,std::string(argv[2])); auto sdfs= std::make_shared<SubdirFilesystem>(Tesses::Framework::Filesystem::LocalFS,std::string(argv[2]));
auto strm= LocalFS->OpenFile(argv[1], "rb");
FILE* f = fopen(argv[1],"rb"); if(strm->CanRead())
if(f == NULL)
{ {
printf("ERROR: could not open %s\n", argv[1]); std::cout << "ERROR: could not open " << argv[1] << std::endl;
return 1; return 1;
} }
auto strm = std::make_shared<FileStream>(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 Name: " << res.first.first << std::endl;
std::cout << "Crvm Version: " << res.first.second.ToString() << std::endl; std::cout << "Crvm Version: " << res.first.second.ToString() << std::endl;
@@ -32,3 +31,4 @@ int main(int argc, char** argv)
return 0; return 0;
} }
}

View File

@@ -1,20 +1,20 @@
#include "CrossLang.hpp" #include "CrossLang.hpp"
#include <iostream> #include <iostream>
using namespace Tesses::CrossLang; namespace Tesses::CrossLang::Programs {
void Ensure(Tesses::Framework::Streams::Stream& strm,uint8_t* buffer, size_t len) static void Ensure(std::shared_ptr<Tesses::Framework::Streams::Stream> 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)."); 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<Tesses::Framework::Streams::Stream> strm)
{ {
uint8_t buff[4]; uint8_t buff[4];
Ensure(strm,buff,sizeof(buff)); Ensure(strm,buff,sizeof(buff));
return BitConverter::ToUint32BE(buff[0]); return BitConverter::ToUint32BE(buff[0]);
} }
std::string EnsureString(Tesses::Framework::Streams::Stream& strm) static std::string EnsureString(std::shared_ptr<Tesses::Framework::Streams::Stream> strm)
{ {
size_t len = (size_t)EnsureInt(strm); size_t len = (size_t)EnsureInt(strm);
std::string myStr={}; std::string myStr={};
@@ -22,30 +22,24 @@ std::string EnsureString(Tesses::Framework::Streams::Stream& strm)
Ensure(strm,(uint8_t*)myStr.data(), len); Ensure(strm,(uint8_t*)myStr.data(), len);
return myStr; return myStr;
} }
void DumpFile(std::filesystem::path p) void CrossLangDump(std::shared_ptr<Tesses::Framework::Streams::Stream> 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 throw VMException("Runtime is too old.");
{ }
std::cout << "File: " << p.string() << std::endl; TVMVersion v2(main_header+13);
Tesses::Framework::Streams::FileStream strm(p,"rb"); std::cout << "Version: " << v2.ToString() << std::endl;
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;
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<std::string> strs; std::vector<std::string> strs;
std::unordered_map<uint32_t, std::vector<std::string>> funs; std::unordered_map<uint32_t, std::vector<std::string>> funs;
std::vector<std::vector<std::string>> closures; std::vector<std::vector<std::string>> closures;
@@ -177,7 +171,7 @@ void DumpFile(std::filesystem::path p)
} }
auto len = EnsureInt(strm); auto len = EnsureInt(strm);
strm.Seek(len,Tesses::Framework::Streams::SeekOrigin::Current); strm->Seek(len,Tesses::Framework::Streams::SeekOrigin::Current);
closures.push_back(args); closures.push_back(args);
} }
@@ -208,7 +202,7 @@ void DumpFile(std::filesystem::path p)
} }
else else
{ {
strm.Seek((int64_t)tableLen,Tesses::Framework::Streams::SeekOrigin::Current); strm->Seek((int64_t)tableLen,Tesses::Framework::Streams::SeekOrigin::Current);
} }
} }
if(hasIcon) if(hasIcon)
@@ -252,22 +246,10 @@ void DumpFile(std::filesystem::path p)
for(auto str : strs) { for(auto str : strs) {
std::cout << EscapeString(str, true) << std::endl; 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]);
}
} }

View File

@@ -1,13 +1,37 @@
#include "CrossLang.hpp" #include "CrossLang.hpp"
#include "TessesFramework/Platform/Environment.hpp"
#include <iostream> #include <iostream>
#include <string> #include <string>
using namespace Tesses::Framework; using namespace Tesses::Framework;
using namespace Tesses::CrossLang;
using namespace Tesses::Framework::Http; using namespace Tesses::Framework::Http;
bool Download(Tesses::Framework::Filesystem::VFSPath filename,std::shared_ptr<Tesses::Framework::Filesystem::VFS> vfs) namespace Tesses::CrossLang::Programs
{ {
static bool Download(Tesses::Framework::Filesystem::VFSPath filename,std::shared_ptr<Tesses::Framework::Filesystem::VFS> vfs)
{
auto inContainer=Platform::Environment::GetVariable("CROSSLANG_CONTAINER");
if(inContainer && (*inContainer=="1" || *inContainer=="y" || *inContainer=="Y"))
{
HttpRequest req;
req.url = "https://downloads.tesses.net/ShellPackage.crvm";
req.method = "GET";
HttpResponse resp(req);
if(resp.statusCode == StatusCode::OK)
{
auto strm = resp.ReadAsStream();
CrossLang::CrossArchiveExtract(strm, vfs);
return true;
}
else
{
std::cout << "Error when fetching the script error: " << std::to_string(resp.statusCode) << " " << HttpUtils::StatusCodeString(resp.statusCode) << std::endl;
return false;
}
}
while(true) while(true)
{ {
std::cout << "File " << filename.ToString() << " not found, do you want to download the installer from: https://downloads.tesses.net/ShellPackage.crvm (this may install other stuff as well) (Y/n)? "; std::cout << "File " << filename.ToString() << " not found, do you want to download the installer from: https://downloads.tesses.net/ShellPackage.crvm (this may install other stuff as well) (Y/n)? ";
@@ -22,7 +46,7 @@ bool Download(Tesses::Framework::Filesystem::VFSPath filename,std::shared_ptr<Te
if(resp.statusCode == StatusCode::OK) if(resp.statusCode == StatusCode::OK)
{ {
auto strm = resp.ReadAsStream(); auto strm = resp.ReadAsStream();
CrossArchiveExtract(strm, vfs); CrossLang::CrossArchiveExtract(strm, vfs);
return true; return true;
} }
@@ -46,13 +70,8 @@ bool Download(Tesses::Framework::Filesystem::VFSPath filename,std::shared_ptr<Te
return false; return false;
} }
int main(int argc, char** argv) TObject CrossLangShell(GCList& ls, std::vector<std::string>& argv)
{ {
TF_InitWithConsole();
if(argc > 0)
TF_AllowPortable(argv[0]);
Tesses::Framework::Filesystem::VFSPath dir = GetCrossLangConfigDir(); Tesses::Framework::Filesystem::VFSPath dir = GetCrossLangConfigDir();
@@ -60,12 +79,12 @@ int main(int argc, char** argv)
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"; 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; std::cout << dir.ToString() << std::endl;
return 0; 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::SubdirFilesystem>(Tesses::Framework::Filesystem::LocalFS,dir); auto subdir = std::make_shared<Tesses::Framework::Filesystem::SubdirFilesystem>(Tesses::Framework::Filesystem::LocalFS,dir);
@@ -76,7 +95,7 @@ int main(int argc, char** argv)
if(resp.statusCode == StatusCode::OK) if(resp.statusCode == StatusCode::OK)
{ {
auto strm = resp.ReadAsStream(); auto strm = resp.ReadAsStream();
CrossArchiveExtract(strm, subdir); CrossLang::CrossArchiveExtract(strm, subdir);
return 0; return 0;
} }
@@ -97,7 +116,7 @@ int main(int argc, char** argv)
auto strm = Tesses::Framework::Filesystem::LocalFS->OpenFile(p,"rb"); auto strm = Tesses::Framework::Filesystem::LocalFS->OpenFile(p,"rb");
if(strm != nullptr) if(strm != nullptr)
{ {
CrossArchiveExtract(strm, subdir); CrossLang::CrossArchiveExtract(strm, subdir);
} }
else else
@@ -113,29 +132,24 @@ int main(int argc, char** argv)
} }
GC gc;
gc.Start();
GCList ls(gc);
TRootEnvironment* env = TRootEnvironment::Create(ls, TDictionary::Create(ls)); 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); TList* args = TList::Create(ls);
args->Add(filename.ToString()); args->Add(filename.ToString());
for(int arg=1;arg<argc;arg++) for(size_t arg=1;arg<argv.size();arg++)
args->Add(std::string(argv[arg])); args->Add(std::string(argv[arg]));
auto res = env->CallFunctionWithFatalError(ls,"main",{args}); return env->CallFunctionWithFatalError(ls,"main",{args});
int64_t iresult;
if(GetObject(res,iresult)) }
return (int)iresult;
return 0;
} }

View File

@@ -0,0 +1,290 @@
#include "CrossLang.hpp"
#include <iostream>
#include <fstream>
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<std::string>& argv)
{
/*std::ifstream strm(argv[1],std::ios_base::in|std::ios_base::binary);
std::vector<LexToken> tokens;
Lex(argv[1],strm,tokens);
Parser parser(tokens);
CodeGen gen;
gen.GenRoot(parser.ParseRoot());
std::vector<uint8_t> data;
ByteCodeVectorWriter w(data);
gen.Save(std::filesystem::current_path(),w);
*/
TF_InitWithConsole();
std::filesystem::path outputDir = std::filesystem::current_path() / "bin";
std::vector<std::filesystem::path> source;
std::filesystem::path resourceDir = std::filesystem::current_path() / "res";
std::vector<std::pair<std::string, TVMVersion>> dependencies;
std::vector<std::pair<std::string, TVMVersion>> 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<std::string,TVMVersion>(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<std::string,TVMVersion>(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<LexToken> 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<SubdirFilesystem>(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<SubdirFilesystem>(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<Tesses::Framework::Streams::FileStream>(outputDir / (name + "-" + version.ToString() + ".crvm"),"wb");
gen.Save(strm);
}
if(gc != nullptr)
{
delete ls;
delete gc;
}
}
}

View File

@@ -4,20 +4,13 @@
#include <sstream> #include <sstream>
#include <vector> #include <vector>
using namespace Tesses::Framework; using namespace Tesses::Framework;
using namespace Tesses::CrossLang;
using namespace Tesses::Framework::Filesystem; 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);
if(argc > 1) namespace Tesses::CrossLang::Programs {
TObject CrossLangInterperter(GCList& ls,TRootEnvironment* env,std::vector<std::string>& argv)
{
GC* gc = ls.GetGC();
if(argv.size() > 1)
{ {
std::ifstream strm(argv[1],std::ios_base::in|std::ios_base::binary); std::ifstream strm(argv[1],std::ios_base::in|std::ios_base::binary);
std::vector<LexToken> tokens; std::vector<LexToken> tokens;
@@ -32,30 +25,28 @@ int main(int argc, char** argv)
gen.GenRoot(parser.ParseRoot()); gen.GenRoot(parser.ParseRoot());
std::vector<uint8_t> data; std::vector<uint8_t> data;
{ {
auto strm2 = std::make_shared<Tesses::Framework::Streams::MemoryStream>(true); auto strm2 = std::make_shared<Tesses::Framework::Streams::MemoryStream>(true);
gen.Save(strm2); gen.Save(strm2);
{ {
TFile* file = TFile::Create(ls); TFile* file = TFile::Create(ls);
strm2->Seek(0,Tesses::Framework::Streams::SeekOrigin::Begin); strm2->Seek(0,Tesses::Framework::Streams::SeekOrigin::Begin);
file->Load(&gc,strm2); file->Load(gc,strm2);
env->LoadFile(&gc, file); env->LoadFile(gc, file);
}
} }
}
TList* args = TList::Create(ls); TList* args = TList::Create(ls);
for(int arg=1;arg<argc;arg++) for(int arg=1;arg<argv.size();arg++)
args->Add(std::string(argv[arg])); args->Add(std::string(argv[arg]));
return env->CallFunctionWithFatalError(ls,"main",{args});
auto res = env->CallFunctionWithFatalError(ls,"main",{args});
int64_t iresult;
if(GetObject(res,iresult))
return (int)iresult;
} }
else else
@@ -91,7 +82,7 @@ int main(int argc, char** argv)
} }
else if(source == "exit") else if(source == "exit")
{ {
return 0; return (int64_t)0;
} }
else else
{ {
@@ -116,9 +107,9 @@ int main(int argc, char** argv)
TFile* file = TFile::Create(ls); TFile* file = TFile::Create(ls);
strm2->Seek(0,Tesses::Framework::Streams::SeekOrigin::Begin); 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;
}
} }

View File

@@ -0,0 +1,61 @@
#include "CrossLang.hpp"
using namespace Tesses::Framework;
namespace Tesses::CrossLang::Programs {
TObject CrossLangVM(GCList& ls,TRootEnvironment* env, std::vector<std::string>& argv)
{
if(argv.size() < 2)
{
std::cout << "USAGE: " << (argv.empty() ? (std::string)"crossvm" : argv[0]) << " <filename.crvm> <args...>" << 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;arg<argv.size();arg++)
args->Add(std::string(argv[arg]));
return env->CallFunctionWithFatalError(ls,"main",{args});
}
}
}

View File

@@ -0,0 +1,9 @@
#include "CrossLang.hpp"
int main(int argc, char** argv)
{
std::vector<std::string> args(argc);
for(int i = 0; i < argc; i++)
args[i] = argv[i];
return (int)Tesses::CrossLang::Programs::CrossArchiveCreate(args);
}

View File

@@ -0,0 +1,9 @@
#include "CrossLang.hpp"
int main(int argc, char** argv)
{
std::vector<std::string> args(argc);
for(int i = 0; i < argc; i++)
args[i] = argv[i];
return (int)Tesses::CrossLang::Programs::CrossArchiveExtract(args);
}

View File

@@ -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<std::string> 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;
}

View File

@@ -0,0 +1,23 @@
#include "CrossLang.hpp"
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
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<std::string> args(argc);
for(int i = 0; i < argc; i++)
args[i] = argv[i];
Programs::CrossLangCompiler(args);
return 0;
}

View File

@@ -0,0 +1,28 @@
#include "CrossLang.hpp"
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
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;
}
}
}

View File

@@ -0,0 +1,29 @@
#include "CrossLang.hpp"
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
using namespace Tesses::Framework;
using namespace Tesses::CrossLang;
using namespace Tesses::Framework::Filesystem;
static GC gc;
int main(int argc, char** argv)
{
TF_InitWithConsole();
if(argc > 0)
TF_AllowPortable(argv[0]);
gc.Start();
GCList ls(gc);
TRootEnvironment* env = TRootEnvironment::Create(ls, TDictionary::Create(ls));
TStd::RegisterStd(&gc,env);
std::vector<std::string> 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;
}

View File

@@ -0,0 +1,30 @@
#include "CrossLang.hpp"
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
using namespace Tesses::Framework;
using namespace Tesses::CrossLang;
using namespace Tesses::Framework::Filesystem;
static GC gc;
int main(int argc, char** argv)
{
TF_InitWithConsole();
if(argc > 0)
TF_AllowPortable(argv[0]);
gc.Start();
GCList ls(gc);
TRootEnvironment* env = TRootEnvironment::Create(ls, TDictionary::Create(ls));
TStd::RegisterStd(&gc,env);
std::vector<std::string> 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;
}

180
src/programs/slim.cpp Normal file
View File

@@ -0,0 +1,180 @@
#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<std::string> args(argc);
for(int i = 0; i < argc; i++)
args[i] = argv[i];
if(programName == "crossint")
{
GC gc;
gc.Start();
int64_t myi64=0;
{
GCList ls(gc);
TRootEnvironment* env = TRootEnvironment::Create(ls, TDictionary::Create(ls));
TStd::RegisterStd(&gc,env);
auto res= Programs::CrossLangInterperter(ls, env, args);
GetObject(res,myi64);
}
return (int)myi64;
}
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();
int64_t myi64=0;
{
GCList ls(gc);
TRootEnvironment* env = TRootEnvironment::Create(ls, TDictionary::Create(ls));
TStd::RegisterStd(&gc,env);
auto res= Programs::CrossLangVM(ls, env, args);
GetObject(res,myi64);
}
return (int)myi64;
}
else if(args.size() > 1)
{
if(args[1] == "crossint")
{
int64_t myi64=0;
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);
GetObject(res,myi64);
}
return (int)myi64;
}
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")
{
int64_t myi64=0;
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);
GetObject(res,myi64);
}
return (int)myi64;
}
}
{
int64_t myi64=0;
GC gc;
gc.Start();
{
GCList ls(gc);
auto res= Programs::CrossLangShell(ls, args);
GetObject(res,myi64);
}
return (int)myi64;
}
}

View File

@@ -641,10 +641,7 @@ namespace Tesses::CrossLang
} }
return nullptr; return nullptr;
} }
static TObject New_MemoryFilesystem(GCList& ls, std::vector<TObject> args)
{
return std::make_shared<Tesses::Framework::Filesystem::MemoryFilesystem>();
}
static TObject New_Filesystem(GCList& ls, std::vector<TObject> args) static TObject New_Filesystem(GCList& ls, std::vector<TObject> args)
{ {
@@ -1330,8 +1327,6 @@ namespace Tesses::CrossLang
newTypes->DeclareFunction(gc, "TempFS","Create a temp directory",{"",""}, New_TempFS); newTypes->DeclareFunction(gc, "TempFS","Create a temp directory",{"",""}, New_TempFS);
newTypes->DeclareFunction(gc, "Stream","Create stream", {"strm"},New_Stream); newTypes->DeclareFunction(gc, "Stream","Create stream", {"strm"},New_Stream);
newTypes->DeclareFunction(gc, "MemoryFilesystem","Create in memory filesystem", {},New_MemoryFilesystem);
newTypes->DeclareFunction(gc,"Version","Create a version object",{"$major","$minor","$patch","$build","$stage"},[](GCList& ls, std::vector<TObject> args)->TObject{ newTypes->DeclareFunction(gc,"Version","Create a version object",{"$major","$minor","$patch","$build","$stage"},[](GCList& ls, std::vector<TObject> args)->TObject{
int64_t major=1; int64_t major=1;

View File

@@ -354,6 +354,11 @@ namespace Tesses::CrossLang
} }
return nullptr; 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, "Eval", "Eval source code",{"source"}, VM_Eval);
dict->DeclareFunction(gc, "Compile", "Compile Source",{"dict"},VM_Compile); dict->DeclareFunction(gc, "Compile", "Compile Source",{"dict"},VM_Compile);

View File

@@ -184,10 +184,8 @@ namespace Tesses::CrossLang {
TObject TDictionary::GetValue(std::string key) TObject TDictionary::GetValue(std::string key)
{ {
if(this->items.empty()) return Undefined(); if(this->items.empty()) return Undefined();
for(auto item : this->items) if(this->items.count(key) > 0)
{ return this->items[key];
if(item.first == key) return item.second;
}
return Undefined(); return Undefined();
} }
void TDictionary::SetValue(std::string key, TObject value) void TDictionary::SetValue(std::string key, TObject value)

View File

@@ -7,130 +7,23 @@ namespace Tesses::CrossLang {
this->ls = new GCList(gc); this->ls = new GCList(gc);
this->ls->Add(obj); this->ls->Add(obj);
this->obj = obj; this->obj = obj;
TDictionary* dict;
if(GetObjectHeap(obj,dict))
{
gc->BarrierBegin();
if(!dict->HasValue("OpenFile"))
{
dict->DeclareFunction(gc,"OpenFile","Open a file",{"path","mode"}, [](GCList& ls, std::vector<TObject> args)->TObject {
return nullptr;
});
}
if(!dict->HasValue("EnumeratePaths"))
{
dict->DeclareFunction(gc,"EnumeratePaths","Enumerate paths",{"path"}, [](GCList& ls, std::vector<TObject> args)->TObject {
return TVFSPathEnumerator::Create(ls,Tesses::Framework::Filesystem::VFSPathEnumerator());
});
}
if(!dict->HasValue("ReadLink"))
{
dict->DeclareFunction(gc,"ReadLink","Read a symlink",{"path"}, [](GCList& ls, std::vector<TObject> args)->TObject {
return Tesses::Framework::Filesystem::VFSPath();
});
}
if(!dict->HasValue("VFSPathToSystem"))
{
dict->DeclareFunction(gc,"VFSPathToSystem","Convert path to system",{"path"}, [](GCList& ls, std::vector<TObject> args)->TObject {
Tesses::Framework::Filesystem::VFSPath path;
if(GetArgumentAsPath(args,0,path))
{
return path.ToString();
}
return "/";
});
}
if(!dict->HasValue("SystemToVFSPath"))
{
dict->DeclareFunction(gc,"SystemToVFSPath","Convert system to path",{"path"}, [](GCList& ls, std::vector<TObject> args)->TObject {
std::string p;
if(GetArgument(args,0,p))
{
return Tesses::Framework::Filesystem::VFSPath(p);
}
return Tesses::Framework::Filesystem::VFSPath();
});
}
if(!dict->HasValue("GetDate"))
{
dict->DeclareFunction(gc,"GetDate","Get date from file",{"path"}, [](GCList& ls, std::vector<TObject> args)->TObject {
auto dict = TDictionary::Create(ls);
ls.GetGC()->BarrierBegin();
dict->SetValue("LastWrite", (int64_t)time(NULL));
dict->SetValue("LastAccess", (int64_t)time(NULL));
ls.GetGC()->BarrierEnd();
return dict;
});
}
if(!dict->HasValue("RegularFileExists"))
{
dict->DeclareFunction(gc,"RegularFileExists","Regular file exists",{"path"}, [](GCList& ls, std::vector<TObject> args)->TObject {
return false;
});
}
if(!dict->HasValue("SymlinkExists"))
{
dict->DeclareFunction(gc,"SymlinkExists","Symlink exists",{"path"}, [](GCList& ls, std::vector<TObject> args)->TObject {
return false;
});
}
if(!dict->HasValue("CharacterDeviceExists"))
{
dict->DeclareFunction(gc,"CharacterDeviceExists","Character file exists",{"path"}, [](GCList& ls, std::vector<TObject> args)->TObject {
return false;
});
}
if(!dict->HasValue("BlockDeviceExists"))
{
dict->DeclareFunction(gc,"BlockDeviceExists","Block file exists",{"path"}, [](GCList& ls, std::vector<TObject> args)->TObject {
return false;
});
}
if(!dict->HasValue("SocketFileExists"))
{
dict->DeclareFunction(gc,"SocketFileExists","Socket file exists",{"path"}, [](GCList& ls, std::vector<TObject> args)->TObject {
return false;
});
}
if(!dict->HasValue("FIFOFileExists"))
{
dict->DeclareFunction(gc,"FIFOFileExists","FIFO file exists",{"path"}, [](GCList& ls, std::vector<TObject> args)->TObject {
return false;
});
}
if(!dict->HasValue("FileExists"))
{
dict->DeclareFunction(gc,"FileExists","File exists",{"path"}, [](GCList& ls, std::vector<TObject> args)->TObject {
return false;
});
}
if(!dict->HasValue("SpecialFileExists"))
{
dict->DeclareFunction(gc,"SpecialFileExists","Special file exists",{"path"}, [](GCList& ls, std::vector<TObject> args)->TObject {
return false;
});
}
if(!dict->HasValue("DirectoryExists"))
{
dict->DeclareFunction(gc,"DirectoryExists","Directory exists",{"path"}, [](GCList& ls, std::vector<TObject> args)->TObject {
return false;
});
}
gc->BarrierEnd();
}
} }
Tesses::Framework::Filesystem::FIFOCreationResult TObjectVFS::CreateFIFO(Tesses::Framework::Filesystem::VFSPath path)
{
TDictionary* dict;
if(GetObjectHeap(this->obj, dict))
{
GCList ls(this->ls->GetGC());
auto res = dict->CallMethod(ls, "CreateFIFO",{path});
int64_t n=0;
if(GetObject(res, n)) return (Tesses::Framework::Filesystem::FIFOCreationResult)n;
}
return Tesses::Framework::Filesystem::FIFOCreationResult::UnknownError;
}
std::shared_ptr<Tesses::Framework::Streams::Stream> TObjectVFS::OpenFile(Tesses::Framework::Filesystem::VFSPath path, std::string mode) std::shared_ptr<Tesses::Framework::Streams::Stream> TObjectVFS::OpenFile(Tesses::Framework::Filesystem::VFSPath path, std::string mode)
{ {
TDictionary* dict; TDictionary* dict;
@@ -189,136 +82,7 @@ namespace Tesses::CrossLang {
} }
} }
bool TObjectVFS::RegularFileExists(Tesses::Framework::Filesystem::VFSPath path) void TObjectVFS::CreateSymlink(Tesses::Framework::Filesystem::VFSPath existingFile, Tesses::Framework::Filesystem::VFSPath symlinkFile)
{
TDictionary* dict;
if(GetObjectHeap(this->obj, dict))
{
GCList ls(this->ls->GetGC());
auto res = dict->CallMethod(ls, "RegularFileExists",{path});
bool out;
if(GetObject(res,out))
{
return out;
}
}
return false;
}
bool TObjectVFS::SymlinkExists(Tesses::Framework::Filesystem::VFSPath path)
{
TDictionary* dict;
if(GetObjectHeap(this->obj, dict))
{
GCList ls(this->ls->GetGC());
auto res = dict->CallMethod(ls, "SymlinkExists",{path});
bool out;
if(GetObject(res,out))
{
return out;
}
}
return false;
}
bool TObjectVFS::CharacterDeviceExists(Tesses::Framework::Filesystem::VFSPath path)
{
TDictionary* dict;
if(GetObjectHeap(this->obj, dict))
{
GCList ls(this->ls->GetGC());
auto res = dict->CallMethod(ls, "CharacterDeviceExists",{path});
bool out;
if(GetObject(res,out))
{
return out;
}
}
return false;
}
bool TObjectVFS::BlockDeviceExists(Tesses::Framework::Filesystem::VFSPath path)
{
TDictionary* dict;
if(GetObjectHeap(this->obj, dict))
{
GCList ls(this->ls->GetGC());
auto res = dict->CallMethod(ls, "BlockDeviceExists",{path});
bool out;
if(GetObject(res,out))
{
return out;
}
}
return false;
}
bool TObjectVFS::SocketFileExists(Tesses::Framework::Filesystem::VFSPath path)
{
TDictionary* dict;
if(GetObjectHeap(this->obj, dict))
{
GCList ls(this->ls->GetGC());
auto res = dict->CallMethod(ls, "SocketFileExists",{path});
bool out;
if(GetObject(res,out))
{
return out;
}
}
return false;
}
bool TObjectVFS::FIFOFileExists(Tesses::Framework::Filesystem::VFSPath path)
{
TDictionary* dict;
if(GetObjectHeap(this->obj, dict))
{
GCList ls(this->ls->GetGC());
auto res = dict->CallMethod(ls, "FIFOFileExists",{path});
bool out;
if(GetObject(res,out))
{
return out;
}
}
return false;
}
bool TObjectVFS::FileExists(Tesses::Framework::Filesystem::VFSPath path)
{
TDictionary* dict;
if(GetObjectHeap(this->obj, dict))
{
GCList ls(this->ls->GetGC());
auto res = dict->CallMethod(ls, "FileExists",{path});
bool out;
if(GetObject(res,out))
{
return out;
}
}
return false;
}
bool TObjectVFS::SpecialFileExists(Tesses::Framework::Filesystem::VFSPath path)
{
TDictionary* dict;
if(GetObjectHeap(this->obj, dict))
{
GCList ls(this->ls->GetGC());
auto res = dict->CallMethod(ls, "SpecialFileExists",{path});
bool out;
if(GetObject(res,out))
{
return out;
}
}
return false;
}
void TObjectVFS::CreateSymlink(Tesses::Framework::Filesystem::VFSPath existingFile, Tesses::Framework::Filesystem::VFSPath symlinkFile)
{ {
TDictionary* dict; TDictionary* dict;
@@ -340,22 +104,7 @@ namespace Tesses::CrossLang {
} }
} }
bool TObjectVFS::DirectoryExists(Tesses::Framework::Filesystem::VFSPath path) void TObjectVFS::DeleteFile(Tesses::Framework::Filesystem::VFSPath path)
{
TDictionary* dict;
if(GetObjectHeap(this->obj, dict))
{
GCList ls(this->ls->GetGC());
auto res = dict->CallMethod(ls, "DirectoryExists",{path});
bool out;
if(GetObject(res,out))
{
return out;
}
}
return false;
}
void TObjectVFS::DeleteFile(Tesses::Framework::Filesystem::VFSPath path)
{ {
TDictionary* dict; TDictionary* dict;
@@ -484,31 +233,6 @@ namespace Tesses::CrossLang {
} }
return Tesses::Framework::Filesystem::VFSPath(); return Tesses::Framework::Filesystem::VFSPath();
} }
void TObjectVFS::GetDate(Tesses::Framework::Filesystem::VFSPath path, Tesses::Framework::Date::DateTime& lastWrite, Tesses::Framework::Date::DateTime& lastAccess)
{
TDictionary* dict;
if(GetObjectHeap(this->obj, dict))
{
GCList ls(this->ls->GetGC());
auto res = dict->CallMethod(ls, "GetDate",{path});
if(GetObjectHeap(res,dict))
{
this->ls->GetGC()->BarrierBegin();
res = dict->GetValue("LastWrite");
std::shared_ptr<Tesses::Framework::Date::DateTime> d;
if(GetObject(res,d))
lastWrite =*d;
res = dict->GetValue("LastAccess");
if(GetObject(res,d))
lastWrite = *d;
this->ls->GetGC()->BarrierEnd();
}
}
}
void TObjectVFS::SetDate(Tesses::Framework::Filesystem::VFSPath path, Tesses::Framework::Date::DateTime lastWrite, Tesses::Framework::Date::DateTime lastAccess) void TObjectVFS::SetDate(Tesses::Framework::Filesystem::VFSPath path, Tesses::Framework::Date::DateTime lastWrite, Tesses::Framework::Date::DateTime lastAccess)
{ {
@@ -532,6 +256,80 @@ namespace Tesses::CrossLang {
} }
} }
void TObjectVFS::Chown(Tesses::Framework::Filesystem::VFSPath path, uint32_t uid, uint32_t gid)
{
TDictionary* dict;
if(GetObjectHeap(this->obj, dict))
{
GCList ls(this->ls->GetGC());
dict->CallMethod(ls, "Chown",{path,(int64_t)uid, (int64_t)gid});
}
}
bool TObjectVFS::Stat(Tesses::Framework::Filesystem::VFSPath path, Tesses::Framework::Filesystem::StatData& data)
{
TDictionary* dict;
if(GetObjectHeap(this->obj, dict))
{
GCList ls(this->ls->GetGC());
auto res = dict->CallMethod(ls, "Stat",{path});
int64_t _num;
TDictionary* _dict;
TObject _o;
if(GetObjectHeap(res,_dict))
{
this->ls->GetGC()->BarrierBegin();
_o = dict->GetValue("BlockSize");
if(GetObject(_o,_num)) data.BlockSize = (uint64_t)_num;
_o = dict->GetValue("BlockCount");
if(GetObject(_o,_num)) data.BlockCount = (uint64_t)_num;
_o = dict->GetValue("Device");
if(GetObject(_o,_num)) data.Device = (uint64_t)_num;
_o = dict->GetValue("DeviceId");
if(GetObject(_o,_num)) data.DeviceId = (uint64_t)_num;
_o = dict->GetValue("GroupId");
if(GetObject(_o,_num)) data.GroupId = (uint32_t)_num;
_o = dict->GetValue("HardLinks");
if(GetObject(_o,_num)) data.HardLinks = (uint64_t)_num;
std::shared_ptr<Tesses::Framework::Date::DateTime> dt;
_o = dict->GetValue("LastAccess");
if(GetObject(_o,dt)) data.LastAccess = dt ? *dt : Tesses::Framework::Date::DateTime(0);
_o = dict->GetValue("LastModified");
if(GetObject(_o,dt)) data.LastModified = dt ? *dt : Tesses::Framework::Date::DateTime(0);
_o = dict->GetValue("LastStatus");
if(GetObject(_o,dt)) data.LastStatus = dt ? *dt : Tesses::Framework::Date::DateTime(0);
_o = dict->GetValue("Mode");
if(GetObject(_o,_num)) data.Mode = (uint32_t)_num;
_o = dict->GetValue("Size");
if(GetObject(_o,_num)) data.Size = (uint64_t)_num;
_o = dict->GetValue("UserId");
if(GetObject(_o,_num)) data.UserId = (uint32_t)_num;
this->ls->GetGC()->BarrierEnd();
return true;
}
}
return false;
}
bool TObjectVFS::StatVFS(Tesses::Framework::Filesystem::VFSPath path, Tesses::Framework::Filesystem::StatVFSData& data) bool TObjectVFS::StatVFS(Tesses::Framework::Filesystem::VFSPath path, Tesses::Framework::Filesystem::StatVFSData& data)
{ {
TDictionary* dict; TDictionary* dict;

View File

@@ -1997,6 +1997,38 @@ namespace Tesses::CrossLang {
cse.back()->Push(gc, nullptr); cse.back()->Push(gc, nullptr);
return false; return false;
} }
if(key == "Stat")
{
Tesses::Framework::Filesystem::VFSPath path;
if(GetArgumentAsPath(args,0,path))
{
Tesses::Framework::Filesystem::StatData data;
if(vfs->Stat(path,data))
{
cse.back()->Push(gc, TDictionary::Create(ls,{
TDItem("BlockCount", (int64_t)data.BlockCount),
TDItem("BlockSize", (int64_t)data.BlockSize),
TDItem("Device", (int64_t)data.Device),
TDItem("DeviceId", (int64_t)data.DeviceId),
TDItem("GroupId", (int64_t)data.GroupId),
TDItem("HardLinks", (int64_t)data.HardLinks),
TDItem("Inode", (int64_t)data.Inode),
TDItem("LastAccess", std::make_shared<Tesses::Framework::Date::DateTime>(data.LastAccess)),
TDItem("LastModified", std::make_shared<Tesses::Framework::Date::DateTime>(data.LastModified)),
TDItem("LastStatus", std::make_shared<Tesses::Framework::Date::DateTime>(data.LastStatus)),
TDItem("Mode", (int64_t)data.Mode),
TDItem("Size", (int64_t)data.Size),
TDItem("UserId", (int64_t)data.UserId)
}));
return false;
}
}
cse.back()->Push(gc, nullptr);
return false;
}
if(key == "StatVFS") if(key == "StatVFS")
{ {
Tesses::Framework::Filesystem::VFSPath path; Tesses::Framework::Filesystem::VFSPath path;

View File

@@ -24,11 +24,6 @@ namespace Tesses::CrossLang
GC::GC() GC::GC()
{ {
this->tpool=new Tesses::Framework::Lazy<Tesses::Framework::Threading::ThreadPool*>([]()->Tesses::Framework::Threading::ThreadPool*{
auto threads = Tesses::Framework::Threading::ThreadPool::GetNumberOfCores();
if(threads < 4) threads=4;
return new Tesses::Framework::Threading::ThreadPool(threads);
},[](Tesses::Framework::Threading::ThreadPool* p)->void{delete p;});
} }
TDictionary* CreateThread(GCList& ls, TCallable* callable,bool detached) TDictionary* CreateThread(GCList& ls, TCallable* callable,bool detached)
{ {
@@ -91,6 +86,12 @@ namespace Tesses::CrossLang
} }
void GC::Start() void GC::Start()
{ {
this->tpool=new Tesses::Framework::Lazy<Tesses::Framework::Threading::ThreadPool*>([]()->Tesses::Framework::Threading::ThreadPool*{
auto threads = Tesses::Framework::Threading::ThreadPool::GetNumberOfCores();
if(threads < 4) threads=4;
return new Tesses::Framework::Threading::ThreadPool(threads);
},[](Tesses::Framework::Threading::ThreadPool* p)->void{delete p;});
this->mtx=new Mutex(); this->mtx=new Mutex();
this->running = true; this->running = true;
this->thrd = new Thread([this]()->void { this->thrd = new Thread([this]()->void {
@@ -203,6 +204,7 @@ namespace Tesses::CrossLang
{ {
return this->tpool->GetValue(); return this->tpool->GetValue();
} }
void GC::UnsetRoot(TObject obj) void GC::UnsetRoot(TObject obj)
{ {
if(std::holds_alternative<THeapObjectHolder>(obj)) if(std::holds_alternative<THeapObjectHolder>(obj))
@@ -224,14 +226,19 @@ namespace Tesses::CrossLang
GC::~GC() GC::~GC()
{ {
GC::BarrierBegin(); GC::BarrierBegin();
this->roots.clear(); this->roots.clear();
GC::BarrierEnd(); GC::BarrierEnd();
this->running=false; this->running=false;
this->thrd->Join(); this->thrd->Join();
delete this->thrd; delete this->thrd;
for(auto item : objects) delete item; for(auto item : objects) delete item;
delete this->mtx;
delete this->tpool; delete this->tpool;
delete this->mtx;
} }
void GC::RegisterEverythingCallback(std::function<void(GC* gc, TRootEnvironment* env)> cb) void GC::RegisterEverythingCallback(std::function<void(GC* gc, TRootEnvironment* env)> cb)