2011/5/3 Brad King <[email protected]>: > On 04/28/2011 02:24 PM, Nicolas Desprès wrote: >> Ninja accepts only one command per rule contrary to make. >> So when several commands must be called (for example: ar and ranlib), >> one possibility is to bundle the commands in a cmake scripts > > Instead of trying to pass this all through CMake language syntax and > the execute_process command, I suggest you create a dedicated internal > interface for it. See for example the cmake::ExecuteLinkScript method > and the calls to it already used to execute long linker command lines. >
I have tried to use it in the first place. But I would like to use generic ninja rules short and to use the per target variable overloading system provided by Ninja. Here an example for an helloworld with a static and a shared library: # Rule for compiling CXX files. rule CXX_COMPILER command = /usr/lib/ccache/g++ $CXX_DEFINES $CXX_FLAGS -o $out -c $in description = Building CXX object $out # Rule for linking CXX static library. rule CXX_STATIC_LIBRARY_LINKER command = /usr/bin/ar cr $out $LDFLAGS $in && /usr/bin/ranlib $out description = Linking CXX static library $out # Rule for linking CXX executable. rule CXX_EXECUTABLE_LINKER command = /usr/lib/ccache/g++ $CXX_FLAGS $LDFLAGS $in -o $out $LDLIBS description = Linking CXX executable $out # Rule for linking CXX shared library. rule CXX_SHARED_LIBRARY_LINKER command = /usr/lib/ccache/g++ -fPIC $CXX_FLAGS $LDFLAGS -shared -Wl,-soname,$SONAME -o $out $in $LDLIBS description = Linking CXX shared library $out # Not that I can overload the CXX_FLAGS variable for each build statement. build CMakeFiles/greeting.dir/src/greeting/greeting.cc.o: CXX_COMPILER /home/despre_n/src/test/helloworld-static-cmake/src/greeting/greeting.cc CXX_FLAGS = -g -I/home/despre_n/src/test/helloworld-static-cmake/src build libgreeting.a: CXX_STATIC_LIBRARY_LINKER CMakeFiles/greeting.dir/src/greeting/greeting.cc.o CXX_FLAGS = -g SONAME = libgreeting.a build helloworld: CXX_EXECUTABLE_LINKER CMakeFiles/helloworld.dir/src/main.cc.o libgreeting.a CXX_FLAGS = -g LDLIBS = -rdynamic I will try to think more about it. Maybe generating something like this using implicit shared library would work would work: # Rule for linking CXX static library. rule CXX_STATIC_LIBRARY_LINKER command = $CMAKE_COMMAND -E cmake_link_script $in --verbose=$VERBOSE description = Linking CXX static library $out build libgreeting.a: CXX_STATIC_LIBRARY_LINKER CMakeFiles/greeting.dir/link.txt | CMakeFiles/greeting.dir/src/greeting/greeting.cc.o But implicit dependencies have not exactly the same meaning of explicit depencies (which appears in the $in variable). Here the documentation http://martine.github.com/ninja/manual.html#_build_dependencies Also there are some discussion about changing this behavior and to make implicit dependencies similar to explicit ones expect that they don't appears in the $in variables. http://groups.google.com/group/ninja-build/browse_thread/thread/b0c239b63e04287e For custom targets and custom commands calling several commands I will have to generate cmake script anyway expect if Ninja changes is behavior: http://groups.google.com/group/ninja-build/browse_thread/thread/d7c0fffa54ab76ba Thanks for the advices. -- Nicolas Desprès _______________________________________________ cmake-developers mailing list [email protected] http://public.kitware.com/cgi-bin/mailman/listinfo/cmake-developers
