generate_armips_cpp.py (3973B)
1 #!/usr/bin/env python 2 3 import os 4 import re 5 import sys 6 7 file_list = [ 8 'stdafx.h', 9 'ext/tinyformat/tinyformat.h', 10 'Commands/CAssemblerCommand.h', 11 'Core/Expression.h', 12 'Core/ExpressionFunctions.h', 13 'Core/SymbolData.h', 14 'Util/Util.h', 15 'Util/FileClasses.h', 16 'Util/ByteArray.h', 17 'Core/FileManager.h', 18 'Core/ELF/ElfTypes.h', 19 'Core/ELF/ElfFile.h', 20 'Core/ELF/ElfRelocator.h', 21 'Archs/Architecture.h', 22 'Archs/MIPS/Mips.h', 23 'Archs/MIPS/MipsOpcodes.h', 24 'Archs/MIPS/CMipsInstruction.h', 25 'Util/EncodingTable.h', 26 'Core/Misc.h', 27 'Core/Assembler.h', 28 'Core/SymbolTable.h', 29 'Core/Common.h', 30 'Parser/DirectivesParser.h', 31 'Parser/Tokenizer.h', 32 'Archs/MIPS/MipsMacros.h', 33 'Archs/MIPS/MipsParser.h', 34 'Archs/MIPS/CMipsInstruction.cpp', 35 'Archs/MIPS/MipsExpressionFunctions.h', 36 'Archs/MIPS/MipsElfRelocator.h', 37 'Archs/MIPS/Mips.cpp', 38 'Archs/MIPS/MipsElfFile.h', 39 'Util/CRC.h', 40 'Archs/MIPS/MipsElfFile.cpp', 41 'Commands/CommandSequence.h', 42 'Parser/Parser.h', 43 'Archs/MIPS/MipsElfRelocator.cpp', 44 'Archs/MIPS/MipsExpressionFunctions.cpp', 45 'Archs/MIPS/MipsMacros.cpp', 46 'Archs/MIPS/MipsOpcodes.cpp', 47 'Parser/ExpressionParser.h', 48 'Archs/MIPS/PsxRelocator.h', 49 'Commands/CDirectiveFile.h', 50 'Archs/MIPS/MipsParser.cpp', 51 'Archs/MIPS/PsxRelocator.cpp', 52 'Archs/Architecture.cpp', 53 'Commands/CAssemblerCommand.cpp', 54 'Commands/CAssemblerLabel.h', 55 'Commands/CAssemblerLabel.cpp', 56 'Commands/CDirectiveArea.h', 57 'Commands/CDirectiveArea.cpp', 58 'Commands/CDirectiveConditional.h', 59 'Commands/CDirectiveConditional.cpp', 60 'Commands/CDirectiveData.h', 61 'Commands/CDirectiveData.cpp', 62 'Commands/CDirectiveFile.cpp', 63 'Commands/CDirectiveMessage.h', 64 'Commands/CDirectiveMessage.cpp', 65 'Commands/CommandSequence.cpp', 66 'Parser/DirectivesParser.cpp', 67 'Parser/ExpressionParser.cpp', 68 'Parser/Parser.cpp', 69 'Parser/Tokenizer.cpp', 70 'Util/ByteArray.cpp', 71 'Util/CRC.cpp', 72 'Util/EncodingTable.cpp', 73 'Util/FileClasses.cpp', 74 'Util/Util.cpp', 75 'Main/CommandLineInterface.h', 76 'Main/CommandLineInterface.cpp', 77 'Core/ELF/ElfFile.cpp', 78 'Core/ELF/ElfRelocator.cpp', 79 'Core/Assembler.cpp', 80 'Core/Common.cpp', 81 'Core/Expression.cpp', 82 'Core/ExpressionFunctions.cpp', 83 'Core/FileManager.cpp', 84 'Core/Misc.cpp', 85 'Core/SymbolData.cpp', 86 'Core/SymbolTable.cpp', 87 'Main/main.cpp', 88 ] 89 90 file_header = \ 91 """// armips assembler v0.11 92 // https://github.com/Kingcom/armips/ 93 // To simplify compilation, all files have been concatenated into one. 94 // MIPS only, ARM is not included.\n\n""" 95 96 def banned(line): 97 return '#pragma once' in line or '#include "' in line 98 99 def cat_file(fout, fin_name): 100 with open(fin_name) as fin: 101 lines = fin.readlines() 102 lines = [l.rstrip() for l in lines if not banned(l)] 103 for l in lines: 104 if re.search(r'\bArm\b', l): 105 fout.write("#ifdef ARMIPS_ARM\n") # must manually insert #endif 106 fout.write(l + '\n') 107 fout.write('\n') 108 109 def combine_armips(fout_name, armips_path): 110 with open(fout_name, 'w') as fout: 111 fout.write(file_header) 112 fout.write("/*\n") 113 cat_file(fout, os.path.join(armips_path, 'LICENSE.txt')) 114 fout.write("*/\n\n") 115 for f in file_list: 116 fout.write(f"// file: {f}\n") 117 cat_file(fout, os.path.join(armips_path, f)) 118 119 def main(): 120 if len(sys.argv) > 1 and sys.argv[1] in ['-h', '--help']: 121 print('Usage: generate_armips_cpp.py [output_filename] [armips_src_dir]') 122 print('Defaults: [output_filename = "armips.cpp"] [armips_src_dir = "./armips"]') 123 return 124 fout_name = sys.argv[1] if len(sys.argv) > 1 else 'armips.cpp' 125 armips_path = sys.argv[2] if len(sys.argv) > 2 else './armips' 126 combine_armips(fout_name, os.path.expanduser(armips_path)) 127 128 main()