[cmake-developers] Fortran support for Ninja generator
Steven Vancoillie
steven.vancoillie at teokem.lu.se
Wed Mar 25 09:37:00 EDT 2015
On Mar 24 [11:21], Brad King wrote:
> On 03/24/2015 05:46 AM, Nils Gladitz wrote:
> > I am not very familiar with fortran myself but there was this discussion
> > on the ninja mailing list that implied that this might also require
> > changes to ninja itself:
> >
> > https://groups.google.com/d/msg/ninja-build/b1-AF3pRJuE/NkPDsO0C2IUJ
>
> That discussion concludes assuming that CMake scans source files
> while generating the build files to generate the ordering dependencies.
> It does not. There could be generated source files or header files
> that are needed to get the ordering right. In the Makefile generator
> we have a step to scan dependencies for a target after all its
> dependencies are finished and its custom commands have executed.
> This ensures generated files are available. Then CMake puts the
> dependency scanning results in a place used by the actual compile
> and link rules.
>
> [snip]
>
> I've been thinking about some ideas on how build.ninja rules
> could express the dynamic scanning and update we need. Rather
> than posting them now, perhaps the design process would benefit
> from any independently developed ideas you may have.
>From what I understood from the conclusion of the discussion is indeed
that it would require cmake to generate dependency files at build
time. In a test setup, I have the following:
build CMakeFiles/testninja.dir/prog.o.d: Fortran_DEPENDS_SCAN ../prog.f90
build CMakeFiles/testninja.dir/prog.o: Fortran_COMPILER ../prog.f90 | CMakeFiles/testninja.dir/prog.o.d
DEP_FILE = CMakeFiles/testninja.dir/prog.o.d
FLAGS = -cpp -I../
OBJECT_DIR = CMakeFiles/testninja.dir
OBJECT_FILE_DIR = CMakeFiles/testninja.dir
build ...
build ...
I skipped all the other files, but the pattern is the same.
Then, there are these rules:
rule Fortran_DEPENDS_SCAN
command = f90deps $in $out
description = Write Fortran dependencies to $out
rule Fortran_COMPILER
depfile = $DEP_FILE
deps = gcc
command = /usr/bin/f95 $DEFINES $FLAGS -c $in -o $out
description = Building Fortran object $out
In this case, a script 'f90deps' does the dependencies on the fly.
Note that the Fortran_COMPILER rule is now missing any -MMD/-MT stuff.
So, to do a similar thing with cmake, one would need to expose the
cmake Fortran dependency scanner so that it can be invoked as e.g.:
rule Fortran_DEPENDS_SCAN
command = cmake scan_dependencies $in $out
description = Write Fortran dependencies to $out
but I don't know if turning the cmake executable into a build-time
dependency scanner is feasible and/or acceptable.
Steven
More information about the cmake-developers
mailing list