가끔 프로젝트를 진행하다보면, 스크립트나 메타프로그램 파일과 같이 별도의 컴파일러로 컴파일을 해야할 경우가 생긴다.
Visual Studio에서 컴파일러가 인식하지 못하는 소스들을 첨가할 때마다, 일일이 Custom Build Setting을 해주는 것은 참으로 귀찮은 일이다.
이걸 한번에 끝내는 방법이 있으니 그것이 바로 rules파일을 만드는 것이다.
형식은 다음과 같이 XML파일이다.
펼쳐두기..
<?xml version="1.0" encoding="utf-8"?>
<VisualStudioToolFile
Name="PIDL's build rule" <-- 이 룰의 이름이다.
Version="8.00"
>
<Rules>
<CustomBuildRule
Name="Generate stub and proxy source files from PIDL" <-- 컴파일 할 때, 이 파일을 커스텀 빌드할 때 나오는 메세지이다.
DisplayName="PIDL Build Tools" <-- 이 이름이 파일 속성 창을 열었을 때, 나온다.
CommandLine="..\..\External\ProudNet\util\PIDL.exe $(InputPath)" <-- 커스텀 빌드를 수행하는 실행파일과 인자를 지정한다.
Outputs="$(ProjectDir)\Code\$(InputName)_common.h;$(ProjectDir) \Code\$(InputName)_proxy.cpp;$(ProjectDir)\Code\$(InputName)_proxy.h;$(ProjectDir)\Code\$(InputName)_stub.cpp;$(ProjectDir)\Code\$(InputName)_stub.h" <-- 결과물을 출력할 형식을 지정한다.
AdditionalDependencies="..\..\External\ProudNet\util\PIDL.exe" <-- 커스텀 빌드를 수행하는 실행파일의 경로를 지정한다.
FileExtensions="*.PIDL" <-- 이 룰을 사용할 확장자를 지정한다.
ExecutionDescription="Compiling $(InputName).PIDL..." <-- 커스텀 빌드시 VS Output창에 출력할 메세지이다.
ShowOnlyRuleProperties="false" <-- 룰에 관한 속성들만 보여줄 것인지 아닌지를 지정한다.
>
<Properties>
</Properties>
</CustomBuildRule>
</Rules>
</VisualStudioToolFile>
원하는 룰을 만들고 싶으시다면 위의 XML파일에서 볼드체로 설명이 들어간 부분을 바꾸면 된다.
이렇게 룰 파일을 작성한 다음, 그 소스들을 포함하고 있는 프로젝트에 룰 파일을 추가하면된다.
우선 룰을 추가하고자하는 vcproj파일을 오픈한다. 그런 다음과 같은 XML파일이 나올 것이다. 그러면 아래 볼드체로 나오는 element를 추가하고 세이브하면 된다.
펼쳐두기..
<?xml version="1.0" encoding="ks_c_5601-1987"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="9.00"
Name="Protocol"
ProjectGUID="{18F0D57A-9D2A-4085-97A6-5D2AE3E54D30}"
RootNamespace="Protocol"
SccProjectName="SAK"
SccAuxPath="SAK"
SccLocalPath="SAK"
SccProvider="SAK"
TargetFrameworkVersion="196613"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
<ToolFile
RelativePath=".\PIDL\PIDL.rules"
/>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="..\..\Intermediate\$(ProjectName) $(ConfigurationName)"
IntermediateDirectory="..\..\Intermediate\$(ProjectName) $(ConfigurationName)"
ConfigurationType="4"
CharacterSet="2"
BuildLogFile="..\..\Intermediate\BuildLogs\$(ProjectName) $(ConfigurationName)\BuildLog.htm"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="3"
WarningLevel="3"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLibrarianTool"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
Description="Move sources to Code directory."
CommandLine="cd "$(ProjectDir)/.."
call targets/move_files_to_code.bat
"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="..\..\Intermediate\$(ProjectName) $(ConfigurationName)"
IntermediateDirectory="..\..\Intermediate\$(ProjectName) $(ConfigurationName)"
ConfigurationType="4"
CharacterSet="2"
WholeProgramOptimization="1"
BuildLogFile="..\..\Intermediate\BuildLogs\$(ProjectName) $(ConfigurationName)\BuildLog.htm"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="2"
EnableIntrinsicFunctions="true"
RuntimeLibrary="2"
EnableFunctionLevelLinking="true"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLibrarianTool"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="PIDL"
>
<File
RelativePath=".\PIDL\coordinator.PIDL"
>
</File>
<File
RelativePath=".\PIDL\entry.PIDL"
>
</File>
<File
RelativePath=".\PIDL\lobby.PIDL"
>
</File>
<File
RelativePath=".\PIDL\session.PIDL"
>
</File>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>
각 파일마다 커스텀 빌드 속성을 지정해주면 <File RelativePath=""></File> element 사이에 <Tool></Tool>이라는 element가 하나하나 추가되서 지저분하다. 하지만 룰파일을 사용하면 깔끔하다(물론 누가 vcproj파일을 메모장으로 열어서 보는 것도 아닌데 괜한 걱정이다).
이제 VS에서 그 프로젝트를 빌드해보면, 룰이 지정된 확장자를 가진 파일들도 제대로 컴파일되는 것을 볼 수 있다.
PS. 예시는 ProudNet의 RMI메서드를 생성해주는 PIDL이라는 메타프로그램이다. 우리 프로젝트에서 ProudNet을 사용하고 있어서 예로 들었다.
댓글 없음:
댓글 쓰기