Skip to content

Instantly share code, notes, and snippets.

@scivision
Last active September 5, 2023 17:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save scivision/8e3070319f0577f7d3efcba863638cae to your computer and use it in GitHub Desktop.
Save scivision/8e3070319f0577f7d3efcba863638cae to your computer and use it in GitHub Desktop.
Debugging CMake Ninja generation for Fortran modules

CMake 3.27.x Ninja Fortran module bug

Since CMake 3.27.0, Ninja for Fortran modules doesn't get the module dependencies correct. As a Fortran project gets more modules, this will be seen more commonly depending on how many parallel workers build. This works fine with CMake 3.26.5 and earlier.

The symptoms is that while building a Fortran project, regardless of compiler, OS, or Ninja version, the dependencies between modules is not detected correctly and so for this example say "m2" tries to build before "m1", so "m2.f90" fails to build as it's missing module "m1.mod" that should have been built first from "m1.f90"

CMake 3.27.1 partly fixed this via https://gitlab.kitware.com/cmake/cmake/-/merge_requests/8651 but the issue still remains (though less noticable than in CMake 3.27.0, it still breaks Fortran projects with multiple Fortran modules, which is common).

I have included the "build.ninja" generated by CMake 3.26.5 and CMake 3.27.4 for comparison. These happened to be on Windows, using the Kitware downloads (NOT the MSYS2-patched CMake).

cmake -Bbuild -G Ninja
cmake --build build

Depending on number of CPU cores i.e. Ninja workers, the build errors result. To reproduce I run cmake --build build --clean-first a few times and it happens more than 50% of the time on a quad-core CPU laptop. For a bigger laptop with 8 CPUs or a workstation with 64 CPUs, build errors happen nearly 100% of the time.

For one experienced with Ninja generation from CMake, perhaps the "build.ninja" file differences help reveal the core issue behind this bug.

# CMAKE generated file: DO NOT EDIT!
# Generated by "Ninja" Generator, CMake Version 3.26
# This file contains all the build statements describing the
# compilation DAG.
# =============================================================================
# Write statements declared in CMakeLists.txt:
#
# Which is the root file.
# =============================================================================
# =============================================================================
# Project: LotOfModules
# Configurations:
# =============================================================================
#############################################
# Minimal version of Ninja required by this file
ninja_required_version = 1.5
# =============================================================================
# Include auxiliary files.
#############################################
# Include rules file.
include CMakeFiles/rules.ninja
# =============================================================================
#############################################
# Logical path to working directory; prefix for absolute paths.
cmake_ninja_workdir = C$:/temp/fourpi/build26/
# =============================================================================
# Object build statements for OBJECT_LIBRARY target m1
#############################################
# Order-only phony target for m1
build cmake_object_order_depends_target_m1: phony || CMakeFiles/m1.dir
build CMakeFiles/m1.dir/m1.f90-pp.f90 | CMakeFiles/m1.dir/m1.f90.obj.ddi: Fortran_PREPROCESS_SCAN__m1_ C$:/temp/fourpi/m1.f90 || cmake_object_order_depends_target_m1
DEP_FILE = CMakeFiles\m1.dir\m1.f90-pp.f90.d
DYNDEP_INTERMEDIATE_FILE = CMakeFiles\m1.dir\m1.f90.obj.ddi
OBJ_FILE = CMakeFiles\m1.dir\m1.f90.obj
build CMakeFiles/m1.dir/m1.f90.obj: Fortran_COMPILER__m1_scanned_ CMakeFiles/m1.dir/m1.f90-pp.f90 || CMakeFiles/m1.dir/Fortran.dd
FLAGS = -fpreprocessed
INCLUDES = -IC:\temp\fourpi
OBJECT_DIR = CMakeFiles\m1.dir
OBJECT_FILE_DIR = CMakeFiles\m1.dir
dyndep = CMakeFiles/m1.dir/Fortran.dd
build CMakeFiles/m1.dir/Fortran.dd: Fortran_DYNDEP__m1_ CMakeFiles/m1.dir/m1.f90.obj.ddi
#############################################
# Object library m1
build m1: phony CMakeFiles/m1.dir/m1.f90.obj
# =============================================================================
# Object build statements for OBJECT_LIBRARY target m2
#############################################
# Order-only phony target for m2
build cmake_object_order_depends_target_m2: phony || cmake_object_order_depends_target_m1
build CMakeFiles/m2.dir/m2.f90-pp.f90 | CMakeFiles/m2.dir/m2.f90.obj.ddi: Fortran_PREPROCESS_SCAN__m2_ C$:/temp/fourpi/m2.f90 || cmake_object_order_depends_target_m2
DEP_FILE = CMakeFiles\m2.dir\m2.f90-pp.f90.d
DYNDEP_INTERMEDIATE_FILE = CMakeFiles\m2.dir\m2.f90.obj.ddi
OBJ_FILE = CMakeFiles\m2.dir\m2.f90.obj
build CMakeFiles/m2.dir/m2.f90.obj: Fortran_COMPILER__m2_scanned_ CMakeFiles/m2.dir/m2.f90-pp.f90 || CMakeFiles/m2.dir/Fortran.dd
FLAGS = -fpreprocessed
INCLUDES = -IC:\temp\fourpi
OBJECT_DIR = CMakeFiles\m2.dir
OBJECT_FILE_DIR = CMakeFiles\m2.dir
dyndep = CMakeFiles/m2.dir/Fortran.dd
build CMakeFiles/m2.dir/Fortran.dd: Fortran_DYNDEP__m2_ CMakeFiles/m2.dir/m2.f90.obj.ddi || m1
#############################################
# Object library m2
build m2: phony CMakeFiles/m2.dir/m2.f90.obj
# =============================================================================
# Object build statements for OBJECT_LIBRARY target m3
#############################################
# Order-only phony target for m3
build cmake_object_order_depends_target_m3: phony || cmake_object_order_depends_target_m1 cmake_object_order_depends_target_m2
build CMakeFiles/m3.dir/m3.f90-pp.f90 | CMakeFiles/m3.dir/m3.f90.obj.ddi: Fortran_PREPROCESS_SCAN__m3_ C$:/temp/fourpi/m3.f90 || cmake_object_order_depends_target_m3
DEP_FILE = CMakeFiles\m3.dir\m3.f90-pp.f90.d
DYNDEP_INTERMEDIATE_FILE = CMakeFiles\m3.dir\m3.f90.obj.ddi
OBJ_FILE = CMakeFiles\m3.dir\m3.f90.obj
build CMakeFiles/m3.dir/m3.f90.obj: Fortran_COMPILER__m3_scanned_ CMakeFiles/m3.dir/m3.f90-pp.f90 || CMakeFiles/m3.dir/Fortran.dd
FLAGS = -fpreprocessed
INCLUDES = -IC:\temp\fourpi
OBJECT_DIR = CMakeFiles\m3.dir
OBJECT_FILE_DIR = CMakeFiles\m3.dir
dyndep = CMakeFiles/m3.dir/Fortran.dd
build CMakeFiles/m3.dir/Fortran.dd: Fortran_DYNDEP__m3_ CMakeFiles/m3.dir/m3.f90.obj.ddi || m1 m2
#############################################
# Object library m3
build m3: phony CMakeFiles/m3.dir/m3.f90.obj
# =============================================================================
# Object build statements for OBJECT_LIBRARY target m4
#############################################
# Order-only phony target for m4
build cmake_object_order_depends_target_m4: phony || cmake_object_order_depends_target_m1 cmake_object_order_depends_target_m2 cmake_object_order_depends_target_m3
build CMakeFiles/m4.dir/m4.f90-pp.f90 | CMakeFiles/m4.dir/m4.f90.obj.ddi: Fortran_PREPROCESS_SCAN__m4_ C$:/temp/fourpi/m4.f90 || cmake_object_order_depends_target_m4
DEP_FILE = CMakeFiles\m4.dir\m4.f90-pp.f90.d
DYNDEP_INTERMEDIATE_FILE = CMakeFiles\m4.dir\m4.f90.obj.ddi
OBJ_FILE = CMakeFiles\m4.dir\m4.f90.obj
build CMakeFiles/m4.dir/m4.f90.obj: Fortran_COMPILER__m4_scanned_ CMakeFiles/m4.dir/m4.f90-pp.f90 || CMakeFiles/m4.dir/Fortran.dd
FLAGS = -fpreprocessed
INCLUDES = -IC:\temp\fourpi
OBJECT_DIR = CMakeFiles\m4.dir
OBJECT_FILE_DIR = CMakeFiles\m4.dir
dyndep = CMakeFiles/m4.dir/Fortran.dd
build CMakeFiles/m4.dir/Fortran.dd: Fortran_DYNDEP__m4_ CMakeFiles/m4.dir/m4.f90.obj.ddi || m1 m2 m3
#############################################
# Object library m4
build m4: phony CMakeFiles/m4.dir/m4.f90.obj
# =============================================================================
# Object build statements for EXECUTABLE target main
#############################################
# Order-only phony target for main
build cmake_object_order_depends_target_main: phony || cmake_object_order_depends_target_m1 cmake_object_order_depends_target_m2 cmake_object_order_depends_target_m3 cmake_object_order_depends_target_m4
build CMakeFiles/main.dir/main.f90-pp.f90 | CMakeFiles/main.dir/main.f90.obj.ddi: Fortran_PREPROCESS_SCAN__main_ C$:/temp/fourpi/main.f90 || cmake_object_order_depends_target_main
DEP_FILE = CMakeFiles\main.dir\main.f90-pp.f90.d
DYNDEP_INTERMEDIATE_FILE = CMakeFiles\main.dir\main.f90.obj.ddi
OBJ_FILE = CMakeFiles\main.dir\main.f90.obj
build CMakeFiles/main.dir/main.f90.obj: Fortran_COMPILER__main_scanned_ CMakeFiles/main.dir/main.f90-pp.f90 || CMakeFiles/main.dir/Fortran.dd
FLAGS = -fpreprocessed
INCLUDES = -IC:\temp\fourpi
OBJECT_DIR = CMakeFiles\main.dir
OBJECT_FILE_DIR = CMakeFiles\main.dir
dyndep = CMakeFiles/main.dir/Fortran.dd
build CMakeFiles/main.dir/Fortran.dd: Fortran_DYNDEP__main_ CMakeFiles/main.dir/main.f90.obj.ddi || m1 m2 m3 m4
# =============================================================================
# Link build statements for EXECUTABLE target main
#############################################
# Link the executable main.exe
build main.exe: Fortran_EXECUTABLE_LINKER__main_ CMakeFiles/m4.dir/m4.f90.obj CMakeFiles/m3.dir/m3.f90.obj CMakeFiles/m2.dir/m2.f90.obj CMakeFiles/m1.dir/m1.f90.obj CMakeFiles/main.dir/main.f90.obj || m1 m2 m3 m4
OBJECT_DIR = CMakeFiles\main.dir
POST_BUILD = cd .
PRE_LINK = cd .
TARGET_FILE = main.exe
TARGET_IMPLIB = libmain.dll.a
TARGET_PDB = main.exe.dbg
#############################################
# Utility command for edit_cache
build CMakeFiles/edit_cache.util: CUSTOM_COMMAND
COMMAND = cmd.exe /C "cd /D C:\temp\fourpi\build26 && C:\cmake-3.26.5\bin\cmake-gui.exe -SC:\temp\fourpi -BC:\temp\fourpi\build26"
DESC = Running CMake cache editor...
pool = console
restat = 1
build edit_cache: phony CMakeFiles/edit_cache.util
#############################################
# Utility command for rebuild_cache
build CMakeFiles/rebuild_cache.util: CUSTOM_COMMAND
COMMAND = cmd.exe /C "cd /D C:\temp\fourpi\build26 && C:\cmake-3.26.5\bin\cmake.exe --regenerate-during-build -SC:\temp\fourpi -BC:\temp\fourpi\build26"
DESC = Running CMake to regenerate build system...
pool = console
restat = 1
build rebuild_cache: phony CMakeFiles/rebuild_cache.util
# =============================================================================
# Target aliases.
build main: phony main.exe
# =============================================================================
# Folder targets.
# =============================================================================
#############################################
# Folder: C:/temp/fourpi/build26
build all: phony m1 m2 m3 m4 main.exe
# =============================================================================
# Built-in targets
#############################################
# Re-run CMake if any of its inputs changed.
build build.ninja: RERUN_CMAKE | C$:/cmake-3.26.5/share/cmake-3.26/Modules/CMakeCommonLanguageInclude.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/CMakeFortranInformation.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/CMakeGenericSystem.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/CMakeInitializeConfigs.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/CMakeLanguageInformation.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/CMakeRCInformation.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/CMakeSystemSpecificInformation.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/CMakeSystemSpecificInitialize.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/Compiler/CMakeCommonCompilerMacros.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/Compiler/GNU-Fortran.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/Compiler/GNU.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/Platform/Windows-GNU-Fortran-ABI.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/Platform/Windows-GNU-Fortran.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/Platform/Windows-GNU.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/Platform/Windows-windres.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/Platform/Windows.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/Platform/WindowsPaths.cmake C$:/temp/fourpi/CMakeLists.txt CMakeCache.txt CMakeFiles/3.26.5/CMakeFortranCompiler.cmake CMakeFiles/3.26.5/CMakeRCCompiler.cmake CMakeFiles/3.26.5/CMakeSystem.cmake
pool = console
#############################################
# A missing CMake input file is not an error.
build C$:/cmake-3.26.5/share/cmake-3.26/Modules/CMakeCommonLanguageInclude.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/CMakeFortranInformation.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/CMakeGenericSystem.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/CMakeInitializeConfigs.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/CMakeLanguageInformation.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/CMakeRCInformation.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/CMakeSystemSpecificInformation.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/CMakeSystemSpecificInitialize.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/Compiler/CMakeCommonCompilerMacros.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/Compiler/GNU-Fortran.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/Compiler/GNU.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/Platform/Windows-GNU-Fortran-ABI.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/Platform/Windows-GNU-Fortran.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/Platform/Windows-GNU.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/Platform/Windows-windres.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/Platform/Windows.cmake C$:/cmake-3.26.5/share/cmake-3.26/Modules/Platform/WindowsPaths.cmake C$:/temp/fourpi/CMakeLists.txt CMakeCache.txt CMakeFiles/3.26.5/CMakeFortranCompiler.cmake CMakeFiles/3.26.5/CMakeRCCompiler.cmake CMakeFiles/3.26.5/CMakeSystem.cmake: phony
#############################################
# Clean all the built files.
build clean: CLEAN
#############################################
# Print all primary targets available.
build help: HELP
#############################################
# Make the all target the default.
default all
# CMAKE generated file: DO NOT EDIT!
# Generated by "Ninja" Generator, CMake Version 3.27
# This file contains all the build statements describing the
# compilation DAG.
# =============================================================================
# Write statements declared in CMakeLists.txt:
#
# Which is the root file.
# =============================================================================
# =============================================================================
# Project: LotOfModules
# Configurations:
# =============================================================================
#############################################
# Minimal version of Ninja required by this file
ninja_required_version = 1.5
# =============================================================================
# Include auxiliary files.
#############################################
# Include rules file.
include CMakeFiles/rules.ninja
# =============================================================================
#############################################
# Logical path to working directory; prefix for absolute paths.
cmake_ninja_workdir = C$:/temp/fourpi/build/
# =============================================================================
# Object build statements for OBJECT_LIBRARY target m1
#############################################
# Order-only phony target for m1
build cmake_object_order_depends_target_m1: phony || CMakeFiles/m1.dir
build CMakeFiles/m1.dir/m1.f90-pp.f90 | CMakeFiles/m1.dir/m1.f90.obj.ddi: Fortran_PREPROCESS_SCAN__m1_ C$:/temp/fourpi/m1.f90 || cmake_object_order_depends_target_m1
DEP_FILE = CMakeFiles\m1.dir\m1.f90-pp.f90.d
DYNDEP_INTERMEDIATE_FILE = CMakeFiles\m1.dir\m1.f90.obj.ddi
OBJ_FILE = CMakeFiles\m1.dir\m1.f90.obj
build CMakeFiles/m1.dir/m1.f90.obj: Fortran_COMPILER__m1_scanned_ CMakeFiles/m1.dir/m1.f90-pp.f90 || CMakeFiles/m1.dir/Fortran.dd
FLAGS = -fpreprocessed
INCLUDES = -IC:\temp\fourpi
OBJECT_DIR = CMakeFiles\m1.dir
OBJECT_FILE_DIR = CMakeFiles\m1.dir
dyndep = CMakeFiles/m1.dir/Fortran.dd
build CMakeFiles/m1.dir/Fortran.dd | C$:/temp/fourpi/build/CMakeFiles/m1.dir/FortranModules.json: Fortran_DYNDEP__m1_ CMakeFiles/m1.dir/m1.f90.obj.ddi
#############################################
# Object library m1
build m1: phony CMakeFiles/m1.dir/m1.f90.obj
# =============================================================================
# Object build statements for OBJECT_LIBRARY target m2
#############################################
# Order-only phony target for m2
build cmake_object_order_depends_target_m2: phony || cmake_object_order_depends_target_m1
build CMakeFiles/m2.dir/m2.f90-pp.f90 | CMakeFiles/m2.dir/m2.f90.obj.ddi: Fortran_PREPROCESS_SCAN__m2_ C$:/temp/fourpi/m2.f90 || cmake_object_order_depends_target_m2
DEP_FILE = CMakeFiles\m2.dir\m2.f90-pp.f90.d
DYNDEP_INTERMEDIATE_FILE = CMakeFiles\m2.dir\m2.f90.obj.ddi
OBJ_FILE = CMakeFiles\m2.dir\m2.f90.obj
build CMakeFiles/m2.dir/m2.f90.obj: Fortran_COMPILER__m2_scanned_ CMakeFiles/m2.dir/m2.f90-pp.f90 || CMakeFiles/m2.dir/Fortran.dd
FLAGS = -fpreprocessed
INCLUDES = -IC:\temp\fourpi
OBJECT_DIR = CMakeFiles\m2.dir
OBJECT_FILE_DIR = CMakeFiles\m2.dir
dyndep = CMakeFiles/m2.dir/Fortran.dd
build CMakeFiles/m2.dir/Fortran.dd | C$:/temp/fourpi/build/CMakeFiles/m2.dir/FortranModules.json: Fortran_DYNDEP__m2_ CMakeFiles/m2.dir/m2.f90.obj.ddi
#############################################
# Object library m2
build m2: phony CMakeFiles/m2.dir/m2.f90.obj
# =============================================================================
# Object build statements for OBJECT_LIBRARY target m3
#############################################
# Order-only phony target for m3
build cmake_object_order_depends_target_m3: phony || cmake_object_order_depends_target_m1 cmake_object_order_depends_target_m2
build CMakeFiles/m3.dir/m3.f90-pp.f90 | CMakeFiles/m3.dir/m3.f90.obj.ddi: Fortran_PREPROCESS_SCAN__m3_ C$:/temp/fourpi/m3.f90 || cmake_object_order_depends_target_m3
DEP_FILE = CMakeFiles\m3.dir\m3.f90-pp.f90.d
DYNDEP_INTERMEDIATE_FILE = CMakeFiles\m3.dir\m3.f90.obj.ddi
OBJ_FILE = CMakeFiles\m3.dir\m3.f90.obj
build CMakeFiles/m3.dir/m3.f90.obj: Fortran_COMPILER__m3_scanned_ CMakeFiles/m3.dir/m3.f90-pp.f90 || CMakeFiles/m3.dir/Fortran.dd
FLAGS = -fpreprocessed
INCLUDES = -IC:\temp\fourpi
OBJECT_DIR = CMakeFiles\m3.dir
OBJECT_FILE_DIR = CMakeFiles\m3.dir
dyndep = CMakeFiles/m3.dir/Fortran.dd
build CMakeFiles/m3.dir/Fortran.dd | C$:/temp/fourpi/build/CMakeFiles/m3.dir/FortranModules.json: Fortran_DYNDEP__m3_ CMakeFiles/m3.dir/m3.f90.obj.ddi
#############################################
# Object library m3
build m3: phony CMakeFiles/m3.dir/m3.f90.obj
# =============================================================================
# Object build statements for OBJECT_LIBRARY target m4
#############################################
# Order-only phony target for m4
build cmake_object_order_depends_target_m4: phony || cmake_object_order_depends_target_m1 cmake_object_order_depends_target_m2 cmake_object_order_depends_target_m3
build CMakeFiles/m4.dir/m4.f90-pp.f90 | CMakeFiles/m4.dir/m4.f90.obj.ddi: Fortran_PREPROCESS_SCAN__m4_ C$:/temp/fourpi/m4.f90 || cmake_object_order_depends_target_m4
DEP_FILE = CMakeFiles\m4.dir\m4.f90-pp.f90.d
DYNDEP_INTERMEDIATE_FILE = CMakeFiles\m4.dir\m4.f90.obj.ddi
OBJ_FILE = CMakeFiles\m4.dir\m4.f90.obj
build CMakeFiles/m4.dir/m4.f90.obj: Fortran_COMPILER__m4_scanned_ CMakeFiles/m4.dir/m4.f90-pp.f90 || CMakeFiles/m4.dir/Fortran.dd
FLAGS = -fpreprocessed
INCLUDES = -IC:\temp\fourpi
OBJECT_DIR = CMakeFiles\m4.dir
OBJECT_FILE_DIR = CMakeFiles\m4.dir
dyndep = CMakeFiles/m4.dir/Fortran.dd
build CMakeFiles/m4.dir/Fortran.dd | C$:/temp/fourpi/build/CMakeFiles/m4.dir/FortranModules.json: Fortran_DYNDEP__m4_ CMakeFiles/m4.dir/m4.f90.obj.ddi
#############################################
# Object library m4
build m4: phony CMakeFiles/m4.dir/m4.f90.obj
# =============================================================================
# Object build statements for EXECUTABLE target main
#############################################
# Order-only phony target for main
build cmake_object_order_depends_target_main: phony || cmake_object_order_depends_target_m1 cmake_object_order_depends_target_m2 cmake_object_order_depends_target_m3 cmake_object_order_depends_target_m4
build CMakeFiles/main.dir/main.f90-pp.f90 | CMakeFiles/main.dir/main.f90.obj.ddi: Fortran_PREPROCESS_SCAN__main_ C$:/temp/fourpi/main.f90 || cmake_object_order_depends_target_main
DEP_FILE = CMakeFiles\main.dir\main.f90-pp.f90.d
DYNDEP_INTERMEDIATE_FILE = CMakeFiles\main.dir\main.f90.obj.ddi
OBJ_FILE = CMakeFiles\main.dir\main.f90.obj
build CMakeFiles/main.dir/main.f90.obj: Fortran_COMPILER__main_scanned_ CMakeFiles/main.dir/main.f90-pp.f90 || CMakeFiles/main.dir/Fortran.dd
FLAGS = -fpreprocessed
INCLUDES = -IC:\temp\fourpi
OBJECT_DIR = CMakeFiles\main.dir
OBJECT_FILE_DIR = CMakeFiles\main.dir
dyndep = CMakeFiles/main.dir/Fortran.dd
build CMakeFiles/main.dir/Fortran.dd | C$:/temp/fourpi/build/CMakeFiles/main.dir/FortranModules.json: Fortran_DYNDEP__main_ CMakeFiles/main.dir/main.f90.obj.ddi | C$:/temp/fourpi/build/CMakeFiles/m4.dir/FortranModules.json C$:/temp/fourpi/build/CMakeFiles/m3.dir/FortranModules.json C$:/temp/fourpi/build/CMakeFiles/m2.dir/FortranModules.json C$:/temp/fourpi/build/CMakeFiles/m1.dir/FortranModules.json
# =============================================================================
# Link build statements for EXECUTABLE target main
#############################################
# Link the executable main.exe
build main.exe: Fortran_EXECUTABLE_LINKER__main_ CMakeFiles/m4.dir/m4.f90.obj CMakeFiles/m3.dir/m3.f90.obj CMakeFiles/m2.dir/m2.f90.obj CMakeFiles/m1.dir/m1.f90.obj CMakeFiles/main.dir/main.f90.obj || m1 m2 m3 m4
OBJECT_DIR = CMakeFiles\main.dir
POST_BUILD = cd .
PRE_LINK = cd .
TARGET_FILE = main.exe
TARGET_IMPLIB = libmain.dll.a
TARGET_PDB = main.exe.dbg
#############################################
# Utility command for edit_cache
build CMakeFiles/edit_cache.util: CUSTOM_COMMAND
COMMAND = cmd.exe /C "cd /D C:\temp\fourpi\build && C:\cmake-3.27.4\bin\cmake-gui.exe -SC:\temp\fourpi -BC:\temp\fourpi\build"
DESC = Running CMake cache editor...
pool = console
restat = 1
build edit_cache: phony CMakeFiles/edit_cache.util
#############################################
# Utility command for rebuild_cache
build CMakeFiles/rebuild_cache.util: CUSTOM_COMMAND
COMMAND = cmd.exe /C "cd /D C:\temp\fourpi\build && C:\cmake-3.27.4\bin\cmake.exe --regenerate-during-build -SC:\temp\fourpi -BC:\temp\fourpi\build"
DESC = Running CMake to regenerate build system...
pool = console
restat = 1
build rebuild_cache: phony CMakeFiles/rebuild_cache.util
# =============================================================================
# Target aliases.
build main: phony main.exe
# =============================================================================
# Folder targets.
# =============================================================================
#############################################
# Folder: C:/temp/fourpi/build
build all: phony m1 m2 m3 m4 main.exe
# =============================================================================
# Built-in targets
#############################################
# Re-run CMake if any of its inputs changed.
build build.ninja: RERUN_CMAKE | C$:/cmake-3.27.4/share/cmake-3.27/Modules/CMakeCommonLanguageInclude.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/CMakeFortranInformation.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/CMakeGenericSystem.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/CMakeInitializeConfigs.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/CMakeLanguageInformation.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/CMakeRCInformation.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/CMakeSystemSpecificInformation.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/CMakeSystemSpecificInitialize.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/Compiler/CMakeCommonCompilerMacros.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/Compiler/GNU-Fortran.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/Compiler/GNU.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/Platform/Windows-GNU-Fortran-ABI.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/Platform/Windows-GNU-Fortran.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/Platform/Windows-GNU.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/Platform/Windows-Initialize.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/Platform/Windows-windres.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/Platform/Windows.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/Platform/WindowsPaths.cmake C$:/temp/fourpi/CMakeLists.txt CMakeCache.txt CMakeFiles/3.27.4/CMakeFortranCompiler.cmake CMakeFiles/3.27.4/CMakeRCCompiler.cmake CMakeFiles/3.27.4/CMakeSystem.cmake
pool = console
#############################################
# A missing CMake input file is not an error.
build C$:/cmake-3.27.4/share/cmake-3.27/Modules/CMakeCommonLanguageInclude.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/CMakeFortranInformation.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/CMakeGenericSystem.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/CMakeInitializeConfigs.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/CMakeLanguageInformation.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/CMakeRCInformation.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/CMakeSystemSpecificInformation.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/CMakeSystemSpecificInitialize.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/Compiler/CMakeCommonCompilerMacros.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/Compiler/GNU-Fortran.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/Compiler/GNU.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/Platform/Windows-GNU-Fortran-ABI.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/Platform/Windows-GNU-Fortran.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/Platform/Windows-GNU.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/Platform/Windows-Initialize.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/Platform/Windows-windres.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/Platform/Windows.cmake C$:/cmake-3.27.4/share/cmake-3.27/Modules/Platform/WindowsPaths.cmake C$:/temp/fourpi/CMakeLists.txt CMakeCache.txt CMakeFiles/3.27.4/CMakeFortranCompiler.cmake CMakeFiles/3.27.4/CMakeRCCompiler.cmake CMakeFiles/3.27.4/CMakeSystem.cmake: phony
#############################################
# Clean all the built files.
build clean: CLEAN
#############################################
# Print all primary targets available.
build help: HELP
#############################################
# Make the all target the default.
default all
cmake_minimum_required(VERSION 3.10)
project(LotOfModules LANGUAGES Fortran)
message(STATUS "CMake ${CMAKE_VERSION}")
add_library(m1 OBJECT m1.f90)
add_library(m2 OBJECT m2.f90)
target_link_libraries(m2 PRIVATE m1)
add_library(m3 OBJECT m3.f90)
target_link_libraries(m3 PRIVATE m2)
add_library(m4 OBJECT m4.f90)
target_link_libraries(m4 PRIVATE m3)
add_executable(main main.f90)
target_link_libraries(main PRIVATE m4 m3 m2 m1)
module m1
implicit none
contains
pure real function pi()
pi = 4*atan(1.)
end function
end module m1
module m2
use m1, only : pi
implicit none
contains
pure real function twopi()
twopi = 2*pi()
end function
end module
module m3
use m2, only : twopi
implicit none
contains
pure real function fourpi()
fourpi = 2*twopi()
end function
end module
module m4
use m3, only : fourpi
implicit none
contains
pure real function halfpi()
halfpi = fourpi() / 8.0
end function
end module
program main
use m1, only : pi
use m4, only : halfpi
implicit none
real :: rpi, rhalfpi
rpi = pi() / 2
rhalfpi = halfpi()
print '(a,ES15.8)', 'floating point precision loss: ', rpi - rhalfpi
end program
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment