1*10465441SEvalZero# 2*10465441SEvalZero# File : menuconfig.py 3*10465441SEvalZero# This file is part of RT-Thread RTOS 4*10465441SEvalZero# COPYRIGHT (C) 2006 - 2018, RT-Thread Development Team 5*10465441SEvalZero# 6*10465441SEvalZero# This program is free software; you can redistribute it and/or modify 7*10465441SEvalZero# it under the terms of the GNU General Public License as published by 8*10465441SEvalZero# the Free Software Foundation; either version 2 of the License, or 9*10465441SEvalZero# (at your option) any later version. 10*10465441SEvalZero# 11*10465441SEvalZero# This program is distributed in the hope that it will be useful, 12*10465441SEvalZero# but WITHOUT ANY WARRANTY; without even the implied warranty of 13*10465441SEvalZero# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*10465441SEvalZero# GNU General Public License for more details. 15*10465441SEvalZero# 16*10465441SEvalZero# You should have received a copy of the GNU General Public License along 17*10465441SEvalZero# with this program; if not, write to the Free Software Foundation, Inc., 18*10465441SEvalZero# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 19*10465441SEvalZero# 20*10465441SEvalZero# Change Logs: 21*10465441SEvalZero# Date Author Notes 22*10465441SEvalZero# 2017-12-29 Bernard The first version 23*10465441SEvalZero# 2018-07-31 weety Support pyconfig 24*10465441SEvalZero 25*10465441SEvalZeroimport os 26*10465441SEvalZeroimport sys 27*10465441SEvalZeroimport shutil 28*10465441SEvalZero 29*10465441SEvalZero# make rtconfig.h from .config 30*10465441SEvalZero 31*10465441SEvalZerodef mk_rtconfig(filename): 32*10465441SEvalZero try: 33*10465441SEvalZero config = open(filename, 'r') 34*10465441SEvalZero except: 35*10465441SEvalZero print('open config:%s failed' % filename) 36*10465441SEvalZero return 37*10465441SEvalZero 38*10465441SEvalZero rtconfig = open('rtconfig.h', 'w') 39*10465441SEvalZero rtconfig.write('#ifndef RT_CONFIG_H__\n') 40*10465441SEvalZero rtconfig.write('#define RT_CONFIG_H__\n\n') 41*10465441SEvalZero 42*10465441SEvalZero empty_line = 1 43*10465441SEvalZero 44*10465441SEvalZero for line in config: 45*10465441SEvalZero line = line.lstrip(' ').replace('\n', '').replace('\r', '') 46*10465441SEvalZero 47*10465441SEvalZero if len(line) == 0: continue 48*10465441SEvalZero 49*10465441SEvalZero if line[0] == '#': 50*10465441SEvalZero if len(line) == 1: 51*10465441SEvalZero if empty_line: 52*10465441SEvalZero continue 53*10465441SEvalZero 54*10465441SEvalZero rtconfig.write('\n') 55*10465441SEvalZero empty_line = 1 56*10465441SEvalZero continue 57*10465441SEvalZero 58*10465441SEvalZero comment_line = line[1:] 59*10465441SEvalZero if line.startswith('# CONFIG_'): line = ' ' + line[9:] 60*10465441SEvalZero else: line = line[1:] 61*10465441SEvalZero 62*10465441SEvalZero rtconfig.write('/*%s */\n' % line) 63*10465441SEvalZero empty_line = 0 64*10465441SEvalZero else: 65*10465441SEvalZero empty_line = 0 66*10465441SEvalZero setting = line.split('=') 67*10465441SEvalZero if len(setting) >= 2: 68*10465441SEvalZero if setting[0].startswith('CONFIG_'): 69*10465441SEvalZero setting[0] = setting[0][7:] 70*10465441SEvalZero 71*10465441SEvalZero # remove CONFIG_PKG_XX_PATH or CONFIG_PKG_XX_VER 72*10465441SEvalZero if type(setting[0]) == type('a') and (setting[0].endswith('_PATH') or setting[0].endswith('_VER')): 73*10465441SEvalZero continue 74*10465441SEvalZero 75*10465441SEvalZero if setting[1] == 'y': 76*10465441SEvalZero rtconfig.write('#define %s\n' % setting[0]) 77*10465441SEvalZero else: 78*10465441SEvalZero rtconfig.write('#define %s %s\n' % (setting[0], setting[1])) 79*10465441SEvalZero 80*10465441SEvalZero if os.path.isfile('rtconfig_project.h'): 81*10465441SEvalZero rtconfig.write('#include "rtconfig_project.h"\n') 82*10465441SEvalZero 83*10465441SEvalZero rtconfig.write('\n') 84*10465441SEvalZero rtconfig.write('#endif\n') 85*10465441SEvalZero rtconfig.close() 86*10465441SEvalZero 87*10465441SEvalZerodef config(): 88*10465441SEvalZero mk_rtconfig('.config') 89*10465441SEvalZero 90*10465441SEvalZerodef get_env_dir(): 91*10465441SEvalZero if os.environ.get('ENV_ROOT'): 92*10465441SEvalZero return os.environ.get('ENV_ROOT') 93*10465441SEvalZero 94*10465441SEvalZero if sys.platform == 'win32': 95*10465441SEvalZero home_dir = os.environ['USERPROFILE'] 96*10465441SEvalZero env_dir = os.path.join(home_dir, '.env') 97*10465441SEvalZero else: 98*10465441SEvalZero home_dir = os.environ['HOME'] 99*10465441SEvalZero env_dir = os.path.join(home_dir, '.env') 100*10465441SEvalZero 101*10465441SEvalZero if not os.path.exists(env_dir): 102*10465441SEvalZero return None 103*10465441SEvalZero 104*10465441SEvalZero return env_dir 105*10465441SEvalZero 106*10465441SEvalZerodef help_info(): 107*10465441SEvalZero print("**********************************************************************************\n" 108*10465441SEvalZero "* Help infomation:\n" 109*10465441SEvalZero "* Git tool install step.\n" 110*10465441SEvalZero "* If your system is linux, you can use command below to install git.\n" 111*10465441SEvalZero "* $ sudo yum install git\n" 112*10465441SEvalZero "* $ sudo apt-get install git\n" 113*10465441SEvalZero "* If your system is windows, you should download git software(msysGit).\n" 114*10465441SEvalZero "* Download path: http://git-scm.com/download/win\n" 115*10465441SEvalZero "* After you install it, be sure to add the git command execution PATH \n" 116*10465441SEvalZero "* to your system PATH.\n" 117*10465441SEvalZero "* Usually, git command PATH is $YOUR_INSTALL_DIR\\Git\\bin\n" 118*10465441SEvalZero "* If your system is OSX, please download git and install it.\n" 119*10465441SEvalZero "* Download path: http://git-scm.com/download/mac\n" 120*10465441SEvalZero "**********************************************************************************\n") 121*10465441SEvalZero 122*10465441SEvalZerodef touch_env(): 123*10465441SEvalZero if sys.platform != 'win32': 124*10465441SEvalZero home_dir = os.environ['HOME'] 125*10465441SEvalZero else: 126*10465441SEvalZero home_dir = os.environ['USERPROFILE'] 127*10465441SEvalZero 128*10465441SEvalZero env_dir = os.path.join(home_dir, '.env') 129*10465441SEvalZero if not os.path.exists(env_dir): 130*10465441SEvalZero os.mkdir(env_dir) 131*10465441SEvalZero os.mkdir(os.path.join(env_dir, 'local_pkgs')) 132*10465441SEvalZero os.mkdir(os.path.join(env_dir, 'packages')) 133*10465441SEvalZero os.mkdir(os.path.join(env_dir, 'tools')) 134*10465441SEvalZero kconfig = open(os.path.join(env_dir, 'packages', 'Kconfig'), 'w') 135*10465441SEvalZero kconfig.close() 136*10465441SEvalZero 137*10465441SEvalZero if not os.path.exists(os.path.join(env_dir, 'packages', 'packages')): 138*10465441SEvalZero try: 139*10465441SEvalZero ret = os.system('git clone https://github.com/RT-Thread/packages.git %s' % os.path.join(env_dir, 'packages', 'packages')) 140*10465441SEvalZero if ret != 0: 141*10465441SEvalZero shutil.rmtree(os.path.join(env_dir, 'packages', 'packages')) 142*10465441SEvalZero print("********************************************************************************\n" 143*10465441SEvalZero "* Warnning:\n" 144*10465441SEvalZero "* Run command error for \"git clone https://github.com/RT-Thread/packages.git\".\n" 145*10465441SEvalZero "* This error may have been caused by not found a git tool or network error.\n" 146*10465441SEvalZero "* If the git tool is not installed, install the git tool first.\n" 147*10465441SEvalZero "* If the git utility is installed, check whether the git command is added to \n" 148*10465441SEvalZero "* the system PATH.\n" 149*10465441SEvalZero "* This error may cause the RT-Thread packages to not work properly.\n" 150*10465441SEvalZero "********************************************************************************\n") 151*10465441SEvalZero help_info() 152*10465441SEvalZero else: 153*10465441SEvalZero kconfig = open(os.path.join(env_dir, 'packages', 'Kconfig'), 'w') 154*10465441SEvalZero kconfig.write('source "$PKGS_DIR/packages/Kconfig"') 155*10465441SEvalZero kconfig.close() 156*10465441SEvalZero except: 157*10465441SEvalZero print("**********************************************************************************\n" 158*10465441SEvalZero "* Warnning:\n" 159*10465441SEvalZero "* Run command error for \"git clone https://github.com/RT-Thread/packages.git\". \n" 160*10465441SEvalZero "* This error may have been caused by not found a git tool or git tool not in \n" 161*10465441SEvalZero "* the system PATH. \n" 162*10465441SEvalZero "* This error may cause the RT-Thread packages to not work properly. \n" 163*10465441SEvalZero "**********************************************************************************\n") 164*10465441SEvalZero help_info() 165*10465441SEvalZero 166*10465441SEvalZero if not os.path.exists(os.path.join(env_dir, 'tools', 'scripts')): 167*10465441SEvalZero try: 168*10465441SEvalZero ret = os.system('git clone https://github.com/RT-Thread/env.git %s' % os.path.join(env_dir, 'tools', 'scripts')) 169*10465441SEvalZero if ret != 0: 170*10465441SEvalZero shutil.rmtree(os.path.join(env_dir, 'tools', 'scripts')) 171*10465441SEvalZero print("********************************************************************************\n" 172*10465441SEvalZero "* Warnning:\n" 173*10465441SEvalZero "* Run command error for \"git clone https://github.com/RT-Thread/env.git\".\n" 174*10465441SEvalZero "* This error may have been caused by not found a git tool or network error.\n" 175*10465441SEvalZero "* If the git tool is not installed, install the git tool first.\n" 176*10465441SEvalZero "* If the git utility is installed, check whether the git command is added \n" 177*10465441SEvalZero "* to the system PATH.\n" 178*10465441SEvalZero "* This error may cause script tools to fail to work properly.\n" 179*10465441SEvalZero "********************************************************************************\n") 180*10465441SEvalZero help_info() 181*10465441SEvalZero except: 182*10465441SEvalZero print("********************************************************************************\n" 183*10465441SEvalZero "* Warnning:\n" 184*10465441SEvalZero "* Run command error for \"git clone https://github.com/RT-Thread/env.git\". \n" 185*10465441SEvalZero "* This error may have been caused by not found a git tool or git tool not in \n" 186*10465441SEvalZero "* the system PATH. \n" 187*10465441SEvalZero "* This error may cause script tools to fail to work properly. \n" 188*10465441SEvalZero "********************************************************************************\n") 189*10465441SEvalZero help_info() 190*10465441SEvalZero 191*10465441SEvalZero if sys.platform != 'win32': 192*10465441SEvalZero env_sh = open(os.path.join(env_dir, 'env.sh'), 'w') 193*10465441SEvalZero env_sh.write('export PATH=~/.env/tools/scripts:$PATH') 194*10465441SEvalZero else: 195*10465441SEvalZero if os.path.exists(os.path.join(env_dir, 'tools', 'scripts')): 196*10465441SEvalZero os.environ["PATH"] = os.path.join(env_dir, 'tools', 'scripts') + ';' + os.environ["PATH"] 197*10465441SEvalZero 198*10465441SEvalZero# menuconfig for Linux 199*10465441SEvalZerodef menuconfig(RTT_ROOT): 200*10465441SEvalZero kconfig_dir = os.path.join(RTT_ROOT, 'tools', 'kconfig-frontends') 201*10465441SEvalZero os.system('scons -C ' + kconfig_dir) 202*10465441SEvalZero 203*10465441SEvalZero touch_env() 204*10465441SEvalZero env_dir = get_env_dir() 205*10465441SEvalZero 206*10465441SEvalZero os.environ['PKGS_ROOT'] = os.path.join(env_dir, 'packages') 207*10465441SEvalZero 208*10465441SEvalZero fn = '.config' 209*10465441SEvalZero 210*10465441SEvalZero if os.path.isfile(fn): 211*10465441SEvalZero mtime = os.path.getmtime(fn) 212*10465441SEvalZero else: 213*10465441SEvalZero mtime = -1 214*10465441SEvalZero 215*10465441SEvalZero kconfig_cmd = os.path.join(RTT_ROOT, 'tools', 'kconfig-frontends', 'kconfig-mconf') 216*10465441SEvalZero os.system(kconfig_cmd + ' Kconfig') 217*10465441SEvalZero 218*10465441SEvalZero if os.path.isfile(fn): 219*10465441SEvalZero mtime2 = os.path.getmtime(fn) 220*10465441SEvalZero else: 221*10465441SEvalZero mtime2 = -1 222*10465441SEvalZero 223*10465441SEvalZero # make rtconfig.h 224*10465441SEvalZero if mtime != mtime2: 225*10465441SEvalZero mk_rtconfig(fn) 226*10465441SEvalZero 227*10465441SEvalZero# pyconfig for windows and linux 228*10465441SEvalZerodef pyconfig(RTT_ROOT): 229*10465441SEvalZero import pymenuconfig 230*10465441SEvalZero 231*10465441SEvalZero touch_env() 232*10465441SEvalZero env_dir = get_env_dir() 233*10465441SEvalZero 234*10465441SEvalZero os.environ['PKGS_ROOT'] = os.path.join(env_dir, 'packages') 235*10465441SEvalZero 236*10465441SEvalZero fn = '.config' 237*10465441SEvalZero 238*10465441SEvalZero if os.path.isfile(fn): 239*10465441SEvalZero mtime = os.path.getmtime(fn) 240*10465441SEvalZero else: 241*10465441SEvalZero mtime = -1 242*10465441SEvalZero 243*10465441SEvalZero pymenuconfig.main(['--kconfig', 'Kconfig', '--config', '.config']) 244*10465441SEvalZero 245*10465441SEvalZero if os.path.isfile(fn): 246*10465441SEvalZero mtime2 = os.path.getmtime(fn) 247*10465441SEvalZero else: 248*10465441SEvalZero mtime2 = -1 249*10465441SEvalZero 250*10465441SEvalZero # make rtconfig.h 251*10465441SEvalZero if mtime != mtime2: 252*10465441SEvalZero mk_rtconfig(fn) 253*10465441SEvalZero 254*10465441SEvalZero 255*10465441SEvalZero# pyconfig_silent for windows and linux 256*10465441SEvalZerodef pyconfig_silent(RTT_ROOT): 257*10465441SEvalZero import pymenuconfig 258*10465441SEvalZero print("In pyconfig silent mode. Don`t display menuconfig window.") 259*10465441SEvalZero 260*10465441SEvalZero touch_env() 261*10465441SEvalZero env_dir = get_env_dir() 262*10465441SEvalZero 263*10465441SEvalZero os.environ['PKGS_ROOT'] = os.path.join(env_dir, 'packages') 264*10465441SEvalZero 265*10465441SEvalZero fn = '.config' 266*10465441SEvalZero 267*10465441SEvalZero pymenuconfig.main(['--kconfig', 'Kconfig', '--config', '.config', '--silent', 'True']) 268*10465441SEvalZero 269*10465441SEvalZero # silent mode, force to make rtconfig.h 270*10465441SEvalZero mk_rtconfig(fn) 271