<?xml version="1.0" encoding="utf-8"?>
<VisualStudioToolFile
	Name="CUDA Build Rule v2.1.0"
	Version="8.00"
	>
	<Rules>
		<CustomBuildRule
			Name="CUDA Build Rule"
			DisplayName="CUDA Build Rule v2.1.0"
			CommandLine="echo [CompilerPath] [Keep] [ExtraNvccOptions] [Arch] -ccbin &quot;$(VCInstallDir)bin&quot; [Emulation] [FastMath] [Defines] -Xcompiler &quot;/EHsc [Warning] /nologo [Optimization] /Zi [RuntimeChecks] [Runtime] [TypeInfo] [ExtraCppOptions]&quot; [Include] [MaxRegCount] [PtxAsOptionV] [NvccCompilation] $(InputFileName) &#x0D;&#x0A; [CompilerPath] [Keep] [ExtraNvccOptions] [Arch] -ccbin &quot;$(VCInstallDir)bin&quot; [Emulation] [FastMath] [Defines] -Xcompiler &quot;/EHsc [Warning] /nologo [Optimization] /Zi [RuntimeChecks] [Runtime] [TypeInfo] [ExtraCppOptions]&quot; [Include] [MaxRegCount] [ptxasoptionv] [NvccCompilation] $(InputFileName) "
			Outputs="[compileout]"
			AdditionalDependencies="[AddedDependencies]"
			FileExtensions="*.cu"
			ExecutionDescription="Compiling with CUDA Build Rule..."
			>
			<Properties>
				<StringProperty
					Name="Include"
					DisplayName="Additional Include Directories"
					Description="Specifies one or more directories to add to the include path; use semi-colon delimited list if more than one.  (/I[path])"
					Switch="-I[value]"
					DefaultValue="&quot;$(CUDA_INC_PATH)&quot;"
					Inheritable="true"
					Delimited="true"
					Delimiters=";"
				/>
				<BooleanProperty
					Name="Debug"
					DisplayName="Generate Debug Information"
					Description="Specifies whether or not debugging information is generated by the CUDA compiler.  (-D_DEBUG)"
					Switch="-D_DEBUG"
				/>
				<EnumProperty
					Name="NvccCompilation"
					DisplayName="NVCC Compilation Type"
					Description="Select desired output of NVCC compilation (-c/-compile, -cuda, -gpu, -cubin, -ptx)"
					>
					<Values>
						<EnumValue
							Value="0"
							Switch="--compile -o $(IntDir)\$(InputName).cu.obj"
							DisplayName="Generate hybrid object file  (--compile / -c)"
						/>
						<EnumValue
							Value="1"
							Switch="-cuda -o $(IntDir)\$(InputName).cu.c"
							DisplayName="Generate hybrid .c file  (-cuda)"
						/>
						<EnumValue
							Value="2"
							Switch="-gpu -o $(IntDir)\$(InputName).gpu"
							DisplayName="Generate .gpu file  (-gpu)"
						/>
						<EnumValue
							Value="3"
							Switch="-m32 -cubin -o data\$(InputName).cubin"
							DisplayName="Generate .cubin file  (-cubin)"
						/>
						<EnumValue
							Value="4"
							Switch="-ptx -o $(IntDir)\$(InputName).ptx"
							DisplayName="Generate .ptx file  (-ptx)"
						/>
					</Values>
				</EnumProperty>
				<EnumProperty
					Name="compileout"
					DisplayName="Compiler Output (obj/cubin)"
					Description="Sets output as an OBJ or cubin file"
					>
					<Values>
						<EnumValue
							Value="0"
							Switch="&quot;$(IntDir)/$(InputName).cu.obj&quot;"
							DisplayName="&quot;$(IntDir)/$(InputName).cu.obj&quot;"
						/>
						<EnumValue
							Value="1"
							Switch="&quot;data/$(InputName).cubin&quot;"
							DisplayName="&quot;data/$(InputName).cubin&quot;"
						/>
					</Values>
				</EnumProperty>
				<EnumProperty
					Name="Arch"
					DisplayName="GPU Architecture"
					Description="Select option for the GPU architecture to use on the command line (-arch sm_10, sm_11, sm_12, sm_13)"
					DefaultValue="10"
					>
					<Values>
						<EnumValue
							Value="10"
							Switch="-arch sm_10"
							DisplayName="sm_10"
						/>
						<EnumValue
							Value="11"
							Switch="-arch sm_11"
							DisplayName="sm_11"
						/>
						<EnumValue
							Value="12"
							Switch="-arch sm_12"
							DisplayName="sm_12"
						/>
						<EnumValue
							Value="13"
							Switch="-arch sm_13"
							DisplayName="sm_13"
						/>
					</Values>
				</EnumProperty>
				<EnumProperty
					Name="CompilerPath"
					DisplayName="Path to nvcc.exe"
					Description="Specifies the path to the CUDA compiler, nvcc.exe "
					>
					<Values>
						<EnumValue
							Value="0"
							Switch="&quot;$(CUDA_BIN_PATH)\nvcc.exe&quot;"
							DisplayName="Installed Toolkit (uses CUDA_BIN_PATH environment varible)"
						/>
						<EnumValue
							Value="1"
							Switch="&quot;[AlternateNvccPath]&quot;"
							DisplayName="Use Alternate path to CUDA, specified below"
						/>
					</Values>
				</EnumProperty>
				<StringProperty
					Name="AlternateNvccPath"
					DisplayName="Alternate path to nvcc.exe (non-standard installation)"
					Switch="[value]\nvcc.exe"
				/>
				<BooleanProperty
					Name="Emulation"
					DisplayName="Emulation Mode"
					Description="Whether or not to generate emulated code."
					Switch="-deviceemu -D_DEVICEEMU"
				/>
				<BooleanProperty
					Name="FastMath"
					DisplayName="Use Fast Math"
					Category="Default"
					Description="Make use of the fast math library."
					Switch="-use_fast_math"
				/>
				<IntegerProperty
					Name="MaxRegCount"
					DisplayName="maxrregcount"
					Switch="-maxrregcount=[Value]"
					DefaultValue="32"
				/>
				<BooleanProperty
					Name="PtxAsOptionV"
					DisplayName="PtxAsOptionV"
					Switch="--ptxas-options=-v"
				/>
				<StringProperty
					Name="ExtraNvccOptions"
					DisplayName="Extra Options"
					Description="Supply any additional command line options to NVCC"
					Switch="[value]"
				/>
				<StringProperty
					Name="Defines"
					DisplayName="Preprocessor Definitions"
					PropertyPageName="Preprocessor"
					Description="Specifies one or more preprocessor defines.  (-D[macro])"
					Switch="-D[value]"
					Delimited="true"
					Inheritable="true"
				/>
				<BooleanProperty
					Name="Keep"
					DisplayName="Keep preprocessed files (.ptx, .cubin, cudafe1.c, cudafe1.cpp, cudafe1.gpu, etc.)"
					PropertyPageName="Preprocessor"
					Description="Specifies that preprocessor files generated by the CUDA compiler are not deleted."
					Switch="--keep"
				/>
				<EnumProperty
					Name="Warning"
					DisplayName="Warning Level"
					PropertyPageName="Hybrid CUDA/C++ Options"
					Description="Select how strict you want the compiler to be about checking for potentially suspect constructs.   (/W0 - /W4)"
					DefaultValue="3"
					>
					<Values>
						<EnumValue
							Value="0"
							Switch="/W0"
							DisplayName="Off: Turn Off All Warnings (/W0)"
						/>
						<EnumValue
							Value="1"
							Switch="/W1"
							DisplayName="Level 1 (/W1)"
						/>
						<EnumValue
							Value="2"
							Switch="/W2"
							DisplayName="Level 2 (/W2)"
						/>
						<EnumValue
							Value="3"
							Switch="/W3"
							DisplayName="Level 3 (/W3)"
						/>
						<EnumValue
							Value="4"
							Switch="/W4"
							DisplayName="Level 4 (/W4)"
						/>
					</Values>
				</EnumProperty>
				<EnumProperty
					Name="Optimization"
					DisplayName="Optimization"
					Description="Select option for code optimization; choose Custom to use specific optimization options.  (/Od, /O1, /O2, /Ox)"
					DefaultValue="2"
					>
					<Values>
						<EnumValue
							Value="0"
							Switch="/Od"
							DisplayName="Disabled (/Od)"
						/>
						<EnumValue
							Value="1"
							Switch="/O1"
							DisplayName="Minimize Size (/O1)"
						/>
						<EnumValue
							Value="2"
							Switch="/O2"
							DisplayName="Maximize Speed (/O2)"
						/>
						<EnumValue
							Value="3"
							Switch="/Ox"
							DisplayName="Full Optimization (/Ox)"
						/>
					</Values>
				</EnumProperty>
			        <StringProperty
					Name="AddedDependencies"
					DisplayName="Source Dependencies"
					Description="Add additional CUDA file dependencies"
					Switch="[value]"
				/>
				<EnumProperty
					Name="RuntimeChecks"
					DisplayName="Basic Runtime Checks"
					PropertyPageName="Hybrid CUDA/C++ Options"
					Description="Perform basic runtime error checks, incompatible with any optimization type other than debug.   (/RTCs, /RTCu, /RTC1)"
					>
					<Values>
						<EnumValue
							Value="0"
							Switch=" "
							DisplayName="Default"
						/>
						<EnumValue
							Value="1"
							Switch="/RTCs"
							DisplayName="Stack Frames (/RTCs)"
						/>
						<EnumValue
							Value="2"
							Switch="/RTCu"
							DisplayName="Uninitialized Variables (/RTCu)"
						/>
						<EnumValue
							Value="3"
							Switch="/RTC1"
							DisplayName="Both (/RTC1, equiv. to /RTCsu)"
						/>
					</Values>
				</EnumProperty>
				<EnumProperty
					Name="Runtime"
					DisplayName="Runtime Library"
					PropertyPageName="Hybrid CUDA/C++ Options"
					Description="Specify runtime library for linking.   (/MT, /MTd, /MD, /MDd, /ML, /MLd)"
					>
					<Values>
						<EnumValue
							Value="0"
							Switch="/MT"
							DisplayName="Multi-Threaded (/MT)"
						/>
						<EnumValue
							Value="1"
							Switch="/MTd"
							DisplayName="Multi-Threaded Debug (/MTd)"
						/>
						<EnumValue
							Value="2"
							Switch="/MD"
							DisplayName="Multi-Threaded DLL (/MD)"
						/>
						<EnumValue
							Value="3"
							Switch="/MDd"
							DisplayName="Multi-Threaded Debug DLL (/MDd)"
						/>
						<EnumValue
							Value="4"
							Switch="/ML"
							DisplayName="Single-Threaded (/ML)"
						/>
						<EnumValue
							Value="5"
							Switch="/MLd"
							DisplayName="Single-Threaded Debug (/MLd)"
						/>
					</Values>
				</EnumProperty>
				<BooleanProperty
					Name="TypeInfo"
					DisplayName="Enable Run-Time Type Info"
					PropertyPageName="Hybrid CUDA/C++ Options"
					Description="Adds code for checking C++ object types at run time (runtime type information). (/GR)"
					Switch="/GR"
				/>
				<StringProperty
					Name="ExtraCppOptions"
					DisplayName="Extra C++ Options"
					PropertyPageName="Hybrid CUDA/C++ Options"
					Description="Supply any additional command line options to the host C++ compiler"
					Switch="[value]"
				/>
      </Properties>
		</CustomBuildRule>
	</Rules>
</VisualStudioToolFile>
