diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index a3157e109..90a04ad7a 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,6 +8,7 @@ jobs: linux-test: name: Linux (Ubuntu) GCC Test runs-on: ubuntu-latest + if: github.repository == 'metacall/core' strategy: matrix: buildtype: [debug, release] @@ -85,3 +86,43 @@ jobs: NODE_PATH: /usr/lib/node_modules METACALL_BUILD_TYPE: ${{ matrix.buildtype }} METACALL_BUILD_OPTIONS: root python ruby netcore5 nodejs typescript file rpc wasm java c cobol rust examples tests scripts ports dynamic install pack benchmarks + + windows-test: + name: Windows MSVC Test + runs-on: windows-latest + steps: + - name: Check out the repository + uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Set up the environment + run: cmd.exe /c "powershell .\tools\metacall-environment.ps1 $Env:METACALL_INSTALL_OPTIONS" + env: + LTTNG_UST_REGISTER_TIMEOUT: 0 + NUGET_XMLDOC_MODE: skip + DOTNET_CLI_TELEMETRY_OPTOUT: 'true' + METACALL_INSTALL_OPTIONS: base python ruby netcore5 nodejs typescript file rpc wasm java c cobol rust rapidjson funchook swig pack # clangformat v8rep51 coverage + + - name: Run the configuration script + run: | + $METACALL_PATH = $PWD + md -Force "$METACALL_PATH\build" + cd "$METACALL_PATH\build" + cmd.exe /c "powershell ..\tools\metacall-configure.ps1 $Env:METACALL_BUILD_TYPE $Env:METACALL_BUILD_OPTIONS" + env: + LTTNG_UST_REGISTER_TIMEOUT: 0 + NUGET_XMLDOC_MODE: skip + DOTNET_CLI_TELEMETRY_OPTOUT: 'true' + METACALL_BUILD_TYPE: debug + METACALL_BUILD_OPTIONS: python # root ruby netcore5 nodejs typescript file rpc wasm java c cobol rust examples tests scripts ports dynamic install pack benchmarks # sanitizer v8 coverage + + - name: Build the core + working-directory: ./build + run: cmd.exe /c "powershell ..\tools\metacall-build.ps1 $Env:METACALL_BUILD_TYPE $Env:METACALL_BUILD_OPTIONS" + env: + LTTNG_UST_REGISTER_TIMEOUT: 0 + NUGET_XMLDOC_MODE: skip + DOTNET_CLI_TELEMETRY_OPTOUT: 'true' + METACALL_BUILD_TYPE: debug + METACALL_BUILD_OPTIONS: tests # coverage install \ No newline at end of file diff --git a/tools/metacall-build.ps1 b/tools/metacall-build.ps1 new file mode 100644 index 000000000..79bd4db7f --- /dev/null +++ b/tools/metacall-build.ps1 @@ -0,0 +1,87 @@ +$Global:BUILD_TYPE = 'Release' +$Global:BUILD_TESTS = 0 +$Global:BUILD_COVERAGE = 0 +$Global:BUILD_INSTALL = 0 + +$Global:PROGNAME = $(Get-Item $PSCommandPath).Basename +$Global:Arguments = $args + +function sub-options { + for ($i = 0; $i -lt $Arguments.Length; $i++) { + $option = $Arguments[$i] + if ( "$option" -eq "debug" ) { + echo "Build all scripts in debug mode" + $Global:BUILD_TYPE = 'Debug' + } + if ( "$option" -eq "release" ) { + echo "Build all scripts in release mode" + $Global:BUILD_TYPE = 'Release' + } + if ( "$option" -eq "relwithdebinfo" ) { + echo "Build all scripts in release mode with debug symbols" + $Global:BUILD_TYPE = 'RelWithDebInfo' + } + if ( "$option" -eq "tests" ) { + echo "Build and run all tests" + $Global:BUILD_TESTS = 1 + } + if ( "$option" -eq "coverage" ) { + echo "Build coverage reports" + $Global:BUILD_COVERAGE = 1 + } + if ( "$option" -eq "install" ) { + echo "Install all libraries" + $Global:BUILD_INSTALL = 1 + } + } +} + +function sub-build { + + # Build the project + echo "Building MetaCall..." + cmake --build . "-j$((Get-CimInstance Win32_ComputerSystem).NumberOfLogicalProcessors)" + + # Tests (coverage needs to run the tests) + if ( ($BUILD_TESTS -eq 1) -or ($BUILD_COVERAGE -eq 1) ) { + echo "Running the tests..." + ctest "-j$((Get-CimInstance Win32_ComputerSystem).NumberOfLogicalProcessors)" --output-on-failure --test-output-size-failed 3221000000 -C $BUILD_TYPE + } + + # Coverage + <# if ( $BUILD_COVERAGE = 1 ) { + # TODO (copied): Remove -k, solve coverage issues + # TODO: Migrate to Windows + echo "Reporting coverage..." + make -k gcov + make -k lcov + make -k lcov-genhtml + } #> + + # Install + if ( $BUILD_INSTALL -eq 1 ) { + echo "Building and installing MetaCall..." + cmake --build . --target install + } +} + +function sub-help { + echo "Usage: $PROGNAME list of options" + echo "Options:" + echo " debug | release | relwithdebinfo: build type" + echo " tests: build and run all tests" + echo " coverage: build coverage reports" + echo " install: install all libraries" + echo "" +} + +switch($args.length) { + 0 { + sub-help + Break + } + Default { + sub-options + sub-build + } +} \ No newline at end of file diff --git a/tools/metacall-configure.ps1 b/tools/metacall-configure.ps1 new file mode 100644 index 000000000..403da56a0 --- /dev/null +++ b/tools/metacall-configure.ps1 @@ -0,0 +1,420 @@ +$Global:ROOT_DIR = "$(pwd)" + +$Global:BUILD_TYPE = 'Release' +$Global:BUILD_PYTHON = 0 +$Global:BUILD_RUBY = 0 +$Global:BUILD_NETCORE = 0 +$Global:BUILD_NETCORE2 = 0 +$Global:BUILD_NETCORE5 = 0 +$Global:BUILD_V8 = 0 +$Global:BUILD_NODEJS = 0 +$Global:BUILD_TYPESCRIPT = 0 +$Global:BUILD_RUST = 0 +$Global:BUILD_FILE = 0 +$Global:BUILD_RPC = 0 +$Global:BUILD_WASM = 0 +$Global:BUILD_JAVA = 0 +$Global:BUILD_C = 0 +$Global:BUILD_COBOL = 0 +$Global:BUILD_SCRIPTS = 0 +$Global:BUILD_EXAMPLES = 0 +$Global:BUILD_TESTS = 0 +$Global:BUILD_BENCHMARKS = 0 +$Global:BUILD_PORTS = 0 +$Global:BUILD_COVERAGE = 0 +$Global:BUILD_SANITIZER = 0 +$Global:PROGNAME = $(Get-Item $PSCommandPath).Basename + +$Global:Arguments = $args + +function sub-options { + for ($i = 0; $i -lt $Arguments.Length; $i++) { + $option = $Arguments[$i] + if ( "$option" -eq 'debug' ) { + echo "Build all scripts in debug mode" + $Global:BUILD_TYPE = 'Debug' + } + if ( "$option" -eq 'release' ) { + echo "Build all scripts in release mode" + $Global:BUILD_TYPE = 'Release' + } + if ( "$option" -eq 'relwithdebinfo' ) { + echo "Build all scripts in release mode with debug symbols" + $Global:BUILD_TYPE = 'RelWithDebInfo' + } + if ( "$option" -eq 'python' ) { + echo "Build with python support" + $Global:BUILD_PYTHON = 1 + } + if ( "$option" -eq 'ruby' ) { + echo "Build with ruby support" + $Global:BUILD_RUBY = 1 + } + if ( "$option" -eq 'netcore' ) { + echo "Build with netcore support" + $Global:BUILD_NETCORE = 1 + } + if ( "$option" -eq 'netcore2' ) { + echo "Build with netcore 2 support" + $Global:BUILD_NETCORE2 = 1 + } + if ( "$option" -eq 'netcore5' ) { + echo "Build with netcore 5 support" + $Global:BUILD_NETCORE5 = 1 + } + if ( "$option" -eq 'v8' ) { + echo "Build with v8 support" + $Global:BUILD_V8 = 1 + } + if ( "$option" -eq 'nodejs' ) { + echo "Build with nodejs support" + $Global:BUILD_NODEJS = 1 + } + if ( "$option" -eq 'typescript' ) { + echo "Build with typescript support" + $Global:BUILD_TYPESCRIPT = 1 + } + if ( "$option" -eq 'file' ) { + echo "Build with file support" + $Global:BUILD_FILE = 1 + } + if ( "$option" -eq 'rpc' ) { + echo "Build with rpc support" + $Global:BUILD_RPC = 1 + } + if ( "$option" -eq 'wasm' ) { + echo "Build with wasm support" + $Global:BUILD_WASM = 1 + } + if ( "$option" -eq 'java' ) { + echo "Build with java support" + $Global:BUILD_JAVA = 1 + } + if ( "$option" -eq 'c' ) { + echo "Build with c support" + $Global:BUILD_C = 1 + } + if ( "$option" -eq 'cobol' ) { + echo "Build with cobol support" + $Global:BUILD_COBOL = 1 + } + if ( "$option" -eq 'scripts' ) { + echo "Build all scripts" + $Global:BUILD_SCRIPTS = 1 + } + if ( "$option" -eq 'examples' ) { + echo "Build all examples" + $Global:BUILD_EXAMPLES = 1 + } + if ( "$option" -eq 'tests' ) { + echo "Build all tests" + $Global:BUILD_TESTS = 1 + } + if ( "$option" -eq 'benchmarks' ) { + echo "Build all benchmarks" + $Global:BUILD_BENCHMARKS = 1 + } + if ( "$option" -eq 'ports' ) { + echo "Build all ports" + $Global:BUILD_PORTS = 1 + } + if ( "$option" -eq 'coverage' ) { + echo "Build all coverage reports" + $Global:BUILD_COVERAGE = 1 + } + if ( "$option" -eq 'sanitizer' ) { + echo "Build with sanitizers" + $Global:BUILD_SANITIZER = 1 + } + if ( "$option" -eq 'rust' ) { + echo "Build with rust support" + $Global:BUILD_RUST = 1 + } + } +} + +function sub-configure { + $Global:BUILD_STRING = "-DOPTION_BUILD_LOG_PRETTY=Off " ` + + "-DOPTION_BUILD_LOADERS=On " ` + + "-DOPTION_BUILD_LOADERS_MOCK=On" + + # Scripts + if ( $BUILD_SCRIPTS -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_SCRIPTS=On" + else + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_SCRIPTS=Off" + } + + # Python + if ( $BUILD_PYTHON -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_LOADERS_PY=On" + + if ( $BUILD_SCRIPTS -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_SCRIPTS_PY=On" + } + + if ( $BUILD_PORTS -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_PORTS_PY=On" + } + } + + # Ruby + if ( $BUILD_RUBY -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_LOADERS_RB=On" + + if ( $BUILD_SCRIPTS -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_SCRIPTS_RB=On" + } + + if ( $BUILD_PORTS -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_PORTS_RB=On" + } + } + + # NetCore + if ( $BUILD_NETCORE -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING " ` + + "-DOPTION_BUILD_LOADERS_CS=On " ` + + "-DDOTNET_CORE_PATH=/usr/share/dotnet/shared/Microsoft.NETCore.App/1.1.10/" + + if ( $BUILD_SCRIPTS -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_SCRIPTS_CS=On" + } + + if ( $BUILD_PORTS -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_PORTS_CS=On" + } + } + + # NetCore 2 + if ( $BUILD_NETCORE2 -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING " ` + + "-DOPTION_BUILD_LOADERS_CS=On " ` + + "-DDOTNET_CORE_PATH=/usr/share/dotnet/shared/Microsoft.NETCore.App/2.2.8/" + + if ( $BUILD_SCRIPTS -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_SCRIPTS_CS=On" + } + + if ( $BUILD_PORTS -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_PORTS_CS=On" + } + } + + # NetCore 5 + if ( $BUILD_NETCORE5 -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING " ` + + "-DOPTION_BUILD_LOADERS_CS=On " ` + + "-DDOTNET_CORE_PATH=/usr/share/dotnet/shared/Microsoft.NETCore.App/5.0.17/" + + if ( $BUILD_SCRIPTS -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_SCRIPTS_CS=On" + } + + if ( $BUILD_PORTS -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_PORTS_CS=On" + } + } + + # V8 + if ( $BUILD_V8 -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_LOADERS_JS=On" + + if ( $BUILD_SCRIPTS -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_SCRIPTS_JS=On" + } + + if ( $BUILD_PORTS -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_PORTS_JS=On" + } + } + + # NodeJS + if ( $BUILD_NODEJS -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_LOADERS_NODE=On" + + if ( $BUILD_SCRIPTS -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_SCRIPTS_NODE=On" + } + + if ( $BUILD_PORTS -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_PORTS_NODE=On" + } + } + + # TypeScript + if ( $BUILD_TYPESCRIPT -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_LOADERS_TS=On" + + if ( $BUILD_SCRIPTS -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_SCRIPTS_TS=On" + } + + if ( $BUILD_PORTS -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_PORTS_TS=On" + } + } + + # File + if ( $BUILD_FILE -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_LOADERS_FILE=On" + + if ( $BUILD_SCRIPTS -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_SCRIPTS_FILE=On" + } + } + + # RPC + if ( $BUILD_RPC -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_LOADERS_RPC=On" + + if ( $BUILD_SCRIPTS -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_SCRIPTS_RPC=On" + } + } + + # WebAssembly + if ( $BUILD_WASM -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_LOADERS_WASM=On" + + if ( $BUILD_SCRIPTS -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_SCRIPTS_WASM=On" + } + } + + # Java + if ( $BUILD_JAVA -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_LOADERS_JAVA=On" + + if ( $BUILD_SCRIPTS -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_SCRIPTS_JAVA=On" + } + } + + # C + if ( $BUILD_C -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_LOADERS_C=On" + + if ( $BUILD_SCRIPTS -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_SCRIPTS_C=On" + } + } + + # Cobol + if ( $BUILD_COBOL -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_LOADERS_COB=On" + + if ( $BUILD_SCRIPTS -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_SCRIPTS_COB=On" + } + } + + # Examples + if ( $BUILD_EXAMPLES -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_EXAMPLES=On" + else + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_EXAMPLES=Off" + } + + # Tests + if ( $BUILD_TESTS -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_TESTS=On" + else + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_TESTS=Off" + } + + # Benchmarks + if ( $BUILD_BENCHMARKS -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_BENCHMARKS=On" + else + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_BENCHMARKS=Off" + } + + # Ports + if ( $BUILD_PORTS -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_PORTS=On" + else + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_PORTS=Off" + } + + # Coverage + if ( $BUILD_COVERAGE -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_COVERAGE=On" + else + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_COVERAGE=Off" + } + + # Sanitizer + if ( $BUILD_SANITIZER -eq 1 ) { + # Disable backtrace module when sanitizer is enabled + # in order to let the sanitizer catch the segmentation faults + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_SANITIZER=On -DOPTION_BUILD_BACKTRACE=Off" + else + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_SANITIZER=Off" + } + + # Rust + if ( $BUILD_RUST -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_LOADERS_RS=On" + + if ( $BUILD_SCRIPTS -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_SCRIPTS_RS=On" + } + + if ( $BUILD_PORTS -eq 1 ) { + $Global:BUILD_STRING = "$BUILD_STRING -DOPTION_BUILD_PORTS_RS=On" + } + } + + # Build type + $Global:BUILD_STRING = "$BUILD_STRING -DCMAKE_BUILD_TYPE=$BUILD_TYPE" + + # Execute CMake + # cmd.exe /c "cmake -Wno-dev -DOPTION_GIT_HOOKS=Off $BUILD_STRING .." + echo "BUILD COMMAND HSJHFGSJDFGKSDJF: cmake -DOPTION_FORK_SAFE=OFF $BUILD_STRING .." + cmd.exe /c "cmake -DOPTION_FORK_SAFE=OFF $BUILD_STRING .." + + Exit $LASTEXITCODE +} + +function sub-help { + echo "Usage: $PROGNAME list of options" + echo "Options:" + echo " debug | release | relwithdebinfo: build type" + echo " python: build with python support" + echo " ruby: build with ruby support" + echo " netcore: build with netcore support" + echo " netcore2: build with netcore 2 support" + echo " netcore5: build with netcore 5 support" + echo " v8: build with v8 support" + echo " nodejs: build with nodejs support" + echo " typescript: build with typescript support" + echo " file: build with file support" + echo " rpc: build with rpc support" + echo " wasm: build with wasm support" + echo " java: build with java support" + echo " c: build with c support" + echo " cobol: build with cobol support" + echo " scripts: build all scripts" + echo " examples: build all examples" + echo " tests: build and run all tests" + echo " benchmarks: build and run all benchmarks" + echo " install: install all libraries" + echo " static: build as static libraries" + echo " dynamic: build as dynamic libraries" + echo " ports: build all ports" + echo " coverage: build all coverage reports" + echo " sanitizer: build with address, memory, thread... sanitizers" + echo "" +} + +switch($args.length) { + 0 { + sub-help + break + } + Default { + sub-options + sub-configure + } +} diff --git a/tools/metacall-environment.ps1 b/tools/metacall-environment.ps1 new file mode 100644 index 000000000..25e34fb31 --- /dev/null +++ b/tools/metacall-environment.ps1 @@ -0,0 +1,536 @@ +$PSDefaultParameterValues['*:Encoding'] = 'utf8' + +$Global:ROOT_DIR = "$(pwd)" + +$Global:INSTALL_CHOCO = 1 +$Global:INSTALL_PYTHON = 0 +$Global:INSTALL_RUBY = 0 +$Global:INSTALL_RUST = 0 +$Global:INSTALL_RAPIDJSON = 0 +$Global:INSTALL_FUNCHOOK = 0 +$Global:INSTALL_NETCORE = 0 +$Global:INSTALL_NETCORE2 = 0 +$Global:INSTALL_NETCORE5 = 0 +$Global:INSTALL_V8 = 0 +$Global:INSTALL_V8REPO = 0 +$Global:INSTALL_V8REPO58 = 0 +$Global:INSTALL_V8REPO57 = 0 +$Global:INSTALL_V8REPO54 = 0 +$Global:INSTALL_V8REPO52 = 0 +$Global:INSTALL_V8REPO51 = 0 +$Global:INSTALL_NODEJS = 0 +$Global:INSTALL_TYPESCRIPT = 0 +$Global:INSTALL_FILE = 0 +$Global:INSTALL_RPC = 0 +$Global:INSTALL_WASM = 0 +$Global:INSTALL_JAVA = 0 +$Global:INSTALL_C = 0 +$Global:INSTALL_COBOL = 0 +$Global:INSTALL_SWIG = 0 +$Global:INSTALL_METACALL = 0 +$Global:INSTALL_PACK = 0 +$Global:INSTALL_COVERAGE = 0 +$Global:INSTALL_CLANGFORMAT = 0 +$Global:SHOW_HELP = 0 +$Global:PROGNAME = $(Get-Item $PSCommandPath).Basename + +$Global:Arguments = $args + +# Helper functions +function Add-to-Path { + $GivenPath = $args[0] + + $NewPath = "$GivenPath;$Env:PATH" + setx /M PATH $NewPath + $Env:PATH = $NewPath + + if ( $Env:GITHUB_ENV -ne $Null ) { + echo "PATH=$Env:PATH" >> $Env:GITHUB_ENV + # echo "{$Env:PATH}" >> $Env:GITHUB_PATH # Doesn't work + } + + refreshenv +} + +# Base packages +function sub-choco { + echo "configure choco" + cd $ROOT_DIR + Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) + refreshenv + + if ( $null -eq $Env:ChocolateyInstall ) { + $Env:ChocolateyInstall = "$Env:SystemDrive\PraogramData\chocolatey" + } + + $Global:ChocolateyBinPath = "$Env:ChocolateyInstall\bin" +} + +# Swig +function sub-swig { + echo "configure swig" + cd $ROOT_DIR + +} + +# Python +function sub-python { + echo "configure python" + cd $ROOT_DIR + + $PythonVersion = '3.9.7' + $RuntimeDir = "$ROOT_DIR\runtimes\python" + + <# + + # Avoiding; The Python installation provided by Chocolatey is statically compiled + + $PythonVersion = '3.10.6' + + choco install python3 --version $PythonVersion -my + + $PythonPath = "$Env:ChocolateyInstall\lib\python3.$PythonVersion\tools" + $PythonBin = "$PythonPath\python-$PythonVersion-amd64.exe" + + cmd.exe /c "mklink ""$PythonPath\python.exe"" ""$PythonBin""" + cmd.exe /c "mklink ""$ChocolateyBinPath\python.exe"" ""$PythonBin""" + + setx /M PATH "$ChocolateyBinPath;$Env:PATH" + $Env:PATH = "$ChocolateyBinPath;$Env:PATH" + + refreshenv + + # DEBUG + # where.exe python + # # python.exe -c "from sysconfig import get_paths as gp; print(gp()['include'])" + # cmd.exe /c """$PythonBin"" -c ""from sysconfig import get_paths as gp; print(gp()['include'])""" + + # Patch for FindPython.cmake + # $FindPython = "$ROOT_DIR\cmake\FindPython.cmake" + # $EscapedLoc = $ROOT_DIR.Replace('\', '/') + # $PythonRuntimeDir = "$EscapedLoc/runtimes/python" + + # echo set(Python_VERSION $PythonVersion) > $FindPython + # echo set(Python_ROOT_DIR "$PythonRuntimeDir") >> $FindPython + # echo set(Python_EXECUTABLE "%$PythonRuntimeDir/python.exe") >> $FindPython + # echo set(Python_INCLUDE_DIRS "%$PythonRuntimeDir/include") >> $FindPython + # echo set(Python_LIBRARIES "%$PythonRuntimeDir/libs/python39.lib") >> $FindPython + # echo include(FindPackageHandleStandardArgs)>> $FindPython + # echo FIND_PACKAGE_HANDLE_STANDARD_ARGS(Python REQUIRED_VARS Python_EXECUTABLE Python_LIBRARIES Python_INCLUDE_DIRS VERSION_VAR Python_VERSION) >> $FindPython + # echo mark_as_advanced(Python_EXECUTABLE Python_LIBRARIES Python_INCLUDE_DIRS) >> $FindPython + + #> + + # Download installer + (New-Object Net.WebClient).DownloadFile("https://www.python.org/ftp/python/$PythonVersion/python-$PythonVersion-amd64.exe", './python_installer.exe') + + # Install Python + where.exe /Q python + if ( $? -eq $True ) { + echo 'Replacing existing Python...' + ./python_installer.exe /uninstall + } + + ./python_installer.exe /quiet "TargetDir=$RuntimeDir" ` + Include_debug=1 Include_symbols=1 PrependPath=1 CompileAll=1 + md "$RuntimeDir\Pip" + + Add-to-Path $RuntimeDir + + # Patch for FindPython.cmake + $FindPython = "$ROOT_DIR\cmake\FindPython.cmake" + $PythonRuntimeDir = $RuntimeDir.Replace('\', '/') + + echo "set(Python_VERSION $PythonVersion)" > $FindPython + echo "set(Python_ROOT_DIR ""$PythonRuntimeDir"")" >> $FindPython + echo "set(Python_EXECUTABLE ""$PythonRuntimeDir/python.exe"")" >> $FindPython + echo "set(Python_INCLUDE_DIRS ""$PythonRuntimeDir/include"")" >> $FindPython + echo "set(Python_LIBRARIES ""$PythonRuntimeDir/libs/python39_d.lib"" ""$PythonRuntimeDir/libs/python39.lib"")" >> $FindPython + echo "include(FindPackageHandleStandardArgs)" >> $FindPython + echo "FIND_PACKAGE_HANDLE_STANDARD_ARGS(Python REQUIRED_VARS Python_EXECUTABLE Python_LIBRARIES Python_INCLUDE_DIRS VERSION_VAR Python_VERSION)" >> $FindPython + echo "mark_as_advanced(Python_EXECUTABLE Python_LIBRARIES Python_INCLUDE_DIRS)" >> $FindPython +} + +# Ruby +function sub-ruby { + echo "configure ruby" + cd $ROOT_DIR + + # TODO (copied from metacall-environment.sh): Review conflict with NodeJS (currently rails test is disabled) + +} + +# Rust +function sub-rust { + echo "configure rust" + cd $ROOT_DIR + +} + +# RapidJSON +function sub-rapidjson { + echo "configure rapidjson" + cd $ROOT_DIR + +} + +# FuncHook +function sub-funchook { + echo "configure funchook" + +} + +# NetCore +function sub-netcore { + echo "configure netcore" + cd $ROOT_DIR + +} + +# NetCore 2 +function sub-netcore2 { + echo "configure netcore 2" + cd $ROOT_DIR + +} + +# NetCore 5 +function sub-netcore5 { + echo "configure netcore 5" + cd $ROOT_DIR + +} + +# V8 Repository +function sub-v8repo { + echo "configure v8 from repository" + cd $ROOT_DIR + +} + +# V8 +function sub-v8 { + echo "configure v8" + cd $ROOT_DIR + +} + +# NodeJS +function sub-nodejs { + # TODO (copied from metacall-environment.sh): Review conflicts with Ruby Rails and NodeJS 4.x + echo "configure nodejs" + cd $ROOT_DIR + +} + +# TypeScript +function sub-typescript { + echo "configure typescript" + +} + +# File +function sub-file { + echo "configure file" +} + +# RPC +function sub-rpc { + echo "cofingure rpc" + cd $ROOT_DIR + +} + +# WebAssembly +function sub-wasm { + echo "configure webassembly" + # TODO (copied from metacall-environment.sh) +} + +# Java +function sub-java { + echo "configure java" + +} + +# C +function sub-c { + echo "configure c" + +} + +# Cobol +function sub-cobol { + echo "configure cobol" + +} + +# MetaCall +function sub-metacall { + # TODO (copied from metacall-environment.sh): Update this or deprecate it + echo "configure metacall" + cd $ROOT_DIR + +} + +# Pack +function sub-pack { + echo "configure pack" + cd $ROOT_DIR + +} + +# Coverage +function sub-coverage { + echo "configure coverage" + cd $ROOT_DIR + +} + +# Clang format +function sub-clangformat { + echo "configure clangformat" + cd $ROOT_DIR + +} + +# Install +function sub-install { + if ( $INSTALL_CHOCO -eq 1 ) { + sub-choco + } + if ( $INSTALL_PYTHON -eq 1 ) { + sub-python + } + if ( $INSTALL_RUBY -eq 1 ) { + sub-ruby + } + if ( $INSTALL_RUST -eq 1 ) { + sub-rust + } + if ( $INSTALL_RAPIDJSON -eq 1 ) { + sub-rapidjson + } + if ( $INSTALL_FUNCHOOK -eq 1 ) { + sub-funchook + } + if ( $INSTALL_NETCORE -eq 1 ) { + sub-netcore + } + if ( $INSTALL_NETCORE2 -eq 1 ) { + sub-netcore2 + } + if ( $INSTALL_NETCORE5 -eq 1 ) { + sub-netcore5 + } + if ( $INSTALL_V8 -eq 1 ) { + sub-v8 + } + if ( $INSTALL_V8REPO -eq 1 ) { + sub-v8repo + } + if ( $INSTALL_NODEJS -eq 1 ) { + sub-nodejs + } + if ( $INSTALL_TYPESCRIPT -eq 1 ) { + sub-typescript + } + if ( $INSTALL_FILE -eq 1 ) { + sub-file + } + if ( $INSTALL_RPC -eq 1 ) { + sub-rpc + } + if ( $INSTALL_WASM -eq 1 ) { + sub-wasm + } + if ( $INSTALL_JAVA -eq 1 ) { + sub-java + } + if ( $INSTALL_C -eq 1 ) { + sub-c + } + if ( $INSTALL_COBOL -eq 1 ) { + sub-cobol + } + if ( $INSTALL_SWIG -eq 1 ) { + sub-swig + } + if ( $INSTALL_METACALL -eq 1 ) { + sub-metacall + } + if ( $INSTALL_PACK -eq 1 ) { + sub-pack + } + if ( $INSTALL_COVERAGE -eq 1 ) { + sub-coverage + } + if ( $INSTALL_CLANGFORMAT -eq 1 ) { + sub-clangformat + } + echo "install finished in workspace $ROOT_DIR" +} + +# Configuration +function sub-options { + for ($i = 0; $i -lt $Arguments.Length; $i++) { + $var = $Arguments[$i] + if ( "$var" -eq 'base' ) { + echo "choco selected" + $Global:INSTALL_CHOCO = 1 + } + if ( "$var" -eq 'python' ) { + echo "python selected" + $Global:INSTALL_PYTHON = 1 + } + if ( "$var" -eq 'ruby' ) { + echo "ruby selected" + $Global:INSTALL_RUBY = 1 + } + if ( "$var" -eq 'rust' ) { + echo "rust selected" + $Global:INSTALL_RUST = 1 + } + if ( "$var" -eq 'netcore' ) { + echo "netcore selected" + $Global:INSTALL_NETCORE = 1 + } + if ( "$var" -eq 'netcore2' ) { + echo "netcore 2 selected" + $Global:INSTALL_NETCORE2 = 1 + } + if ( "$var" -eq 'netcore5' ) { + echo "netcore 5 selected" + $Global:INSTALL_NETCORE5 = 1 + } + if ( "$var" -eq 'rapidjson' ) { + echo "rapidjson selected" + $Global:INSTALL_RAPIDJSON = 1 + } + if ( "$var" -eq 'funchook' ) { + echo "funchook selected" + $INSTALL_FUNCHOOK = 1 + } + if ( ("$var" -eq 'v8') -or ("$var" -eq 'v8rep54') ) { + echo "v8 selected" + $Global:INSTALL_V8REPO = 1 + $Global:INSTALL_V8REPO54 = 1 + } + if ( "$var" -eq 'v8rep57' ) { + echo "v8 selected" + $Global:INSTALL_V8REPO = 1 + $Global:INSTALL_V8REPO57 = 1 + } + if ( "$var" -eq 'v8rep58' ) { + echo "v8 selected" + $Global:INSTALL_V8REPO = 1 + $Global:INSTALL_V8REPO58 = 1 + } + if ( "$var" -eq 'v8rep52' ) { + echo "v8 selected" + $Global:INSTALL_V8REPO = 1 + $Global:INSTALL_V8REPO52 = 1 + } + if ( "$var" -eq 'v8rep51' ) { + echo "v8 selected" + $Global:INSTALL_V8REPO = 1 + $Global:INSTALL_V8REPO51 = 1 + } + if ( "$var" -eq 'nodejs' ) { + echo "nodejs selected" + $Global:INSTALL_NODEJS = 1 + } + if ( "$var" -eq 'typescript' ) { + echo "typescript selected" + $Global:INSTALL_TYPESCRIPT = 1 + } + if ( "$var" -eq 'file' ) { + echo "file selected" + $Global:INSTALL_FILE = 1 + } + if ( "$var" -eq 'rpc' ) { + echo "rpc selected" + $Global:INSTALL_RPC = 1 + } + if ( "$var" -eq 'wasm' ) { + echo "wasm selected" + $Global:INSTALL_WASM = 1 + } + if ( "$var" -eq 'java' ) { + echo "java selected" + $Global:INSTALL_JAVA = 1 + } + if ( "$var" -eq 'c' ) { + echo "c selected" + $Global:INSTALL_C = 1 + } + if ( "$var" -eq 'cobol' ) { + echo "cobol selected" + $Global:INSTALL_COBOL = 1 + } + if ( "$var" -eq 'swig' ) { + echo "swig selected" + $Global:INSTALL_SWIG = 1 + } + if ( "$var" -eq 'metacall' ) { + echo "metacall selected" + $Global:INSTALL_METACALL = 1 + } + if ( "$var" -eq 'pack' ) { + echo "pack selected" + $Global:INSTALL_PACK = 1 + } + if ( "$var" -eq 'coverage' ) { + echo "coverage selected" + $Global:INSTALL_COVERAGE = 1 + } + if ( "$var" -eq 'clangformat' ) { + echo "clangformat selected" + $Global:INSTALL_CLANGFORMAT = 1 + } + } +} + +# Help +function sub-help { + echo "Usage: $PROGNAME list of component" + echo "Components:" + echo " base" + echo " python" + echo " ruby" + echo " netcore" + echo " netcore2" + echo " netcore5" + echo " rapidjson" + echo " funchook" + echo " v8" + echo " v8rep51" + echo " v8rep54" + echo " v8rep57" + echo " v8rep58" + echo " nodejs" + echo " typescript" + echo " file" + echo " rpc" + echo " wasm" + echo " java" + echo " c" + echo " cobol" + echo " swig" + echo " metacall" + echo " pack" + echo " coverage" + echo " clangformat" + echo "" +} + +switch($args.length) { + 0 { + sub-help + Break + } + Default { + sub-options + sub-install + } +}