Setup WSL Development Environment for target RG353P(arm64) and Windows 10 (not relevan again) use pre build toolchain - leonkasovan/RG353P GitHub Wiki

Setup Windows Subsystem for Linux (WSL) for Windows 10/11

  1. (Optional) Unregister and delete Linux Distro: wslconfig /u Debian
  2. Setting BIOS for supporting virtualization
    Gigabyte BIOS Motherboard (press DEL when booting):
    M.I.T -> Advanced Frequency Settings -> Advanced CPU Core Settings -> SVM Mode : Enabled
  3. Download and install DEBIAN Linux Distro in Microsoft Store or
    use command line: wsl --install --distribution Ubuntu-22.04
    use command line: wsl --install --distribution Debian
  4. Update WSL (in power shell administrator) to support GUI apps wsl --update
  5. Run linux env via Win+S: wsl

Install Development Environment for aarch64 / arm64

  1. Add package support for aarch64/arm64
    sudo dpkg --add-architecture arm64
  2. Update package manager tools
    sudo apt update
    sudo apt upgrade
  3. (Optional) Edit package source list
    sudo nano /etc/apt/sources.list

deb [arch=amd64,arm64] http://deb.debian.org/debian bullseye main
deb [arch=amd64,arm64] http://deb.debian.org/debian bullseye-updates main
deb [arch=amd64,arm64] http://security.debian.org/debian-security bullseye-security main
deb [arch=amd64,arm64] http://ftp.debian.org/debian bullseye-backports main

  1. Install GCC sudo apt install build-essential gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
    Disarankan pakai GCC version 10: gcc-10-aarch64-linux-gnu
  2. (Optional) Install cmake sudo apt install cmake

Adding Library for Development

sudo apt install libsdl2-dev:arm64
sudo apt install libsdl2-mixer-dev:arm64
sudo apt install libfreetype-dev:arm64
sudo apt install libfreeimage-dev:arm64
sudo apt install libopengl-dev:arm64
sudo apt install libcurl3-openssl-dev:arm64
sudo apt install libgl1-mesa-dev:arm64
sudo apt install libgles-dev:arm64
sudo apt install rapidjson-dev:arm64

Makefile for cross compiling aarch64

TARGET = EnhancedFileManager
CC = aarch64-linux-gnu-g++
SDL2_CONFIG = pkg-config sdl2,SDL2_ttf,SDL2_image
SRC = $(wildcard src/*.cpp)
OBJ = $(patsubst %cpp,%o,$(SRC))
COMPILER_FLAGS =  $(shell $(SDL2_CONFIG) --cflags) -Wall -pedantic -Wfatal-errors "
LINKER_FLAGS = $(shell $(SDL2_CONFIG) --libs) -s -w

all : $(OBJ)
	$(CC) $(OBJ) -o $(TARGET) $(LINKER_FLAGS)

%.o:%.cpp
	$(CC) -c $< -o $@ $(COMPILER_FLAGS)

clean :
	rm -f $(OBJ) $(TARGET)

pkg-config for cross compiling aarch64

PKG_CONFIG_PATH="/usr/lib/aarch64-linux-gnu/pkgconfig" make (works) OR

pkg-config --cflags --libs libcurl
export PKG_CONFIG_DIR=""
export PKG_CONFIG_LIBDIR="/usr/lib/aarch64-linux-gnu/pkgconfig"
export PKG_CONFIG_SYSROOT_DIR=""
pkg-config --cflags --libs libcurl

CMake for cross compiling aarch64

nano CMakeLists.txt

project(emulationstation-all)
set(ENV{PKG_CONFIG_DIR} "")
set(ENV{PKG_CONFIG_LIBDIR} "${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig")
set(ENV{PKG_CONFIG_SYSROOT_DIR} ${CMAKE_SYSROOT})
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_C_COMPILER "/usr/bin/aarch64-linux-gnu-gcc")
set(CMAKE_CXX_COMPILER "/usr/bin/aarch64-linux-gnu-g++")
set(CMAKE_INCLUDE_DIR "/usr/include")
set(CMAKE_LIBRARY_PATH "/usr/lib/aarch64-linux-gnu")
set(CMAKE_SYSROOT "")
set(CMAKE_LIBRARY_ARCHITECTURE "aarch64-linux-gnu")

CC=aarch64-linux-gnu-gcc CXX=aarch64-linux-gnu-g++ cmake . make -j8

Below is not needed:

cmake_minimum_required(VERSION 2.8)
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR aarch64)
set(CMAKE_C_COMPILER "/usr/bin/aarch64-linux-gnu-gcc")
set(CMAKE_CXX_COMPILER "/usr/bin/aarch64-linux-gnu-g++")
set(CMAKE_C_FLAGS "-march=armv8-a -mtune=cortex-a55")
set(CMAKE_CXX_FLAGS "-march=armv8-a -mtune=cortex-a55")
set(CMAKE_SYSROOT "")
set(CMAKE_LIBRARY_ARCHITECTURE "aarch64-linux-gnu")
set(ENV{PKG_CONFIG_DIR} "")
set(ENV{PKG_CONFIG_LIBDIR} "${CMAKE_SYSROOT}/usr/lib/aarch64-linux-gnu/pkgconfig")
set(ENV{PKG_CONFIG_SYSROOT_DIR} ${CMAKE_SYSROOT})
set(GLES2 ON)
set(SCREENSCRAPER_DEV_LOGIN "devid=jelos&devpassword=jelos")
set(SCREENSCRAPER_SOFTNAME "MyBuildEmulationStation")
set(OPENGLES2_INCLUDE_DIR "/usr/include")
add_definitions(-DHAVE_INTL)
...
...

Install golang for cross compiling aarch64

  1. Download go binary from https://go.dev/dl/
    wget https://go.dev/dl/go1.20.5.linux-amd64.tar.gz
  2. Open WSL shell
sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.20.5.linux-amd64.tar.gz
sudo nano /etc/profile; export PATH=$PATH:/usr/local/go/bin
sudo ln -s /usr/local/go/bin/go /usr/bin/go

  1. Restart WSL shell and test go
    go version
  2. Install needed libraries for target host arm64:
    sudo apt install libsdl2-dev:arm64

Create go project:

  1. mkdir go-project-1 && cd go-project-1
  2. nano main.go (copy paste from sample go hello world)
  3. go mod init go-project-1
  4. CGO_ENABLED=1 CC=aarch64-linux-gnu-gcc GOOS=linux GOARCH=arm64 go build -trimpath -x -ldflags "-s -w"