import os from sys import argv OUTPUT = '' LOLCAT = False ERROR = False path = 'src/ompl_src/' def echo(text): # вывод, цветной или нет global OUTPUT, LOLCAT if LOLCAT: OUTPUT += text + '\n' else: print(text) def output_flush(): # вывод цветного буффера global OUTPUT, LOLCAT if LOLCAT: os.system(f'echo \"{OUTPUT[:-1]}\"| /usr/games/lolcat') def exec_build_list(): # сборка по билд листу global ERROR try: file = open('build_list.txt', 'r') except FileNotFoundError: echo('file \"build_list.txt\" not found') ERROR = True return lines = file.readlines() file.close() build_names = [] for line in lines: line = line.strip() if line != '': build_names.append(line.split(' ')) build_command = build_log = '' for line in build_names: build_command = f'gcc -shared -o {path}lib/{line[0]}.so {path}/obj/{line[0]}.o' build_log = line[0] + '.o' for i in range(1, len(line)): build_log += (' < ' if i < len(line) else '') + line[i] build_command += f' {path}/obj/{line[i]}.o' os.system(build_command) echo(build_log) if os.getuid() != 0: # проверка прав админа print('root rights required\nrun \'sudo python install.py\'') exit(1) os.chdir(os.path.dirname(__file__)) # смена рабочей директории на директорию, в которой был запущен скрипт # позволяет запускать скрипт из других директорий if os.path.exists('/usr/games/lolcat') and not 'i' in argv: # если лолкат установлен, то норм LOLCAT = True print('lolcat detected!') if 'r' in argv: # если есть аргумент r, то скомплированные папки удаляются os.system(f'rm {path}obj/ -rf') os.system(f'rm {path}lib/ -rf') echo('building .c files to .o files') # компилится .c файлы в объектники if not os.path.exists(f'{path}obj/'): os.system(f'mkdir {path}obj/') if not os.path.exists(f'{path}lib/'): os.system(f'mkdir {path}lib/') name_ext = None for f in os.listdir(f'{path}c'): name_ext = os.path.splitext(f) if name_ext[1] == '.c': echo(f) if os.system(f'gcc -fPIC -c {path}c/{name_ext[0]}.c -o {path}obj/{name_ext[0]}.o') and not ERROR: ERROR = True echo('=' * 13) if ERROR: echo('error occured while building .o files') output_flush() exit(1) echo('building .o files to .so libs') # компиляция объектников в общие библиотеки exec_build_list() echo('=' * 13) echo('installing') # копирование папок и файлов в /usr/bin # main.py переименовывается в ompl echo('copying src/main.py') os.system(f'cp src/main.py /usr/bin/ompl') os.system('chmod +x /usr/bin/ompl') echo('copying src/ompl_src/') os.system(f'cp src/ompl_src /usr/bin/ -r') echo('=' * 13) if 'c' in argv: # если есть аргумент c, то скомпилированные папки удаляются echo('cleaning') echo('deleting lib/ and obj/ folders') os.system('rm src/ompl_src/lib/ -r | rm src/ompl_src/obj/ -r') echo('=' * 13) echo('done') output_flush() # вывод с помощью lolcat