#!/usr/bin/env omake #---------------------------------------------------------------------------- # Project: Horizon # File: targetdefs.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-11-01#$ # $Rev: 30041 $ # $Author: sasaki_yu $ #---------------------------------------------------------------------------- public.DEFAULT_FILTER = CTR-TS*MPCore* # ターゲットに依存しないディレクトリ取得関数 getOutputBaseDirectory() = abs_cwd = $(absname $(CWD)) #println(abs_cwd: $(abs_cwd)) # プロジェクトのルートはHORIZON_ROOT?(SDK のビルド?) if $(equal $(AROOT), $(HORIZON_ROOT)) return $(dir $(HORIZON_ROOT)) # カレントディレクトリは HORIZON_ROOT の中? subdir = $(removeprefix $(HORIZON_ROOT), $(abs_cwd)) if $(not $(equal $(subdir), $(abs_cwd))) #println("UNDER HORIZON: "$(abs_cwd)) return $(dir $(HORIZON_ROOT)) # プロジェクトのルートには sources ディレクトリがある? subdir = $(removeprefix $(AROOT)\\sources\\, $(abs_cwd)) if $(not $(equal $(subdir), $(abs_cwd))) #println("SOURCES EXIST: "$(abs_cwd)) return $(ROOT) #println(subdir: $(subdir)) # カレントディレクトリに出力 return $(dir .) # ソースのパス名から生成物を格納するサブディレクトリ名を得る getModuleSubDirectory() = if $(defined SOURCES_BASE_ROOT) basedir = $(SOURCES_BASE_ROOT) export else basedir = $(CWD) export #println(basedir: $(basedir)) if $(equal $(ROOT), $(basedir)) return . basedir = $(absname $(basedir)) subpath = $(removeprefix $(AROOT)$(DIRSEP), $(basedir)) subpath = $(removeprefix sources$(DIRSEP), $(subpath)) return $(subpath) getObjectBaseDirectory() = base_dir = $(getOutputBaseDirectory) if $(equal ., $(base_dir)) module_dir = export else module_dir = $(getModuleSubDirectory)$(DIRSEP) export return $(base_dir)$(DIRSEP)$(SUBDIR_OBJECTS)$(DIRSEP)$(module_dir) TargetSpec. = class TargetSpec processor = platform = hardware = new(name) = this.name = $(name) return $(this) dump() = println($"name: "$(name)) println($" platform: "$(platform)) println($" hardware: "$(hardware)) println($" processors: "$(processors)) println($' ') getMacroFlags(systemname, processor) = return $(EMPTY) TargetConfig. = class TargetConfig hardware = systemname = processor = effort = buildtype = matched = true new() = return $(this) dump() = println($"hardware: "$(hardware)) println($" processor: "$(processor)) println($' ') getFullname() = return $(hardware).$(systemname).$(processor).$(effort) getFullnameWithSystem(altsystemname) = return $(hardware).$(altsystemname).$(processor).$(effort) getFullnameWithSystemAndEffort(altsystemname, alteffort) = return $(hardware).$(altsystemname).$(processor).$(alteffort) getScannerName() = return $(getFullname)-$(buildtype)$(if $(FEEDBACK_1ST_STAGE),.f) getObjectDirectory() = dir_suffix = if $(FEEDBACK_1ST_STAGE) dir_suffix = $(DIRSUFFIX_FEEDBACK) export return $(makeDirectory $(getObjectBaseDirectory)$(DIRSEP)$(getTargetSubDirectory false)$(dir_suffix)) getObjectDirectory() = if $(FEEDBACK_1ST_STAGE) return $(getObjectDirectoryFeedback true) return $(getObjectDirectoryFeedback false) getObjectDirectoryFeedback(isFeedback) = dir_suffix = if $(isFeedback) dir_suffix = $(DIRSUFFIX_FEEDBACK) export return $(makeDirectory $(getObjectBaseDirectory)$(DIRSEP)$(getTargetSubDirectory false)$(dir_suffix)) getLibraryDirectory(isInstall) = if $(and $(isInstall), $(defined INSTALL_ROOT)) return $(makeDirectory $(INSTALL_ROOT_LIBRARIES)$(DIRSEP)$(getTargetSubDirectory true)) else return $(makeDirectory $(HORIZON_ROOT_LIBRARIES)$(DIRSEP)$(getTargetSubDirectory true)) isTestBuild() = if $(not $(defined BUILD_TESTS)) return false else return $(BUILD_TESTS) getOutputBaseDirectory() = return $(getOutputBaseDirectory) getImageDirectory(isInstall) = module_dir = $(getModuleSubDirectory)$(DIRSEP) if $(and $(isInstall), $(isSdkTool)) images_dir = $(ROOT_TARGETTOOLS) return $(makeDirectory $(images_dir)$(DIRSEP)$(hardware)$(DIRSEP)$(buildtype)) export elseif $(and $(isInstall), $(defined INSTALL_ROOT)) # インストール対象ディレクトリ images_dir = $(INSTALL_ROOT_IMAGES) export else base_dir = $(getOutputBaseDirectory) if $(equal ., $(base_dir)) module_dir = export images_dir = $(base_dir)$(DIRSEP)$(SUBDIR_IMAGES) export # テストをビルドする場合はパスの規則が変わる if $(isTestBuild) module_dir = tests$(DIRSEP)$(gsub $(module_dir), $"\$(DIRSEP)tests?(\$(DIRSEP)|$$)", $(DIRSEP)) export return $(makeDirectory $(images_dir)$(DIRSEP)$(module_dir)$(getTargetSubDirectory false)) isSdkTool() = if $(and $(defined INSTALL_SDK_TOOL), $(INSTALL_SDK_TOOL), \ $(equal $(systemname), Process), \ $(equal $(processor), MPCore), \ $(equal $(effort), fast)) return true else return false getOptimizeType() = opttype = switch($(buildtype)) case Debug value noopt case Development value verbose case Release value release default value etc return $(opttype) getTargetSubDirectory(isLibrary) = subdir = $(hardware).$(systemname).$(processor) if $(isLibrary) return $(subdir)$(DIRSEP)$(getOptimizeType) else return $(subdir).$(effort)$(DIRSEP)$(buildtype) getLibraryName(name) = return $(name).$(effort)$(EXT_LIB) getStaticObjectName(name) = return $(basename $(name)).$(effort)$(EXT_OBJ) getLdscriptPath(name) = return $(getBinaryPath $(name), $".autogen.ldscript") getMapfilePath(name) = return $(getBinaryPath $(name), $".map") getLdscriptTemplatePath() = base = $(ROOT_BUILD)$(DIRSEP)linker$(DIRSEP)$(platform).$(systemname).$(processor) if $(and $(equal $(processor), ARM946ES) $(equal $(hardware), CTR-CTTS)) return $(file $(base).Legacy.ldscript.template) else return $(file $(base).ldscript.template) getFeedBackPath() = return $(file $(getImageDirectory false)$(DIRSEP)$(getOutputFilename feedback, .dat)) getBinaryPath(name, suffix) = return $(file $(getImageDirectory false)$(DIRSEP)$(getOutputFilename $(name), $(suffix))) getDefaultDescriptorPath() = return $(file $(ROOT_RESOURCES)$(DIRSEP)specfiles$(DIRSEP)Application.desc) getDefaultRomSpecFile() = spec = $(TARGET_MANAGER.getSpecByHardware $(hardware)) if $(defined spec.getDefaultRomSpecFile) return $(file $(ROOT_RESOURCES)$(DIRSEP)specfiles$(DIRSEP)$(spec.getDefaultRomSpecFile $(hardware))) else return $(file $(ROOT_RESOURCES)$(DIRSEP)specfiles$(DIRSEP)Application.rsf) getDefaultBannerFile() = return $(ROOT_RESOURCES)$(DIRSEP)banner$(DIRSEP)Default.bnr getDefaultIconFile() = return $(ROOT_RESOURCES)$(DIRSEP)banner$(DIRSEP)Default.icn getOutputFilename(name, suffix) = return $(name)$(suffix) getSuitableKernelFilename() = return $(HORIZON_ROOT_IMAGES)$(DIRSEP)kernel$(DIRSEP)$(getFullnameWithSystem Kernel)$(DIRSEP)$(buildtype)$(DIRSEP)kernel.axf getSystemCCFlags() = spec = $(TARGET_MANAGER.getSpecByHardware $(hardware)) if $(defined spec.getSystemFlags) return $(spec.getSystemFlags $(systemname)) else return $(EMPTY) getMinimumLibraries() = spec = $(TARGET_MANAGER.getSpecByHardware $(hardware)) if $(defined spec.getMinimumLibraries) return $(spec.getMinimumLibraries $(systemname), $(processor)) else return $(EMPTY) getDefaultLibraries() = spec = $(TARGET_MANAGER.getSpecByHardware $(hardware)) if $(defined spec.getDefaultLibraries) return $(spec.getDefaultLibraries $(systemname), $(processor)) else return $(EMPTY) getHostIoLibraries() = spec = $(TARGET_MANAGER.getSpecByHardware $(hardware)) if $(defined spec.getHostIoLibraries) return $(spec.getHostIoLibraries $(systemname), $(processor)) else return $(EMPTY) getMacroFlags() = spec = $(TARGET_MANAGER.getSpecByHardware $(hardware)) if $(defined spec.getMacroFlags) return $(spec.getMacroFlags $(systemname), $(processor)) else return $(EMPTY) matches(varvalue, pattern) = regex = compileToRegex($(pattern)) match($(varvalue)) case $(pattern) return true default return false isHostIoEnable() = if $(equal $(buildtype),Release) HOST_IO_DEFAULT = false export else HOST_IO_DEFAULT = true export if $,(HOST_IO) return true else return false isFilterMatched() = return $(matched) HardwareTargetConfig. = extends $(TargetConfig) class HardwareTargetConfig new() = return $(this) getFullname() = return $(hardware).$(effort) getFullnameDetailed(altsystemname, altprocessor) = return $(hardware).$(altsystemname).$(altprocessor).$(effort) getTargetSubDirectory(isLibrary) = if $(isLibrary) return $(hardware)$(DIRSEP)$(getOptimizeType) else return $(hardware).$(effort)$(DIRSEP)$(buildtype) TargetManager. = class TargetManager new() = this.tmap = $(Map) return $(this) register(target) = #println($"register: "$(target.name)) tmap = $(tmap.add $(target.name), $(target)) export dump() = tmap.foreach(k, v) v.dump() return getProcessors(hardware) = spec = $(getSpecByHardware $(hardware)) return $(spec.processors) getHardwares() = return $(collectTargetValues $(fun v, $(v.hardware))) getPlatform(hardware) = spec = $(getSpecByHardware $(hardware)) return $(spec.platform) getSpecByHardware(hardware) = return $(tmap.find $(hardware)) collectTargetValues(getter) = values = tmap.foreach(k, v) values += $(apply $(getter), $(v)) export return $(set $(values)) enumerateTargets(filterstrings, ignoreFastSmall) = #println(filter: $(filterstrings)) regex = $(compileToRegex $(filterstrings)) regex_global = $(compileToRegex $(TARGET_FILTER)) hardwares = $(getHardwares) targets_list = export targets_list foreach(buildtype, $(TARGET_BUILDTYPES)) foreach(hardware, $(hardwares)) foreach(systemname, $(SYSTEM_LIST)) foreach(processor, $(getProcessors $(hardware))) matched_fast = false export matched_fast foreach(effort, fast small) fullname = $"$(hardware).$(systemname).$(processor).$(effort)" #println($(fullname)) if $(and $(isFilterMatch $(regex), $(fullname)), $(isFilterMatch $(regex_global), $(fullname))) #eprintln($"name: " $(fullname)-$(buildtype)) target = $(TargetConfig.new) target.platform = $(getPlatform $(hardware)) target.hardware = $(hardware) target.systemname = $(systemname) target.processor = $(processor) target.effort = $(effort) target.buildtype = $(buildtype) targets_list += $(target) if $(equal $(effort), fast) matched_fast = true elseif $(and $(not $(matched_fast)), $(ignoreFastSmall)) target.effort = fast target.matched = false targets_list += $(target) elseif $(and $(matched_fast), $(ignoreFastSmall)) target = $(TargetConfig.new) target.platform = $(getPlatform $(hardware)) target.hardware = $(hardware) target.systemname = $(systemname) target.processor = $(processor) target.effort = small target.buildtype = $(buildtype) target.matched = false targets_list += $(target) return $(targets_list) enumerateHardwareTargets(filterstrings) = regex = $(compileToRegex $(filterstrings)) regex_global = $(compileToRegex $(TARGET_FILTER)) hardwares = $(getHardwares) targets_list = foreach(buildtype, $(TARGET_BUILDTYPES)) foreach(hardware, $(hardwares)) foreach(effort, fast small) fullname = $"$(hardware).$(effort)" if $(and $(isFilterMatch $(regex), $(fullname)), $(isFilterMatch $(regex_global), $(fullname))) target = $(HardwareTargetConfig.new) target.platform = $(getPlatform $(hardware)) target.hardware = $(hardware) target.effort = $(effort) target.buildtype = $(buildtype) targets_list += $(target) export export export export return $(targets_list) isFilterMatch(regex, fullname) = match $(fullname) case $(regex) return true default return false Builder. = class Builder new(manager) = this.manager = $(manager) return $(this) getTargets(targetfilters) = SYSTEM_LIST = Kernel Process configs = $(manager.enumerateTargets $(targetfilters), false) return $(configs) getLibraryTargets(targetfilters) = SYSTEM_LIST = Kernel Process configs = $(manager.enumerateTargets $(targetfilters), true) return $(configs) getHardwareTargets(targetfilters) = configs = $(manager.enumerateHardwareTargets $(targetfilters)) return $(configs) getToolTargets(targetfilters) = TARGET_FILTER = WIN-IA32.* SYSTEM_LIST = Tool configs = $(manager.enumerateTargets *) return $(configs) go(targetfilters, verb) = result = configs = $(getTargets $(targetfilters)) foreach(TARGET, $(configs)) result += $,(verb)) export return $(result) dumpConfigList(configs) = foreach(config, $(configs)) config.dump() declare public.TARGET_FILTER if $(defined FILTER) TARGET_FILTER = $(FILTER) export elseif $(defined targets) eprintln($"Warning: `targets` の代わりに `FILTER` を使用して下さい。") TARGET_FILTER = $(targets) export else if $(defined-env HORIZON_TARGETS) TARGET_FILTER = $(getenv HORIZON_TARGETS) export elseif $(defined-env CTRSDK_TARGETS) TARGET_FILTER = $(getenv CTRSDK_TARGETS) export else TARGET_FILTER = $`(DEFAULT_FILTER) export export if $(grep q, $",", $(open-in-string $(TARGET_FILTER))) TARGET_FILTER=$(split $",", $(TARGET_FILTER)) export if $(defined BUILD) BUILDTYPES = $(BUILD) export else BUILDTYPES = Development export section RS=$'[ \t,]+' TARGET_BUILDTYPES = export TARGET_BUILDTYPES awk($(open-in-string $(lowercase $(BUILDTYPES)))) case $'(debug)|(dbg)' TARGET_BUILDTYPES += Debug case $'dev(elop)?' TARGET_BUILDTYPES += Development case $'rel(ease)?' TARGET_BUILDTYPES += Release case $'full' TARGET_BUILDTYPES += Debug Development Release TARGET_BUILDTYPES = $(set $(TARGET_BUILDTYPES)) declare public.TARGET_BUILDTYPES #eprintln($"TARGET:"$(string $(TARGET_BUILDTYPES))) declare public.TARGET_MANAGER TARGET_MANAGER = $(TargetManager.new) declare public.BUILDER BUILDER = $(Builder.new $(TARGET_MANAGER)) include $(ROOT_OMAKE)/targetdefs.CTR include $(ROOT_OMAKE)/targetdefs.WIN