Skip to content

Latest commit

 

History

History
362 lines (316 loc) · 12.3 KB

File metadata and controls

362 lines (316 loc) · 12.3 KB

Cách Build SailfishOS

Bắt Đầu

Tước Hết Bạn Cần Tạo Một User Khác / Cái Này Tùy Ý ( Bỏ Qua Cũng Đc )

   sudo useradd build -s /bin/bash -m -G wheel -c "SFOS Builder"
   sudo passwd build
   su - build

Bước 1:

Các Packages Cần Thiết :

   sudo dpkg --add-architecture i386 && sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get install -y git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev libgl1-mesa-dev libxml2-utils xsltproc unzip bc repo nano && sudo apt-get install -y git gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 x11proto-core-dev libx11-dev libgl1-mesa-dev libxml2-utils xsltproc unzip bc repo nano libssl-dev && sudo apt-get install -y openjdk-8-jdk android-tools-adb bc bison build-essential curl flex g++-multilib gcc-multilib gnupg gperf imagemagick lib32readline-dev lib32z1-dev liblz4-tool libncurses5-dev libsdl1.2-dev libssl-dev libwxgtk3.0-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc yasm zip zlib1g-dev && sudo apt-get install -y build-essential kernel-package libncurses5-dev bzip2 android-liblog android-libbacktrace libtinyxml2-6 android-libutils android-sdk-build-tools git-lfs libncurses5:i386 libncurses5 ccache build-essential p7zip-full git libgtk2.0-dev chrpath libncurses5-dev libdbus-1-dev ruby libgl1-mesa-dev "^libxcb.*" libx11-xcb-dev libxrender-dev libxi-dev flex bison gperf patchelf

Bạn Cần add Những Thứ Này Vào ~/.bashrc

   # SailfishOS
   export HISTFILE="$HOME/.bash_history"
   export HISTSIZE=1000
   export HISTCONTROL=ignoreboth
   export PATH=$HOME/bin:$PATH
   export PLATFORM_SDK_ROOT="/srv/mer"
   export ANDROID_ROOT="$HOME/Sailfish/src"
   shopt -s histappend
   alias sfossdk="$PLATFORM_SDK_ROOT/sdks/sfossdk/mer-sdk-chroot"
   alias sfos_sdk="sfossdk"
   alias platform_sdk="sfossdk"
   alias plat_sdk="sfossdk"
   alias platformsdk="sfossdk"
   alias platsdk="sfossdk"

Tiếp Theo Bạn Cần Tạo File .hadk.env ở ~/ và dán nội dung này vào :

   
   export PLATFORM_SDK_ROOT="/srv/mer"
   export ANDROID_ROOT="$HOME/Sailfish/src"
   export VENDOR="xiaomi"
   export DEVICE="whyred"
   export PORT_ARCH="armv7hl"

   # If not running interactively, don't do anything else
   [[ $- != *i* ]] && return

   echo "$ export LANG=C LC_ALL=POSIX"
   export LANG=C LC_ALL=POSIX
   echo "$ cd \$ANDROID_ROOT"
   cd $ANDROID_ROOT

Tiếp Theo Là File .mersdk.profile

builder_script="rpm/dhd/helpers/build_packages.sh"
[ -d /etc/bash_completion.d ] && for i in /etc/bash_completion.d/*; do . $i; done
export PS1="PLATFORM_SDK $PS1"
export HISTFILE="$HOME/.bash_history-sfossdk"
export RELEASE=`cat /etc/os-release | grep VERSION_ID | cut -d"=" -f2`

alias host="exit"
alias ha_build="ubu-chroot -r $PLATFORM_SDK_ROOT/sdks/ubuntu"
alias habuild="ha_build"
alias build_all_pkgs="build_all_packages"
alias build_all="build_all_packages"
alias bp="build_packages"
alias build_pkgs="build_packages"
alias build_droid_hal="build_packages -d"
alias build_hal="build_droid_hal"
alias build_device_configs="build_packages -c"
alias build_configs="build_device_configs"
alias build_cfgs="build_device_configs"
alias do_mic_build="run_mic_build"
alias mic_build="run_mic_build"
alias build_sfos="run_mic_build"
alias build_sailfish="run_mic_build"
alias build_img="run_mic_build"
alias build_image="run_mic_build"
alias reset_droid_repos="sudo rm -rf $ANDROID_ROOT/rpm/ $ANDROID_ROOT/hybris/droid-{configs,hal-version-$DEVICE}* $ANDROID_ROOT/droid-hal-$DEVICE.log $ANDROID_ROOT/.last_device; unset last_device; choose_target"
alias reset_repos="reset_droid_repos"
alias choose_device="choose_target"
alias switch_target="choose_target"
alias switch_device="choose_target"

hadk() {
	echo
	source $HOME/.hadk.env
	echo "Env setup for $DEVICE"
}

clone_src() {
	path="$ANDROID_ROOT/$3/"
	mkdir -p "$path"
	git clone --recurse -b $2 https://github.com/SailfishOS-Whyred-sdm660/$1 "$path" &> /dev/null
}

update_src() {
	path="$ANDROID_ROOT/$1/"
	[ ! -d "$path" ] && exit 1
	# TODO: Fix updating properly; force all unless local changes detected?
	cd "$path" && git fetch &> /dev/null && git pull --recurse-submodules &> /dev/null
}

choose_target() {
	echo -e "\nWhich hybris-15.1 device would you like to build for?"
	echo -e "\n  1. whyred (Xiaomi Redmi Note 5 Pro)"
	echo -e "  2. dumpling     (OnePlus 5T)\n"
	read -p "Choice: (1/2) " target

	# Setup variables
	device="whyred"
	[ "$target" = "2" ] && device="dumpling"
	branch="hybris-15.1"
	[ "$device" = "dumpling" ] && branch="dumpling-15.1"
	[ -f "$ANDROID_ROOT/.last_device" ] && last_device="$(<$ANDROID_ROOT/.last_device)"

	if [ "$device" != "$last_device" ]; then
		if [ ! -z "$last_device" ]; then
			echo "WARNING: All current changes in SFOS local droid repos WILL be discarded if you continue!"
			read -p "Would you like to continue? (y/N) " ans
			ans=`echo "$ans" | xargs | tr "[y]" "[Y]"`
			if [ "$ans" != "Y" ]; then
				hadk
				return 1
			fi

			echo "Discarded local droid HAL & configs for $last_device!"
			rm -rf $ANDROID_ROOT/rpm* $ANDROID_ROOT/hybris/droid-{configs,hal-version-}*
		fi

		printf "Cloning droid HAL & configs for $device..."
		clone_src "droid-hal-whyred" "$branch" "rpm" &&
		clone_src "droid-config-whyred" "$branch" "hybris/droid-configs" &&
		clone_src "droid-hal-version-whyred" "$branch" "hybris/droid-hal-version-$device"
		(( $? == 0 )) && echo " done!" || echo " fail! exit code: $?"

		echo "$device" > "$ANDROID_ROOT/.last_device"
	else
		printf "Updating droid HAL & configs for $device..."
		update_src "rpm" &&
		update_src "hybris/droid-configs" &&
		update_src "hybris/droid-hal-version-$device"
		(( $? == 0 )) && echo " done!" || echo " fail! exit code: $?"
	fi

	sed "s/DEVICE=.*/DEVICE=\"$device\"/" -i $HOME/.hadk.env
	hadk
}

build_all_packages() {
	cd $ANDROID_ROOT

	echo "$ $builder_script $@"
	$builder_script $@
}

build_packages() {
	cd $ANDROID_ROOT

	if (( $# == 0 )); then
		build_packages -c
		return
	fi

	echo "$ $builder_script $@"
	$builder_script $@ || return
}

run_mic_build() {
	if [ -z $UPDATES_CHECKED ]; then
		# Function to compare version strings
		vercomp() {
			[ "$1" = "$2" ] && return 0 # =
			[ "$1" = `printf "$1\n$2" | sort -t '.' -k 1,1 -k 2,2 -k 3,3 -k 4,4 -g | head -1` ] && return 1 # <
			return 2 # >
		}

		# Fetch latest public release version
		local tmp=`curl -s https://en.wikipedia.org/wiki/Sailfish_OS | grep -B 2 "^<td>Public release$" | grep "^<td>v" | tail -1` # e.g. "<td>v3.0.3.10</td>"
		tmp=${tmp#*v} # e.g. "3.0.3.10</td>"
		local LATEST_RELEASE=${tmp::${#tmp}-5} # e.g. "3.0.3.10"
		local LATEST_TOOLING=`echo $LATEST_RELEASE | cut --complement -d"." -f4-` # e.g. "3.0.3"
		local CURRENT_TOOLING=`echo $RELEASE | cut --complement -d"." -f4-` # e.g. "3.1.0"

		# Can we build latest w/ current tooling (e.g. '3.0.3' vs '3.1.0')
		vercomp "$LATEST_TOOLING" "$CURRENT_TOOLING"
		local res=$?
		if (( $res == 0 )); then
			# TODO Check if installed tooling is latest available from http://releases.sailfishos.org/sdk/targets/

			# Only use "latest version" if it's actually newer
			vercomp "$LATEST_RELEASE" "$RELEASE"
			res=$?
			if (( $res == 2 )); then
				RELEASE="$LATEST_RELEASE"
				echo ">> Targeting latest public release $RELEASE."

			# Out-of-date version history => Use local tooling
			else
				echo ">> Targeting installed tooling release $RELEASE."
			fi

		# Out-of-date version history => Use local tooling
		elif (( $tmp == 1 )); then
			echo ">> Targeting installed tooling release $RELEASE."

		# Can't build w/ current tooling => Check if tooling updates available
		else
			curl -s http://releases.sailfishos.org/sdk/targets/ | fgrep $LATEST_TOOLING &>/dev/null && echo ">> Build target updates available ($CURRENT_TOOLING.x => $LATEST_TOOLING.x)! Resources: http://releases.sailfishos.org/sdk/targets/ https://git.io/fjM1D"
			echo ">> Currently targeting installed tooling release $RELEASE."
		fi

		UPDATES_CHECKED=1
	fi

	# TODO: Add support to build image using OBS KS (devel/testing), do local fixups etc
	build_packages -i
}

choose_target

Tiếp Theo Là File .mersdkubu.profile :


hadk() { source $HOME/.hadk.env; echo "Env setup for $DEVICE"; }
export PS1="HABUILD_SDK [\${DEVICE}] $PS1"
hadk

sdk_prompt() { echo "$1: enter PLATFORM_SDK first by pressing CTRL + D & try again!"; }
alias zypper="sdk_prompt zypper"
alias sb2="sdk_prompt sb2"
alias sfossdk="exit"
alias sfos_sdk="exit"
alias platform_sdk="exit"
alias plat_sdk="exit"
alias platformsdk="exit"
alias platsdk="exit"

export HISTFILE="$HOME/.bash_history-habuild"

if [ -f build/envsetup.sh ]; then
	echo "$ source build/envsetup.sh"
	source build/envsetup.sh
	echo "$ breakfast $DEVICE"
	breakfast $DEVICE
	echo "$ export USE_CCACHE=1"
	export USE_CCACHE=1
fi

Bước 2

Bạn Tạo curl Bin Google

   mkdir ~/bin
   curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
   chmod +x ~/bin/repo

Tiếp Theo Là Tạo Môi Trường SDK Nền Tản SUSE Linux :

   exec bash
   sudo mkdir -p $PLATFORM_SDK_ROOT/{targets,toolings,sdks/sfossdk}
   sudo ln -s /srv/mer/sdks/sfossdk/srv/mer/sdks/ubuntu/ /srv/mer/sdks/ubuntu
   cd && curl -k -O http://releases.sailfishos.org/sdk/installers/latest/Jolla-latest-SailfishOS_Platform_SDK_Chroot-i486.tar.bz2
   sudo tar --numeric-owner -p -xjf Jolla-latest-SailfishOS_Platform_SDK_Chroot-i486.tar.bz2 -C $PLATFORM_SDK_ROOT/sdks/sfossdk            
   mkdir -p $ANDROID_ROOT
   sfossdk

Tiếp Theo Là Chọn Thiết Bị :

Which hybris-15.1 device would you like to build for?

  1. whyred (Xiaomi Redmi Note 5 Pro)
  2. dumpling     (OnePlus 5T)
  
  Choice: (1/2) 1
Cloning droid HAL & configs for whyred... done!

Env setup for whyred

Cài Đặt Tool HADK :

   sudo zypper ref -f
   sudo zypper --non-interactive in bc pigz atruncate android-tools-hadk
   Nếu Bị Lỗi Này adaptation0 Thì Đó Là Chuyện Bình Thường / Không Bị Cũng Không Sao Cả  😅😅😅

Bước 3

Thêm Mục Tiêu Để Build SailfishOS

   cd && sdk-manage target install $VENDOR-$DEVICE-$PORT_ARCH http://releases.sailfishos.org/sdk/targets/Sailfish_OS-$RELEASE-Sailfish_SDK_Target-$PORT_ARCH.tar.7z --tooling SailfishOS-$RELEASE --tooling-url http://releases.sailfishos.org/sdk/targets/Sailfish_OS-$RELEASE-Sailfish_SDK_Tooling-i486.tar.7z

Để Kiểm Tra Xem Đã Ổn Chưa :

   sdk-assistant list

Kết quả Là :

   SailfishOS-3.2.1.20
   |-xiaomi-whyred-armv7hl

Là Ổn Rồi Đấy

Bước 4

Cài Đặt SDK HABUILD :

   TARBALL=ubuntu-trusty-20180613-android-rootfs.tar.bz2
   cd && curl -O https://releases.sailfishos.org/ubu/$TARBALL
   UBUNTU_CHROOT=$PLATFORM_SDK_ROOT/sdks/ubuntu
   sudo mkdir -p $UBUNTU_CHROOT
   sudo tar --numeric-owner -xjf $TARBALL -C $UBUNTU_CHROOT
   sudo sed "s/\tlocalhost/\t$(</parentroot/etc/hostname)/g" -i $UBUNTU_CHROOT/etc/hosts
   cd $ANDROID_ROOT
   habuild

Thiết Lập Thêm Môi Trường Git :

   git config --global user.name "Your Name"
   git config --global user.email "your@email.com"

Bạn Có Thể Xoá File Cũ Để Nhẹ Bớt Ổ Cứng :

   cd && rm Jolla-latest-SailfishOS_Platform_SDK_Chroot-i486.tar.bz2 ubuntu-*-android-rootfs.tar.bz2

Bước 5

Bắt Đầu Sync :

   repo init -u https://github.com/SailfishOS-sdm660/SailfishOS_manifest.git -b android-8.1
   repo sync -c -j$(nproc --all) --force-sync --no-clone-bundle --no-tags

Hướng Dẫn Chuyển Đổi User

Ví Dụ Bạn Đang Ở habuild để Chuyển Đổi Về platform_sdk Bạn Nhập exit để sang habuild bạn nhập habuild

Bước 6

Build Hal : / user habuild

   source build/envsetup.sh && breakfast $DEVICE && export USE_CCACHE=1
   mka hybris-hal

Nếu Đây Là Lần Đầu Bạn Build Với Source Này . Bạn Cần Thứ Này Đấy ☺️☺️😚

   echo "MINIMEDIA_AUDIOPOLICYSERVICE_ENABLE := 1" > external/droidmedia/env.mk
   mka droidmedia audioflingerglue

Tiếp Theo Là Build Hybris Boot ( Kernel )

   mka hybris-boot

Build SailfishOS Và rootfs Của SailfishOS : (P/S Build Lỗi Nhiều Kinh 😂😂😂)

   build_packages

Info :

Nếu Có Bất Kỳ Lỗi Nào : nobi nobita