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-11-01#$
15# $Rev: 30041 $
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    getFullnameWithSystemAndEffort(altsystemname, alteffort) =
118        return $(hardware).$(altsystemname).$(processor).$(alteffort)
119
120    getScannerName() =
121        return $(getFullname)-$(buildtype)$(if $(FEEDBACK_1ST_STAGE),.f)
122
123    getObjectDirectory() =
124        dir_suffix =
125        if $(FEEDBACK_1ST_STAGE)
126            dir_suffix = $(DIRSUFFIX_FEEDBACK)
127            export
128
129        return $(makeDirectory $(getObjectBaseDirectory)$(DIRSEP)$(getTargetSubDirectory false)$(dir_suffix))
130
131    getObjectDirectory() =
132        if $(FEEDBACK_1ST_STAGE)
133            return $(getObjectDirectoryFeedback true)
134
135        return $(getObjectDirectoryFeedback false)
136
137    getObjectDirectoryFeedback(isFeedback) =
138        dir_suffix =
139        if $(isFeedback)
140            dir_suffix = $(DIRSUFFIX_FEEDBACK)
141            export
142
143        return $(makeDirectory $(getObjectBaseDirectory)$(DIRSEP)$(getTargetSubDirectory false)$(dir_suffix))
144
145    getLibraryDirectory(isInstall) =
146        if $(and $(isInstall), $(defined INSTALL_ROOT))
147            return $(makeDirectory $(INSTALL_ROOT_LIBRARIES)$(DIRSEP)$(getTargetSubDirectory true))
148        else
149            return $(makeDirectory $(HORIZON_ROOT_LIBRARIES)$(DIRSEP)$(getTargetSubDirectory true))
150
151    isTestBuild() =
152        if $(not $(defined BUILD_TESTS))
153            return false
154        else
155            return $(BUILD_TESTS)
156
157    getOutputBaseDirectory() =
158        return $(getOutputBaseDirectory)
159
160    getImageDirectory(isInstall) =
161        module_dir = $(getModuleSubDirectory)$(DIRSEP)
162
163        if $(and $(isInstall), $(isSdkTool))
164            images_dir = $(ROOT_TARGETTOOLS)
165            return $(makeDirectory $(images_dir)$(DIRSEP)$(hardware)$(DIRSEP)$(buildtype))
166            export
167        elseif $(and $(isInstall), $(defined INSTALL_ROOT))
168            # �C���X�g�[���Ώۃf�B���N�g��
169            images_dir = $(INSTALL_ROOT_IMAGES)
170            export
171        else
172            base_dir = $(getOutputBaseDirectory)
173            if $(equal ., $(base_dir))
174                module_dir =
175                export
176            images_dir = $(base_dir)$(DIRSEP)$(SUBDIR_IMAGES)
177            export
178
179        # �e�X�g���r���h����ꍇ�̓p�X�̋K�����ς��
180        if $(isTestBuild)
181            module_dir = tests$(DIRSEP)$(gsub $(module_dir), $"\$(DIRSEP)tests?(\$(DIRSEP)|$$)", $(DIRSEP))
182            export
183
184        return $(makeDirectory $(images_dir)$(DIRSEP)$(module_dir)$(getTargetSubDirectory false))
185
186    isSdkTool() =
187        if $(and $(defined INSTALL_SDK_TOOL), $(INSTALL_SDK_TOOL), \
188             $(equal $(systemname), Process), \
189             $(equal $(processor), MPCore), \
190             $(equal $(effort), fast))
191            return true
192        else
193            return false
194
195
196    getOptimizeType() =
197        opttype =
198            switch($(buildtype))
199            case Debug
200                value noopt
201            case Development
202                value verbose
203            case Release
204                value release
205            default
206                value etc
207        return $(opttype)
208
209    getTargetSubDirectory(isLibrary) =
210        subdir = $(hardware).$(systemname).$(processor)
211        if $(isLibrary)
212            return $(subdir)$(DIRSEP)$(getOptimizeType)
213        else
214            return $(subdir).$(effort)$(DIRSEP)$(buildtype)
215
216    getLibraryName(name) =
217        return $(name).$(effort)$(EXT_LIB)
218
219    getStaticObjectName(name) =
220        return $(basename $(name)).$(effort)$(EXT_OBJ)
221
222    getLdscriptPath(name) =
223        return $(getBinaryPath $(name), $".autogen.ldscript")
224
225    getMapfilePath(name) =
226        return $(getBinaryPath $(name), $".map")
227
228    getLdscriptTemplatePath() =
229        base = $(ROOT_BUILD)$(DIRSEP)linker$(DIRSEP)$(platform).$(systemname).$(processor)
230        if $(and $(equal $(processor), ARM946ES) $(equal $(hardware), CTR-CTTS))
231            return $(file $(base).Legacy.ldscript.template)
232        else
233            return $(file $(base).ldscript.template)
234
235    getFeedBackPath() =
236        return $(file $(getImageDirectory false)$(DIRSEP)$(getOutputFilename feedback, .dat))
237
238    getBinaryPath(name, suffix) =
239        return $(file $(getImageDirectory false)$(DIRSEP)$(getOutputFilename $(name), $(suffix)))
240
241    getDefaultDescriptorPath() =
242        return $(file $(ROOT_RESOURCES)$(DIRSEP)specfiles$(DIRSEP)Application.desc)
243
244    getDefaultRomSpecFile() =
245        spec = $(TARGET_MANAGER.getSpecByHardware $(hardware))
246        if $(defined spec.getDefaultRomSpecFile)
247            return $(file $(ROOT_RESOURCES)$(DIRSEP)specfiles$(DIRSEP)$(spec.getDefaultRomSpecFile $(hardware)))
248        else
249            return $(file $(ROOT_RESOURCES)$(DIRSEP)specfiles$(DIRSEP)Application.rsf)
250
251    getDefaultBannerFile() =
252        return $(ROOT_RESOURCES)$(DIRSEP)banner$(DIRSEP)Default.bnr
253
254    getDefaultIconFile() =
255        return $(ROOT_RESOURCES)$(DIRSEP)banner$(DIRSEP)Default.icn
256
257    getOutputFilename(name, suffix) =
258        return $(name)$(suffix)
259
260    getSuitableKernelFilename() =
261        return $(HORIZON_ROOT_IMAGES)$(DIRSEP)kernel$(DIRSEP)$(getFullnameWithSystem Kernel)$(DIRSEP)$(buildtype)$(DIRSEP)kernel.axf
262
263    getSystemCCFlags() =
264        spec = $(TARGET_MANAGER.getSpecByHardware $(hardware))
265        if $(defined spec.getSystemFlags)
266            return $(spec.getSystemFlags $(systemname))
267        else
268            return $(EMPTY)
269
270    getMinimumLibraries() =
271        spec = $(TARGET_MANAGER.getSpecByHardware $(hardware))
272        if $(defined spec.getMinimumLibraries)
273            return $(spec.getMinimumLibraries $(systemname), $(processor))
274        else
275            return $(EMPTY)
276
277    getDefaultLibraries() =
278        spec = $(TARGET_MANAGER.getSpecByHardware $(hardware))
279        if $(defined spec.getDefaultLibraries)
280            return $(spec.getDefaultLibraries $(systemname), $(processor))
281        else
282            return $(EMPTY)
283
284    getHostIoLibraries() =
285        spec = $(TARGET_MANAGER.getSpecByHardware $(hardware))
286        if $(defined spec.getHostIoLibraries)
287            return $(spec.getHostIoLibraries $(systemname), $(processor))
288        else
289            return $(EMPTY)
290
291    getMacroFlags() =
292        spec = $(TARGET_MANAGER.getSpecByHardware $(hardware))
293        if $(defined spec.getMacroFlags)
294            return $(spec.getMacroFlags $(systemname), $(processor))
295        else
296            return $(EMPTY)
297
298    matches(varvalue, pattern) =
299        regex = compileToRegex($(pattern))
300        match($(varvalue))
301        case $(pattern)
302            return true
303        default
304            return false
305
306    isHostIoEnable() =
307        if $(equal $(buildtype),Release)
308            HOST_IO_DEFAULT         = false
309            export
310        else
311            HOST_IO_DEFAULT         = true
312            export
313
314        if $,(HOST_IO)
315            return true
316        else
317            return false
318
319    isFilterMatched() =
320        return $(matched)
321
322HardwareTargetConfig. =
323    extends $(TargetConfig)
324    class HardwareTargetConfig
325
326    new() =
327        return $(this)
328
329    getFullname() =
330        return $(hardware).$(effort)
331
332    getFullnameDetailed(altsystemname, altprocessor) =
333        return $(hardware).$(altsystemname).$(altprocessor).$(effort)
334
335    getTargetSubDirectory(isLibrary) =
336        if $(isLibrary)
337            return $(hardware)$(DIRSEP)$(getOptimizeType)
338        else
339            return $(hardware).$(effort)$(DIRSEP)$(buildtype)
340
341TargetManager. =
342    class TargetManager
343
344    new() =
345        this.tmap = $(Map)
346        return $(this)
347
348    register(target) =
349        #println($"register: "$(target.name))
350        tmap = $(tmap.add $(target.name), $(target))
351        export
352
353    dump() =
354        tmap.foreach(k, v)
355            v.dump()
356        return
357
358    getProcessors(hardware) =
359        spec = $(getSpecByHardware $(hardware))
360        return $(spec.processors)
361
362    getHardwares() =
363        return $(collectTargetValues $(fun v, $(v.hardware)))
364
365    getPlatform(hardware) =
366        spec = $(getSpecByHardware $(hardware))
367        return $(spec.platform)
368
369    getSpecByHardware(hardware) =
370        return $(tmap.find $(hardware))
371
372    collectTargetValues(getter) =
373        values =
374        tmap.foreach(k, v)
375            values += $(apply $(getter), $(v))
376            export
377        return $(set $(values))
378
379    enumerateTargets(filterstrings, ignoreFastSmall) =
380        #println(filter: $(filterstrings))
381        regex = $(compileToRegex $(filterstrings))
382        regex_global = $(compileToRegex $(TARGET_FILTER))
383        hardwares = $(getHardwares)
384        targets_list =
385        export targets_list
386        foreach(buildtype, $(TARGET_BUILDTYPES))
387            foreach(hardware, $(hardwares))
388                foreach(systemname, $(SYSTEM_LIST))
389                    foreach(processor, $(getProcessors $(hardware)))
390                        matched_fast  = false
391                        export matched_fast
392                        foreach(effort, fast small)
393                            fullname = $"$(hardware).$(systemname).$(processor).$(effort)"
394                            #println($(fullname))
395                            if $(and $(isFilterMatch $(regex), $(fullname)), $(isFilterMatch $(regex_global), $(fullname)))
396                                #eprintln($"name: " $(fullname)-$(buildtype))
397
398                                target = $(TargetConfig.new)
399                                target.platform    = $(getPlatform $(hardware))
400                                target.hardware    = $(hardware)
401                                target.systemname  = $(systemname)
402                                target.processor   = $(processor)
403                                target.effort      = $(effort)
404                                target.buildtype   = $(buildtype)
405
406                                targets_list += $(target)
407
408                                if $(equal $(effort), fast)
409                                    matched_fast   = true
410                                elseif $(and $(not $(matched_fast)), $(ignoreFastSmall))
411                                    target.effort  = fast
412                                    target.matched = false
413
414                                    targets_list += $(target)
415
416                            elseif $(and $(matched_fast), $(ignoreFastSmall))
417                                target = $(TargetConfig.new)
418                                target.platform    = $(getPlatform $(hardware))
419                                target.hardware    = $(hardware)
420                                target.systemname  = $(systemname)
421                                target.processor   = $(processor)
422                                target.effort      = small
423                                target.buildtype   = $(buildtype)
424                                target.matched     = false
425
426                                targets_list += $(target)
427
428
429        return $(targets_list)
430
431    enumerateHardwareTargets(filterstrings) =
432        regex = $(compileToRegex $(filterstrings))
433        regex_global = $(compileToRegex $(TARGET_FILTER))
434        hardwares = $(getHardwares)
435        targets_list =
436        foreach(buildtype, $(TARGET_BUILDTYPES))
437            foreach(hardware, $(hardwares))
438                foreach(effort, fast small)
439                    fullname = $"$(hardware).$(effort)"
440                    if $(and $(isFilterMatch $(regex), $(fullname)), $(isFilterMatch $(regex_global), $(fullname)))
441                        target = $(HardwareTargetConfig.new)
442                        target.platform    = $(getPlatform $(hardware))
443                        target.hardware    = $(hardware)
444                        target.effort      = $(effort)
445                        target.buildtype   = $(buildtype)
446
447                        targets_list += $(target)
448                        export
449                    export
450                export
451            export
452        return $(targets_list)
453
454    isFilterMatch(regex, fullname) =
455        match $(fullname)
456        case $(regex)
457            return true
458        default
459            return false
460
461Builder. =
462    class Builder
463
464    new(manager) =
465        this.manager = $(manager)
466        return $(this)
467
468    getTargets(targetfilters) =
469        SYSTEM_LIST = Kernel Process
470        configs = $(manager.enumerateTargets $(targetfilters), false)
471        return $(configs)
472
473    getLibraryTargets(targetfilters) =
474        SYSTEM_LIST = Kernel Process
475        configs = $(manager.enumerateTargets $(targetfilters), true)
476        return $(configs)
477
478    getHardwareTargets(targetfilters) =
479        configs = $(manager.enumerateHardwareTargets $(targetfilters))
480        return $(configs)
481
482    getToolTargets(targetfilters) =
483        TARGET_FILTER = WIN-IA32.*
484        SYSTEM_LIST   = Tool
485        configs = $(manager.enumerateTargets *)
486        return $(configs)
487
488    go(targetfilters, verb) =
489        result =
490        configs = $(getTargets $(targetfilters))
491        foreach(TARGET, $(configs))
492            result += $,(verb))
493            export
494        return $(result)
495
496    dumpConfigList(configs) =
497        foreach(config, $(configs))
498            config.dump()
499
500declare public.TARGET_FILTER
501if $(defined FILTER)
502    TARGET_FILTER = $(FILTER)
503    export
504elseif $(defined targets)
505    eprintln($"Warning: `targets` �̑���� `FILTER` ���g�p���ĉ������B")
506    TARGET_FILTER = $(targets)
507    export
508else
509    if $(defined-env HORIZON_TARGETS)
510        TARGET_FILTER = $(getenv HORIZON_TARGETS)
511        export
512    elseif $(defined-env CTRSDK_TARGETS)
513        TARGET_FILTER = $(getenv CTRSDK_TARGETS)
514        export
515    else
516        TARGET_FILTER = $`(DEFAULT_FILTER)
517        export
518    export
519
520if $(grep q, $",", $(open-in-string $(TARGET_FILTER)))
521    TARGET_FILTER=$(split $",", $(TARGET_FILTER))
522    export
523
524
525if $(defined BUILD)
526    BUILDTYPES = $(BUILD)
527    export
528else
529    BUILDTYPES = Development
530    export
531
532section
533    RS=$'[ \t,]+'
534    TARGET_BUILDTYPES =
535    export TARGET_BUILDTYPES
536    awk($(open-in-string $(lowercase $(BUILDTYPES))))
537    case $'(debug)|(dbg)'
538        TARGET_BUILDTYPES += Debug
539    case $'dev(elop)?'
540        TARGET_BUILDTYPES += Development
541    case $'rel(ease)?'
542        TARGET_BUILDTYPES += Release
543    case $'full'
544        TARGET_BUILDTYPES += Debug Development Release
545
546    TARGET_BUILDTYPES = $(set $(TARGET_BUILDTYPES))
547
548declare public.TARGET_BUILDTYPES
549#eprintln($"TARGET:"$(string $(TARGET_BUILDTYPES)))
550
551declare public.TARGET_MANAGER
552TARGET_MANAGER = $(TargetManager.new)
553
554declare public.BUILDER
555BUILDER = $(Builder.new $(TARGET_MANAGER))
556
557include $(ROOT_OMAKE)/targetdefs.CTR
558include $(ROOT_OMAKE)/targetdefs.WIN
559
560