Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Rev 24 | Rev 28 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. @echo off
  2. setlocal enableextensions enabledelayedexpansion
  3.  
  4. rem // set the WSL distribution to use
  5. set WSL_DISTR=Ubuntu-22.04
  6.  
  7. rem // name of the QNX SDK root directory
  8. set QNXSDK_DIRNAME=qnx800
  9.  
  10. rem // list of Linux tools required by the cross-build script
  11. set REQUIRED_TOOLS=wget python3 cmake gcc g++ ninja:ninja-build ccache
  12.  
  13.  
  14. rem // make sure we have at least Windows 10
  15. for /f "tokens=4 delims=. " %%i in ('ver') do set VERSION=%%i
  16. echo Detected Windows NT kernel version: %VERSION%
  17. if %VERSION% LSS 10 (
  18.         echo Error: you need at least Windows 10 to cross-build LLVM to QNX 8.
  19.         echo Please upgrade your Windows operating system to Windows 10 version 2004 build
  20.         echo 19041 or a later version.
  21.         goto :exit_error
  22. )
  23.  
  24. rem // if WSL is not installed, do so
  25. echo Checking WSL presence...
  26. wsl --list -v > nul 2>&1 || goto :install_wsl
  27. echo The Windows Subsystem for Linux is installed
  28.  
  29. rem // WSL is installed, make sure the Linux distribution we need is there
  30. echo Checking for the presence of %WSL_DISTR% in WSL...
  31. wsl --distribution %WSL_DISTR% -- cat /etc/os-release|find "%WSL_DISTR:-= %" > nul || goto :install_wsl
  32. echo The GNU/Linux distribution %WSL_DISTR% is present
  33.  
  34. rem // WSL is installed, make sure it's running WSL2
  35. echo Checking WSL hypervisor version...
  36. wsl --distribution %WSL_DISTR% -- cat /proc/version|find "WSL2" > nul || (
  37.         echo This WSL distribution %WSL_DISTR% needs to be converted to WSL2.
  38.         rem // this distribution needs to be converted
  39.         wsl --set-version %WSL_DISTR% 2 || (
  40.                 echo Error: you need the Windows Subsystem for Linux to support WSL2 for this
  41.                 echo cross-build script to work consistently.
  42.                 echo Please upgrade your Windows operating system to Windows 10 version 2004 build
  43.                 echo 19041 or a later version.
  44.                 goto :exit_error
  45.         )
  46.         rem // alright, this distribution is on WSL2
  47. )
  48. echo The Windows Subsystem for Linux is version 2.
  49.  
  50. rem // make sure we have the required tools, install them if not
  51. set APT_CACHE_UPDATED=0
  52. for %%i in (%REQUIRED_TOOLS%) do (
  53.         rem // tool syntax: "<executable>:<optional APT package name>"
  54.         rem // if package name is not specified, it defaults to <executable>
  55.         set REQUIRED_TOOL_AND_PACKAGE=%%i
  56.         for /f "tokens=1-2 delims=:" %%j in ('echo !REQUIRED_TOOL_AND_PACKAGE!') do (
  57.                 set REQUIRED_TOOL=%%j
  58.                 set REQUIRED_PACKAGE=%%k
  59.                 if "!REQUIRED_PACKAGE!"=="" set REQUIRED_PACKAGE=!REQUIRED_TOOL!
  60.         )
  61.         echo Checking for the presence of !REQUIRED_TOOL! from APT package !REQUIRED_PACKAGE!...
  62.         wsl --distribution %WSL_DISTR% -- !REQUIRED_TOOL! --version > nul 2>&1 && (
  63.                 echo !REQUIRED_TOOL! is available.
  64.         ) || (
  65.                 echo !REQUIRED_TOOL! needs installation. Attempting to install it.
  66.                 if "!APT_CACHE_UPDATED!"=="0" (
  67.                         rem // allow ourselves to run any commands by patching /etc/sudoers. Do this once.
  68.                         wsl --distribution %WSL_DISTR% -- sudo sh -c ^"echo '%%sudo  ALL=^(ALL^) NOPASSWD:ALL' ^>^> /etc/sudoers^"
  69.                         rem // update APT cache before installing stuff, but just once.
  70.                         wsl --distribution %WSL_DISTR% -- sudo apt-get -y update
  71.                         set APT_CACHE_UPDATED=1
  72.                 )
  73.                 wsl --distribution %WSL_DISTR% sudo apt-get -y install !REQUIRED_PACKAGE! || (
  74.                         echo Error: the required Linux tool !REQUIRED_TOOL! can't be installed with apt-get.
  75.                         pause
  76.                         goto :exit_error
  77.                 )
  78.         )
  79. )
  80.  
  81. rem // set the QNX8 SDP build environment, deploying the toolchain symlinks if necessary
  82. set THISDIR=%CD%
  83. cd ..\qnx800
  84. call qnxsdp-env.bat || goto :exit_error
  85. cd "%THISDIR%"
  86.  
  87. rem // The build script will already recursively transfer the contents of $QNX_HOST and $QNX_TARGET to the WSL2 ext4 partition
  88. rem // to avoid using the Plan9 NTFS to ext4 bridge (9p file protocol) implemented by Microsoft that is notoriously slow.
  89. rem // However to make this faster, we could:
  90. rem //   1. fire up a file packer and create a SINGLE FILE archive of the directory hierarchy to copy
  91. rem //   2. copy the file over to WSL
  92. rem //   3. unpack the archive in /tmp/qnxsdk and delete it - as it's much faster to migrate a single file than a folder hierarchy
  93. rem // The prerequisite shall be that the archive format be *operable with the default tools on both systems*.
  94. rem // We might be able to do this by using the "tar.exe" utility from the QNX8 Win64 host SDP tools and piping the data
  95. rem // through a wsl instance which would in turn untar it directly at its location. Investigate.
  96.  
  97. rem // NOTE: on WSL2, the QNX SDK will always be copied to $HOME, regardless of what xdg-user-dir DESKTOP says.
  98. wsl --distribution %WSL_DISTR% -- mkdir -p ~/%QNXSDK_DIRNAME%/host ~/%QNXSDK_DIRNAME%/target
  99. echo Deploying QNX8 Linux host SDK to WSL2 ext4 filesystem, please wait...
  100. "%QNX_HOST%\usr\bin\tar.exe" c - ..\%QNXSDK_DIRNAME%\host\linux | wsl --distribution %WSL_DISTR% -- tar x --directory=~/%QNXSDK_DIRNAME%/host
  101. echo Deploying QNX8 TARGET SDK to WSL2 ext4 filesystem, please wait...
  102. "%QNX_HOST%\usr\bin\tar.exe" c - ..\%QNXSDK_DIRNAME%\target\qnx | wsl --distribution %WSL_DISTR% -- tar x --directory=~/%QNXSDK_DIRNAME%/target
  103.  
  104. rem // now run WSL from this directory and chain-call the POSIX Bourne shell build script
  105. wsl --distribution %WSL_DISTR% -- ./cross-build.sh || goto :exit_error
  106.  
  107. rem // at this point, the story is supposed to have ended well.
  108. rem // Keep calm, and I'll tell you another one tomorrow.
  109. goto :exit_success
  110.  
  111.  
  112. :install_wsl
  113.         echo Installing the Windows Subsystem for Linux...
  114.         echo ############################################################################
  115.         echo # NOTE: please define a *non-root* Linux user name and password when asked #
  116.         echo #       ^(for example: 'utilisateur' / 'utilisateur'^)                       #
  117.         echo #       then type 'exit' at the Linux shell ^(green prompt^) to continue.    #
  118.         echo ############################################################################
  119.         wsl --install --distribution %WSL_DISTR% || (
  120.                 echo Error: you need at least a version of Windows 10 which has the "wsl" command.
  121.                 echo Please upgrade your Windows operating system to Windows 10 version 2004 build
  122.                 echo 19041 or a later version.
  123.                 goto :exit_error
  124.         )
  125.         echo The Windows Subsystem for Linux was successfully installed with the default
  126.         echo distribution.
  127.         echo Action required: please reboot your computer and run this script again.
  128.         pause
  129.         goto :exit_success
  130.  
  131. :exit_error
  132. rem // failure exit
  133. pause
  134. exit /b 1
  135.  
  136. :exit_success
  137. rem // successful exit
  138. exit /b 0
  139.