[CMake] adding dependencies on generated files to source code files
J Decker
d3ck0r at gmail.com
Mon Mar 8 23:15:08 EST 2010
On Mon, Mar 8, 2010 at 6:28 PM, Tony Bridges <nabridges at gmail.com> wrote:
> Hi All,
>
> The problem is : the files that are generated are not dependencies of the
> top level target (as discussed in the article), they are dependencies of
> another source file because they are generated includes. If I add the
> dependency to the executable, there’s no guarantee that the order will be
> correct, from what I see.
>
I think pretty much dependencies are handled in-order... unless there
is something specifically that requires something else before the
first thing.
>
>
> i.e.
>
> message compiler runs in directory A, produces a .txt output containing
> string definitions.
>
> Generated file is included into an RC file in directory B, within the
> correct RC context.
>
>
>
> The piece I’m missing is how to hook a source file as a top level target,
> without having to reimplement the compilation phase as a custom rule.
>
it does seem that sources are not targets... but the target they are
built into can depend on other targets, which get built before sources
are compiled?
>
>
> The makefile equivalent of all this is very simply :
>
> myResource.rc : externalGeneratedFile.txt
>
>
>
> This feels like fairly common usage, so I’m sure I’ve just missed something,
> but I’m not sure what.
>
> many thanks
>
I was just playing with this...
cmake_minimum_required(VERSION 2.8)
set( FAKE source.h )
#this would be text->.h
add_custom_command( OUTPUT source.h
#DEPENDS ${SACK_BASE}/all_resources.rc
COMMAND echo \#include \"stdio.h\" >source.h
)
# this would be .h used by
add_custom_command( OUTPUT main.c
DEPENDS source.h
COMMAND echo int main( void ) { return 1\; } >main.c
)
ADD_CUSTOM_TARGET( generate_foo DEPENDS main.c )
# have to touch filea.c fileb.c and filec.c yourself... for brevity...
set( SOURCES main.c filea.c fileb.c filec.c )
add_executable( main ${SOURCES} )
# this pretty much makes sure that the header is generated before
other tings are compiled.
add_dependencies( main generate_foo )
# output after a make clean...
[ 0%] Generating source.h
[ 0%] Generating main.c
[ 25%] Built target generate_foo
[ 37%] Building C object CMakeFiles/main.dir/main.c.obj
[ 50%] Building C object CMakeFiles/main.dir/a.c.obj
[ 62%] Building C object CMakeFiles/main.dir/b.c.obj
[ 75%] Building C object CMakeFiles/main.dir/c.c.obj
Linking C executable main.exe
[100%] Built target main
# next output...
M:\tmp\zz\zz>make
[ 25%] Built target generate_foo
[100%] Built target main
> /t
>
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the CMake FAQ at:
> http://www.cmake.org/Wiki/CMake_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.cmake.org/mailman/listinfo/cmake
>
More information about the CMake
mailing list