1#!/usr/bin/env omake
2#----------------------------------------------------------------------------
3# Project: Horizon
4# File:    targetdefs.om
5#
6# Copyright 2007-2009 Nintendo.  All rights reserved.
7#
8# These coded instructions, statements, and computer programs contain
9# proprietary information of Nintendo of America Inc. and/or Nintendo
10# Company Ltd., and are protected by Federal copyright law.  They may
11# not be disclosed to third parties or copied or duplicated in any form,
12# in whole or in part, without the prior written consent of Nintendo.
13#
14# $Date:: 2010-09-20#$
15# $Rev: 26320 $
16# $Author: sasaki_yu $
17#----------------------------------------------------------------------------
18
19public.DEFAULT_FILTER = CTR-TS*MPCore*
20
21# �^�[�Q�b�g�Ɉˑ����Ȃ��f�B���N�g���擾�֐�
22getOutputBaseDirectory() =
23    abs_cwd = $(absname $(CWD))
24    #println(abs_cwd: $(abs_cwd))
25    # �v���W�F�N�g�̃��[�g��HORIZON_ROOT�H�iSDK �̃r���h�H�j
26    if $(equal $(AROOT), $(HORIZON_ROOT))
27        return $(dir $(HORIZON_ROOT))
28
29    # �J�����g�f�B���N�g���� HORIZON_ROOT �̒��H
30    subdir = $(removeprefix $(HORIZON_ROOT), $(abs_cwd))
31    if $(not $(equal $(subdir), $(abs_cwd)))
32        #println("UNDER HORIZON: "$(abs_cwd))
33        return $(dir $(HORIZON_ROOT))
34
35    # �v���W�F�N�g�̃��[�g�ɂ� sources �f�B���N�g��������H
36    subdir = $(removeprefix $(AROOT)\\sources\\, $(abs_cwd))
37    if $(not $(equal $(subdir), $(abs_cwd)))
38        #println("SOURCES EXIST: "$(abs_cwd))
39        return $(ROOT)
40
41    #println(subdir: $(subdir))
42    # �J�����g�f�B���N�g���ɏo��
43    return $(dir .)
44
45# �\�[�X�̃p�X�����琶�������i�[����T�u�f�B���N�g��������
46getModuleSubDirectory() =
47    if $(defined SOURCES_BASE_ROOT)
48        basedir = $(SOURCES_BASE_ROOT)
49        export
50    else
51        basedir = $(CWD)
52        export
53    #println(basedir: $(basedir))
54    if $(equal $(ROOT), $(basedir))
55        return .
56
57    basedir = $(absname $(basedir))
58    subpath = $(removeprefix  $(AROOT)$(DIRSEP), $(basedir))
59    subpath = $(removeprefix sources$(DIRSEP), $(subpath))
60    return $(subpath)
61
62getObjectBaseDirectory() =
63    base_dir = $(getOutputBaseDirectory)
64    if $(equal ., $(base_dir))
65        module_dir =
66        export
67    else
68        module_dir = $(getModuleSubDirectory)$(DIRSEP)
69        export
70    return $(base_dir)$(DIRSEP)$(SUBDIR_OBJECTS)$(DIRSEP)$(module_dir)
71
72TargetSpec. =
73    class TargetSpec
74
75    processor   =
76    platform    =
77    hardware    =
78
79    new(name) =
80        this.name = $(name)
81        return $(this)
82
83    dump() =
84        println($"name: "$(name))
85        println($"  platform:   "$(platform))
86        println($"  hardware:   "$(hardware))
87        println($"  processors: "$(processors))
88        println($' ')
89
90    getMacroFlags(systemname, processor) =
91        return $(EMPTY)
92
93TargetConfig. =
94    class TargetConfig
95
96    hardware    =
97    systemname  =
98    processor   =
99    effort      =
100    buildtype   =
101    matched     = true
102
103    new() =
104        return $(this)
105
106    dump() =
107        println($"hardware: "$(hardware))
108        println($"  processor: "$(processor))
109        println($' ')
110
111    getFullname() =
112        return $(hardware).$(systemname).$(processor).$(effort)
113
114    getFullnameWithSystem(altsystemname) =
115        return $(hardware).$(altsystemname).$(processor).$(effort)
116
117    getScannerName() =
118        return $(getFullname)-$(buildtype)$(if $(FEEDBACK_1ST_STAGE),.f)
119
120    getObjectDirectory() =
121        dir_suffix =
122        if $(FEEDBACK_1ST_STAGE)
123            dir_suffix = $(DIRSUFFIX_FEEDBACK)
124            export
125
126        return $(makeDirectory $(getObjectBaseDirectory)$(DIRSEP)$(getTargetSubDirectory false)$(dir_suffix))
127
128    getObjectDirectory() =
129        if $(FEEDBACK_1ST_STAGE)
130            return $(getObjectDirectoryFeedback true)
131
132        return $(getObjectDirectoryFeedback false)
133
134    getObjectDirectoryFeedback(isFeedback) =
135        dir_suffix =
136        if $(isFeedback)
137            dir_suffix = $(DIRSUFFIX_FEEDBACK)
138            export
139
140        return $(makeDirectory $(getObjectBaseDirectory)$(DIRSEP)$(getTargetSubDirectory false)$(dir_suffix))
141
142    getLibraryDirectory(isInstall) =
143        if $(and $(isInstall), $(defined INSTALL_ROOT))
144            return $(makeDirectory $(INSTALL_ROOT_LIBRARIES)$(DIRSEP)$(getTargetSubDirectory true))
145        else
146            return $(makeDirectory $(HORIZON_ROOT_LIBRARIES)$(DIRSEP)$(getTargetSubDirectory true))
147
148    isTestBuild() =
149        if $(not $(defined BUILD_TESTS))
150            return false
151        else
152            return $(BUILD_TESTS)
153
154    getOutputBaseDirectory() =
155        return $(getOutputBaseDirectory)
156
157    getImageDirectory(isInstall) =
158        module_dir = $(getModuleSubDirectory)$(DIRSEP)
159
160        if $(and $(isInstall), $(isSdkTool))
161            images_dir = $(ROOT_TARGETTOOLS)
162            return $(makeDirectory $(images_dir)$(DIRSEP)$(hardware)$(DIRSEP)$(buildtype))
163            export
164        elseif $(and $(isInstall), $(defined INSTALL_ROOT))
165            # �C���X�g�[���Ώۃf�B���N�g��
166            images_dir = $(INSTALL_ROOT_IMAGES)
167            export
168        else
169            base_dir = $(getOutputBaseDirectory)
170            if $(equal ., $(base_dir))
171                module_dir =
172                export
173            images_dir = $(base_dir)$(DIRSEP)$(SUBDIR_IMAGES)
174            export
175
176        # �e�X�g���r���h����ꍇ�̓p�X�̋K�����ς��
177        if $(isTestBuild)
178            module_dir = tests$(DIRSEP)$(gsub $(module_dir), $"\$(DIRSEP)tests?(\$(DIRSEP)|$$)", $(DIRSEP))
179            export
180
181        return $(makeDirectory $(images_dir)$(DIRSEP)$(module_dir)$(getTargetSubDirectory false))
182
183    isSdkTool() =
184        if $(and $(defined INSTALL_SDK_TOOL), $(INSTALL_SDK_TOOL), \
185             $(equal $(systemname), Process), \
186             $(equal $(processor), MPCore), \
187             $(equal $(effort), fast))
188            return true
189        else
190            return false
191
192
193    getOptimizeType() =
194        opttype =
195            switch($(buildtype))
196            case Debug
197                value noopt
198            case Development
199                value verbose
200            case Release
201                value release
202            default
203                value etc
204        return $(opttype)
205
206    getTargetSubDirectory(isLibrary) =
207        subdir = $(hardware).$(systemname).$(processor)
208        if $(isLibrary)
209            return $(subdir)$(DIRSEP)$(getOptimizeType)
210        else
211            return $(subdir).$(effort)$(DIRSEP)$(buildtype)
212
213    getLibraryName(name) =
214        return $(name).$(effort)$(EXT_LIB)
215
216    getStaticObjectName(name) =
217        return $(basename $(name)).$(effort)$(EXT_OBJ)
218
219    getLdscriptPath(name) =
220        return $(getBinaryPath $(name), $".autogen.ldscript")
221
222    getMapfilePath(name) =
223        return $(getBinaryPath $(name), $".map")
224
225    getLdscriptTemplatePath() =
226        base = $(ROOT_BUILD)$(DIRSEP)linker$(DIRSEP)$(platform).$(systemname).$(processor)
227        if $(and $(equal $(processor), ARM946ES) $(equal $(hardware), CTR-CTTS))
228            return $(file $(base).Legacy.ldscript.template)
229        else
230            return $(file $(base).ldscript.template)
231
232    getFeedBackPath() =
233        return $(file $(getImageDirectory false)$(DIRSEP)$(getOutputFilename feedback, .dat))
234
235    getBinaryPath(name, suffix) =
236        return $(file $(getImageDirectory false)$(DIRSEP)$(getOutputFilename $(name), $(suffix)))
237
238    getDefaultDescriptorPath() =
239        return $(file $(ROOT_RESOURCES)$(DIRSEP)specfiles$(DIRSEP)Application.desc)
240
241    getDefaultRomSpecFile() =
242        spec = $(TARGET_MANAGER.getSpecByHardware $(hardware))
243        if $(defined spec.getDefaultRomSpecFile)
244            return $(file $(ROOT_RESOURCES)$(DIRSEP)specfiles$(DIRSEP)$(spec.getDefaultRomSpecFile $(hardware)))
245        else
246            return $(file $(ROOT_RESOURCES)$(DIRSEP)specfiles$(DIRSEP)Application.rsf)
247
248    getDefaultBannerFile() =
249        return $(ROOT_RESOURCES)$(DIRSEP)banner$(DIRSEP)Default.bnr
250
251    getDefaultIconFile() =
252        return $(ROOT_RESOURCES)$(DIRSEP)banner$(DIRSEP)Default.icn
253
254    getOutputFilename(name, suffix) =
255        return $(name)$(suffix)
256
257    getSuitableKernelFilename() =
258        return $(HORIZON_ROOT_IMAGES)$(DIRSEP)kernel$(DIRSEP)$(getFullnameWithSystem Kernel)$(DIRSEP)$(buildtype)$(DIRSEP)kernel.axf
259
260    getSystemCCFlags() =
261        spec = $(TARGET_MANAGER.getSpecByHardware $(hardware))
262        if $(defined spec.getSystemFlags)
263            return $(spec.getSystemFlags $(systemname))
264        else
265            return $(EMPTY)
266
267    getMinimumLibraries() =
268        spec = $(TARGET_MANAGER.getSpecByHardware $(hardware))
269        if $(defined spec.getMinimumLibraries)
270            return $(spec.getMinimumLibraries $(systemname), $(processor))
271        else
272            return $(EMPTY)
273
274    getDefaultLibraries() =
275        spec = $(TARGET_MANAGER.getSpecByHardware $(hardware))
276        if $(defined spec.getDefaultLibraries)
277            return $(spec.getDefaultLibraries $(systemname), $(processor))
278        else
279            return $(EMPTY)
280
281    getHostIoLibraries() =
282        spec = $(TARGET_MANAGER.getSpecByHardware $(hardware))
283        if $(defined spec.getHostIoLibraries)
284            return $(spec.getHostIoLibraries $(systemname), $(processor))
285        else
286            return $(EMPTY)
287
288    getMacroFlags() =
289        spec = $(TARGET_MANAGER.getSpecByHardware $(hardware))
290        if $(defined spec.getMacroFlags)
291            return $(spec.getMacroFlags $(systemname), $(processor))
292        else
293            return $(EMPTY)
294
295    matches(varvalue, pattern) =
296        regex = compileToRegex($(pattern))
297        match($(varvalue))
298        case $(pattern)
299            return true
300        default
301            return false
302
303    isHostIoEnable() =
304        if $(equal $(buildtype),Release)
305            HOST_IO_DEFAULT         = false
306            export
307        else
308            HOST_IO_DEFAULT         = true
309            export
310
311        if $,(HOST_IO)
312            return true
313        else
314            return false
315
316    isFilterMatched() =
317        return $(matched)
318
319HardwareTargetConfig. =
320    extends $(TargetConfig)
321    class HardwareTargetConfig
322
323    new() =
324        return $(this)
325
326    getFullname() =
327        return $(hardware).$(effort)
328
329    getFullnameDetailed(altsystemname, altprocessor) =
330        return $(hardware).$(altsystemname).$(altprocessor).$(effort)
331
332    getTargetSubDirectory(isLibrary) =
333        if $(isLibrary)
334            return $(hardware)$(DIRSEP)$(getOptimizeType)
335        else
336            return $(hardware).$(effort)$(DIRSEP)$(buildtype)
337
338TargetManager. =
339    class TargetManager
340
341    new() =
342        this.tmap = $(Map)
343        return $(this)
344
345    register(target) =
346        #println($"register: "$(target.name))
347        tmap = $(tmap.add $(target.name), $(target))
348        export
349
350    dump() =
351        tmap.foreach(k, v)
352            v.dump()
353        return
354
355    getProcessors(hardware) =
356        spec = $(getSpecByHardware $(hardware))
357        return $(spec.processors)
358
359    getHardwares() =
360        return $(collectTargetValues $(fun v, $(v.hardware)))
361
362    getPlatform(hardware) =
363        spec = $(getSpecByHardware $(hardware))
364        return $(spec.platform)
365
366    getSpecByHardware(hardware) =
367        return $(tmap.find $(hardware))
368
369    collectTargetValues(getter) =
370        values =
371        tmap.foreach(k, v)
372            values += $(apply $(getter), $(v))
373            export
374        return $(set $(values))
375
376    enumerateTargets(filterstrings, ignoreFastSmall) =
377        #println(filter: $(filterstrings))
378        regex = $(compileToRegex $(filterstrings))
379        regex_global = $(compileToRegex $(TARGET_FILTER))
380        hardwares = $(getHardwares)
381        targets_list =
382        export targets_list
383        foreach(buildtype, $(TARGET_BUILDTYPES))
384            foreach(hardware, $(hardwares))
385                foreach(systemname, $(SYSTEM_LIST))
386                    foreach(processor, $(getProcessors $(hardware)))
387                        matched_fast  = false
388                        export matched_fast
389                        foreach(effort, fast small)
390                            fullname = $"$(hardware).$(systemname).$(processor).$(effort)"
391                            #println($(fullname))
392                            if $(and $(isFilterMatch $(regex), $(fullname)), $(isFilterMatch $(regex_global), $(fullname)))
393                                #eprintln($"name: " $(fullname)-$(buildtype))
394
395                                target = $(TargetConfig.new)
396                                target.platform    = $(getPlatform $(hardware))
397                                target.hardware    = $(hardware)
398                                target.systemname  = $(systemname)
399                                target.processor   = $(processor)
400                                target.effort      = $(effort)
401                                target.buildtype   = $(buildtype)
402
403                                targets_list += $(target)
404
405                                if $(equal $(effort), fast)
406                                    matched_fast   = true
407                                elseif $(and $(not $(matched_fast)), $(ignoreFastSmall))
408                                    target.effort  = fast
409                                    target.matched = false
410
411                                    targets_list += $(target)
412
413                            elseif $(and $(matched_fast), $(ignoreFastSmall))
414                                target = $(TargetConfig.new)
415                                target.platform    = $(getPlatform $(hardware))
416                                target.hardware    = $(hardware)
417                                target.systemname  = $(systemname)
418                                target.processor   = $(processor)
419                                target.effort      = small
420                                target.buildtype   = $(buildtype)
421                                target.matched     = false
422
423                                targets_list += $(target)
424
425
426        return $(targets_list)
427
428    enumerateHardwareTargets(filterstrings) =
429        regex = $(compileToRegex $(filterstrings))
430        regex_global = $(compileToRegex $(TARGET_FILTER))
431        hardwares = $(getHardwares)
432        targets_list =
433        foreach(buildtype, $(TARGET_BUILDTYPES))
434            foreach(hardware, $(hardwares))
435                foreach(effort, fast small)
436                    fullname = $"$(hardware).$(effort)"
437                    if $(and $(isFilterMatch $(regex), $(fullname)), $(isFilterMatch $(regex_global), $(fullname)))
438                        target = $(HardwareTargetConfig.new)
439                        target.platform    = $(getPlatform $(hardware))
440                        target.hardware    = $(hardware)
441                        target.effort      = $(effort)
442                        target.buildtype   = $(buildtype)
443
444                        targets_list += $(target)
445                        export
446                    export
447                export
448            export
449        return $(targets_list)
450
451    isFilterMatch(regex, fullname) =
452        match $(fullname)
453        case $(regex)
454            return true
455        default
456            return false
457
458Builder. =
459    class Builder
460
461    new(manager) =
462        this.manager = $(manager)
463        return $(this)
464
465    getTargets(targetfilters) =
466        SYSTEM_LIST = Kernel Process
467        configs = $(manager.enumerateTargets $(targetfilters), false)
468        return $(configs)
469
470    getLibraryTargets(targetfilters) =
471        SYSTEM_LIST = Kernel Process
472        configs = $(manager.enumerateTargets $(targetfilters), true)
473        return $(configs)
474
475    getHardwareTargets(targetfilters) =
476        configs = $(manager.enumerateHardwareTargets $(targetfilters))
477        return $(configs)
478
479    getToolTargets(targetfilters) =
480        TARGET_FILTER = WIN-IA32.*
481        SYSTEM_LIST   = Tool
482        configs = $(manager.enumerateTargets *)
483        return $(configs)
484
485    go(targetfilters, verb) =
486        result =
487        configs = $(getTargets $(targetfilters))
488        foreach(TARGET, $(configs))
489            result += $,(verb))
490            export
491        return $(result)
492
493    dumpConfigList(configs) =
494        foreach(config, $(configs))
495            config.dump()
496
497declare public.TARGET_FILTER
498if $(defined FILTER)
499    TARGET_FILTER = $(FILTER)
500    export
501elseif $(defined targets)
502    eprintln($"Warning: `targets` �̑���� `FILTER` ���g�p���ĉ������B")
503    TARGET_FILTER = $(targets)
504    export
505else
506    if $(defined-env HORIZON_TARGETS)
507        TARGET_FILTER = $(getenv HORIZON_TARGETS)
508        export
509    elseif $(defined-env CTRSDK_TARGETS)
510        TARGET_FILTER = $(getenv CTRSDK_TARGETS)
511        export
512    else
513        TARGET_FILTER = $`(DEFAULT_FILTER)
514        export
515    export
516
517if $(grep q, $",", $(open-in-string $(TARGET_FILTER)))
518    TARGET_FILTER=$(split $",", $(TARGET_FILTER))
519    export
520
521
522if $(defined BUILD)
523    BUILDTYPES = $(BUILD)
524    export
525else
526    BUILDTYPES = Development
527    export
528
529section
530    RS=$'[ \t,]+'
531    TARGET_BUILDTYPES =
532    export TARGET_BUILDTYPES
533    awk($(open-in-string $(lowercase $(BUILDTYPES))))
534    case $'(debug)|(dbg)'
535        TARGET_BUILDTYPES += Debug
536    case $'dev(elop)?'
537        TARGET_BUILDTYPES += Development
538    case $'rel(ease)?'
539        TARGET_BUILDTYPES += Release
540    case $'full'
541        TARGET_BUILDTYPES += Debug Development Release
542
543    TARGET_BUILDTYPES = $(set $(TARGET_BUILDTYPES))
544
545declare public.TARGET_BUILDTYPES
546#eprintln($"TARGET:"$(string $(TARGET_BUILDTYPES)))
547
548declare public.TARGET_MANAGER
549TARGET_MANAGER = $(TargetManager.new)
550
551declare public.BUILDER
552BUILDER = $(Builder.new $(TARGET_MANAGER))
553
554include $(ROOT_OMAKE)/targetdefs.CTR
555include $(ROOT_OMAKE)/targetdefs.WIN
556
557