install.py 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import os
  2. from sys import argv
  3. OUTPUT = ''
  4. LOLCAT = False
  5. ERROR = False
  6. path = 'src/ompl_src/'
  7. def echo(text): # вывод, цветной или нет
  8. global OUTPUT, LOLCAT
  9. if LOLCAT: OUTPUT += text + '\n'
  10. else: print(text)
  11. def output_flush(): # вывод цветного буффера
  12. global OUTPUT, LOLCAT
  13. if LOLCAT: os.system(f'echo \"{OUTPUT[:-1]}\"| /usr/games/lolcat')
  14. def exec_build_list(): # сборка по билд листу
  15. global ERROR
  16. try:
  17. file = open('build_list.txt', 'r')
  18. except FileNotFoundError:
  19. echo('file \"build_list.txt\" not found')
  20. ERROR = True
  21. return
  22. lines = file.readlines()
  23. file.close()
  24. build_names = []
  25. for line in lines:
  26. line = line.strip()
  27. if line != '': build_names.append(line.split(' '))
  28. build_command = build_log = ''
  29. for line in build_names:
  30. build_command = f'gcc -shared -o {path}lib/{line[0]}.so {path}/obj/{line[0]}.o'
  31. build_log = line[0] + '.o'
  32. for i in range(1, len(line)):
  33. build_log += (' < ' if i < len(line) else '') + line[i]
  34. build_command += f' {path}/obj/{line[i]}.o'
  35. os.system(build_command)
  36. echo(build_log)
  37. if os.getuid() != 0: # проверка прав админа
  38. print('root rights required\nrun \'sudo python install.py\'')
  39. exit(1)
  40. os.chdir(os.path.dirname(__file__)) # смена рабочей директории на директорию, в которой был запущен скрипт
  41. # позволяет запускать скрипт из других директорий
  42. if os.path.exists('/usr/games/lolcat') and not 'i' in argv: # если лолкат установлен, то норм
  43. LOLCAT = True
  44. print('lolcat detected!')
  45. if 'r' in argv: # если есть аргумент r, то скомплированные папки удаляются
  46. os.system(f'rm {path}obj/ -rf')
  47. os.system(f'rm {path}lib/ -rf')
  48. echo('building .c files to .o files') # компилится .c файлы в объектники
  49. if not os.path.exists(f'{path}obj/'): os.system(f'mkdir {path}obj/')
  50. if not os.path.exists(f'{path}lib/'): os.system(f'mkdir {path}lib/')
  51. name_ext = None
  52. for f in os.listdir(f'{path}c'):
  53. name_ext = os.path.splitext(f)
  54. if name_ext[1] == '.c':
  55. echo(f)
  56. 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
  57. echo('=' * 13)
  58. if ERROR:
  59. echo('error occured while building .o files')
  60. output_flush()
  61. exit(1)
  62. echo('building .o files to .so libs') # компиляция объектников в общие библиотеки
  63. exec_build_list()
  64. echo('=' * 13)
  65. echo('installing') # копирование папок и файлов в /usr/bin
  66. # main.py переименовывается в ompl
  67. echo('copying src/main.py')
  68. os.system(f'cp src/main.py /usr/bin/ompl')
  69. os.system('chmod +x /usr/bin/ompl')
  70. echo('copying src/ompl_src/')
  71. os.system(f'cp src/ompl_src /usr/bin/ -r')
  72. echo('=' * 13)
  73. if 'c' in argv: # если есть аргумент c, то скомпилированные папки удаляются
  74. echo('cleaning')
  75. echo('deleting lib/ and obj/ folders')
  76. os.system('rm src/ompl_src/lib/ -r | rm src/ompl_src/obj/ -r')
  77. echo('=' * 13)
  78. echo('done')
  79. output_flush() # вывод с помощью lolcat