153 lines
5.4 KiB
CMake
153 lines
5.4 KiB
CMake
# - Validate sources listed in sources.cmake with those on disk
|
|
# This file is configured by Geant4 to locate all sources.cmake files in
|
|
# the source tree used by the current build tree.
|
|
#
|
|
# We have to parse the sources.cmake files for the headers and sources
|
|
# because these files use the include_directories command, which is non
|
|
# scriptable. A simple REGEX is used to find all the .cc, .hh and .icc
|
|
# files listed in eah sources.cmake file. These lists are compared with
|
|
# a GLOB of those in the include and src directories of the module
|
|
# corresponding to the sources.cmake file.
|
|
#
|
|
# Warnings are printed when a mismatch is detected.
|
|
#
|
|
# Note that certain modules have configurable source lists and so we
|
|
# expect these to show a mismatch. We allow for this by providing the
|
|
# variable:
|
|
#
|
|
# GEANT4_FALSEPOSITIVE_SOURCES List of all source files (.cc, .hh, .icc)
|
|
# that may result in false positive mismatch.
|
|
#
|
|
# As this file is configured by Geant4's CMake system the generated
|
|
# file "geant4_validate_sources.cmake" SHOULD NOT BE EDITED
|
|
#
|
|
|
|
#-----------------------------------------------------------------------
|
|
# List all sources that we know cause false positives, e.g. obsolete,
|
|
# but still on disk
|
|
#
|
|
set(GEANT4_FALSEPOSITIVE_SOURCES
|
|
# - Xaw is deprecated...
|
|
G4UIXaw.hh
|
|
G4UIXaw.cc
|
|
# - OpenGL Wt not yet supported....
|
|
G4OpenGLImmediateWt.hh
|
|
G4OpenGLImmediateWtViewer.hh
|
|
G4OpenGLWtViewer.hh
|
|
G4OpenGLImmediateWt.cc
|
|
G4OpenGLImmediateWtViewer.cc
|
|
G4OpenGLWtViewer.cc
|
|
# - VRML has icc files in the src/ directory. These are only used
|
|
# internally but validate_sources assumes icc files will be in
|
|
# include/
|
|
# They are covered in sources.cmake though!
|
|
G4VRML1SceneHandlerFunc.icc
|
|
G4VRML2SceneHandlerFunc.icc
|
|
# - Documentation of processes/hadronic/models/cascade/cascade
|
|
# lists some sources in in comments. These do not correspond to
|
|
# real sources so we can safely filter them
|
|
# TODO : Improve regex to identify comments!!!!
|
|
T1xxChannel.cc
|
|
XXChannel.cc
|
|
)
|
|
|
|
#-----------------------------------------------------------------------
|
|
# First locate our current source tree
|
|
#
|
|
set(GEANT4_SOURCE_TREE "/work/leverington/geant4.10.1-build/source")
|
|
message(STATUS "Scanning source tree ${GEANT4_SOURCE_TREE}")
|
|
|
|
#-----------------------------------------------------------------------
|
|
# Now find all of the sources.cmake files...
|
|
#
|
|
file(GLOB_RECURSE GEANT4_SOURCESCMAKE_FILES
|
|
${GEANT4_SOURCE_TREE}/*/sources.cmake
|
|
)
|
|
list(LENGTH GEANT4_SOURCESCMAKE_FILES GEANT4_SOURCESCMAKE_COUNT)
|
|
message(STATUS "Located ${GEANT4_SOURCESCMAKE_COUNT} sources.cmake files")
|
|
|
|
#-----------------------------------------------------------------------
|
|
# Parse each modules and process...
|
|
#
|
|
foreach(_sourcesfile ${GEANT4_SOURCESCMAKE_FILES})
|
|
# - Where are we?
|
|
get_filename_component(_sourcesfile_location ${_sourcesfile} PATH)
|
|
|
|
# - Find on disk files...
|
|
file(GLOB
|
|
_ondisk_hh
|
|
RELATIVE ${_sourcesfile_location}/include
|
|
${_sourcesfile_location}/include/*.hh
|
|
${_sourcesfile_location}/include/*.icc
|
|
)
|
|
file(GLOB
|
|
_ondisk_cc
|
|
RELATIVE ${_sourcesfile_location}/src
|
|
${_sourcesfile_location}/src/*.cc
|
|
)
|
|
|
|
# - Find files listed in sources.cmake
|
|
# Ouch, we have to use a READ, because we can't load the module directly
|
|
# due to it using the non scriptable command include_directories.
|
|
file(READ ${_sourcesfile} _sourcesfile_contents)
|
|
string(REGEX MATCHALL "[A-Z0-9a-z_]+\\.cc" _sources_cc "${_sourcesfile_contents}")
|
|
string(REGEX MATCHALL "[A-Z0-9a-z_]+\\.(hh|icc)" _sources_hh "${_sourcesfile_contents}")
|
|
|
|
# - If we take the difference of each list (in both directions),
|
|
# then there should be no mismatch if resulting lists are empty.
|
|
# - On disk, but not in sources
|
|
set(_cmp_ondisk ${_ondisk_hh} ${_ondisk_cc})
|
|
set(_cmp_sources ${_sources_hh} ${_sources_cc})
|
|
list(REMOVE_ITEM _cmp_ondisk ${_cmp_sources})
|
|
set(_missing_in_sources ${_cmp_ondisk})
|
|
|
|
# - In sources, but not on disk
|
|
set(_cmp_ondisk ${_ondisk_hh} ${_ondisk_cc})
|
|
set(_cmp_sources ${_sources_hh} ${_sources_cc})
|
|
list(REMOVE_ITEM _cmp_sources ${_cmp_ondisk})
|
|
set(_missing_on_disk ${_cmp_sources})
|
|
|
|
# - Remove known false positives - can probably move this to above
|
|
# difference calculation.
|
|
if(_missing_in_sources)
|
|
list(REMOVE_ITEM _missing_in_sources ${GEANT4_FALSEPOSITIVE_SOURCES})
|
|
endif()
|
|
if(_missing_on_disk)
|
|
list(REMOVE_ITEM _missing_on_disk ${GEANT4_FALSEPOSITIVE_SOURCES})
|
|
endif()
|
|
|
|
# - Report if either list is not empty
|
|
if(_missing_in_sources OR _missing_on_disk)
|
|
message(" ")
|
|
message("Problems detected in ${_sourcesfile_location}:")
|
|
set(GEANT4_BUILD_ISINCONSISTENT TRUE)
|
|
|
|
# - New/Obsolete File Error
|
|
if(_missing_in_sources)
|
|
message("Sources on disk but not listed in sources.cmake:")
|
|
foreach(_m ${_missing_in_sources})
|
|
message(" ${_m}")
|
|
endforeach()
|
|
endif()
|
|
|
|
# - Removed File Error - In general, should be picked up at standard
|
|
# CMake run time, but we double report here to be paranoid.
|
|
if(_missing_on_disk)
|
|
message("Sources listed in sources.cmake but not on disk:")
|
|
foreach(_m ${_missing_on_disk})
|
|
message(" ${_m}")
|
|
endforeach()
|
|
endif()
|
|
endif()
|
|
endforeach()
|
|
|
|
#-----------------------------------------------------------------------
|
|
# Final fail?
|
|
#
|
|
if(GEANT4_BUILD_ISINCONSISTENT)
|
|
message(FATAL_ERROR "Inconsistent Geant4 build detected!")
|
|
else()
|
|
message(STATUS "Geant4 build appears consistent")
|
|
endif()
|
|
|