Skip to content

Commit

Permalink
Always sort glob results
Browse files Browse the repository at this point in the history
This fixes issue google#69. GNU make 3 sorts both for include and
$(wildcard) while GNU make 4 doesn't.
  • Loading branch information
shinh committed May 2, 2016
1 parent fe9f54e commit c1f36f0
Show file tree
Hide file tree
Showing 5 changed files with 67 additions and 3 deletions.
2 changes: 1 addition & 1 deletion fileutil.cc
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ class GlobCache {
vector<string>* files = p.first->second = new vector<string>;
if (strcspn(pat, "?*[\\") != strlen(pat)) {
glob_t gl;
glob(pat, GLOB_NOSORT, NULL, &gl);
glob(pat, 0, NULL, &gl);
for (size_t i = 0; i < gl.gl_pathc; i++) {
files->push_back(gl.gl_pathv[i]);
}
Expand Down
1 change: 0 additions & 1 deletion func.cc
Original file line number Diff line number Diff line change
Expand Up @@ -318,7 +318,6 @@ void WildcardFunc(const vector<Value*>& args, Evaluator* ev, string* s) {
for (StringPiece tok : WordScanner(pat)) {
ScopedTerminator st(tok);
Glob(tok.data(), &files);
sort(files->begin(), files->end());
for (const string& file : *files) {
ww.Write(file);
}
Expand Down
1 change: 0 additions & 1 deletion regen.cc
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,6 @@ class StampChecker {
COLLECT_STATS("glob time (regen)");
vector<string>* files;
Glob(gr->pat.c_str(), &files);
sort(files->begin(), files->end());
bool needs_regen = files->size() != gr->result.size();
for (size_t i = 0; i < gr->result.size(); i++) {
if (!needs_regen) {
Expand Down
19 changes: 19 additions & 0 deletions testcase/include_glob_order.mk
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
MAKEVER:=$(shell make --version | ruby -n0e 'puts $$_[/Make (\d)/,1]')

# GNU make 4 doesn't sort glob results.
ifeq ($(MAKEVER,4))

$(info test skipped)

else

test1:
echo '$$(info foo)' > foo.d
echo '$$(info bar)' > bar.d

test2:
echo $(wildcard *.d)

-include *.d

endif
47 changes: 47 additions & 0 deletions testcase/ninja_regen_glob.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
#!/bin/sh
#
# Copyright 2016 Google Inc. All rights reserved
#
# Licensed 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.

set -e

log=/tmp/log
mk="$@"

sleep_if_necessary() {
if [ x$(uname) != x"Linux" -o x"${TRAVIS}" != x"" ]; then
sleep "$@"
fi
}

touch xe.mk yc.mk xa.mk yb.mk xd.mk

cat <<EOF > Makefile
include *.mk
all:
echo foo
EOF

${mk} 2> ${log}
if [ -e ninja.sh ]; then
./ninja.sh
fi

${mk} 2> ${log}
if [ -e ninja.sh ]; then
if grep regenerating ${log}; then
echo 'Should not be regenerated'
fi
./ninja.sh
fi

0 comments on commit c1f36f0

Please sign in to comment.