summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunghyun Kim <jh0822.kim@samsung.com>2016-08-04 22:28:18 (GMT)
committerJunghyun Kim <jh0822.kim@samsung.com>2016-08-05 01:17:35 (GMT)
commit26bb5821ce7f8b493c78221ab43532a9354768a0 (patch)
tree9fb99629241c23f5bba54e74cc3fbd0b1b6f6453
parent8f57854a0c003ff2d4c278b47d13f8ef6feb6bbc (diff)
downloadcmake-26bb5821ce7f8b493c78221ab43532a9354768a0.zip
cmake-26bb5821ce7f8b493c78221ab43532a9354768a0.tar.gz
cmake-26bb5821ce7f8b493c78221ab43532a9354768a0.tar.bz2
List of files are sorted when using aux_source_directory() and file(glob).submit/tizen_base/20160805.051525accepted/tizen/base/20160805.171158refs/changes/42/82642/3
If aux_source_directory(. SRCS) or file(glob SRCS "*.c") is used, files in SRCS are not sorted. This can cause different orders of files across machines. Even though it does not have any correctness issue, there is a problem. If we have a build infrastructure (e.g., OBS), the result binaries can be different on each machine. In this case, build results can be different on two different machines even if we have the same source files. For example, 1. ld -o liba.a a.o b.o SRCS=a.c b.c 2. ld -o libb.a b.o a.o SRCS=b.c a.c Then, liba.a and libb.a are different. REASON This is because of the system call readdir(). The system call readdir() returns a file in the directory in any order. SOLUTION Intead of readdir(), scandir() is used with alphasort(). This makes the list of files are sorted alphabetically. AMENDED 1. another free() is added to free malloc()ed objects (Reviewed by Chan Lee). 2. remove "#include <errno.h>" (Reviewed by Chan Lee). Change-Id: Id8aff23b2761ea04c1c49c91fcc511b9bc2b1228 Signed-off-by: Junghyun Kim <jh0822.kim@samsung.com>
-rw-r--r--Source/kwsys/Directory.cxx18
1 files changed, 12 insertions, 6 deletions
diff --git a/Source/kwsys/Directory.cxx b/Source/kwsys/Directory.cxx
index b884747..c16b913 100644
--- a/Source/kwsys/Directory.cxx
+++ b/Source/kwsys/Directory.cxx
@@ -190,6 +190,8 @@ unsigned long Directory::GetNumberOfFilesInDirectory(const char* name)
#include <sys/types.h>
#include <dirent.h>
+#include <stdio.h>
+#include <malloc.h>
/* There is a problem with the Portland compiler, large file
support and glibc/Linux system headers:
@@ -211,19 +213,23 @@ bool Directory::Load(const char* name)
{
return 0;
}
- DIR* dir = opendir(name);
- if (!dir)
+ struct dirent** namelist;
+ int num_entries = scandir(name, &namelist, NULL, alphasort);
+ if(num_entries == -1)
{
+ printf("name=%s\n", name);
+ perror("scandir");
return 0;
}
-
- for (dirent* d = readdir(dir); d; d = readdir(dir) )
+
+ for( int i = 0; i < num_entries; ++i )
{
- this->Internal->Files.push_back(d->d_name);
+ this->Internal->Files.push_back(namelist[i]->d_name);
+ free(namelist[i]);
}
+ free(namelist);
this->Internal->Path = name;
- closedir(dir);
return 1;
}