logo

한국어
#!/bin/bash
######################################################################
#
# OpenWRT 빌드 스크립트
#
# OS: CentOS 7
# Target Profile: WeVO 11AC NAS Router
# Firmware download:
# http://downloads.openwrt.org/releases/18.06.4/targets/${DEVICE_ARCH}/${DEVICE_SOC}/openwrt-18.06.4-${DEVICE_ARCH}-${DEVICE_SOC}-11acnas-squashfs-sysupgrade.bin
#
######################################################################
CURRENT_DIR=$(pwd)
WORKING_DIR="/work"
GIT_URL="https://git.openwrt.org/openwrt/openwrt.git"
GIT_BRANCH="v18.06.4"
DEVICE_ARCH="ramips"
DEVICE_SOC="mt7621"
MY_OPENWRT_CONFIG="$(pwd)/myconfig"
CONFIG_DOWNLOAD_URL="http://downloads.openwrt.org/releases/18.06.4/targets/${DEVICE_ARCH}/${DEVICE_SOC}/config.seed"
CPU_CORE=3

######################################################################
#
# 사용법 출력
#
######################################################################
function usage() {
  echo
  echo "$0 (build step)"
  echo
  echo "build step:"
  echo "  yum: update required files via yum"
  echo "  dnsrc: download openwrt source code via git"
  echo "  dncfg: kernel & openwrt config file download"
  echo "  menuconfig: make menuconfig"
  echo "  make: make"
  echo "  getbin: copy the finished build image to the current directory"
  echo "  clean: make distclean"
  echo "  reset: delete all files, including source code"
}

######################################################################
#
# 빌드에 필요한 CentOS 패키지를 설치한다.
#
######################################################################
function cmd_yum() {
  yum -y install binutils bzip2 gcc gcc-c++ gawk gettext flex ncurses-devel zlib-devel zlib-static make patch unzip perl-ExtUtils-MakeMaker glibc glibc-devel glibc-static ncurses-libs sed sdcc intltool sharutils bison wget git-core openssl-devel xz subversion
}

######################################################################
#
# OpenWRT 소스코드를 다운로드 받고, feeds를 업데이트 한다.
#
######################################################################
function cmd_dnsrc() {
  mkdir -p ${WORKING_DIR}
  cd ${WORKING_DIR}
  git clone -b ${GIT_BRANCH} ${GIT_URL}

  cd ${WORKING_DIR}/openwrt

  ####################################################################
  # feeds 업데이트
  ####################################################################
  ./scripts/feeds update -a
  ./scripts/feeds install -a


  ####################################################################
  # LuCI Web Interface
  ####################################################################
  ./scripts/feeds update packages luci
  ./scripts/feeds install -a -p luci

  cd ${CURRENT_DIR}
}

######################################################################
#
# 커널 CONFIG 파일을 다운로드 받는다.
#
######################################################################
function cmd_dncfg() {
  rm -f ${WORKING_DIR}/config.*
  wget --no-check-certificate -P ${WORKING_DIR} ${CONFIG_DOWNLOAD_URL}
  echo "CONFIG_TARGET_${DEVICE_ARCH}_${DEVICE_SOC}_DEVICE_11acnas=y" >> ${WORKING_DIR}/config.seed
  cp -fv ${WORKING_DIR}/config.seed ${WORKING_DIR}/openwrt/.config
}

######################################################################
#
# menuconfig 실행
#
# 글자가 깨질 경우 vi ~/.bash_profile 해서
# export TERM=xterm
# 을 추가하고 터미널 클라이언트도 맞춘다.
#
######################################################################
function cmd_menuconfig() {
  if [ ! -f ${WORKING_DIR}/config.seed ]
  then
    echo "Please execute the \"${0} dncfg\" first."
    exit 1
  fi

  cd ${WORKING_DIR}/openwrt
  rm -rf tmp
  rm -f .config
  make defconfig

  ####################################################################
  # 다운로드 된 config가 있으면 그것으로 make menuconfig 준비
  ####################################################################
  if [ -f ${WORKING_DIR}/config.seed ]
  then
    cp -fv ${WORKING_DIR}/config.seed ${WORKING_DIR}/openwrt/.config
  fi

  ####################################################################
  # 미리 준비된 config가 있으면 그것으로 make menuconfig 준비
  ####################################################################
  if [ -f ${MY_OPENWRT_CONFIG} ]
  then
    cp -fv ${MY_OPENWRT_CONFIG} ./.config
  fi

  make menuconfig
}

######################################################################
#
# make
# ※ V=99는 make에서 빌드시 상세한 정보가 보여지도록 한다.
# ※ "-j 5"는 멀티스레드로 빌드를 진행한다 5는 CPU 코어수 + 1
# ※ IGNORE_ERRORS는 오류를 무시할 것인가 결정한다.
#
######################################################################
function cmd_make() {
  cd ${WORKING_DIR}/openwrt

  if [ ! -f .config ]
  then
    echo "Please execute the \"${0} config\" first."
    exit 1
  fi

  rm -rf ${WORKING_DIR}/openwrt/bin/targets/${DEVICE_ARCH}/${DEVICE_SOC}/*
  export FORCE_UNSAFE_CONFIGURE=1
  make -j ${CPU_CORE} IGNORE_ERRORS=1 V=99
}

######################################################################
#
# 컴파일 완료된 이미지 파일을 현재 디렉토리로 복사
#
######################################################################
function cmd_getbin() {
  rm -f ${CURRENT_DIR}/*.bin

  cp -fv ${WORKING_DIR}/openwrt/bin/targets/${DEVICE_ARCH}/${DEVICE_SOC}/*-sysupgrade.bin ${CURRENT_DIR}
}

######################################################################
#
# distclean
#
######################################################################
function cmd_clean() {
  cd ${WORKING_DIR}/openwrt
  rm -rf tmp
  make distclean
}

######################################################################
#
# 모든 소스코드 삭제
#
######################################################################
function cmd_reset() {
  rm -rf ${WORKING_DIR}
}

######################################################################
#
# arguments가 1보다 크면 잘못된 옵션 지정이므로 끝낸다.
#
######################################################################
if [ $# -gt 1 ]
then
  usage
  exit 1
fi

######################################################################
#
# 옵션에 따라 분기 처리
#
######################################################################
case ${1} in
  yum)
    cmd_yum
    ;;
  dnsrc)
    cmd_dnsrc
    ;;
  dncfg)
    cmd_dncfg
    ;;
  menuconfig)
    cmd_menuconfig
    ;;
  make)
    cmd_make
    ;;
  getbin)
    cmd_getbin
    ;;
  clean)
    cmd_clean
    ;;
  reset)
    cmd_reset
    ;;
  *)
    usage
esac

exit 0