#!/usr/bin/env omake #---------------------------------------------------------------------------- # Project: Horizon # File: testutil.om # # Copyright 2007-2009 Nintendo. All rights reserved. # # These coded instructions, statements, and computer programs contain # proprietary information of Nintendo of America Inc. and/or Nintendo # Company Ltd., and are protected by Federal copyright law. They may # not be disclosed to third parties or copied or duplicated in any form, # in whole or in part, without the prior written consent of Nintendo. # # $Date:: 2010-08-20#$ # $Rev: 24283 $ # $Author: takiguchi_shinichi $ #---------------------------------------------------------------------------- LOADRUN = $(absname $(ROOT_TOOLS)$(DIRSEP)CommandLineTools$(DIRSEP)ctr_loadrunf32.exe) # UNIQUE_ID を指定して cia を生成します。 public.MakeCiaByID(filename, id, sources, rsf) = depends = CTR_APPTYPE = NAND objects[] = target_program = $(filename) UNIQUE_ID = 0x$(id) MAKEROMFLAGS += -DUNIQUE_ID=$(UNIQUE_ID) TITLE = $(filename) ROM_SPEC_FILE = $(rsf) section if $(defined TESTCIA_ROMFS_ROOT) ROMFS_ROOT = $(TESTCIA_ROMFS_ROOT) export ROMFS_ROOT else ROMFS_ROOT = export ROMFS_ROOT foreach(target, $(BUILDER.getTargets $(SUPPORTED_TARGETS))) if $(defined UserRunProcess) depends += $(UserRunProcess $(target), $(target_program), $(sources) $(objects)) export depends else depends += $(UserProcess $(target), $(target_program), $(sources) $(objects)) export depends export depends export depends return $(filter %$(EXT_CIA), $(depends)) # UNIQUE_ID の範囲を指定して cia を生成します。 public.MakeCiaByIDRange(id_s, id_e, sources, rsf) = depends = id_s_denary = $(int 0x$(id_s)) id_e_denary = $(int 0x$(id_e)) idx = $(id_s_denary) while $(lt $(idx), $(add $(id_e_denary), 1)) id_hex = $(sprintf $"%05X", $(idx)) depends += $(MakeCiaByID $(id_hex), $(id_hex), $(sources), $(rsf)) idx = $(add $(idx), 1) return $(depends) # cfa を作成します。(出力先指定付) public.FileArchiveWithOutdir(srcdir, outdir, rsf) = name = $(basename $(srcdir)) SOURCES_BASE_ROOT = $(dirname $(srcdir)) CFAFile = $(makeDirectory $(outdir))$(DIRSEP)$(name)$(EXT_CFA) if $(not $(defined ARCHIVE_DEPENDENCIES)) ARCHIVE_DEPENDENCIES = $(ls -R, $(dir $(srcdir))) export ARCHIVE_DEPENDENCIES += $(rsf) $(CFAFile): $(makeDirectory $(dirname $(CFAFile))) $(CFAFile): $(srcdir) $(MAKEROM) $(rsf) $(ARCHIVE_DEPENDENCIES) $(MAKEROM) -o $@ -DROMFS_ROOT=$(srcdir) $(MAKEROMFLAGS) -f data -rsf $(rsf) return $(CFAFile) # コンテンツを含む cia を生成します。 public.MakeCiaWithContents(filename, contents, rsf) = depends = CTR_APPTYPE = NAND title_contents[] = target_title = $(filename) TITLE = $(filename) UNIQUE_ID = 0xFE000 MAKEROMFLAGS += -DUNIQUE_ID=$(UNIQUE_ID) ROM_SPEC_FILE = $(rsf) idx = 0 foreach(content, $(contents)) title_contents += $(idx)>$(content) idx = $(add $(idx), 1) export if $(defined Title) foreach(target, $(BUILDER.getTargets $(SUPPORTED_TARGETS))) depends += $(Title $(target), $(target_title), $(title_contents)) export depends export depends return $(depends) # マニュアルを含む cia を生成します。 public.MakeCiaWithManual(filename, id, sources, rsf, manualdir) = section MANUAL_DIR = $(manualdir) return $(MakeCiaByID $(filename), $(id), $(sources), $(rsf)) # 任意の大きさのファイルを生成します。 public.MakeSpecifiedSizeFile(datafile, filesize) = filedir = $(dirname $(datafile)) $(datafile): $(makeDirectory $(filedir)) section rm -f $(filedir)/* f = $(fopen $@, w) idx = 0 while $(lt $(idx), $(filesize)) fprint($(f), A) idx = $(add $(idx), 1) close($(f)) return $(datafile) # romfs に任意の大きさのファイルをもつ cia を生成します。 public.MakeCiaWithRomfs(filename, id, filesize, sources, rsf) = section TESTCIA_ROMFS_ROOT = $(getOutputBaseDirectory)/$(SUBDIR_OBJECTS)/$(getModuleSubDirectory)/files_$(id) datafile = $(TESTCIA_ROMFS_ROOT)/data.txt ROMFS_DEPENDENCIES = $(MakeSpecifiedSizeFile $(datafile), $(filesize)) return $(MakeCiaByID $(filename), $(id), $(sources), $(rsf)) # ファイルを romfs_dir へコピーします。 public.CopyIntoRomfsroot(romfs_dir, srces) = copiedfiles = foreach(TARGET, $(BUILDER.getTargets $(SUPPORTED_TARGETS))) foreach(src, $(srces)) filename = $(basename $(src)) romfsroot = $(TARGET.getImageDirectory false)/$(romfs_dir) copiedfile = $(romfsroot)/$(filename) copiedfiles += $(copiedfile) $(copiedfile): $(src) $(makeDirectory $(romfsroot)) cp $(src) $(copiedfile) export copiedfiles export copiedfiles return $(copiedfiles) # ターゲット別に生成されているファイルを romfs_dir へコピーします。 public.CopyIntoRomfsrootFilteredByTarget(romfs_dir, srces) = copiedfiles = foreach(TARGET, $(BUILDER.getTargets $(SUPPORTED_TARGETS))) target_srces = foreach(src, $(srces)) dirs = $(split /, $(split \\, $(src))) if $(and $(mem $(TARGET.getFullnameWithSystem Process), $(dirs)), $(mem $(TARGET.buildtype), $(dirs))) target_srces += $(src) export target_srces export target_srces foreach(src, $(target_srces)) filename = $(basename $(src)) romfsroot = $(TARGET.getImageDirectory false)/$(romfs_dir) copiedfile = $(romfsroot)/$(filename) copiedfiles += $(copiedfile) $(copiedfile): $(src) $(makeDirectory $(romfsroot)) cp $(src) $(copiedfile) export copiedfiles export copiedfiles return $(copiedfiles) # ファイルを開き、一行ずつ読み込みます。 public.ReadFileLine(filename) = f = $(fopen $(filename), r) result = while true try result += $(input-line $(f)) export result catch RuntimeException(e) break() export result close($(f)) return $(result) # PC上のプログラムを実行するクラスです。 HostProgramRunner. = class HostProgramRunner program = new(program) = this.program = $(program) return $(this) run() = $(program) & public.MakeHostProgramRunner(program) = return $(HostProgramRunner.new $(program)) ProgramRunner. = class ProgramRunner new(program, exitpattern, timeout) = this.program = $(program) this.exitPattern = $(exitpattern) this.timeOut = $(timeout) return $(this) run(options, logfile) = echo $(LOADRUN) $(options) -re $(program) -e $(exitPattern) -t $(timeOut) | tee $(logfile) $(LOADRUN) $(options) -re $(program) -e $(exitPattern) -t $(timeOut) | tee $(logfile) public.MakeProgramRunner(program, exitpattern, timeout) = return $(ProgramRunner.new $(program),$(exitpattern),$(timeout)) public.GetToolPath(programName, ext) = return $(HORIZON_ROOT_IMAGES)$(DIRSEP)tools$(DIRSEP)$(programName)$(DIRSEP)$`(TARGET.getFullnameWithSystem Process)$(DIRSEP)$`(TARGET.buildtype)$(DIRSEP)$(programName)$(ext) # 指定された名前のプロセスの CDI のパスを返します。 public.GetProcessCdiPath(processName) = return @$(HORIZON_ROOT_IMAGES)$(DIRSEP)processes$(DIRSEP)$(processName)$(DIRSEP)$`(TARGET.getFullnameWithSystem Process)$(DIRSEP)$`(TARGET.buildtype)$(DIRSEP)$(processName).cdi # 指定された複数のプロセスのCDIのパスを返します。 public.GetProcessCdiPathList(processNames) = if $(eq 1, $(length processNames)) return $(GetProcessCdiPath $(processNames)) pathlist = $(GetProcessCdiPath $(nth 0, $(processNames))) foreach(proc, $(nth-tl 1, $(processNames))) pathlist += ,$(GetProcessCdiPath $(proc)) export return $(pathlist)