summaryrefslogtreecommitdiff
path: root/solenv
diff options
context:
space:
mode:
authorBjoern Michaelsen <bjoern.michaelsen@canonical.com>2012-07-30 17:39:40 +0200
committerBjoern Michaelsen <bjoern.michaelsen@canonical.com>2012-07-31 18:40:35 +0200
commitc2b467b84a81bd45ca9df1f7f07e2700fd6e396a (patch)
treec64fc4a7b9a8fd97a25481245ec46cfa4669e5c9 /solenv
parente1544be5759bfbaf93d8a4dd66a950a8736e58e5 (diff)
fix concat-deps
* make concat-deps use absolute paths whereever possible * collapse /../ _after_ making the path absolute otherwise it will break for relative paths starting with ../ * substitude SRCDIR variable, so trees can be moved * this fixes subsequentcheck as it does run gbuild from a different work directory in a few non-tail_build modules, which are then complaining about missing/unresolvable deps * this should fix troubles from module rebuild as relative paths were different between tail_build and the module dir Change-Id: I5a25e1f55bdc2b475df2af04b711fd808d95cdaf
Diffstat (limited to 'solenv')
-rw-r--r--solenv/bin/concat-deps.c107
1 files changed, 85 insertions, 22 deletions
diff --git a/solenv/bin/concat-deps.c b/solenv/bin/concat-deps.c
index 28ac2edb560b..d2c1d7f0e1f5 100644
--- a/solenv/bin/concat-deps.c
+++ b/solenv/bin/concat-deps.c
@@ -109,6 +109,12 @@
#define FALSE 0
#endif
+static char* base_dir_var = "$(SRCDIR)";
+#define kBASE_DIR_VAR_LENGTH 9
+static char* current_dir;
+static size_t current_dir_length;
+static char* base_dir;
+static size_t base_dir_length;
#ifdef __GNUC__
#define clz __builtin_clz
@@ -684,21 +690,65 @@ int fd;
return buffer;
}
-static void _cancel_relative(char* base, char** ref_cursor, char** ref_cursor_out, char* end)
+static inline void print_nodotdot(char* path)
{
- char* cursor = *ref_cursor;
- char* cursor_out = *ref_cursor_out;
+char* pathpart;
+char* lastnondotdot;
+ pathpart = path;
+ lastnondotdot = NULL;
+ while(pathpart != NULL)
+ {
+ if(strncmp(pathpart, "/../", 4) == 0)
+ {
+ if(!lastnondotdot)
+ break; /* this should never happen with abs. paths */
+ memmove(lastnondotdot, pathpart+4, strlen(pathpart)-3);
+ lastnondotdot = NULL;
+ pathpart = path;
+ }
+ else
+ {
+ lastnondotdot = pathpart+1;
+ pathpart = strchr(pathpart+1,'/');
+ }
+ }
+ fputs(path, stdout);
+}
- do
+static char* print_fullpaths_buffer = NULL;
+static size_t print_fullpaths_buffersize = 0;
+/* prefix paths to absolute */
+static inline void print_fullpaths(char* line)
+{
+char* token;
+size_t token_length;;
+
+ token = strtok(line," ");
+ while(token != NULL)
{
- cursor += 3;
- while(cursor_out > base && cursor_out[-1] == '/')
- cursor_out--;
- while(cursor_out > base && *--cursor_out != '/');
+ if(*token == ':' || *token == '\\' || *token == '/' || *token == '$')
+ {
+ fputs(token, stdout);
+ }
+ else
+ {
+ token_length=strlen(token);
+ if(print_fullpaths_buffersize < current_dir_length+token_length+2)
+ {
+ /* we really should avoid to get there more than once, so print a message to alert of the condition */
+ if(print_fullpaths_buffersize)
+ fprintf(stderr, "resize fullpaths buffer %d -> %d\n", ((int)print_fullpaths_buffersize), ((int)(current_dir_length+token_length))+1024);
+ print_fullpaths_buffersize = current_dir_length+token_length+1024;
+ print_fullpaths_buffer = realloc(print_fullpaths_buffer, print_fullpaths_buffersize);
+ }
+ memcpy(print_fullpaths_buffer, current_dir, current_dir_length);
+ *(print_fullpaths_buffer+current_dir_length) = '/';
+ memcpy(print_fullpaths_buffer+current_dir_length+1, token, token_length+1);
+ print_nodotdot(print_fullpaths_buffer);
+ }
+ fputc(' ', stdout);
+ token = strtok(NULL," ");
}
- while(cursor + 3 < end && !memcmp(cursor, "/../", 4));
- *ref_cursor = cursor;
- *ref_cursor_out = cursor_out;
}
static int _process(struct hash* dep_hash, char* fn)
@@ -732,13 +782,6 @@ off_t size;
}
else if(*cursor == '/')
{
- if(cursor + 3 < end)
- {
- if(!memcmp(cursor, "/../", 4))
- {
- _cancel_relative(base, &cursor, &cursor_out, end);
- }
- }
*cursor_out++ = *cursor++;
}
else if(*cursor == '\n')
@@ -757,14 +800,14 @@ off_t size;
*/
if(hash_store(dep_hash, base, (int)(cursor_out - base)))
{
- puts(base);
+ print_fullpaths(base);
putc('\n', stdout);
}
}
else
{
/* rule with dep, just write it */
- puts(base);
+ print_fullpaths(base);
putc('\n', stdout);
}
}
@@ -825,8 +868,8 @@ off_t in_list_size = 0;
char* in_list;
char* in_list_cursor;
char* in_list_base;
+char* buffer;
struct hash* dep_hash;
-char* base_dir;
if(argc < 2)
{
@@ -836,9 +879,29 @@ char* base_dir;
base_dir = getenv("SRCDIR");
if(!base_dir)
{
- fputs("Error: SRCDIR si missing in the environement\n", stderr);
+ fputs("Error: SRCDIR is missing in the environement\n", stderr);
return 1;
}
+ current_dir = getcwd(NULL, 0);
+ base_dir_length = strlen(base_dir);
+ current_dir_length = strlen(current_dir);
+ if(strncmp(base_dir, current_dir, base_dir_length) == 0)
+ {
+ if(current_dir_length == base_dir_length)
+ {
+ current_dir = base_dir_var;
+ }
+ else
+ {
+ buffer = malloc(kBASE_DIR_VAR_LENGTH+current_dir_length-base_dir_length+1);
+ memcpy(buffer, base_dir_var, kBASE_DIR_VAR_LENGTH);
+ memcpy(buffer+kBASE_DIR_VAR_LENGTH, current_dir+base_dir_length, current_dir_length-base_dir_length+1);
+ free(current_dir);
+ current_dir=buffer;
+ current_dir_length=kBASE_DIR_VAR_LENGTH+current_dir_length-base_dir_length;
+ }
+ }
+
in_list = file_load(argv[1], &in_list_size, &rc);
if(!rc)
{