1#----------------------------------------------------------------------------
2# Project:  Horizon
3# File:     CTR.commondefs.gl.om
4#
5# Copyright (C)2009-2011 Nintendo Co., Ltd.  All rights reserved.
6#
7# These coded instructions, statements, and computer programs contain
8# proprietary information of Nintendo of America Inc. and/or Nintendo
9# Company Ltd., and are protected by Federal copyright law.  They may
10# not be disclosed to third parties or copied or duplicated in any form,
11# in whole or in part, without the prior written consent of Nintendo.
12#
13# $Rev: 35205 $
14#----------------------------------------------------------------------------
15
16#----------------------------------------------------------------------------
17# 定数定義
18#----------------------------------------------------------------------------
19
20# アセンブラ・リンカの定義
21global.VSASM            = $(ROOT_COMMANDS)$(DIRSEP)ctr_VertexShaderAssembler32.exe
22global.VSLD             = $(ROOT_COMMANDS)$(DIRSEP)ctr_VertexShaderLinker32.exe
23
24# 拡張子の定義
25global.EXT_VSASM        = .vsh
26global.EXT_VSOBJ        = .obj
27global.EXT_VSBIN        = .shbin
28
29# ビルド済みシェーダが格納されているディレクトリ
30private.SHADER_PREBUILT_ROOT = $(ROOT_RESOURCES)$(DIRSEP)shaders
31
32# アセンブラ・リンカに -I で渡されるインクルードディレクトリ
33global.SHADER_INCLUDES  = $(SHADER_PREBUILT_ROOT)
34
35# インクルードディレクトリを指定するコマンドラインを生成(遅延評価)
36private.PREFIXED_SHADER_INCLUDES = $`(addprefix -I, $(set $(absname $(SHADER_INCLUDES))))
37
38# アセンブラに指定するオプション
39global.SHADER_ASFLAGS =
40
41# リンカに指定するオプション
42global.SHADER_LDFLAGS = -M
43
44#----------------------------------------------------------------------------
45# 関数定義
46#----------------------------------------------------------------------------
47
48#-------------------------------------------------------
49# getShaderObjectDirectory
50#
51# 概要
52#   .obj/.shbin の格納先を返しつつ親ディレクトリの生成ルールを定義する
53#
54# 参照しているグローバル変数
55#   なし
56#-------------------------------------------------------
57getShaderObjectDirectory() =
58    return $(makeDirectory $(getObjectBaseDirectory)$(DIRSEP)CTR.Shader)
59
60
61
62#-------------------------------------------------------
63# VertexShaderObjects
64#
65# 概要
66#   .obj ファイルを生成する
67#   sourcefiles - .vsh ファイル(複数可)
68#   options - シェーダアセンブラに指定するオプション
69#
70# 参照しているグローバル変数
71#   PREFIXED_SHADER_INCLUDES
72#-------------------------------------------------------
73VertexShaderObjects(sourcefiles, options) =
74    # .obj を格納するディレクトリを求める
75    private.obj_dir_parent = $(getShaderObjectDirectory)
76
77    # .vsh ファイル一つずつに対してルールを定義
78    private.ofiles =
79        foreach(sourcefile, $(sourcefiles))
80            # 出力するファイル名をフルパスで求める
81            private.ofile = $(file $(obj_dir_parent)/$(basename $(removesuffix $(sourcefile)))$(EXT_VSOBJ))
82
83            # アセンブルのルールを定義 (警告もエラーもない場合は grep で出力をカット)
84            # ディレクトリにも依存させて自動生成
85            $(ofile): $(sourcefile) $(obj_dir_parent) $(VSASM)
86                $(VSASM) $< $(PREFIXED_SHADER_INCLUDES) -O$@ $(options) | grep -v '^.*finished - 0 error, 0 warning'
87
88            value $(ofile)
89
90    # クリーンのルールを定義
91    clean:
92        rm -rf $(obj_dir_parent)
93
94    return $(ofiles)
95
96
97
98#-------------------------------------------------------
99# VertexShaderBinary
100#
101# 概要
102#   .shbin ファイルを生成する
103#   name        - .shbin の名前(拡張子無し)
104#   sourcefiles - OMakefile で生成された .obj ファイル
105#   sourcefiles_pre - resources 以下にあるビルド済み .obj ファイル
106#   options - シェーダリンカに指定するオプション
107#
108# 参照しているグローバル変数
109#   PREFIXED_SHADER_INCLUDES, SHBIN_INSTALL_ROOT
110#-------------------------------------------------------
111VertexShaderBinary(name, sourcefiles, sourcefiles_pre, options) =
112    # .obj を格納するディレクトリを求める
113    private.obj_dir_parent = $(getShaderObjectDirectory)
114
115    # 依存関係を正しく得る為 sourcefiles_pre をフルパスに変換する。
116    # (-I に頼ると、ビルド済み .obj が更新されたときに再ビルドされない。)
117    private.sourcefiles_pre = $(addprefix $(SHADER_PREBUILT_ROOT)$(DIRSEP), $(sourcefiles_pre))
118
119    # 出力するファイル名をフルパスで求める
120    private.ofile = $(file $(obj_dir_parent)/$(basename $(name))$(EXT_VSBIN))
121
122    # リンクのルールを定義 (警告もエラーもない場合は grep で出力をカット)
123    $(ofile): $(sourcefiles) $(sourcefiles_pre) $(obj_dir_parent) $(VSLD)
124        $(VSLD) $(sourcefiles) $(sourcefiles_pre) $(PREFIXED_SHADER_INCLUDES) $(options) -O$@ | grep -v '^.*finished - 0 error, 0 warning'
125
126    if $(not $(defined SHBIN_INSTALL_ROOT))
127        if $(defined ROMFS_ROOT)
128            SHBIN_INSTALL_ROOT = $(ROMFS_ROOT)
129            export
130        export
131
132    # SHBIN_INSTALL_ROOT が定義されている場合は SHBIN_INSTALL_ROOT 以下にバイナリをコピー
133    if $(and $(defined SHBIN_INSTALL_ROOT), $(not $(equal $(SHBIN_INSTALL_ROOT),$(EMPTY))))
134
135        # インストール先のファイル名を求める
136        private.ofile_install = $(SHBIN_INSTALL_ROOT)$(DIRSEP)$(basename $(ofile))
137
138        # インストール先への格納
139        $(ofile_install): $(ofile) $(SHBIN_INSTALL_ROOT)
140            ln-or-cp $< $@
141        # インストール先のディレクトリを作成する
142        $(SHBIN_INSTALL_ROOT):
143            mkdir -p $@
144        #クリーンのルールを定義
145        clean:
146            rm -f $(ofile_install)
147
148
149        # ROMFS 内のファイルは MAKEROM 前に準備する必要がある
150        build-romfs: $(ofile_install)
151
152    # クリーンのルールを定義
153    clean:
154        rm -rf $(obj_dir_parent)
155
156    # objects 内に生成される方のバイナリを常に返す
157    return $(ofile)
158
159
160