| #!/usr/bin/python |
| import sys |
| import argparse |
| import os |
| |
| parser = argparse.ArgumentParser(description="Make helper parser") |
| parser.add_argument("--directory", dest="directory", required=True) |
| parser.add_argument("--library", dest="library", help="Make a library") |
| parser.add_argument("--binary", dest="binary", help="Make a binary") |
| parser.add_argument("--prefix", dest="prefix", help="Make a set of objs") |
| parser.add_argument("--exclude", dest="exclude", help="Exclude file", action="append") |
| parser.add_argument("--include", dest="include", help="Include file", action="append") |
| parser.add_argument("--out", dest="out", help="Output file") |
| parser.add_argument("--cpp-suffix", dest="cpp_suffix", help="C++ file suffix") |
| PREFIX=None |
| LIBRARY=None |
| BINARY=None |
| EXCLUDE=[] |
| INCLUDE=[] |
| OUTFILE="targets.mk" |
| CPP_SUFFIX=".cpp" |
| |
| def write_cpp_rule_pattern(f): |
| src = "$(%s_SRCDIR)/%%%s"%(PREFIX, CPP_SUFFIX) |
| dst = "$(%s_SRCDIR)/%%.$(OBJ)"%(PREFIX) |
| |
| f.write("%s: %s\n"%(dst, src)) |
| f.write('\t$(QUIET_CXX)$(CXX) $(CFLAGS) $(CXXFLAGS) $(INCLUDES) $(' + PREFIX + '_CFLAGS) $(' + PREFIX + '_INCLUDES) -c $(CXX_O) $<\n') |
| f.write("\n") |
| |
| def write_c_rule_pattern(f): |
| src = "$(%s_SRCDIR)/%%.c"%(PREFIX) |
| dst = "$(%s_SRCDIR)/%%.$(OBJ)"%(PREFIX) |
| |
| f.write("%s: %s\n"%(dst, src)) |
| f.write('\t$(QUIET_CC)$(CC) $(CFLAGS) $(INCLUDES) $(' + PREFIX + '_CFLAGS) $(' + PREFIX + '_INCLUDES) -c $(CXX_O) $<\n') |
| f.write("\n") |
| |
| def write_asm_rule_pattern(f): |
| src = "$(%s_SRCDIR)/%%.asm"%(PREFIX) |
| dst = "$(%s_SRCDIR)/%%.$(OBJ)"%(PREFIX) |
| |
| f.write("%s: %s\n"%(dst, src)) |
| f.write('\t$(QUIET_ASM)$(ASM) $(ASMFLAGS) $(ASM_INCLUDES) $(' + PREFIX + '_ASMFLAGS) $(' + PREFIX + '_ASM_INCLUDES) -o $@ $<\n') |
| f.write("\n") |
| |
| def write_asm_s_rule_pattern(f): |
| src = "$(%s_SRCDIR)/%%.S"%(PREFIX) |
| dst = "$(%s_SRCDIR)/%%.$(OBJ)"%(PREFIX) |
| |
| f.write("%s: %s\n"%(dst, src)) |
| f.write('\t$(QUIET_CCAS)$(CCAS) $(CCASFLAGS) $(ASMFLAGS) $(INCLUDES) $(' + PREFIX + '_CFLAGS) $(' + PREFIX + '_INCLUDES) -c -o $@ $<\n') |
| f.write("\n") |
| |
| |
| def find_sources(): |
| cpp_files = [] |
| asm_files = [] |
| c_files = [] |
| s_files = [] |
| print EXCLUDE |
| for dir in os.walk("."): |
| for file in dir[2]: |
| if (len(INCLUDE) == 0 and not file in EXCLUDE) or file in INCLUDE: |
| if os.path.splitext(file)[1] == CPP_SUFFIX: |
| cpp_files.append(os.path.join(dir[0].strip('./'), file)) |
| if os.path.splitext(file)[1] == '.asm': |
| asm_files.append(os.path.join(dir[0].strip('./'), file)) |
| if os.path.splitext(file)[1] == '.c': |
| c_files.append(os.path.join(dir[0].strip('./'), file)) |
| if os.path.splitext(file)[1] == '.S': |
| s_files.append(os.path.join(dir[0].strip('./'), file)) |
| return [cpp_files, asm_files, c_files, s_files] |
| |
| |
| args = parser.parse_args() |
| |
| if args.library is not None: |
| PREFIX=args.library.upper() |
| elif args.binary is not None: |
| PREFIX=args.binary.upper() |
| elif args.prefix is not None: |
| PREFIX=args.prefix.upper() |
| else: |
| sys.stderr.write("Must provide either library, binary or prefix") |
| sys.exit(1) |
| |
| if args.exclude is not None: |
| EXCLUDE = args.exclude |
| if args.include is not None: |
| INCLUDE = args.include |
| if args.out is not None: |
| OUTFILE = args.out |
| else: |
| OUTFILE = os.path.join(args.directory, OUTFILE) |
| if args.cpp_suffix is not None: |
| CPP_SUFFIX = args.cpp_suffix |
| |
| OUTFILE = os.path.abspath(OUTFILE) |
| try: |
| os.chdir(args.directory) |
| except OSError as e: |
| sys.stderr.write("Error changing directory to %s\n" % e.filename) |
| sys.exit(1) |
| |
| (cpp, asm, cfiles, sfiles) = find_sources() |
| |
| cpp = sorted(cpp, key=lambda s: s.lower()) |
| asm = sorted(asm, key=lambda s: s.lower()) |
| cfiles = sorted(cfiles, key=lambda s: s.lower()) |
| sfiles = sorted(sfiles, key=lambda s: s.lower()) |
| armfiles = [] |
| arm64files = [] |
| for file in sfiles: |
| c = file.split('/') |
| if 'arm64' in c: |
| arm64files.append(file) |
| elif 'arm' in c: |
| armfiles.append(file) |
| mipsfiles = [] |
| for file in cfiles: |
| c = file.split('/') |
| if 'mips' in c: |
| mipsfiles.append(file) |
| cfiles = [x for x in cfiles if x not in mipsfiles] |
| loongarchfiles = [] |
| for file in cfiles: |
| c = file.split('/') |
| if 'loongarch' in c: |
| loongarchfiles.append(file) |
| cfiles = [x for x in cfiles if x not in loongarchfiles] |
| |
| |
| f = open(OUTFILE, "w") |
| f.write("# This file is autogenerated, do not edit it directly, edit build/mktargets.py\n") |
| f.write("# instead. To regenerate files, run build/mktargets.sh.\n") |
| f.write("\n") |
| |
| f.write("%s_SRCDIR=%s\n"%(PREFIX, args.directory)) |
| |
| f.write("%s_CPP_SRCS=\\\n"%(PREFIX)) |
| for c in cpp: |
| f.write("\t$(%s_SRCDIR)/%s\\\n"%(PREFIX, c)) |
| f.write("\n") |
| f.write("%s_OBJS += $(%s_CPP_SRCS:%s=.$(OBJ))\n\n"%(PREFIX, PREFIX, CPP_SUFFIX)) |
| |
| if len(cfiles) > 0: |
| f.write("%s_C_SRCS=\\\n"%(PREFIX)) |
| for cfile in cfiles: |
| f.write("\t$(%s_SRCDIR)/%s\\\n"%(PREFIX, cfile)) |
| f.write("\n") |
| f.write("%s_OBJS += $(%s_C_SRCS:.c=.$(OBJ))\n"%(PREFIX, PREFIX)) |
| |
| if len(asm) > 0: |
| f.write("%s_ASM_SRCS=\\\n"%(PREFIX)) |
| for c in asm: |
| f.write("\t$(%s_SRCDIR)/%s\\\n"%(PREFIX, c)) |
| f.write("\n") |
| f.write("%s_OBJSASM += $(%s_ASM_SRCS:.asm=.$(OBJ))\n"%(PREFIX, PREFIX)) |
| f.write("ifeq ($(ASM_ARCH), x86)\n") |
| f.write("%s_OBJS += $(%s_OBJSASM)\n"%(PREFIX,PREFIX)) |
| f.write("endif\n") |
| f.write("OBJS += $(%s_OBJSASM)\n\n"%(PREFIX)) |
| |
| if len(armfiles) > 0: |
| f.write("%s_ASM_ARM_SRCS=\\\n"%(PREFIX)) |
| for c in armfiles: |
| f.write("\t$(%s_SRCDIR)/%s\\\n"%(PREFIX, c)) |
| f.write("\n") |
| f.write("%s_OBJSARM += $(%s_ASM_ARM_SRCS:.S=.$(OBJ))\n"%(PREFIX, PREFIX)) |
| f.write("ifeq ($(ASM_ARCH), arm)\n") |
| f.write("%s_OBJS += $(%s_OBJSARM)\n"%(PREFIX,PREFIX)) |
| f.write("endif\n") |
| f.write("OBJS += $(%s_OBJSARM)\n\n"%(PREFIX)) |
| |
| if len(arm64files) > 0: |
| f.write("%s_ASM_ARM64_SRCS=\\\n"%(PREFIX)) |
| for c in arm64files: |
| f.write("\t$(%s_SRCDIR)/%s\\\n"%(PREFIX, c)) |
| f.write("\n") |
| f.write("%s_OBJSARM64 += $(%s_ASM_ARM64_SRCS:.S=.$(OBJ))\n"%(PREFIX, PREFIX)) |
| f.write("ifeq ($(ASM_ARCH), arm64)\n") |
| f.write("%s_OBJS += $(%s_OBJSARM64)\n"%(PREFIX,PREFIX)) |
| f.write("endif\n") |
| f.write("OBJS += $(%s_OBJSARM64)\n\n"%(PREFIX)) |
| |
| if len(mipsfiles) > 0: |
| mmifiles = [] |
| for file in mipsfiles: |
| if '_mmi' in file: |
| mmifiles.append(file) |
| f.write("%s_ASM_MIPS_MMI_SRCS=\\\n"%(PREFIX)) |
| for c in mmifiles: |
| f.write("\t$(%s_SRCDIR)/%s\\\n"%(PREFIX, c)) |
| f.write("\n") |
| f.write("%s_OBJSMIPS_MMI += $(%s_ASM_MIPS_MMI_SRCS:.c=.$(OBJ))\n\n"%(PREFIX, PREFIX)) |
| msafiles = [] |
| for file in mipsfiles: |
| if '_msa' in file: |
| msafiles.append(file) |
| f.write("%s_ASM_MIPS_MSA_SRCS=\\\n"%(PREFIX)) |
| for c in msafiles: |
| f.write("\t$(%s_SRCDIR)/%s\\\n"%(PREFIX, c)) |
| f.write("\n") |
| f.write("%s_OBJSMIPS_MSA += $(%s_ASM_MIPS_MSA_SRCS:.c=.$(OBJ))\n"%(PREFIX, PREFIX)) |
| f.write("ifeq ($(ASM_ARCH), mips)\n") |
| f.write("ifeq ($(ENABLE_MMI), Yes)\n") |
| f.write("%s_OBJS += $(%s_OBJSMIPS_MMI)\n"%(PREFIX,PREFIX)) |
| f.write("endif\n") |
| f.write("ifeq ($(ENABLE_MSA), Yes)\n") |
| f.write("%s_OBJS += $(%s_OBJSMIPS_MSA)\n"%(PREFIX,PREFIX)) |
| f.write("endif\n") |
| f.write("endif\n") |
| f.write("OBJS += $(%s_OBJSMIPS_MMI)\n"%(PREFIX)) |
| f.write("OBJS += $(%s_OBJSMIPS_MSA)\n\n"%(PREFIX)) |
| |
| if len(loongarchfiles) > 0: |
| lsxfiles = [] |
| for file in loongarchfiles: |
| if '_lsx' in file: |
| lsxfiles.append(file) |
| f.write("%s_ASM_LOONGARCH_LSX_SRCS=\\\n"%(PREFIX)) |
| for c in lsxfiles: |
| f.write("\t$(%s_SRCDIR)/%s\\\n"%(PREFIX, c)) |
| f.write("\n") |
| f.write("%s_OBJSLOONGARCH_LSX += $(%s_ASM_LOONGARCH_LSX_SRCS:.c=.$(OBJ))\n\n"%(PREFIX, PREFIX)) |
| lasxfiles = [] |
| for file in loongarchfiles: |
| if '_lasx' in file: |
| lasxfiles.append(file) |
| f.write("%s_ASM_LOONGARCH_LASX_SRCS=\\\n"%(PREFIX)) |
| for c in lasxfiles: |
| f.write("\t$(%s_SRCDIR)/%s\\\n"%(PREFIX, c)) |
| f.write("\n") |
| f.write("%s_OBJSLOONGARCH_LASX += $(%s_ASM_LOONGARCH_LASX_SRCS:.c=.$(OBJ))\n"%(PREFIX, PREFIX)) |
| |
| f.write("ifeq ($(ASM_ARCH), loongarch)\n") |
| f.write("ifeq ($(ENABLE_LSX), Yes)\n") |
| f.write("%s_OBJS += $(%s_OBJSLOONGARCH_LSX)\n"%(PREFIX,PREFIX)) |
| f.write("endif\n") |
| f.write("ifeq ($(ENABLE_LASX), Yes)\n") |
| f.write("%s_OBJS += $(%s_OBJSLOONGARCH_LASX)\n"%(PREFIX,PREFIX)) |
| f.write("endif\n") |
| f.write("endif\n") |
| f.write("OBJS += $(%s_OBJSLOONGARCH_LSX)\n"%(PREFIX)) |
| f.write("OBJS += $(%s_OBJSLOONGARCH_LASX)\n\n"%(PREFIX)) |
| |
| f.write("OBJS += $(%s_OBJS)\n\n"%(PREFIX)) |
| write_cpp_rule_pattern(f) |
| |
| if len(cfiles) > 0 or len(mipsfiles) > 0: |
| write_c_rule_pattern(f) |
| |
| if len(asm) > 0: |
| write_asm_rule_pattern(f) |
| |
| if len(sfiles) > 0: |
| write_asm_s_rule_pattern(f) |
| |
| if args.library is not None: |
| f.write("$(LIBPREFIX)%s.$(LIBSUFFIX): $(%s_OBJS)\n"%(args.library, PREFIX)) |
| f.write("\t$(QUIET)rm -f $@\n") |
| f.write("\t$(QUIET_AR)$(AR) $(AR_OPTS) $+\n") |
| f.write("\n") |
| f.write("libraries: $(LIBPREFIX)%s.$(LIBSUFFIX)\n"%args.library) |
| f.write("LIBRARIES += $(LIBPREFIX)%s.$(LIBSUFFIX)\n"%args.library) |
| |
| if args.binary is not None: |
| f.write("%s$(EXEEXT): $(%s_OBJS) $(%s_DEPS)\n"%(args.binary, PREFIX, PREFIX)) |
| f.write("\t$(QUIET_CXX)$(CXX) $(CXX_LINK_O) $(%s_OBJS) $(%s_LDFLAGS) $(LDFLAGS)\n\n"%(PREFIX, PREFIX)) |
| f.write("binaries: %s$(EXEEXT)\n"%args.binary) |
| f.write("BINARIES += %s$(EXEEXT)\n"%args.binary) |
| |
| f.close() |