1#!/usr/bin/env omake
2#----------------------------------------------------------------------------
3# Project: Horizon
4# File:    commondefs.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:: 2011-01-21#$
15# $Rev: 33687 $
16# $Author: komatsu_satoshi $
17#----------------------------------------------------------------------------
18
19# OMake �̃f�t�H���g���C�u��������x�����ǂݍ���
20open build/Common
21
22SCANNER_MODE=disabled
23
24# �f�B���N�g�����[�g �‹��ϐ��̎擾�i��`����Ă��Ȃ��Ă��r���h���͉̂”\�j
25public.HORIZON_ROOT =
26if $(defined-env HORIZON_ROOT)
27    HORIZON_ROOT = $(absname $"$(getenv HORIZON_ROOT)")
28    export
29
30if $(defined-env CTRSDK_ROOT)
31    CTRSDK_ROOT = $(absname $"$(getenv CTRSDK_ROOT)")
32    if $(and $(defined-env HORIZON_ROOT), $(not $(equal $(HORIZON_ROOT), $(CTRSDK_ROOT))))
33        eprintln(HORIZON_ROOT �� CTRSDK_ROOT ����v���܂���B�����pX��ݒ肷�邩�A�ǂ��炩����������`���ĉ������B)
34        exit(1)
35    HORIZON_ROOT = $(CTRSDK_ROOT)
36    export
37
38if $(defined-env CTRSDK_TARGETS)
39    CTRSDK_TARGETS = $(absname $"$(getenv CTRSDK_TARGETS)")
40    if $(defined-env HORIZON_TARGETS)
41        eprintln(HORIZON_TARGETS �� CTRSDK_TARGETS �͓����Ɏgp�ł��܂���̂ŁA�ǂ��炩����������`���ĉ������B)
42        exit(1)
43    HORIZON_TARGETS = $(CTRSDK_TARGETS)
44    export
45
46if $(not $(HORIZON_ROOT))
47    eprintln($"$$CTRSDK_ROOT ����`����Ă��܂���")
48    HORIZON_ROOT = $(absname $(ROOT))
49    export
50
51public.HORIZON_ADDINS_ROOT =
52if $(defined-env HORIZON_ADDINS_ROOT)
53    HORIZON_ADDINS_ROOT = $(absname $"$(getenv HORIZON_ADDINS_ROOT)")
54    export
55else
56    HORIZON_ADDINS_ROOT = $(absname $(HORIZON_ROOT)/../CTR/Addins)
57    export
58    if $(not $(file-exists $(HORIZON_ADDINS_ROOT)))
59        HORIZON_ADDINS_ROOT =
60        export
61
62# �f�B���N�g�����`
63public.SUBDIR_IMAGES    = images
64public.SUBDIR_SD_IMAGES = sdimages
65public.SUBDIR_OBJECTS   = objects
66public.SUBDIR_LIBRARIES = libraries
67public.SUBDIR_INCLUDE   = include
68public.DIRSUFFIX_FEEDBACK = .__feedback__
69public.SCANNER_PREFIX   = scan
70
71public.AROOT            = $(absname $(ROOT))
72
73public.ROOT_IMAGES      = $(absname $(ROOT)$(DIRSEP)$(SUBDIR_IMAGES))
74public.ROOT_OBJECTS     = $(absname $(ROOT)$(DIRSEP)$(SUBDIR_OBJECTS))
75public.ROOT_LIBRARIES   = $(absname $(HORIZON_ROOT)$(DIRSEP)$(SUBDIR_LIBRARIES))
76public.ROOT_BUILD       = $(absname $(HORIZON_ROOT)$(DIRSEP)build)
77public.ROOT_OMAKE       = $(absname $(ROOT_BUILD)$(DIRSEP)omake)
78public.ROOT_INCLUDE     = $(absname $(ROOT)$(DIRSEP)$(SUBDIR_INCLUDE))
79public.ROOT_SOURCES     = $(absname $(ROOT)$(DIRSEP)sources)
80public.ROOT_TOOLS       = $(absname $(HORIZON_ROOT)$(DIRSEP)tools)
81public.ROOT_TARGETTOOLS = $(absname $(HORIZON_ROOT)$(DIRSEP)tools$(DIRSEP)TargetTools)
82public.ROOT_COMMANDS    = $(absname $(ROOT_TOOLS)$(DIRSEP)CommandLineTools)
83public.ROOT_RESOURCES   = $(absname $(HORIZON_ROOT)$(DIRSEP)resources)
84
85public.HORIZON_ROOT_INCLUDE     = $(HORIZON_ROOT)$(DIRSEP)$(SUBDIR_INCLUDE)
86public.HORIZON_ROOT_IMAGES      = $(HORIZON_ROOT)$(DIRSEP)$(SUBDIR_IMAGES)
87public.HORIZON_ROOT_LIBRARIES   = $(HORIZON_ROOT)$(DIRSEP)$(SUBDIR_LIBRARIES)
88
89# �C���X�g�[�����ݒ� (���̏��ԂŗD��)
90# 1. �‹��ϐ� HORIZON_INSTALL_ROOT
91# 2. �ϐ� INSTALL_ROOT
92# 3. �ϐ� HORIZON_ROOT
93if $(defined-env HORIZON_INSTALL_ROOT)
94    HORIZON_INSTALL_ROOT = $(dir $"$(getenv HORIZON_INSTALL_ROOT)")
95
96declare public.INSTALL_ROOT
97if $(defined HORIZON_INSTALL_ROOT)
98    INSTALL_ROOT    = $(dir $(HORIZON_INSTALL_ROOT))
99    export
100else
101    if $(defined INSTALL_ROOT)
102        INSTALL_ROOT    = $(dir $(INSTALL_ROOT))
103        export
104    elseif $(equal $(AROOT), $(HORIZON_ROOT))
105        INSTALL_ROOT    = $(ROOT)
106        export
107    export
108
109if $(not $(defined INSTALL_IMAGES_DIR))
110    INSTALL_IMAGES_DIR = $(SUBDIR_IMAGES)
111    export
112
113if $(defined INSTALL_ROOT)
114    INSTALL_ROOT_IMAGES     = $(dir $(INSTALL_ROOT)$(DIRSEP)$(INSTALL_IMAGES_DIR))
115    INSTALL_ROOT_LIBRARIES  = $(dir $(INSTALL_ROOT)$(DIRSEP)$(SUBDIR_LIBRARIES))
116    export
117
118public.HORIZON_PRIVATE_RULES = $(EMPTY)
119
120# Horizon �p���C�u����
121include $(ROOT_OMAKE)/utildefs
122include $(ROOT_OMAKE)/commondefs.cctype
123include $(ROOT_OMAKE)/commondefs.gl
124include $(ROOT_OMAKE)/targetdefs
125include $(ROOT_OMAKE)/packagedefs
126include $(ROOT_OMAKE)/debuggerdefs.partner
127
128# �l�̐ݒ����荞��
129if $(test -f $(ROOT_OMAKE)/localdefs.om)
130    include $(ROOT_OMAKE)/localdefs
131    export
132
133# �R���p�C���̑I�� (TODO: �؂�ւ��C���^�t�F�[�X�����)
134
135COMPILER = $(CompilerRVCT.new)
136
137# �g���q�̐ݒ�
138
139EXT_OBJ = .o
140EXT_LIB = .a
141EXT_ASM = .s
142EXT_C   = .c
143
144EXT_EXE     = $(EXE)
145EXT_ELF     = .axf
146EXT_CCI     = .cci      # CTR Card Image
147EXT_CIP     = .cip      # CTR Initial Process
148EXT_CSU     = .csu      # CTR System Updater
149EXT_CXI     = .cxi      # CTR eXecutable Image
150EXT_CIA     = .cia      # CTR Importable Archive
151EXT_CDI     = .cdi      # CTR Development Image
152EXT_OLS     = .ols.cia
153EXT_CFA     = .cfa      # CTR File Archive
154EXT_BANNER  = .bnr
155EXT_ICON    = .icn
156
157EXT_PUB = .pubbin
158EXT_PRI = .pribin
159
160# �A�v���P�[�V�����^�C�v�̐ݒ�
161
162APPTYPE_CARD = CARD
163APPTYPE_NAND = NAND
164APPTYPE_BOTH = BOTH
165
166# Horizon �p�c�[���̐ݒ�
167
168public.MAKEROM      = $(ROOT_COMMANDS)$(DIRSEP)ctr_makerom32.exe
169public.MAKECIA      = $(ROOT_COMMANDS)$(DIRSEP)ctr_makecia32.exe
170public.MAKEOLS      = $(ROOT_COMMANDS)$(DIRSEP)ctr_makeols32.exe
171public.MAKEBANNER   = $(ROOT_COMMANDS)$(DIRSEP)ctr_makebanner32.exe
172
173public.MAKEROMFLAGS =
174public.MAKECIAFLAGS =
175
176public.BIN2OBJ      = $(file $(ROOT_COMMANDS)/ctr_bin2obj32$(EXE))
177public.BIN2OBJ_FLAGS=
178public.RUNNER       = $(file $(ROOT_BUILD)/runner/run.sh)
179public.RUNNER_LOCK  = $(file $(ROOT_BUILD)/runner/.lock)
180
181# �p�����[�^�ϐ�
182
183if $(not $(defined SKIP_BUILD))
184    public.SKIP_BUILD = false
185    export
186
187if $(not $(defined DEBUG_PRINT))
188    public.DEBUG_PRINT      = $`(DEBUG_PRINT_DEFAULT)
189    export
190
191if $(not $(defined DEBUG_PRINT_SDK))
192    public.DEBUG_PRINT_SDK  = $`(DEBUG_PRINT_SDK_DEFAULT)
193    export
194
195if $(not $(defined ASSERT_WARNING))
196    public.ASSERT_WARNING   = $`(ASSERT_WARNING_DEFAULT)
197    export
198
199if $(not $(defined ASSERT_WARNING_SDK))
200    public.ASSERT_WARNING_SDK = $`(ASSERT_WARNING_SDK_DEFAULT)
201    export
202
203if $(not $(defined HOST_IO))
204    public.HOST_IO          = $`(HOST_IO_DEFAULT)
205    export
206
207public.SOURCES =
208public.OBJECTS =
209
210public.BUILD_APPLICATION = false
211public.BUILD_KERNEL      = false
212
213public.FEEDBACK_1ST_STAGE = false
214public.FEEDBACK_2ND_STAGE = false
215
216public.EXCLUSION_SCATTER = false
217
218if $(not $(defined TRACE_PRODUCTCODE))
219    public.TRACE_PRODUCTCODE =
220    export
221
222# �r���h�^�[�Q�b�g�ƃr���h�^�C�v�ɍ��킹���f�B���N�g�������[�U���Ŏw�肷�邽�߂̕ϐ�
223public.BUILD_TARGET_DIR      =   $`(TARGET.getFullnameWithSystem Process)
224public.BUILD_TYPE_DIR        =   $`(TARGET.buildtype)
225
226# ���[�e�B���e�B�֐�
227
228# �v���W�F�N�g���[�g����̑��΃p�X�����߂�B
229# ���[�g������ sources �ȉ��̃p�X�̏ꍇ�� sources �����
230GetSubPath(path) =
231    apath = $(absname $(path))
232    #println(target: $(apath))
233
234    subpath = $(removeprefix  $(AROOT)$(DIRSEP), $(apath))
235    subpath = $(removeprefix sources$(DIRSEP), $(subpath))
236
237    if $(and                                            \
238         $(or $(equal $(apath), $(subpath)),            \
239              $(and $(defined FORCE_REFERENCE_ROOT),    \
240                    $(FORCE_REFERENCE_ROOT))),           \
241         $(defined SOURCES_REFERENCE_ROOT))
242        subpath_refer = $(removeprefix $(absname $(SOURCES_REFERENCE_ROOT)), $(apath))
243        #println(subpath_refer: $(subpath_refer))
244        return $(subpath_refer)
245    else
246        if $(equal $(subpath), $(apath))
247            eprintln($"c���[�O�̃t�@�C�����r���h���悤�Ƃ��Ă��܂��B: $(apath)")
248            eprintln($"SOURCES_REFERENCE_ROOT �ɂĎ蓮�Ŋ�fB���Ng�����w�肵�Ă��������B")
249            return $(basename $(apath))
250    return $(subpath)
251
252# �f�B���N�g���̐e�q�֌W���ׂ�
253is_under(parent_path, child_path) =
254    parent_path = $(absname $(parent_path))
255    child_path  = $(absname $(child_path))
256    if $(equal $(removeprefix $(parent_path), $(child_path)), $(child_path))
257        return false
258    else
259        return true
260
261
262GetBuildGroup() =
263    return group$(mod $(random), 10)
264
265# �I�u�W�F�N�g�t�@�C�����쐬����
266public.Object(config, files) =
267    if $(and $(FEEDBACK_1ST_STAGE), $(FEEDBACK_2ND_STAGE))
268        eprintln(FEEDBACK error)
269        exit(1)
270
271    CCFLAGS        += $(COMPILER.getCCFlags $(config)) $(config.getSystemCCFlags)
272    CCFLAGS_MACRO  += $(COMPILER.getMacroFlags $(config)) -DNN_USE_MAKECCI
273    ASFLAGS        += $(COMPILER.getASFlags $(config))
274
275    INCLUDES        = $(dir $(INCLUDES))
276
277    DEPEND_FEEDBACK = false
278    if $(FEEDBACK_2ND_STAGE)
279        # �t�B�[�h�o�b�N�t�@�C�����g�p�����r���h�̏ꍇ
280        FEEDBACK = $(config.getFeedBackPath)
281        CCFLAGS_BUILD += --feedback=$(absname $(FEEDBACK))
282        if $(test ! -e $(FEEDBACK))
283            # ��Ɉˑ��֌W��������ƁA.h �̕ύX���Ƀt�B�[�h�o�b�N�t�@�C�����������Ƃ����
284            # �r���h���I����Ă��܂����߁A����r���h�i�O���������t�B�[�h�o�b�N�t�@�C�������݂��Ȃ��j
285            # �ꍇ�ɂ݈̂ˑ��֌W�����B
286            DEPEND_FEEDBACK = true
287            export
288        export
289
290    OFILES =
291    export OFILES
292
293    obj_dir_parent = $(config.getObjectDirectory)
294
295    CC              = $,(CC)
296    CXX             = $,(CXX)
297    CFLAGS          = $,(CFLAGS)
298    CCFLAGS         = $,(CCFLAGS)
299    CXXFLAGS        = $,(CXXFLAGS)
300
301    .PHONY: build-random group1 group2 group3 group4 group5 group6 group7 group8 group9 group0
302    build-random: group1 group2 group3 group4 group5 group6 group7 group8 group9 group0
303
304    # �����I�Ɉ�ˆ�‚̃t�@�C���ɑ΂��ă��[�����`����
305    foreach(filename, $(files))
306        if $(not $(equal $(filename), $(EMPTY)))
307            if $(not $(is_under $(CWD), $(filename)))
308                ONAME = $(rootname $(GetSubPath $(filename)))$(EXT_OBJ)
309                export
310            else
311                ONAME = $(rootname $(filename))$(EXT_OBJ)
312                export
313
314            OFILE = $(file $(obj_dir_parent)/$(ONAME))
315            ODIR  = $(makeDirectory $(dirname $(OFILE)))
316
317            $(OFILE): $(ODIR)
318
319            match $(filename)
320            case $"\($(EXT_C)\)$$"
321                scanner_name = $(SCANNER_PREFIX)-c-$(fullname $(rootname $(OFILE)))
322                .SCANNER: $(scanner_name): $(filename) .PHONY/$(ROOT)/build-setup :value: $(digest-in-path-optional $(INCLUDES), $&)
323                    $(CC) $(CFLAGS) $(PREFIXED_INCLUDES) $(CSCANFLAGS) $(CCOUT)$(absname $(OFILE)) $(absname $<)
324
325                $(OFILE): $(filename) :scanner: $(scanner_name)
326                    $(CC) $(CFLAGS) $(CCFLAGS_BUILD) $(PREFIXED_INCLUDES) -c $(CCOUT)$(absname $@) $(absname $<)
327
328                $(OFILE): $(nth 0, $(CC))
329
330                $(GetBuildGroup): $(OFILE)
331
332            case $"\(\.cpp\)$$"
333                EXT = $1
334                scanner_name = $(SCANNER_PREFIX)-cxx-$(fullname $(rootname $(OFILE)))
335                .SCANNER: $(scanner_name): $(filename) .PHONY/$(ROOT)/build-setup :value: $(digest-in-path-optional $(INCLUDES), $&)
336                    $(CXX) $(CXXFLAGS) $(PREFIXED_INCLUDES) $(CSCANFLAGS) $(CCOUT)$(absname $(OFILE)) $(absname $<)
337
338                $(OFILE): $(filename) :scanner: $(scanner_name)
339                    $(CXX) $(CXXFLAGS) $(CCFLAGS_BUILD) $(PREFIXED_INCLUDES) -c $(CCOUT)$(absname $@) $(absname $<)
340
341                $(OFILE): $(nth 0, $(CXX))
342
343                $(GetBuildGroup): $(OFILE)
344
345            case $"\($(EXT_ASM)\)$$"
346                 $(OFILE): $(filename) :effects: asmlock
347                    $(AS) $(ASFLAGS) $(CCFLAGS_BUILD) $(PREFIXED_INCLUDES) $(ASOUT)$(absname $@) $(absname $<)
348
349                 $(OFILE): $(nth 0, $(AS))
350
351            default
352                eprintln($"Unsupported source file: " '$(filename)')
353                exit(1)
354
355            # �t�B�[�h�o�b�N���g�p���ăR���p�C������ꍇ�̓t�B�[�h�o�b�N�t�@�C���Ɉˑ�
356            # �•ʂɃ��[�����`����ꍇ�͈ˑ��֌W���•ʂɎw�肷��K�v������
357            if $(DEPEND_FEEDBACK)
358                $(OFILE): $(config.getFeedBackPath)
359
360            OFILES += $(OFILE)
361
362    clean:
363        rm -rf $(obj_dir_parent) $(SUBDIR_OBJECTS)
364
365    return $(OFILES)
366
367public.Bin2ObjDefaultSymbolFunction(filename) =
368    SYMBOL_PREFIX = $(uppercase $(removesuffix $(basename $(filename))))
369    return $(SYMBOL_PREFIX)_BEGIN $(SYMBOL_PREFIX)_END
370
371public.Bin2ObjHashSymbolFunction(filename) =
372    SYMBOL_PREFIX = $(uppercase $(removesuffix $(basename $(filename))))
373    return $(SYMBOL_PREFIX)_HASH_BEGIN $(SYMBOL_PREFIX)_HASH_END
374
375
376public.ObjectFromBinaryWithSymbol(config, files, symbol_function) =
377    OFILES =
378
379    obj_dir_parent = $(config.getObjectDirectory)
380
381    foreach(filename, $(files))
382        OFILE = $(file $(obj_dir_parent)/$(basename $(filename))$(EXT_OBJ))
383        OFILES += $(OFILE)
384
385        SYMBOL_PAIR = $(symbol_function $(filename))
386        $(OFILE): $(filename) $(BIN2OBJ)
387            $(BIN2OBJ) $(BIN2OBJ_FLAGS) -b $(nth 0, $(SYMBOL_PAIR)) -e $(nth 1, $(SYMBOL_PAIR)) $< $@
388
389        $(OFILE): $(obj_dir_parent)
390
391        export OFILES
392    return $(OFILES)
393
394
395public.ObjectFromBinary(config, files) =
396    return $(ObjectFromBinaryWithSymbol $(config), $(files), $(Bin2ObjDefaultSymbolFunction))
397
398public.HashFromBinary(config, files) =
399    EXT_HASH = .hash
400    HFILES =
401
402    obj_dir_parent = $(config.getObjectDirectory)
403    foreach(filename, $(files))
404        HFILE = $(file $(obj_dir_parent)/$(basename $(filename))$(EXT_HASH)$(EXT_OBJ))
405        HFILES += $(HFILE)
406
407        SYMBOL_PAIR = $(Bin2ObjHashSymbolFunction $(filename))
408        $(HFILE): $(filename) $(BIN2OBJ)
409            $(RUBY) -e "require 'Digest/md5'; STDOUT.binmode; print [Digest::SHA1.hexdigest(File.open('$(filename)', 'rb').read)].pack('H*');" > $@
410            $(BIN2OBJ) $(BIN2OBJ_FLAGS) -b $(nth 0, $(SYMBOL_PAIR)) -e $(nth 1, $(SYMBOL_PAIR)) $@ $@
411
412        $(HFILE): $(obj_dir_parent)
413
414        export HFILES
415    return $(HFILES)
416
417%.c: %.y
418    $(YACC) $<
419
420%.c: %.l
421    $(LEX) $<
422
423public.PreProcess(config, infile, outfile) =
424    CCFLAGS_MACRO  += $(COMPILER.getMacroFlags $(config)) -DNN_USE_MAKECCI
425
426    scanner_name = $(SCANNER_PREFIX)-cpp-$(fullname $(rootname $(outfile)))
427
428    .SCANNER: $(scanner_name): $(infile) .PHONY/$(ROOT)/build-setup :value: $(digest-in-path-optional $(INCLUDES), $&)
429        $(CPP) $(CCFLAGS) $(PREFIXED_INCLUDES) $(CSCANFLAGS) $(CCOUT)$(absname $(outfile)) $(absname $<)
430
431    outdir = $(makeDirectory $(dirname $(outfile)))
432
433    $(outfile): $(infile) $(outdir) :scanner: $(scanner_name)
434        $(CPP) $(CCFLAGS) $(PREFIXED_INCLUDES) $(CCOUT)$(absname $@) $(absname $<)
435    return $(outfile)
436
437#
438# Default C scanner
439#
440
441.PHONY: CGeneratedFilesTarget
442
443public.CGeneratedFiles(files) =
444    CGeneratedFilesTarget: $(files)
445
446public.LocalCGeneratedFiles(files) =
447    .SCANNER: scan-c-%: $(files)
448    .SCANNER: scan-cxx-%: $(files)
449    .SCANNER: %$(EXT_OBJ): $(files)
450    export
451
452
453.PHONY: build-romfs
454
455public.StaticLibrary(config, name, files) =
456    private.LIBDIR = $(config.getLibraryDirectory true)
457    private.OFILES = $(Object $(config), $(filter-out %$(EXT_OBJ),$(files))) $(filter %$(EXT_OBJ),$(files))
458    private.NORMALLIB = $(file $(LIBDIR)$(DIRSEP)$(config.getLibraryName $(name)))
459
460    $(NORMALLIB): $(LIBDIR) $(nth 0, $(AR))
461    $(NORMALLIB): $(OFILES)
462        echo $(absname $^) > $@.res
463        rm -f $(absname $@)
464        $(AR) $(ARFLAGS) $(absname $@) --via $(absname $@.res)
465        rm -f $@.res
466
467    clean:
468        rm -f $(NORMALLIB)
469
470    .PHONY: build-random group1 group2 group3 group4 group5 group6 group7 group8 group9 group0
471    build-random: group1 group2 group3 group4 group5 group6 group7 group8 group9 group0
472    $(GetBuildGroup): $(NORMALLIB)
473
474    return $(NORMALLIB)
475
476
477public.StaticObject(config, files) =
478    private.LIBDIR = $(config.getLibraryDirectory true)
479
480    SOFILES =
481    foreach(filename, $(files))
482        private.OFILE = $(Object $(config), $(filename))
483
484        private.NORMALLIB = $(file $(LIBDIR)/$(config.getStaticObjectName $(rootname $(filename))))
485
486        $(NORMALLIB): $(LIBDIR)
487        $(NORMALLIB): $(OFILE)
488            cp $< $@
489
490        SOFILES += $(NORMALLIB)
491        export SOFILES
492
493    clean:
494        rm -f $(SOFILES)
495
496    return $(SOFILES)
497
498
499completeLibrarySuffix(config, libfiles) =
500    result =
501    foreach(libfile, $(libfiles))
502        if $(findstring $(libfile), $'\.(small)|(fast)(\.|$)')
503            result += $(libfile)
504            export
505        else
506            result += $(libfile).$(config.effort)
507            export
508        export
509    return $(result)
510
511public.Program(config, name, files) =
512    FEEDBACK_FILE       = $(config.getFeedBackPath)
513    private.IMAGE_DIR   = $(config.getImageDirectory false)
514    LIBDIR              = $(config.getLibraryDirectory false)
515    NAME                = $(config.getBinaryPath $(name), $(EXT_EXE))
516    LDFLAGS            += $(COMPILER.getLDFlags $(config))
517
518    MINIMUM_LIBS       += $(config.getMinimumLibraries)
519    DEFAULT_LIBS       += $(config.getDefaultLibraries)
520    if $(config.isHostIoEnable)
521        DEFAULT_LIBS   += $(config.getHostIoLibraries)
522        export
523
524    OFILES              = $(Object $(config), $(filter-out %$(EXT_OBJ) %$(EXT_ELF),$(files))) $(filter %$(EXT_OBJ) %$(EXT_ELF),$(files))
525    DASM                = $(file $(removesuffix $(NAME)).dasm)
526
527    if $(filter %$(EXT_LIB), $(LIBS))
528        eprintln($""!!! WARNING: the LIBS variable should contain libraries _without_ extensions."")
529        LIBS = $(replacesuffixes $(EXT_LIB), $"$(EMPTY)", $(LIBS))
530        export
531
532    if $(not $(and $(defined TOOL), $(TOOL)))
533        FILTERED_LFILES = $(filter-out $"$(EMPTY)",$(LIBS))
534        LFILES          = $(file $(addprefix $(LIBDIR)$(DIRSEP), $(addsuffix $(EXT_LIB), $(completeLibrarySuffix $(config), $(FILTERED_LFILES)))))
535        LFILES         += $(file $(addsuffix $(EXT_LIB), $(completeLibrarySuffix $(config), $(replacesuffixes $(EXT_LIB), $"$(EMPTY)", $(LIBFILES)))))
536        LFILES         += $(file $(addsuffix $(EXT_LIB), $(completeLibrarySuffix $(config), $(replacesuffixes $(EXT_LIB), $"$(EMPTY)", $(LIBFILES)))))
537        LFILES         += $(file $(addsuffix $(EXT_LIB), $(completeLibrarySuffix $(config), $(replacesuffixes $(EXT_LIB), $"$(EMPTY)", $(LIBFILES)))))
538
539        if $(defined CRT_0_O)
540            LFILES += $(file $(addprefix $(LIBDIR)$(DIRSEP), $(addsuffix $(EXT_OBJ), $(completeLibrarySuffix $(config), $(removesuffix $(CRT_0_O))))))
541            export
542
543        MAPFILE         = $(config.getMapfilePath $(name))
544        export MAPFILE
545
546        LDSCRIPT        = $(PreProcess $(config), $(LDSCRIPT_TEMPLATE), $(absname $(config.getLdscriptPath $(name))))
547        export
548
549        $(LDSCRIPT): $(IMAGE_DIR)
550
551        if $(FEEDBACK_1ST_STAGE)
552            $(FEEDBACK_FILE): $(LDSCRIPT)
553        else
554            $(NAME): $(LDSCRIPT) :effects: $(MAPFILE)
555
556    else
557        LFILES          =
558
559        $(NAME): $(IMAGE_DIR)
560        export
561
562    if $(equal $(LDRESP),$(EMPTY))
563        $(NAME): $(OFILES) $(LFILES) :effects: $(DASM)
564            $(LD) $(LDOUT)$(absname $@) $(LDFLAGS) $^
565            $(if $(DISAS), $(DISAS) -o$(absname $(DASM)) $(absname $@))
566
567        if $(FEEDBACK_1ST_STAGE)
568            eprintln(feed back is not supported.)
569    else
570        if $(FEEDBACK_1ST_STAGE)
571            $(FEEDBACK_FILE): $(OFILES) $(LFILES)
572                echo $(absname $^) > $@.res
573                $(LD) $(LDOUT)$(absname $(NAME)) $(LDFLAGS) $(LDRESP) $(absname $@.res)
574                grep -v $"^;.+Last Updated:" $@.tmp > $@
575        else
576            # FEEDBACK_1ST_STAGE �ł͎g�p���Ȃ����[���B
577            $(NAME): $(OFILES) $(LFILES) :effects: $(DASM)
578                echo $(absname $^) > $@.res
579                $(LD) $(LDOUT)$(absname $@) $(LDFLAGS) $(LDRESP) $(absname $@.res)
580                $(if $(DISAS), $(DISAS) -o$(absname $(DASM)) $(absname $@))
581
582    $(NAME): $(nth 0, $(LD))
583
584    clean:
585        rm -rf $(IMAGE_DIR) $(SUBDIR_IMAGES)
586
587    if $(FEEDBACK_1ST_STAGE)
588        return $(FEEDBACK_FILE)
589    else
590        return $(NAME)
591
592public.ProgramELF(config, name, files) =
593    EXT_EXE     = $(EXT_ELF)
594    return $(Program $(config), $(name), $(files))
595
596public.Tool(config, name, files) =
597    TOOL        = true
598    return $(Program $(config), $(name), $(files))
599
600public.InstallTool(files) =
601    install_files =
602    export install_files
603    foreach(filename, $(files))
604        install_file = $(file $(ROOT_COMMANDS)$(DIRSEP)$(basename $(filename)))
605        $(install_file): $(filename)
606            cp -f $< $@
607        install_files += $(install_file)
608    return $(install_files)
609
610public.GetMakeromUserVariables()=
611    if $(not $(defined ROMFS_ROOT))
612        ROMFS_ROOT =
613        export
614
615    if $(not $(defined TITLE))
616        TITLE = CtrApp
617        export
618
619    FLAGS =
620
621    FLAGS += -DROMFS_ROOT=$(ROMFS_ROOT)
622    FLAGS += -DTITLE=$(TITLE)
623    return $(FLAGS)
624
625public.GetBannerFile(config) =
626    BannerFile = $(config.getDefaultBannerFile)
627    if $(defined CTR_BANNER_SPEC)
628        base    = $(removesuffix $(CTR_BANNER_SPEC))
629        BannerFile = $(addprefix $(config.getObjectDirectory)$(DIRSEP), $(addsuffixes $(EXT_BANNER), $(base)))
630        export
631    else
632        if $(defined CTR_BANNER)
633            BannerFile = $(CTR_BANNER)
634            export
635        elseif $(or $(and $(defined CTR_NO_BANNER_ICON), $(equal $(CTR_NO_BANNER_ICON), true)), \
636                    $(and $(defined CTR_NO_BANNER), $(equal $(CTR_NO_BANNER), true))            )
637            BannerFile =
638            export
639        export
640    return $(BannerFile)
641
642public.GetIconFile(config) =
643    IconFile = $(config.getDefaultIconFile)
644    if $(defined CTR_BANNER_SPEC)
645        base     = $(removesuffix $(CTR_BANNER_SPEC))
646        IconFile = $(addprefix $(config.getObjectDirectory)$(DIRSEP), $(addsuffixes $(EXT_ICON), $(base)))
647        export
648    else
649        if $(defined CTR_ICON)
650            IconFile = $(CTR_ICON)
651            export
652        elseif $(and $(defined CTR_NO_BANNER_ICON), $(equal $(CTR_NO_BANNER_ICON), true))
653            IconFile =
654            export
655        export
656    return $(IconFile)
657
658public.GetMakeromBannerOptions(config) =
659    if $(defined CTR_BANNER_SPEC)
660        if $(or $(defined CTR_BANNER), $(defined CTR_ICON))
661            eprintln($"CTR_BANNER CTR_ICON �� CTR_BANNER_SPEC �͓����Ɏg�p�ł��܂���")
662            exit(1)
663
664    options =
665    BannerFile = $(GetBannerFile $(config))
666    IconFile = $(GetIconFile $(config))
667    if $(not $(equal $(BannerFile.length), 0))
668        options += -banner $(BannerFile)
669        export
670
671    if $(not $(equal $(IconFile.length), 0))
672        options += -icon $(IconFile)
673        export
674
675    return $(options)
676
677public.UserProcess(config, name, files) =
678    BUILD_APPLICATION = true
679
680    if $(not $(defined LDSCRIPT_TEMPLATE))
681        LDSCRIPT_TEMPLATE = $(config.getLdscriptTemplatePath)
682        export
683
684    if $(not $(defined CRT_0_O))
685        CRT_0_O   = crt0.o
686        export
687
688    ELFFile = $(ProgramELF $(config), $(name), $(files))
689    CCIFile = $(replacesuffixes $(EXT_ELF), $(EXT_CCI), $(ELFFile))
690    CIPFile = $(replacesuffixes $(EXT_ELF), $(EXT_CIP), $(ELFFile))
691    CSUFile = $(replacesuffixes $(EXT_ELF), $(EXT_CSU), $(ELFFile))
692    CXIFile = $(replacesuffixes $(EXT_ELF), $(EXT_CXI), $(ELFFile))
693    CIAFile = $(replacesuffixes $(EXT_ELF), $(EXT_CIA), $(ELFFile))
694    CDIFile = $(replacesuffixes $(EXT_ELF), $(EXT_CDI), $(ELFFile))
695    OLSFile = $(replacesuffixes $(EXT_ELF), $(EXT_OLS), $(ELFFile))
696
697    MAKEROM_INPUTS[] = $(EMPTY)
698    MAKECIA_INPUTS[] = $(EMPTY)
699
700    if $(not $(defined DESCRIPTOR))
701        DESCRIPTOR = $(config.getDefaultDescriptorPath)
702        export
703
704    if $(not $(defined ROMFS_DEPENDENCIES))
705        if $(defined ROMFS_ROOT)
706            ROMFS_DEPENDENCIES = $(ls -R, $(dir $(ROMFS_ROOT)))
707            export
708        else
709            ROMFS_DEPENDENCIES =
710            export
711        export
712
713
714    if $(not $(defined ROM_SPEC_FILE))
715        ROM_SPEC_FILE = $(config.getDefaultRomSpecFile)
716        export
717
718    if $(not $(defined CTR_APPTYPE))
719        CTR_APPTYPE = $(APPTYPE_CARD)
720        export
721
722    if $(and $(defined CTR_NANDAPP),$(equal $(CTR_NANDAPP),true))
723        CTR_APPTYPE = $(APPTYPE_NAND)
724        export
725
726    if $(or  \
727       $(and $(defined CTR_REMOVE_AMCORE), $(CTR_REMOVE_AMCORE)), \
728       $(and $(defined CTR_MAKESIMPLECIA), $(CTR_MAKESIMPLECIA))  \
729    )
730        MAKECIA = $(ROOT_COMMANDS)$(DIRSEP)ctr_makesimplecia32.exe
731        export
732
733    DEFAULT_ROM_SPEC_FILE = $(config.getDefaultRomSpecFile)
734
735    # �}�j���A���p
736    if $(defined MANUAL_DIR)
737        MANUAL_CFA = $(nth 0,$(FileArchive $(MANUAL_DIR), $(ROOT_RESOURCES)/specfiles/Manual.rsf))
738
739        MAKEROMFLAGS += -content $(MANUAL_CFA):1
740        MAKEROM_INPUTS += $(MANUAL_CFA)
741
742        MAKECIAFLAGS += -i $(MANUAL_CFA):1
743        MAKECIA_INPUTS += $(MANUAL_CFA)
744        export
745
746    # �q�@�p
747    if $(defined CHILD_APPS)
748        MAKE_CIA_ARCHIVE    =   $(ROOT_COMMANDS)$(DIRSEP)ctr_makeciaarchive32.exe
749        cia_archive_root    =   $(TARGET.getObjectDirectory)/cia_archive_root
750        child_cfa           =   $(TARGET.getObjectDirectory)/childroot.cfa
751        $(child_cfa): $(CHILD_APPS) $(makeDirectory $(cia_archive_root)) $(MAKE_CIA_ARCHIVE) :effects: $(cia_archive_root)
752            $(MAKE_CIA_ARCHIVE) -cia $(CHILD_APPS) -rsf $(ROOT_RESOURCES)/specfiles/Child.rsf -o $@ --romfs-root $(cia_archive_root)
753
754        MAKEROMFLAGS += -content $(child_cfa):2
755        MAKEROM_INPUTS += $(child_cfa)
756
757        MAKECIAFLAGS += -i $(child_cfa):2
758        MAKECIA_INPUTS += $(child_cfa)
759
760        export
761
762    # �A�b�v�f�[�g�p�[�e�B�V�����p
763    if $(defined CTR_UPDATE_ARCHIVE)
764        MAKEROMFLAGS   += -content $(CTR_UPDATE_ARCHIVE):3
765        MAKEROM_INPUTS += $(CTR_UPDATE_ARCHIVE)
766
767        MAKECIAFLAGS   += -i $(CTR_UPDATE_ARCHIVE):3
768        MAKECIA_INPUTS += $(CTR_UPDATE_ARCHIVE)
769        export
770
771    # �ˑ��v���Z�X�̃o���G�[�V���������w��
772    if $(defined CTR_DEPENDENCY_VARIATION)
773        MAKEROMFLAGS    +=  -dv $(CTR_DEPENDENCY_VARIATION)
774        export
775
776    # 1st stage updater �p
777    if $(and $(defined CTR_BUILD_1ST_STAGE_UPDATER), $(CTR_BUILD_1ST_STAGE_UPDATER))
778        MAKEROMFLAGS    +=  -temp
779        export
780
781    MAKEROMFLAGS += -desc $(DESCRIPTOR) -rsf $(ROM_SPEC_FILE)
782    MAKEROMFLAGS += $(GetMakeromUserVariables)
783    MAKEROMFLAGS += $(GetMakeromBannerOptions $(config))
784    MAKEROM_INPUTS += $(DESCRIPTOR) $(ROM_SPEC_FILE) $(DEFAULT_ROM_SPEC_FILE) $(ROMFS_DEPENDENCIES) $(GetBannerFile $(config)) $(GetIconFile $(config))
785
786    $(CCIFile): $(ELFFile) $(MAKEROM) $(MAKEROM_INPUTS) build-romfs :value: $(getMtimeIfLarge $(ELFFile))
787        $(MAKEROM) -o $@ $< $(MAKEROMFLAGS) -f card
788
789    $(CIPFile): $(ELFFile) $(MAKEROM) $(MAKEROM_INPUTS) build-romfs :value: $(getMtimeIfLarge $(ELFFile))
790        $(MAKEROM) -o $@ $< $(MAKEROMFLAGS) -align 4 -cip
791
792    $(CSUFile): $(ELFFile) $(MAKEROM) $(MAKEROM_INPUTS) build-romfs :value: $(getMtimeIfLarge $(ELFFile))
793        $(MAKEROM) -o $@ $< $(MAKEROMFLAGS) -f card
794
795    $(CXIFile): $(ELFFile) $(MAKEROM) $(MAKEROM_INPUTS) build-romfs :value: $(getMtimeIfLarge $(ELFFile))
796        $(MAKEROM) -o $@ $< $(MAKEROMFLAGS)
797
798    $(CDIFile): $(ELFFile) $(MAKEROM) $(MAKEROM_INPUTS) build-romfs :value: $(getMtimeIfLarge $(ELFFile))
799        $(MAKEROM) -o $@ $< $(MAKEROMFLAGS) -cdi
800
801    $(CIAFile): $(CXIFile) $(MAKECIA) $(MAKECIA_INPUTS) :value: $(getMtimeIfLarge $(CXIFile))
802        $(MAKECIA) -i $< -o $@ $(MAKECIAFLAGS)
803        if $(and $(defined CTR_MAKEOLSZIP), $(CTR_MAKEOLSZIP))
804            $(MAKEOLS) -i $< -o $@ $(MAKECIAFLAGS)
805
806    # �^�[�Q�b�g�ɂȂ�t�@�C��������
807    CARD_IMAGE_FILE = $(CCIFile)
808    if $(defined IS_CIP)
809        CARD_IMAGE_FILE = $(CIPFile)
810        export CARD_IMAGE_FILE
811
812    if $(defined MAKECSU)
813        CARD_IMAGE_FILE = $(CSUFile)
814        export CARD_IMAGE_FILE
815
816    # NAND �A�v���̏ꍇ�� CIA ��������
817    NAND_IMAGE_FILE = $(CIAFile)
818
819    # �A�v���P�[�V�����^�C�v�ɂ���ă^�[�Q�b�g������
820    switch $(CTR_APPTYPE)
821    case $(APPTYPE_CARD)
822        TARGET_FILES = $(CARD_IMAGE_FILE)
823        if $(and $(defined CTR_MAKE_DEVELOPMENT_IMAGE), $(CTR_MAKE_DEVELOPMENT_IMAGE))
824            TARGET_FILES += $(CDIFile)
825            export
826        export
827    case $(APPTYPE_NAND)
828        TARGET_FILES = $(NAND_IMAGE_FILE)
829        export
830    case $(APPTYPE_BOTH)
831        TARGET_FILES = $(CARD_IMAGE_FILE) $(NAND_IMAGE_FILE)
832        export
833
834    # CTR_MAKE_DEVELOPMENT_IMAGE ����`����Ă���ꍇ�̂� cdi ���쐬����
835    if $(and $(defined CTR_MAKE_DEVELOPMENT_IMAGE), $(CTR_MAKE_DEVELOPMENT_IMAGE))
836        TARGET_FILES += $(CDIFile)
837        export
838
839    # �e�X�g�p
840    export LIST_PREFIX
841    if $(and $(defined BUILD_TESTS),$(equal $(BUILD_TESTS),true))
842        LIST_PREFIX = $(removesuffix $(basename $(CCIFile)))_
843    else
844        LIST_PREFIX = $(EMPTY)
845
846    # �c���[���O������Q�Ƃ��Ă���Ȃ�C���X�g�[�����邩���f
847    INSTALL_TARGET_IMAGEDIR = $(config.getImageDirectory true)
848    INSTALL_TARGETS =
849    if $(or $(and $(config.isSdkTool),\
850                  $(equal $(filter full,$(BUILDTYPES)),full)),\
851            $(and $(not $(config.isSdkTool)),\
852                  $(not $(equal $(INSTALL_TARGET_IMAGEDIR), $(dirname $(CARD_IMAGE_FILE))))))
853
854        foreach(TARGET, $(TARGET_FILES))
855            INSTALL_TARGET = $(INSTALL_TARGET_IMAGEDIR)/$(basename $(TARGET))
856            $(INSTALL_TARGET): $(INSTALL_TARGET_IMAGEDIR)
857            $(INSTALL_TARGET): $(TARGET)
858                cp -f $< $@
859            INSTALL_TARGETS += $(INSTALL_TARGET)
860            export INSTALL_TARGETS
861        export INSTALL_TARGETS
862
863    return $(TARGET_FILES) $(INSTALL_TARGETS)
864
865public.UserProcessTest(config, files) =
866    name = $(removesuffix $(basename $(nth 0,$(files))))
867
868    BUILD_TESTS = true
869    EXEFile = $(UserProcess $(config), $(name), $(files))
870
871    return $(EXEFile)
872
873public.Title(config, name, contents) =
874    ELFFile = $(config.getBinaryPath $(name), $(EXT_ELF))
875    CCIFile = $(replacesuffixes $(EXT_ELF), $(EXT_CCI), $(ELFFile))
876    CXIFile = $(replacesuffixes $(EXT_ELF), $(EXT_CXI), $(ELFFile))
877    CIAFile = $(replacesuffixes $(EXT_ELF), $(EXT_CIA), $(ELFFile))
878    CDIFile = $(replacesuffixes $(EXT_ELF), $(EXT_CDI), $(ELFFile))
879
880    CARD_IMAGE_FILE = $(CCIFile)
881    NAND_IMAGE_FILE = $(CIAFile)
882
883    depends[] =
884
885    if $(and $(defined CTR_NANDAPP),$(equal $(CTR_NANDAPP),true))
886        CTR_APPTYPE = $(APPTYPE_NAND)
887        export
888
889    switch $(CTR_APPTYPE)
890    case $(APPTYPE_CARD)
891        TARGET_FILES = $(CARD_IMAGE_FILE)
892        export
893    case $(APPTYPE_NAND)
894        TARGET_FILES = $(NAND_IMAGE_FILE)
895        export
896    case $(APPTYPE_BOTH)
897        TARGET_FILES = $(CARD_IMAGE_FILE) $(NAND_IMAGE_FILE)
898        export
899
900    MAKEROMFLAGS += -rsf $(ROM_SPEC_FILE)
901    depends += $(ROM_SPEC_FILE)
902
903    contentfiles[] =
904
905    foreach(CONTENTSTR, $(contents))
906        contentseq = $(split >,$(CONTENTSTR))
907
908        index = $(nth 0,$(contentseq))
909        contentfile = $(nth 1,$(contentseq))
910
911        contentfiles += $(contentfile)
912
913        MAKEROMFLAGS += -content $(contentfile):$(index)
914        MAKECIAFLAGS += -i $(contentfile):$(index)
915        $(CCIFile): :value: $(getMtimeIfLarge $(contentfile))
916        $(CIAFile): :value: $(getMtimeIfLarge $(contentfile))
917        export
918
919    depends += $(contentfiles)
920
921    # cfa �݂̂̋��L�f�[�^�^�C�g���̏ꍇ�ɂ̓��W���[�o�[�W������ʓr�ݒ肷��悤�ɂ���
922    if $(not $(defined SHAREDDATATITLE_MAJOR_VERSION))
923        SHAREDDATATITLE_MAJOR_VERSION = 0
924        export
925
926    if $(not $(equal $(suffix $(nth 0,$(contentfiles))), $(EXT_CXI)))
927        MAKECIAFLAGS += -major $(SHAREDDATATITLE_MAJOR_VERSION)
928        export
929
930    $(CCIFile): $(makeDirectory $(dirname $(CCIFile)))
931    $(CCIFile): $(MAKEROM) build-romfs  $(depends)
932        $(MAKEROM) -o $@ $(MAKEROMFLAGS) -f card
933
934    $(CIAFile): $(makeDirectory $(dirname $(CIAFile)))
935    $(CIAFile): $(MAKECIA) $(depends)
936        $(MAKECIA) -o $@ $(MAKECIAFLAGS)
937
938    return $(TARGET_FILES)
939
940public.FileArchive(srcdir, rsf) =
941    name = $(basename $(srcdir))
942    SOURCES_BASE_ROOT = $(dirname $(srcdir))
943    CFAFile = $(makeDirectory $(getOutputBaseDirectory)$(DIRSEP)$(SUBDIR_OBJECTS)$(DIRSEP)$(getModuleSubDirectory))$(DIRSEP)$(name)$(EXT_CFA)
944
945    if $(not $(defined ARCHIVE_DEPENDENCIES))
946        ARCHIVE_DEPENDENCIES = $(ls -R, $(dir $(srcdir)))
947        export
948    ARCHIVE_DEPENDENCIES += $(rsf)
949
950    $(CFAFile): $(srcdir)
951    $(CFAFile): $(makeDirectory $(dirname $(CFAFile)))
952    $(CFAFile): $(srcdir) $(MAKEROM) $(rsf) $(ARCHIVE_DEPENDENCIES)
953        $(MAKEROM) -o $@ -DROMFS_ROOT=$(srcdir) $(MAKEROMFLAGS) -f data -rsf $(rsf)
954
955    return $(CFAFile)
956
957public.Banner(config, spec) =
958    BannerFile  = $(GetBannerFile $(config))
959    IconFile    = $(GetIconFile $(config))
960    $(BannerFile) $(IconFile): $(spec) $(MAKEBANNER)
961        mkdir -p $(dirname $(BannerFile))
962        $(MAKEBANNER) $< $(BannerFile) $(IconFile)
963
964    return $(BannerFile)
965
966public.MakeDataCia(source, titleid) =
967    name = $(rootname $(basename $(source)))
968    CIAFile = $(getOutputBaseDirectory)$(DIRSEP)$(SUBDIR_IMAGES)$(DIRSEP)$(getModuleSubDirectory)$(DIRSEP)$(name)$(EXT_CIA)
969
970    TARGET_FILES = $(CIAFile)
971
972    $(CIAFile): $(makeDirectory $(dirname $(CIAFile)))
973    $(CIAFile): $(source) $(MAKECIA)
974        $(MAKECIA) -a $(source) -o $(CIAFile) -p $(titleid) -padding
975
976    return $(TARGET_FILES)
977
978public.MakeSrlCia(srlfile) =
979    name = $(rootname $(basename $(srlfile)))
980    CIAFile = $(getOutputBaseDirectory)$(DIRSEP)$(SUBDIR_IMAGES)$(DIRSEP)$(getModuleSubDirectory)$(DIRSEP)$(name)$(EXT_CIA)
981
982    TARGET_FILES = $(CIAFile)
983
984    $(CIAFile): $(makeDirectory $(dirname $(CIAFile)))
985    $(CIAFile): $(srlfile) $(MAKECIA)
986        $(MAKECIA) -s $< -o $@ -padding
987
988    return $(TARGET_FILES)
989
990public.InstallFiles(source_root, sources, destination) =
991    destination = $(absname $(destination))
992    source_root = $(absname $(source_root))
993    sources     = $(removeprefix $(source_root)$(DIRSEP), $(sources))
994
995    dfiles = $(addprefix $(destination)$(DIRSEP), $(sources))
996
997    .SUBDIRS: $(source_root)
998        foreach(source, $(sources))
999            dfile = $(addprefix $(destination)$(DIRSEP), $(source))
1000            $(dfile): $(source)
1001                mkdir -p $(dirname $(dfile))
1002                ln-or-cp $(source) $(dfile)
1003
1004    return $(dfiles)
1005
1006public.Filelist(destfile, filelist) =
1007    $(destfile): $(dirname $(destfile)) :value: $(filelist)
1008        section
1009            f = $(fopen $(@), w)
1010            foreach(filename, $(filelist))
1011                fprintln($(f), $(filename))
1012            close($(f))
1013    return $(destfile)
1014
1015public.ParseDependProcess(config, process, depends) =
1016    RESULT_PROCESSES =
1017    export RESULT_PROCESSES
1018    foreach(DEPEND, $(depends))
1019        if $(findstring $(DEPEND), $">")
1020            DEPEND_PAIR = $(split >, $(DEPEND))
1021            PROCESS_KEY = $(nth 0, $(DEPEND_PAIR))
1022            if $(equal $(process), $(PROCESS_KEY))
1023                RESULT_PROCESSES += $(split $",", $(nth 1, $(DEPEND_PAIR)))
1024        else
1025            RESULT_PROCESSES += $(DEPEND)
1026
1027    return $(RESULT_PROCESSES)
1028
1029# �S�Ẵ\�[�X�t�@�C���̃R���p�C���O�Ɏ��s����^�[�Q�b�g
1030public.RequireSetup(targets) =
1031    .PHONY/$(ROOT)/build-setup: $(targets)
1032
1033public.DefineDefaultRules() =
1034
1035    .DEFAULT: build
1036
1037    all: build tests
1038
1039    run: run-scripts
1040
1041    %.log: run-scripts
1042
1043    dotests run: $(RUNNER) :effects: $(RUNNER_LOCK)
1044        $(RunDependMCR $@)
1045
1046public.ShowConfig() =
1047    NOT_FOUND = $"���‚���܂���"
1048    println($"�‹��ϐ�/�����ݒ�--------------------------------------")
1049    println($"  HORIZON_ROOT:           " $(absname $(HORIZON_ROOT)))
1050    println($"  HORIZON_ADDINS_ROOT:    " $(HORIZON_ADDINS_ROOT))
1051    println($"  HORIZON_TARGETS:        " $(if $(defined-env HORIZON_TARGETS),                   $`(getenv HORIZON_TARGETS)))
1052    println($"  ARMLMD_LICENSE_FILE:    " $(if $(defined-env ARMLMD_LICENSE_FILE),               $`(getenv ARMLMD_LICENSE_FILE)))
1053    println($"  $(RVCT_ENV_PREFIX)BIN:              " $(if $(defined-env $(RVCT_ENV_PREFIX)BIN), $`(getenv $(RVCT_ENV_PREFIX)BIN)))
1054    if $(defined-env $(RVCT_ENV_PREFIX)BIN)
1055        ARMCC_VERSION   = $(gsub $(string $(shell $"$(RVCT_BINDIR)armcc.exe" --help)),   $" Usage:.*", $(EMPTY))
1056        ARMASM_VERSION  = $(gsub $(string $(shell $"$(RVCT_BINDIR)armasm.exe" --help)),  $" Usage:.*", $(EMPTY))
1057        ARMLINK_VERSION = $(gsub $(string $(shell $"$(RVCT_BINDIR)armlink.exe" --help)), $" Usage:.*", $(EMPTY))
1058        ARMAR_VERSION   = $(gsub $(string $(shell $"$(RVCT_BINDIR)armar.exe" --help)),   $" - archive.*", $(EMPTY))
1059        FROMELF_VERSION = $(gsub $(string $(shell $"$(RVCT_BINDIR)fromelf.exe" --help)), $"ARM image.*", $(EMPTY))
1060
1061        println($"                           - $(ARMCC_VERSION)")
1062        println($"                           - $(ARMASM_VERSION)")
1063        println($"                           - $(ARMLINK_VERSION)")
1064        println($"                           - $(ARMAR_VERSION)")
1065        println($"                           - $(FROMELF_VERSION)")
1066    println($"  $(RVCT_ENV_PREFIX)INC:              " $(if $(defined-env $(RVCT_ENV_PREFIX)INC),           $`(getenv $(RVCT_ENV_PREFIX)INC)))
1067    println($"  $(RVCT_ENV_PREFIX)LIB:              " $(if $(defined-env $(RVCT_ENV_PREFIX)LIB),           $`(getenv $(RVCT_ENV_PREFIX)LIB)))
1068
1069    println($" ")
1070    println($"�v���W�F�N�g�ݒ�---------------------------------------")
1071    println($"  ROOT:                   " $(absname $(ROOT)))
1072    println($"  INSTALL_ROOT:           " $(absname $(INSTALL_ROOT)))
1073    println($"  INSTALL_ROOT_IMAGES:    " $(absname $(INSTALL_ROOT_IMAGES)))
1074    println($"  INSTALL_ROOT_LIBRARIES: " $(absname $(INSTALL_ROOT_LIBRARIES)))
1075    println($" ")
1076    println($"�v���O����---------------------------------------------")
1077
1078    GCC_VERSION =
1079    if $(GCC)
1080        GCC_VERSION = $`(gsub $(string $(shell $(GCC) --version)), $" Copyright.*", $(EMPTY))
1081        export
1082
1083    #OMAKE_VERSION_ = $`(gsub $(string $(shell omake --version)), $":.*", $(EMPTY))
1084    println($"  GCC:                    " $(if $(equal $(GCC),   $(EMPTY)), $(NOT_FOUND), $`(GCC) [$`(GCC_VERSION)]))
1085    println($"  RUBY:                   " $(if $(equal $(RUBY),  $(EMPTY)), $(NOT_FOUND), $`(RUBY) [$`(RUBY_VERSION)]))
1086    println($"  7ZIP:                   " $(if $(equal $(7ZIP),  $(EMPTY)), $(NOT_FOUND), $`(7ZIP)))
1087    println($"  UNZIP:                  " $(if $(equal $(UNZIP), $(EMPTY)), $(NOT_FOUND), $`(UNZIP)))
1088    println($" ")
1089
1090.PHONY: show-config
1091show-config:
1092    $(ShowConfig)
1093
1094