From d7095619ef1d7187b2d9fbde61b2312ed4fd581d Mon Sep 17 00:00:00 2001 From: latercomer Date: Sat, 13 Jul 2024 11:44:19 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BB=9F=E4=B8=80tools=E4=B8=ADenv=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E7=9A=84=E6=8E=A5=E5=8F=A3=E5=88=B0env=5Fhelper.py?= =?UTF-8?q?=E6=96=87=E4=BB=B6=EF=BC=8C=E5=B9=B6=E5=90=8C=E6=AD=A5=E8=B0=83?= =?UTF-8?q?=E6=95=B4ci?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/bsp_buildings.yml | 2 +- .../workflows/compile_bsp_with_drivers.yml | 5 +- .github/workflows/manual_dist.yml | 3 +- .../manual_trigger_scons_STM32_all.yml | 3 +- .../manual_trigger_scons_except_STM32_all.yml | 3 +- .../manual_trigger_scons_fail_bsp_all.yml | 3 +- tools/building.py | 29 +- tools/env.py | 55 -- tools/env_helper.py | 470 ++++++++++++++++++ tools/install_env.py | 191 ------- tools/menukconfig.py | 392 --------------- tools/options.py | 10 +- 12 files changed, 491 insertions(+), 675 deletions(-) delete mode 100644 tools/env.py create mode 100644 tools/env_helper.py delete mode 100644 tools/install_env.py delete mode 100644 tools/menukconfig.py diff --git a/.github/workflows/bsp_buildings.yml b/.github/workflows/bsp_buildings.yml index b5c3eab55839..746d4082a49d 100644 --- a/.github/workflows/bsp_buildings.yml +++ b/.github/workflows/bsp_buildings.yml @@ -369,9 +369,9 @@ jobs: chmod 777 install_ubuntu.sh ./install_ubuntu.sh git config --global http.postBuffer 524288000 - python -c "import tools.menukconfig; tools.menukconfig.touch_env()" echo "RTT_ROOT=${{ github.workspace }}" >> $GITHUB_ENV echo "RTT_CC=gcc" >> $GITHUB_ENV + echo "export PATH=~/.env/tools/scripts:$PATH" > ~/.env/env.sh - name: Install Arm ToolChains if: ${{ matrix.legs.RTT_TOOL_CHAIN == 'sourcery-arm' && success() }} diff --git a/.github/workflows/compile_bsp_with_drivers.yml b/.github/workflows/compile_bsp_with_drivers.yml index 43fcb59ab3e1..71f170308612 100644 --- a/.github/workflows/compile_bsp_with_drivers.yml +++ b/.github/workflows/compile_bsp_with_drivers.yml @@ -52,7 +52,6 @@ jobs: git config --global http.postBuffer 524288000 git remote -v git fetch origin - python -c "import tools.menukconfig; tools.menukconfig.touch_env()" - name: Install Arm ToolChains if: ${{ success() }} @@ -67,5 +66,5 @@ jobs: if: ${{ success() }} shell: bash run: | - source ~/.env/env.sh - #python tools/ci/compile_bsp_with_drivers.py + # source ~/.env/env.sh + # python tools/ci/compile_bsp_with_drivers.py diff --git a/.github/workflows/manual_dist.yml b/.github/workflows/manual_dist.yml index 93efd90ecf4e..ea5fd1eb4956 100644 --- a/.github/workflows/manual_dist.yml +++ b/.github/workflows/manual_dist.yml @@ -66,7 +66,6 @@ jobs: chmod 777 install_ubuntu.sh ./install_ubuntu.sh git config --global http.postBuffer 524288000 - python -c "import tools.menukconfig; tools.menukconfig.touch_env()" echo "RTT_ROOT=${{ github.workspace }}" >> $GITHUB_ENV echo "RTT_CC=gcc" >> $GITHUB_ENV @@ -145,7 +144,7 @@ jobs: RTT_BSP: ${{ github.event.inputs.bsp_options }} RTT_TOOL_CHAIN: ${{ github.event.inputs.bsp_tool_chain}} run: | - source ~/.env/env.sh + # source ~/.env/env.sh echo $RTT_BSP ls bsp/$RTT_BSP/Kconfig && scons -C bsp/$RTT_BSP --pyconfig-silent config=${{ github.event.inputs.bsp_config}} diff --git a/.github/workflows/manual_trigger_scons_STM32_all.yml b/.github/workflows/manual_trigger_scons_STM32_all.yml index 57795f74b9cd..707643b52edb 100644 --- a/.github/workflows/manual_trigger_scons_STM32_all.yml +++ b/.github/workflows/manual_trigger_scons_STM32_all.yml @@ -141,7 +141,6 @@ jobs: chmod 777 install_ubuntu.sh ./install_ubuntu.sh git config --global http.postBuffer 524288000 - python -c "import tools.menukconfig; tools.menukconfig.touch_env()" echo "RTT_ROOT=${{ github.workspace }}" >> $GITHUB_ENV echo "RTT_CC=gcc" >> $GITHUB_ENV @@ -161,7 +160,7 @@ jobs: RTT_BSP: ${{ matrix.legs.RTT_BSP }} RTT_TOOL_CHAIN: ${{ matrix.legs.RTT_TOOL_CHAIN }} run: | - source ~/.env/env.sh + # source ~/.env/env.sh echo $RTT_BSP ls bsp/$RTT_BSP/Kconfig && scons -C bsp/$RTT_BSP --pyconfig-silent sed -i "s/# ${{ github.event.inputs.bsp_config }} is not set/${{ github.event.inputs.bsp_config }}=y/g" bsp/$RTT_BSP/.config diff --git a/.github/workflows/manual_trigger_scons_except_STM32_all.yml b/.github/workflows/manual_trigger_scons_except_STM32_all.yml index a2fbe2f2d37e..422123342518 100644 --- a/.github/workflows/manual_trigger_scons_except_STM32_all.yml +++ b/.github/workflows/manual_trigger_scons_except_STM32_all.yml @@ -286,7 +286,6 @@ jobs: chmod 777 install_ubuntu.sh ./install_ubuntu.sh git config --global http.postBuffer 524288000 - python -c "import tools.menukconfig; tools.menukconfig.touch_env()" echo "RTT_ROOT=${{ github.workspace }}" >> $GITHUB_ENV echo "RTT_CC=gcc" >> $GITHUB_ENV @@ -354,7 +353,7 @@ jobs: RTT_BSP: ${{ matrix.legs.RTT_BSP }} RTT_TOOL_CHAIN: ${{ matrix.legs.RTT_TOOL_CHAIN }} run: | - source ~/.env/env.sh + # source ~/.env/env.sh echo $RTT_BSP ls bsp/$RTT_BSP/Kconfig && scons -C bsp/$RTT_BSP --pyconfig-silent sed -i "s/# ${{ github.event.inputs.bsp_config }} is not set/${{ github.event.inputs.bsp_config }}=y/g" bsp/$RTT_BSP/.config diff --git a/.github/workflows/manual_trigger_scons_fail_bsp_all.yml b/.github/workflows/manual_trigger_scons_fail_bsp_all.yml index c7b01eba5a50..5db36489f294 100644 --- a/.github/workflows/manual_trigger_scons_fail_bsp_all.yml +++ b/.github/workflows/manual_trigger_scons_fail_bsp_all.yml @@ -116,7 +116,6 @@ jobs: chmod 777 install_ubuntu.sh ./install_ubuntu.sh git config --global http.postBuffer 524288000 - python -c "import tools.menukconfig; tools.menukconfig.touch_env()" echo "RTT_ROOT=${{ github.workspace }}" >> $GITHUB_ENV echo "RTT_CC=gcc" >> $GITHUB_ENV @@ -175,7 +174,7 @@ jobs: RTT_BSP: ${{ matrix.legs.RTT_BSP }} RTT_TOOL_CHAIN: ${{ matrix.legs.RTT_TOOL_CHAIN }} run: | - source ~/.env/env.sh + # source ~/.env/env.sh echo $RTT_BSP ls bsp/$RTT_BSP/Kconfig && scons -C bsp/$RTT_BSP --pyconfig-silent sed -i "s/# ${{ github.event.inputs.bsp_config }} is not set/${{ github.event.inputs.bsp_config }}=y/g" bsp/$RTT_BSP/.config diff --git a/tools/building.py b/tools/building.py index 480197d5005a..de06818ddf07 100644 --- a/tools/building.py +++ b/tools/building.py @@ -142,17 +142,6 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [ # set BSP_ROOT in ENV Env['BSP_ROOT'] = Dir('#').abspath os.environ["BSP_DIR"] = Dir('#').abspath - # set PKGS_ROOT in ENV - if "PKGS_DIR" in os.environ: - pass - elif "PKGS_ROOT" in os.environ: - os.environ["PKGS_DIR"] = os.environ["PKGS_ROOT"] - elif "ENV_ROOT" in os.environ: - os.environ["PKGS_DIR"] = os.path.join(os.environ["ENV_ROOT"], "packages") - elif sys.platform == "win32": - os.environ["PKGS_DIR"] = os.path.join(os.environ["USERPROFILE"], ".env", "packages") - else: - os.environ["PKGS_DIR"] = os.path.join(os.environ["HOME"], ".env", "packages") sys.path += os.path.join(Rtt_Root, 'tools') @@ -205,7 +194,7 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [ try: # try to detect toolchains in env - envm = utils.ImportModule('env') + envm = utils.ImportModule('env_helper') # from env import GetSDKPath exec_path = envm.GetSDKPath(rtconfig.CC) if 'gcc' in rtconfig.CC: @@ -331,7 +320,7 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [ print('--global-macros arguments are illegal!') if GetOption('genconfig'): - from menukconfig import genconfig + from env_helper import genconfig genconfig() exit(0) @@ -341,23 +330,23 @@ def PrepareBuilding(env, root_directory, has_libcpu=False, remove_components = [ exit(0) if GetOption('menuconfig'): - from menukconfig import menuconfig + from env_helper import menuconfig menuconfig(Rtt_Root) exit(0) - if GetOption('pyconfig-silent'): - from menukconfig import guiconfig_silent - guiconfig_silent(Rtt_Root) + if GetOption('defconfig'): + from env_helper import defconfig + defconfig(Rtt_Root) exit(0) - elif GetOption('pyconfig'): - from menukconfig import guiconfig + elif GetOption('guiconfig'): + from env_helper import guiconfig guiconfig(Rtt_Root) exit(0) configfn = GetOption('useconfig') if configfn: - from menukconfig import mk_rtconfig + from env_helper import mk_rtconfig mk_rtconfig(configfn) exit(0) diff --git a/tools/env.py b/tools/env.py deleted file mode 100644 index 995cfd135b5d..000000000000 --- a/tools/env.py +++ /dev/null @@ -1,55 +0,0 @@ -#! /usr/bin/env python -#coding=utf-8 -# -# Copyright (c) 2024, RT-Thread Development Team -# -# SPDX-License-Identifier: GPL-2.0 -# -# Change Logs: -# Date Author Notes -# 2024-04-20 Bernard the first version - -import os -import json -import platform - -def GetEnvPath(): - env = os.environ.get('ENV_ROOT') - - if env is None: - if platform.system() == 'Windows': - return os.path.join(os.environ['USERPROFILE'], '.env') - else: - return os.path.join(os.environ['HOME'], '.env') - - return env - -def GetSDKPackage(): - env = GetEnvPath() - - if env: - return os.path.join(env, 'tools', 'packages') - - return None - -def GetSDKPath(name): - env = GetEnvPath() - - if env: - #read packages.json under env/tools/packages - with open(os.path.join(env, 'tools', 'packages', 'pkgs.json'), 'r', encoding='utf-8') as f: - # packages_json = f.read() - packages = json.load(f) - - for item in packages: - package_path = os.path.join(GetEnvPath(), 'packages', item['path'], 'package.json') - # read package['path']/package.json under env/packages - with open(package_path, 'r', encoding='utf-8') as f: - # package_json = f.read() - package = json.load(f) - - if package['name'] == name: - return os.path.join(GetSDKPackage(), package['name'] + '-' + item['ver']) - - # not found named package - return None diff --git a/tools/env_helper.py b/tools/env_helper.py new file mode 100644 index 000000000000..6fe1b55482ce --- /dev/null +++ b/tools/env_helper.py @@ -0,0 +1,470 @@ +#! /usr/bin/env python +# coding=utf-8 +# +# Copyright (c) 2024, RT-Thread Development Team +# +# SPDX-License-Identifier: GPL-2.0 +# +# Change Logs: +# Date Author Notes +# 2024-04-20 Bernard the first version + +import os +import json +import platform +import re +import sys +import shutil +import hashlib +import operator + + +def GetEnvPath(): + if "ENV_ROOT" in os.environ: + return os.environ["ENV_ROOT"] + + if platform.system() == 'Windows': + env_root = os.path.join(os.environ['USERPROFILE'], '.env') + else: + env_root = os.path.join(os.environ['HOME'], '.env') + + return env_root + + +def GetPkgPath(): + if "PKGS_DIR" in os.environ: + return os.environ["PKGS_DIR"] + elif "PKGS_ROOT" in os.environ: + return os.environ["PKGS_ROOT"] + elif GetEnvPath(): + return os.path.join(GetEnvPath(), "packages") + else: + return None + + +def GetSDKPath(name): + env = GetEnvPath() + + if env: + # read packages.json under env/tools/packages + with open(os.path.join(env, 'tools', 'packages', 'pkgs.json'), 'r', encoding='utf-8') as f: + # packages_json = f.read() + packages = json.load(f) + + for item in packages: + package_path = os.path.join(GetEnvPath(), 'packages', item['path'], 'package.json') + # read package['path']/package.json under env/packages + with open(package_path, 'r', encoding='utf-8') as f: + # package_json = f.read() + package = json.load(f) + + if package['name'] == name: + return os.path.join(GetPkgPath(), package['name'] + '-' + item['ver']) + + # not found named package + return None + + +def help_info(): + print( + "**********************************************************************************\n" + "* Help infomation:\n" + "* Git tool install step.\n" + "* If your system is linux, you can use command below to install git.\n" + "* $ sudo yum install git\n" + "* $ sudo apt-get install git\n" + "* If your system is windows, you should download git software(msysGit).\n" + "* Download path: http://git-scm.com/download/win\n" + "* After you install it, be sure to add the git command execution PATH \n" + "* to your system PATH.\n" + "* Usually, git command PATH is $YOUR_INSTALL_DIR\\Git\\bin\n" + "* If your system is OSX, please download git and install it.\n" + "* Download path: http://git-scm.com/download/mac\n" + "**********************************************************************************\n" + ) + + +def touch_env(use_gitee=False): + if sys.platform != 'win32': + home_dir = os.environ['HOME'] + else: + home_dir = os.environ['USERPROFILE'] + + if use_gitee: + # "Install RT-Thread Environment from Gitee" + sdk_url = 'https://gitee.com/RT-Thread-Mirror/sdk.git' + pkg_url = 'https://gitee.com/RT-Thread-Mirror/packages.git' + env_url = 'https://gitee.com/RT-Thread-Mirror/env.git' + else: + pkg_url = 'https://github.com/RT-Thread/packages.git' + sdk_url = 'https://github.com/RT-Thread/sdk.git' + env_url = 'https://github.com/RT-Thread/env.git' + + pkg_url = os.getenv('RTT_PACKAGE_URL') or pkg_url + sdk_url = os.getenv('RTT_SDK_URL') or sdk_url + env_url = os.getenv('RTT_ENV_URL') or env_url + + # make .env and other directories + env_dir = os.path.join(home_dir, '.env') + if not os.path.exists(env_dir): + os.mkdir(env_dir) + os.mkdir(os.path.join(env_dir, 'local_pkgs')) + os.mkdir(os.path.join(env_dir, 'packages')) + os.mkdir(os.path.join(env_dir, 'tools')) + kconfig = open(os.path.join(env_dir, 'packages', 'Kconfig'), 'w') + kconfig.close() + + # git clone packages + if not os.path.exists(os.path.join(env_dir, 'packages', 'packages')): + try: + ret = os.system('git clone %s %s' % (pkg_url, os.path.join(env_dir, 'packages', 'packages'))) + if ret != 0: + shutil.rmtree(os.path.join(env_dir, 'packages', 'packages')) + print( + "********************************************************************************\n" + "* Warnning:\n" + "* Run command error for \"git clone https://github.com/RT-Thread/packages.git\".\n" + "* This error may have been caused by not found a git tool or network error.\n" + "* If the git tool is not installed, install the git tool first.\n" + "* If the git utility is installed, check whether the git command is added to \n" + "* the system PATH.\n" + "* This error may cause the RT-Thread packages to not work properly.\n" + "********************************************************************************\n" + ) + help_info() + else: + kconfig = open(os.path.join(env_dir, 'packages', 'Kconfig'), 'w') + kconfig.write('source "$PKGS_DIR/packages/Kconfig"') + kconfig.close() + except: + print( + "**********************************************************************************\n" + "* Warnning:\n" + "* Run command error for \"git clone https://github.com/RT-Thread/packages.git\". \n" + "* This error may have been caused by not found a git tool or git tool not in \n" + "* the system PATH. \n" + "* This error may cause the RT-Thread packages to not work properly. \n" + "**********************************************************************************\n" + ) + help_info() + + # git clone env scripts + if not os.path.exists(os.path.join(env_dir, 'tools', 'scripts')): + try: + ret = os.system('git clone %s %s' % (env_url, os.path.join(env_dir, 'tools', 'scripts'))) + if ret != 0: + shutil.rmtree(os.path.join(env_dir, 'tools', 'scripts')) + print( + "********************************************************************************\n" + "* Warnning:\n" + "* Run command error for \"git clone https://github.com/RT-Thread/env.git\".\n" + "* This error may have been caused by not found a git tool or network error.\n" + "* If the git tool is not installed, install the git tool first.\n" + "* If the git utility is installed, check whether the git command is added \n" + "* to the system PATH.\n" + "* This error may cause script tools to fail to work properly.\n" + "********************************************************************************\n" + ) + help_info() + except: + print( + "********************************************************************************\n" + "* Warnning:\n" + "* Run command error for \"git clone https://github.com/RT-Thread/env.git\". \n" + "* This error may have been caused by not found a git tool or git tool not in \n" + "* the system PATH. \n" + "* This error may cause script tools to fail to work properly. \n" + "********************************************************************************\n" + ) + help_info() + + # git clone sdk + if not os.path.exists(os.path.join(env_dir, 'packages', 'sdk')): + try: + ret = os.system('git clone %s %s' % (sdk_url, os.path.join(env_dir, 'packages', 'sdk'))) + if ret != 0: + shutil.rmtree(os.path.join(env_dir, 'packages', 'sdk')) + print( + "********************************************************************************\n" + "* Warnning:\n" + "* Run command error for \"git clone https://github.com/RT-Thread/sdk.git\".\n" + "* This error may have been caused by not found a git tool or network error.\n" + "* If the git tool is not installed, install the git tool first.\n" + "* If the git utility is installed, check whether the git command is added \n" + "* to the system PATH.\n" + "* This error may cause the RT-Thread SDK to not work properly.\n" + "********************************************************************************\n" + ) + help_info() + except: + print( + "********************************************************************************\n" + "* Warnning:\n" + "* Run command error for \"https://github.com/RT-Thread/sdk.git\".\n" + "* This error may have been caused by not found a git tool or git tool not in \n" + "* the system PATH. \n" + "* This error may cause the RT-Thread SDK to not work properly. \n" + "********************************************************************************\n" + ) + help_info() + + # try to create an empty .config file + if not os.path.exists(os.path.join(env_dir, 'tools', '.config')): + kconfig = open(os.path.join(env_dir, 'tools', '.config'), 'w') + kconfig.close() + + # copy env.sh or env.ps1, Kconfig + shutil.copy(os.path.join(env_dir, 'tools', 'scripts', 'Kconfig'), os.path.join(home_dir, '.env', 'tools')) + if sys.platform != 'win32': + shutil.copy(os.path.join(env_dir, 'tools', 'scripts', 'env.sh'), os.path.join(home_dir, '.env', 'env.sh')) + else: + shutil.copy(os.path.join(env_dir, 'tools', 'scripts', 'env.ps1'), os.path.join(home_dir, '.env', 'env.ps1')) + # unzip kconfig-mconf.zip + # zip_file = os.path.join(env_dir, 'tools', 'scripts', 'kconfig-mconf.zip') + # if os.path.exists(zip_file): + # zip_file_dir = os.path.join(env_dir, 'tools', 'bin') + # if os.path.exists(zip_file_dir): + # shutil.rmtree(zip_file_dir) + # zip_file_obj = zipfile.ZipFile(zip_file, 'r') + # for file in zip_file_obj.namelist(): + # zip_file_obj.extract(file, zip_file_dir) + # zip_file_obj.close() + + +def is_pkg_special_config(config_str): + '''judge if it's CONFIG_PKG_XX_PATH or CONFIG_PKG_XX_VER''' + + if type(config_str) == type('a'): + if config_str.startswith("PKG_") and (config_str.endswith('_PATH') or config_str.endswith('_VER')): + return True + return False + + +def mk_rtconfig(filename): + try: + config = open(filename, 'r') + except: + print('open config:%s failed' % filename) + return + + rtconfig = open('rtconfig.h', 'w') + rtconfig.write('#ifndef RT_CONFIG_H__\n') + rtconfig.write('#define RT_CONFIG_H__\n\n') + + empty_line = 1 + + for line in config: + line = line.lstrip(' ').replace('\n', '').replace('\r', '') + + if len(line) == 0: + continue + + if line[0] == '#': + if len(line) == 1: + if empty_line: + continue + + rtconfig.write('\n') + empty_line = 1 + continue + + if line.startswith('# CONFIG_'): + line = ' ' + line[9:] + else: + line = line[1:] + rtconfig.write('/*%s */\n' % line) + + empty_line = 0 + else: + empty_line = 0 + setting = line.split('=') + if len(setting) >= 2: + if setting[0].startswith('CONFIG_'): + setting[0] = setting[0][7:] + + # remove CONFIG_PKG_XX_PATH or CONFIG_PKG_XX_VER + if is_pkg_special_config(setting[0]): + continue + + if setting[1] == 'y': + rtconfig.write('#define %s\n' % setting[0]) + else: + rtconfig.write('#define %s %s\n' % (setting[0], re.findall(r"^.*?=(.*)$", line)[0])) + + if os.path.isfile('rtconfig_project.h'): + rtconfig.write('#include "rtconfig_project.h"\n') + + rtconfig.write('\n') + rtconfig.write('#endif\n') + rtconfig.close() + + +def get_file_md5(file): + MD5 = hashlib.new('md5') + with open(file, 'r') as fp: + MD5.update(fp.read().encode('utf8')) + fp_md5 = MD5.hexdigest() + return fp_md5 + + +# Exclude utestcases +def exclude_utestcases(RTT_ROOT): + if os.path.isfile(os.path.join(RTT_ROOT, 'examples/utest/testcases/Kconfig')): + return + + if not os.path.isfile(os.path.join(RTT_ROOT, 'Kconfig')): + return + + with open(os.path.join(RTT_ROOT, 'Kconfig'), 'r') as f: + data = f.readlines() + with open(os.path.join(RTT_ROOT, 'Kconfig'), 'w') as f: + for line in data: + if line.find('examples/utest/testcases/Kconfig') == -1: + f.write(line) + + +# fix locale for kconfiglib +def kconfiglib_fix_locale(): + import os + import locale + + # Get the list of supported locales + supported_locales = set(locale.locale_alias.keys()) + + # Check if LANG is set and its value is not in the supported locales + if 'LANG' in os.environ and os.environ['LANG'] not in supported_locales: + os.environ['LANG'] = 'C' + + +def kconfiglib_check_installed(): + try: + import kconfiglib + except ImportError as e: + print("\033[1;31m**ERROR**: Failed to import kconfiglib, " + str(e)) + print("") + print("You may need to install it using:") + print(" pip install kconfiglib\033[0m") + print("") + sys.exit(1) + + # set PKGS_DIR envrionment + pkg_dir = GetPkgPath() + if os.path.exists(pkg_dir): + os.environ["PKGS_DIR"] = pkg_dir + elif sys.platform != 'win32': + touch_env() + os.environ["PKGS_DIR"] = GetPkgPath() + else: + print("\033[1;33m**WARNING**: PKGS_DIR not found, please install ENV tools\033[0m") + + +# menuconfig for Linux and Windows +def menuconfig(RTT_ROOT): + kconfiglib_check_installed() + + import menuconfig + + # Exclude utestcases + exclude_utestcases(RTT_ROOT) + + fn = '.config' + fn_old = '.config.old' + + sys.argv = ['menuconfig', 'Kconfig'] + + # fix vscode console + kconfiglib_fix_locale() + + menuconfig._main() + + if os.path.isfile(fn): + if os.path.isfile(fn_old): + diff_eq = operator.eq(get_file_md5(fn), get_file_md5(fn_old)) + else: + diff_eq = False + else: + sys.exit(-1) + + # make rtconfig.h + if diff_eq == False: + shutil.copyfile(fn, fn_old) + mk_rtconfig(fn) + + +# guiconfig for windows and linux +def guiconfig(RTT_ROOT): + kconfiglib_check_installed() + + import guiconfig + + # Exclude utestcases + exclude_utestcases(RTT_ROOT) + + fn = '.config' + fn_old = '.config.old' + + sys.argv = ['guiconfig', 'Kconfig'] + guiconfig._main() + + if os.path.isfile(fn): + if os.path.isfile(fn_old): + diff_eq = operator.eq(get_file_md5(fn), get_file_md5(fn_old)) + else: + diff_eq = False + else: + sys.exit(-1) + + # make rtconfig.h + if diff_eq == False: + shutil.copyfile(fn, fn_old) + mk_rtconfig(fn) + + +# defconfig for windows and linux +def defconfig(RTT_ROOT): + kconfiglib_check_installed() + + import defconfig + + # Exclude utestcases + exclude_utestcases(RTT_ROOT) + + fn = '.config' + + sys.argv = ['defconfig', '--kconfig', 'Kconfig', '.config'] + defconfig.main() + + # silent mode, force to make rtconfig.h + mk_rtconfig(fn) + + +def genconfig(): + from SCons.Script import SCons + + PreProcessor = SCons.cpp.PreProcessor() + + try: + f = open('rtconfig.h', 'r') + contents = f.read() + f.close() + except: + print("Open rtconfig.h file failed.") + + PreProcessor.process_contents(contents) + options = PreProcessor.cpp_namespace + + try: + f = open('.config', 'w') + for opt, value in options.items(): + if type(value) == type(1): + f.write("CONFIG_%s=%d\n" % (opt, value)) + + if type(value) == type('') and value == '': + f.write("CONFIG_%s=y\n" % opt) + elif type(value) == type('str'): + f.write("CONFIG_%s=%s\n" % (opt, value)) + + print("Generate .config done!") + f.close() + except: + print("Generate .config file failed.") diff --git a/tools/install_env.py b/tools/install_env.py deleted file mode 100644 index e98ac60d42f2..000000000000 --- a/tools/install_env.py +++ /dev/null @@ -1,191 +0,0 @@ -#! /usr/bin/env python -#coding=utf-8 - -# -# File : env.py -# This file is part of RT-Thread RTOS -# COPYRIGHT (C) 2024, RT-Thread Development Team -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Change Logs: -# Date Author Notes -# 2024-04-05 Bernard Add copyright information -# - -import os -import sys -import platform -import shutil -import zipfile - -PKG_URL = 'https://github.com/RT-Thread/packages.git' -SDK_URL = 'https://github.com/RT-Thread/sdk.git' -ENV_URL = 'https://github.com/RT-Thread/env.git' - -def help_info(): - print("**********************************************************************************\n" - "* Help infomation:\n" - "* Git tool install step.\n" - "* If your system is linux, you can use command below to install git.\n" - "* $ sudo yum install git\n" - "* $ sudo apt-get install git\n" - "* If your system is windows, you should download git software(msysGit).\n" - "* Download path: http://git-scm.com/download/win\n" - "* After you install it, be sure to add the git command execution PATH \n" - "* to your system PATH.\n" - "* Usually, git command PATH is $YOUR_INSTALL_DIR\\Git\\bin\n" - "* If your system is OSX, please download git and install it.\n" - "* Download path: http://git-scm.com/download/mac\n" - "**********************************************************************************\n") - -def touch_env(): - if sys.platform != 'win32': - home_dir = os.environ['HOME'] - else: - home_dir = os.environ['USERPROFILE'] - - pkg_url = os.getenv('RTT_PACKAGE_URL') or PKG_URL - sdk_url = os.getenv('RTT_SDK_URL') or SDK_URL - env_url = os.getenv('RTT_ENV_URL') or ENV_URL - if len(sys.argv) == 2 and sys.argv[1] == '--gitee': - # "Install RT-Thread Environment from Gitee" - sdk_url = 'https://gitee.com/RT-Thread-Mirror/sdk.git' - pkg_url = 'https://gitee.com/RT-Thread-Mirror/packages.git' - env_url = 'https://gitee.com/RT-Thread-Mirror/env.git' - - # make .env and other directories - env_dir = os.path.join(home_dir, '.env') - if not os.path.exists(env_dir): - os.mkdir(env_dir) - os.mkdir(os.path.join(env_dir, 'local_pkgs')) - os.mkdir(os.path.join(env_dir, 'packages')) - os.mkdir(os.path.join(env_dir, 'tools')) - kconfig = open(os.path.join(env_dir, 'packages', 'Kconfig'), 'w') - kconfig.close() - - # git clone packages - if not os.path.exists(os.path.join(env_dir, 'packages', 'packages')): - try: - ret = os.system('git clone %s %s' % (pkg_url, os.path.join(env_dir, 'packages', 'packages'))) - if ret != 0: - shutil.rmtree(os.path.join(env_dir, 'packages', 'packages')) - print("********************************************************************************\n" - "* Warnning:\n" - "* Run command error for \"git clone https://github.com/RT-Thread/packages.git\".\n" - "* This error may have been caused by not found a git tool or network error.\n" - "* If the git tool is not installed, install the git tool first.\n" - "* If the git utility is installed, check whether the git command is added to \n" - "* the system PATH.\n" - "* This error may cause the RT-Thread packages to not work properly.\n" - "********************************************************************************\n") - help_info() - else: - kconfig = open(os.path.join(env_dir, 'packages', 'Kconfig'), 'w') - kconfig.write('source "$PKGS_DIR/packages/Kconfig"') - kconfig.close() - except: - print("**********************************************************************************\n" - "* Warnning:\n" - "* Run command error for \"git clone https://github.com/RT-Thread/packages.git\". \n" - "* This error may have been caused by not found a git tool or git tool not in \n" - "* the system PATH. \n" - "* This error may cause the RT-Thread packages to not work properly. \n" - "**********************************************************************************\n") - help_info() - - # git clone env scripts - if not os.path.exists(os.path.join(env_dir, 'tools', 'scripts')): - try: - ret = os.system('git clone %s %s' % (env_url, os.path.join(env_dir, 'tools', 'scripts'))) - if ret != 0: - shutil.rmtree(os.path.join(env_dir, 'tools', 'scripts')) - print("********************************************************************************\n" - "* Warnning:\n" - "* Run command error for \"git clone https://github.com/RT-Thread/env.git\".\n" - "* This error may have been caused by not found a git tool or network error.\n" - "* If the git tool is not installed, install the git tool first.\n" - "* If the git utility is installed, check whether the git command is added \n" - "* to the system PATH.\n" - "* This error may cause script tools to fail to work properly.\n" - "********************************************************************************\n") - help_info() - except: - print("********************************************************************************\n" - "* Warnning:\n" - "* Run command error for \"git clone https://github.com/RT-Thread/env.git\". \n" - "* This error may have been caused by not found a git tool or git tool not in \n" - "* the system PATH. \n" - "* This error may cause script tools to fail to work properly. \n" - "********************************************************************************\n") - help_info() - - # git clone sdk - if not os.path.exists(os.path.join(env_dir, 'packages', 'sdk')): - try: - ret = os.system('git clone %s %s' % (sdk_url, os.path.join(env_dir, 'packages', 'sdk'))) - if ret != 0: - shutil.rmtree(os.path.join(env_dir, 'packages', 'sdk')) - print("********************************************************************************\n" - "* Warnning:\n" - "* Run command error for \"git clone https://github.com/RT-Thread/sdk.git\".\n" - "* This error may have been caused by not found a git tool or network error.\n" - "* If the git tool is not installed, install the git tool first.\n" - "* If the git utility is installed, check whether the git command is added \n" - "* to the system PATH.\n" - "* This error may cause the RT-Thread SDK to not work properly.\n" - "********************************************************************************\n") - help_info() - except: - print("********************************************************************************\n" - "* Warnning:\n" - "* Run command error for \"https://github.com/RT-Thread/sdk.git\".\n" - "* This error may have been caused by not found a git tool or git tool not in \n" - "* the system PATH. \n" - "* This error may cause the RT-Thread SDK to not work properly. \n" - "********************************************************************************\n") - help_info() - - # try to create an empty .config file - if not os.path.exists(os.path.join(env_dir, 'tools', '.config')): - kconfig = open(os.path.join(env_dir, 'tools', '.config'), 'w') - kconfig.close() - - # copy env.sh or env.ps1, Kconfig - shutil.copy(os.path.join(env_dir, 'tools', 'scripts', 'Kconfig'), os.path.join(home_dir, '.env', 'tools')) - if sys.platform != 'win32': - shutil.copy(os.path.join(env_dir, 'tools', 'scripts', 'env.sh'), os.path.join(home_dir, '.env', 'env.sh')) - else: - shutil.copy(os.path.join(env_dir, 'tools', 'scripts', 'env.ps1'), os.path.join(home_dir, '.env', 'env.ps1')) - # unzip kconfig-mconf.zip - zip_file = os.path.join(env_dir, 'tools', 'scripts', 'kconfig-mconf.zip') - if os.path.exists(zip_file): - zip_file_dir = os.path.join(env_dir, 'tools', 'bin') - if os.path.exists(zip_file_dir): - shutil.rmtree(zip_file_dir) - zip_file_obj = zipfile.ZipFile(zip_file, 'r') - for file in zip_file_obj.namelist(): - zip_file_obj.extract(file, zip_file_dir) - zip_file_obj.close() - -def main(): - print("Install RT-Thread Environment") - - touch_env() - - return - -if __name__ == "__main__": - main() diff --git a/tools/menukconfig.py b/tools/menukconfig.py deleted file mode 100644 index 4c54e69b7338..000000000000 --- a/tools/menukconfig.py +++ /dev/null @@ -1,392 +0,0 @@ -# -# File : menuconfig.py -# This file is part of RT-Thread RTOS -# COPYRIGHT (C) 2006 - 2018, RT-Thread Development Team -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License along -# with this program; if not, write to the Free Software Foundation, Inc., -# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Change Logs: -# Date Author Notes -# 2017-12-29 Bernard The first version -# 2018-07-31 weety Support pyconfig -# 2019-07-13 armink Support guiconfig - -import os -import re -import sys -import shutil -import hashlib -import operator - -# test kconfiglib is installed -try: - import kconfiglib -except ImportError as e: - print("Failed to import kconfiglib: " + str(e)) - print("") - print("You may need to install it using:") - print(" pip install kconfiglib") - print("") - sys.exit(1) - -DEFAULT_RTT_PACKAGE_URL = 'https://github.com/RT-Thread/packages.git' -# you can change the package url by defining RTT_PACKAGE_URL, ex: -# export RTT_PACKAGE_URL=https://github.com/Varanda-Labs/packages.git - -# make rtconfig.h from .config - -def is_pkg_special_config(config_str): - ''' judge if it's CONFIG_PKG_XX_PATH or CONFIG_PKG_XX_VER''' - - if type(config_str) == type('a'): - if config_str.startswith("PKG_") and (config_str.endswith('_PATH') or config_str.endswith('_VER')): - return True - return False - -def mk_rtconfig(filename): - try: - config = open(filename, 'r') - except: - print('open config:%s failed' % filename) - return - - rtconfig = open('rtconfig.h', 'w') - rtconfig.write('#ifndef RT_CONFIG_H__\n') - rtconfig.write('#define RT_CONFIG_H__\n\n') - - empty_line = 1 - - for line in config: - line = line.lstrip(' ').replace('\n', '').replace('\r', '') - - if len(line) == 0: - continue - - if line[0] == '#': - if len(line) == 1: - if empty_line: - continue - - rtconfig.write('\n') - empty_line = 1 - continue - - if line.startswith('# CONFIG_'): - line = ' ' + line[9:] - else: - line = line[1:] - rtconfig.write('/*%s */\n' % line) - - empty_line = 0 - else: - empty_line = 0 - setting = line.split('=') - if len(setting) >= 2: - if setting[0].startswith('CONFIG_'): - setting[0] = setting[0][7:] - - # remove CONFIG_PKG_XX_PATH or CONFIG_PKG_XX_VER - if is_pkg_special_config(setting[0]): - continue - - if setting[1] == 'y': - rtconfig.write('#define %s\n' % setting[0]) - else: - rtconfig.write('#define %s %s\n' % (setting[0], re.findall(r"^.*?=(.*)$",line)[0])) - - if os.path.isfile('rtconfig_project.h'): - rtconfig.write('#include "rtconfig_project.h"\n') - - rtconfig.write('\n') - rtconfig.write('#endif\n') - rtconfig.close() - - -def get_file_md5(file): - MD5 = hashlib.new('md5') - with open(file, 'r') as fp: - MD5.update(fp.read().encode('utf8')) - fp_md5 = MD5.hexdigest() - return fp_md5 - -def config(): - mk_rtconfig('.config') - -def get_env_dir(): - if os.environ.get('ENV_ROOT'): - return os.environ.get('ENV_ROOT') - - if sys.platform == 'win32': - home_dir = os.environ['USERPROFILE'] - env_dir = os.path.join(home_dir, '.env') - else: - home_dir = os.environ['HOME'] - env_dir = os.path.join(home_dir, '.env') - - if not os.path.exists(env_dir): - return None - - return env_dir - -def help_info(): - print("**********************************************************************************\n" - "* Help infomation:\n" - "* Git tool install step.\n" - "* If your system is linux, you can use command below to install git.\n" - "* $ sudo yum install git\n" - "* $ sudo apt-get install git\n" - "* If your system is windows, you should download git software(msysGit).\n" - "* Download path: http://git-scm.com/download/win\n" - "* After you install it, be sure to add the git command execution PATH \n" - "* to your system PATH.\n" - "* Usually, git command PATH is $YOUR_INSTALL_DIR\\Git\\bin\n" - "* If your system is OSX, please download git and install it.\n" - "* Download path: http://git-scm.com/download/mac\n" - "**********************************************************************************\n") - -def touch_env(): - if sys.platform != 'win32': - home_dir = os.environ['HOME'] - else: - home_dir = os.environ['USERPROFILE'] - - package_url = os.getenv('RTT_PACKAGE_URL') or DEFAULT_RTT_PACKAGE_URL - - env_dir = os.path.join(home_dir, '.env') - if not os.path.exists(env_dir): - os.mkdir(env_dir) - os.mkdir(os.path.join(env_dir, 'local_pkgs')) - os.mkdir(os.path.join(env_dir, 'packages')) - os.mkdir(os.path.join(env_dir, 'tools')) - kconfig = open(os.path.join(env_dir, 'packages', 'Kconfig'), 'w') - kconfig.close() - - if not os.path.exists(os.path.join(env_dir, 'packages', 'packages')): - try: - ret = os.system('git clone %s %s' % (package_url, os.path.join(env_dir, 'packages', 'packages'))) - if ret != 0: - shutil.rmtree(os.path.join(env_dir, 'packages', 'packages')) - print("********************************************************************************\n" - "* Warnning:\n" - "* Run command error for \"git clone https://github.com/RT-Thread/packages.git\".\n" - "* This error may have been caused by not found a git tool or network error.\n" - "* If the git tool is not installed, install the git tool first.\n" - "* If the git utility is installed, check whether the git command is added to \n" - "* the system PATH.\n" - "* This error may cause the RT-Thread packages to not work properly.\n" - "********************************************************************************\n") - help_info() - else: - kconfig = open(os.path.join(env_dir, 'packages', 'Kconfig'), 'w') - kconfig.write('source "$PKGS_DIR/packages/Kconfig"') - kconfig.close() - except: - print("**********************************************************************************\n" - "* Warnning:\n" - "* Run command error for \"git clone https://github.com/RT-Thread/packages.git\". \n" - "* This error may have been caused by not found a git tool or git tool not in \n" - "* the system PATH. \n" - "* This error may cause the RT-Thread packages to not work properly. \n" - "**********************************************************************************\n") - help_info() - - if not os.path.exists(os.path.join(env_dir, 'tools', 'scripts')): - try: - ret = os.system('git clone https://github.com/RT-Thread/env.git %s' % os.path.join(env_dir, 'tools', 'scripts')) - if ret != 0: - shutil.rmtree(os.path.join(env_dir, 'tools', 'scripts')) - print("********************************************************************************\n" - "* Warnning:\n" - "* Run command error for \"git clone https://github.com/RT-Thread/env.git\".\n" - "* This error may have been caused by not found a git tool or network error.\n" - "* If the git tool is not installed, install the git tool first.\n" - "* If the git utility is installed, check whether the git command is added \n" - "* to the system PATH.\n" - "* This error may cause script tools to fail to work properly.\n" - "********************************************************************************\n") - help_info() - except: - print("********************************************************************************\n" - "* Warnning:\n" - "* Run command error for \"git clone https://github.com/RT-Thread/env.git\". \n" - "* This error may have been caused by not found a git tool or git tool not in \n" - "* the system PATH. \n" - "* This error may cause script tools to fail to work properly. \n" - "********************************************************************************\n") - help_info() - - if sys.platform != 'win32': - env_sh = open(os.path.join(env_dir, 'env.sh'), 'w') - env_sh.write('export PATH=~/.env/tools/scripts:$PATH') - - # if fish config exists, generate env.fish - if os.path.exists(os.path.join(home_dir, '.config', 'fish', 'config.fish')): - env_fish = open(os.path.join(env_dir, 'env.fish'), 'w') - env_fish.write('set -gx PATH ~/.env/tools/scripts $PATH') - else: - if os.path.exists(os.path.join(env_dir, 'tools', 'scripts')): - os.environ["PATH"] = os.path.join(env_dir, 'tools', 'scripts') + ';' + os.environ["PATH"] - -# Exclude utestcases -def exclude_utestcases(RTT_ROOT): - if os.path.isfile(os.path.join(RTT_ROOT, 'examples/utest/testcases/Kconfig')): - return - - if not os.path.isfile(os.path.join(RTT_ROOT, 'Kconfig')): - return - - with open(os.path.join(RTT_ROOT, 'Kconfig'), 'r') as f: - data = f.readlines() - with open(os.path.join(RTT_ROOT, 'Kconfig'), 'w') as f: - for line in data: - if line.find('examples/utest/testcases/Kconfig') == -1: - f.write(line) - -# fix locale for kconfiglib -def kconfiglib_fix_locale(): - import os - import locale - - # Get the list of supported locales - supported_locales = set(locale.locale_alias.keys()) - - # Check if LANG is set and its value is not in the supported locales - if 'LANG' in os.environ and os.environ['LANG'] not in supported_locales: - os.environ['LANG'] = 'C' - -# menuconfig for Linux and Windows -def menuconfig(RTT_ROOT): - import menuconfig - - # Exclude utestcases - exclude_utestcases(RTT_ROOT) - - if sys.platform != 'win32': - touch_env() - - env_dir = get_env_dir() - if isinstance(env_dir, str): - os.environ['PKGS_ROOT'] = os.path.join(env_dir, 'packages') - - fn = '.config' - fn_old = '.config.old' - - sys.argv = ['menuconfig', 'Kconfig'] - - # fix vscode console - kconfiglib_fix_locale() - - menuconfig._main() - - if os.path.isfile(fn): - if os.path.isfile(fn_old): - diff_eq = operator.eq(get_file_md5(fn), get_file_md5(fn_old)) - else: - diff_eq = False - else: - sys.exit(-1) - - # make rtconfig.h - if diff_eq == False: - shutil.copyfile(fn, fn_old) - mk_rtconfig(fn) - -# guiconfig for windows and linux -def guiconfig(RTT_ROOT): - import guiconfig - - # Exclude utestcases - exclude_utestcases(RTT_ROOT) - - if sys.platform != 'win32': - touch_env() - - env_dir = get_env_dir() - if isinstance(env_dir, str): - os.environ['PKGS_ROOT'] = os.path.join(env_dir, 'packages') - - fn = '.config' - fn_old = '.config.old' - - sys.argv = ['guiconfig', 'Kconfig'] - guiconfig._main() - - if os.path.isfile(fn): - if os.path.isfile(fn_old): - diff_eq = operator.eq(get_file_md5(fn), get_file_md5(fn_old)) - else: - diff_eq = False - else: - sys.exit(-1) - - # make rtconfig.h - if diff_eq == False: - shutil.copyfile(fn, fn_old) - mk_rtconfig(fn) - - -# guiconfig for windows and linux -def guiconfig_silent(RTT_ROOT): - import defconfig - - # Exclude utestcases - exclude_utestcases(RTT_ROOT) - - if sys.platform != 'win32': - touch_env() - - env_dir = get_env_dir() - if isinstance(env_dir, str): - os.environ['PKGS_ROOT'] = os.path.join(env_dir, 'packages') - - fn = '.config' - - sys.argv = ['defconfig', '--kconfig', 'Kconfig', '.config'] - defconfig.main() - - # silent mode, force to make rtconfig.h - mk_rtconfig(fn) - - -def genconfig() : - from SCons.Script import SCons - - PreProcessor = SCons.cpp.PreProcessor() - - try: - f = open('rtconfig.h', 'r') - contents = f.read() - f.close() - except : - print("Open rtconfig.h file failed.") - - PreProcessor.process_contents(contents) - options = PreProcessor.cpp_namespace - - try: - f = open('.config', 'w') - for (opt, value) in options.items(): - if type(value) == type(1): - f.write("CONFIG_%s=%d\n" % (opt, value)) - - if type(value) == type('') and value == '': - f.write("CONFIG_%s=y\n" % opt) - elif type(value) == type('str'): - f.write("CONFIG_%s=%s\n" % (opt, value)) - - print("Generate .config done!") - f.close() - except: - print("Generate .config file failed.") diff --git a/tools/options.py b/tools/options.py index c1b396736940..b77b67561226 100644 --- a/tools/options.py +++ b/tools/options.py @@ -121,16 +121,16 @@ def AddOptions(): action = 'store_true', default = False, help = 'reset the project configurations to default') - AddOption('--pyconfig', '--guiconfig', - dest = 'pyconfig', + AddOption('--guiconfig', '--pyconfig', + dest = 'guiconfig', action = 'store_true', default = False, help = 'Python GUI menuconfig for RT-Thread BSP') - AddOption('--pyconfig-silent', '--defconfig', - dest = 'pyconfig-silent', + AddOption('--defconfig', '--pyconfig-silent', + dest = 'defconfig', action = 'store_true', default = False, - help = 'Don`t show pyconfig window') + help = 'Don`t show Python GUI menuconfig window') AddOption('--menuconfig', dest = 'menuconfig', action = 'store_true',