blob: d73d42cbc6e4a6be8d7ffa35fd97d557d370fc5d [file] [log] [blame]
#!/bin/sh
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# This script can be used to detect C++ source files present in the
# tree, but not mentioned in any `CMakeLists.txt`.
set -e
set -o pipefail
readonly MESOS_DIR="$(git rev-parse --show-toplevel)"
. "$MESOS_DIR"/support/atexit.sh
SOURCE_DIRS="$MESOS_DIR/src $MESOS_DIR/3rdparty"
# Get a list of all source files in the tree.
#
# We rely on the fact that in Mesos source files end in `.cpp`. We
# only care about files known to git.
readonly FILES=$(mktemp)
atexit "rm $FILES"
for file in $(cd "$MESOS_DIR" && git ls-files "$MESOS_DIR" | grep '.*\.cpp'); do
realpath "$MESOS_DIR/$file"
done | sort > "$FILES"
# Get a list of all source files in the cmake build.
#
# Since Mesos add source files to the cmake build conditionally, even
# cmake does not know the full list of all possible source files in
# our current setup. As a heuristic we search the cmake build for
# likely source file names.
readonly CMAKE_FILES=$(mktemp)
atexit "rm $CMAKE_FILES"
for cm in $(find $SOURCE_DIRS -name CMakeLists.txt); do
base="$(dirname "$cm")"
for file in $(grep -o '\(\S\)*\w\+\.cpp' "$cm"); do
# We ignore weird filename-like patterns which do
# not correspond to a path.
realpath "$base/$file" 2> /dev/null || true
done
done | sort > "$CMAKE_FILES"
MISSING_FILES=$(comm -23 "$FILES" "$CMAKE_FILES")
if [ -n "$MISSING_FILES" ]; then
(>&2 \
printf "%s\\n\\n%s\\n" \
"The following files do not appear in any CMakeLists.txt:" \
"$MISSING_FILES" \
)
exit 1
fi