Archive for 2008/12/14

sourcesファイルにおけるサブディレクトリ指定

「なんだ、それ?dir ファイルにサブディレクトリを書くだけでしょ。」というのが、たぶん普通の反応なんだと思います。たしかに、Windows Embedded CE の流儀では、それが正しいやり方です。

以下で説明するのは、WinCE の流儀には忠実でないやり方で、PlatformBuilder の OSDesign サブプロジェクトを作る方法です。この方法は、クロスプラットフォームのオープンソースのライブラリを WinCE で利用したり、あるいは、将来的なクロスプラットフォームでの利用も想定して、可搬性の高いコードやプロジェクトを作る場合に、役立つのではないかと思います。

さて、「方法」と書きましたが、実際は、そんなに大袈裟なものでは、ありません。単に、sources ファイルにターゲット(オブジェクトファイル)の生成規則を追加するだけです。生成規則は、
 <WINCE600_Root>/PUBLIC/COMMON/OAK/MISC/
にある makefile.def ファイルに記述されています。たとえば、makefile を配置したディレクトリの、一つ上のディレクトリに存在する .cpp ファイルに対するオブジェクトファイルの生成規則は、次の通りです:

{..\}.cpp{$(_OBJDIR)\}.obj:
    @echo BUILD_MARKER:CPP_COMPILE_START Compiling $<
    @type <<
$(ECHO_CXX_MSG)
<<NOKEEP
    @$(CXXCOMPILER) @<< $(CONLY_FLAGS) -Fo$@
$(C_COMMAND_LINE_OPTIONS: =
) $(MAKEDIR)\$<
<<NOKEEP
    @echo BUILD_MARKER:CPP_COMPILE_END

この生成規則があるため、次のようなディレクトリ構成で PlatformBuilder サブプロジェクトを作成しても、正しくビルドされるのです。

 MySubProj/
  myprojsrc.cpp
  myprojsrc2.cpp
  WCEPB/
   makefile
   MySubProj.pbpxml
   postlink.bat
   prelink.bat
   ProjSysgen.bat
   sources

上の例では、MySubProj/ というディレクトリが、PlatformBuilder サブプロジェクトのソースディレクトリです。この中の、WCEPB/ というサブディレクトリに PlatformBuilder のプロジェクトファイルを配置しています。この例では、sources ファイルでは、SOURCES マクロが次のように定義されているはずです:

 SOURCES= \
   ..\myprojsrc.cpp \
   ..\myprojsrc2.cpp \

ここで、上の例とは異なり、ソースファイル用のサブディレクトリがある場合には、makefile.def ファイルに記述された生成規則だけではビルドできません。次のようなディレクトリ構成の場合です。

 MySubProj2/
  myprojsrc.cpp
  myprojsrc2.cpp
  SubDir/
   subdirsrc.cpp
  WCEPB/
   …(※上の例と同じ)

この場合、sources ファイルで SOURCES マクロを次のように書いても、ビルドエラーとなります。

 SOURCES= \
   ..\myprojsrc.cpp \
   ..\myprojsrc2.cpp \
   ..\SubDir\subdirsrc.cpp \

ビルドエラーのメッセージは、次のようになる筈です。

 NMAKE :  U1073: don’t know how to make ‘obj\ARMV4I\debug\subdirsrc.obj’

これは、subdirsrc.cpp に対応するオブジェクトファイルの生成規則が見つからないからです。従って、sources ファイルに次の生成規則を追加することにより、このエラーを解消できます:

# for source files in ‘SubDir/’ dir
{..\SubDir\}.cpp{$(_OBJDIR)\}.obj:
    @echo BUILD_MARKER:CPP_COMPILE_START Compiling $<
    @type <<
$(ECHO_CXX_MSG)
<<NOKEEP
    @$(CXXCOMPILER) @<< $(CONLY_FLAGS) -Fo$@
$(C_COMMAND_LINE_OPTIONS: =
) $(MAKEDIR)\$<
<<NOKEEP
    @echo BUILD_MARKER:CPP_COMPILE_END

サブディレクトリに配置するソースファイルが、C++ のソース(.cpp)ではなく C のソース(.c)の場合に、どのような生成規則を追加すればよいのかは、makefile.def を御覧になってみて下さい。’BUILD_MARKER:C_COMPILE_START’ という文字列で検索すれば、すぐに見つかるでしょう :-)

1 comment 2008/12/14 koga


Categories

Links

Posts by Authors

Recent Posts

Calendar

2008年12月
« 11月   7月 »
 123456
78910111213
14151617181920
21222324252627
28293031  

Posts by Month

Posts by Category

Meta