[CMake] ADD_CUSTOM_COMMAND and Visual Studio 2010

Michael Wild themiwi at gmail.com
Wed Mar 31 08:40:22 EDT 2010


Well, VS-2010 isn't even released so far... Which exact version of CMake are you using by the way? 2.8 or 2.8.1? If I remember correctly, there were some improvements in 2.8.1 w.r.t. VS-2010.

Michael


On 31. Mar, 2010, at 14:28 , elizabeta petreska wrote:

> If I use Visual Studio 2005 generator everything works well.
> 
> But, it seems that Visual Studio 2005 does not require the input file ( in
> this case foo.txt.rule ) to Custom Build Step to exist on disk. So the
> Visual Studio 2005 generator never makes foo.txt.rule to the disk, but the
> whole thing still works.
> 
> While in Visual Studio 2010 it seems that the input file to custom build
> step must exist on disk.
> 
> I tested this with defining Custom Build Steps directly through The Visual
> Studio 2005 and Visual studio 2010 IDE.
> 
> So , someone can say is this a bug in the Visual Studio 2010 generator?
> 
> thank you
> 
> 
> On Wed, Mar 31, 2010 at 2:09 PM, Michael Wild <themiwi at gmail.com> wrote:
> 
>> CC-ing back to the mailing list...
>> 
>> Sorry, I don't know why this fails and I don't have VS-2010 around. What
>> happens if you use a different generator?
>> 
>> Michael
>> 
>> On 31. Mar, 2010, at 14:05 , elizabeta petreska wrote:
>> 
>>> Hello
>>> 
>>> Thank you for the reply.
>>> I test your suggestion.
>>> It still generates foo.txt every time I build the solution.
>>> 
>>> I think that this behavior is because foo.txt.rule file is not generated
>> i.e
>>> doesnot exist on disk. Here is the relevant part in the generated
>> .vcxproj
>>> project file :
>>> 
>>> 
>>> <CustomBuild Include="$(Configuration)\Foo.txt.rule"> // Foo.txt.rule
>>> doesnot exist
>>> 
>>>     <Message
>>> Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Generating
>>> $(Configuration)/Foo.txt</Message>
>>> 
>>>    <Command
>> Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">echo
>>> Foo &gt; C:/project2/build_cmake_vs10/$(Configuration)/Foo.txt</Command>
>>> 
>>>     <AdditionalInputs
>>> 
>> Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">C:project2/build_cmake_vs10/$(Configuration)/Foo.txt.rule;C:project2\myfile.txt;%(AdditionalInputs)</AdditionalInputs>
>>> 
>>>     <Outputs
>>> 
>> Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">C:\project2\build_cmake_vs10\$(Configuration)\Foo.txt;%(Outputs)</Outputs>
>>> 
>>> 
>>> If I change the add_custom_command to the following then foo.txt.rule is
>>> made by cmake, and  it works :
>>> 
>>> set(outfile "Foo.txt")
>>> add_custom_command(OUTPUT "${outfile}"
>>> COMMAND echo Foo > "${outfile}"
>>> DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/myfile.txt"
>>> )
>>> add_custom_target(Foo DEPENDS "${outfile}")
>>> 
>>> In this case it works because foo.txt.rule is made by cmake on disk in
>> the
>>> folder ${CMAKE_CURRENT_BINARY_DIR} i.e C:\project2\build_cmake_vs10
>>> 
>>> Someone can say what is the difference if I use CMAKE_CFG_INTDIR  in the
>>> outputs of add_custom_command.
>>> 
>>> Thanks
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> On Wed, Mar 31, 2010 at 1:27 PM, Michael Wild <themiwi at gmail.com> wrote:
>>> 
>>>> 
>>>> On 31. Mar, 2010, at 12:07 , elizabeta petreska wrote:
>>>> 
>>>>> Hello
>>>>> 
>>>>> I am using cmake 2.8 to generate Visual Studio 2010 solution files.
>>>>> 
>>>>> I have the following cmakelists.txt :
>>>>> 
>>>>> set(PROJECT_NAME Test2)
>>>>> PROJECT(${PROJECT_NAME})
>>>>> 
>>>>> FILE(GLOB Test_SRCS
>>>>> main.cpp
>>>>> )
>>>>> 
>>>>> 
>>>>> ADD_EXECUTABLE(${PROJECT_NAME}
>>>>> ${Test_SRCS}
>>>>> )
>>>>> 
>>>>> 
>>>>> ADD_CUSTOM_COMMAND (OUTPUT "$(ConfigurationName)/Foo.txt"
>>>>>     COMMAND echo Foo >  "$(ConfigurationName)/Foo.txt"
>>>>>     DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/myfile.txt
>>>>> )
>>>>> ADD_CUSTOM_TARGET (Foo DEPENDS "$(ConfigurationName)/Foo.txt")
>>>>> ADD_DEPENDENCIES(${PROJECT_NAME} Foo)
>>>>> 
>>>>> The problem is that Foo.txt is generated on every build on the solution
>>>>> although myfile.txt is not changed.
>>>> 
>>>> Use absolute paths in the OUTPUT and DEPENDS options. And you should
>> also
>>>> use the CMAKE_CFG_INTDIR variable instead of $(ConfigurationName)...
>>>> 
>>>> set(outfile "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/Foo.txt")
>>>> add_custom_command(OUTPUT "${outfile}"
>>>> COMMAND echo Foo > "${outfile}"
>>>> DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/myfile.txt"
>>>> )
>>>> add_custom_target(Foo DEPENDS "${outfile}")
>>>> 
>>>> 
>>>> HTH
>>>> 
>>>> Michael
>> 
>> 



More information about the CMake mailing list