Update of /cvsroot/alsa/alsa-driver/utils In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv9204/utils
Modified Files: Makefile Added Files: mod-deps.c Removed Files: Modules.dep Log Message: Recoded mod-deps to use Kconfig as source for dependencies. The new code still contains bugs in the acinclude.m4 output. --- NEW FILE: mod-deps.c --- /* * Utility to find module dependencies from Modules.dep * Copyright (c) by Jaroslav Kysela <[EMAIL PROTECTED]> * Anders Semb Hermansen <[EMAIL PROTECTED]>, * Martin Dahl <[EMAIL PROTECTED]>, * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <string.h> #include <ctype.h> #include <errno.h> // Output methods #define METHOD_ACINCLUDE 1 #define METHOD_MAKECONF 2 #define METHOD_INCLUDE 3 #define COND_AND 0 #define COND_OR 1 struct cond { char *name; /* dependency name */ struct dep *dep; /* dependency pointer */ int left; /* left brackets */ int right; /* right brackets */ int type; struct cond *next; struct cond *stack_prev; }; struct sel { char *name; /* dependency name */ struct dep *dep; /* dependency pointer */ struct sel *next; }; struct dep { char *name; // dependency part - conditions (chain) struct cond *cond; // forced selection (dependency) part struct sel *sel; // misc int hitflag; struct dep *next; }; // Prototypes static int read_file(const char *filename); static int read_file_1(const char *filename); static int include_file(char *line); static void free_cond(struct cond *cond); static struct cond *create_cond(char *line); static struct dep *alloc_mem_for_dep(void); static struct dep *find_or_create_dep(char *line); static void add_dep(struct dep * dep, char *line, struct cond *template); static void add_select(struct dep * dep, char *line); static char *get_word(char *line, char *word); static struct dep *find_dep(char *parent, char *depname); static void del_all_from_list(void); int main(int argc, char *argv[]); static void usage(char *programname); static char *convert_to_config_uppercase(const char *pre, const char *line); // static char *convert_to_escape(const char *line); static char *get_card_name(const char *line); // Globals static struct dep *all_deps = NULL; static char *basedir = "../alsa-kernel"; static char *hiddendir = ".."; static char *kernel_deps[] = { "ARCH_SA1100", "SBUS", "GAMEPORT", NULL }; /* @ -> add to output for all cards */ /* % -> always true */ static char *no_cards[] = { "SOUND", "SOUND_PRIME", "[EMAIL PROTECTED]", "@SND_TIMER", "@SND_HWDEP", "@SND_RAWMIDI", "@SND_PCM", "SND_SEQUENCER", "SND_MIXER_OSS", "SND_PCM_OSS", "SND_SEQUENCER_OSS", "SND_OSSEMUL", "SND_RTCTIMER", "SND_DEBUG", "SND_DEBUG_MEMORY", "SND_DEBUG_DETECT", "SND_VERBOSE_PRINTK", "SND_BIT32_EMUL", "@SND_OPL3_LIB", "@SND_OPL4_LIB", "@SND_VX_LIB", "@SND_MPU401_UART", NULL }; #define READ_STATE_NONE 0 #define READ_STATE_CONFIG 1 #define READ_STATE_MENU 2 static void nomem(void) { fprintf(stderr, "No enough memory\n"); exit(EXIT_FAILURE); } static int read_file(const char *filename) { char *fullfile; int err; fullfile = malloc(strlen(basedir) + strlen(hiddendir) + 1 + strlen(filename) + 1); sprintf(fullfile, "%s/%s", basedir, filename); if ((err = read_file_1(fullfile)) < 0) return err; if (!strncmp(filename, "core/", 5)) sprintf(fullfile, "%s/acore/%s", hiddendir, filename + 5); else sprintf(fullfile, "%s/%s", hiddendir, filename); if (access(fullfile, R_OK) == 0) { if ((err = read_file_1(fullfile)) < 0) return err; } return 0; } static int read_file_1(const char *filename) { char *buffer, *newbuf; FILE *file; int c, prev, idx, size, result = 0; int state = READ_STATE_NONE; struct dep *dep; struct cond *template = NULL; file = fopen(filename, "r"); if (file == NULL) { fprintf(stderr, "Unable to open file %s: %s\n", filename, strerror(errno)); return -ENOENT; } size = 512; buffer = (char *) malloc(size); if (!buffer) { fclose(file); return -ENOMEM; } while (!feof(file)) { buffer[idx = 0] = prev = '\0'; while (1) { if (idx + 1 >= size) { newbuf = (char *) realloc(buffer, size += 256); if (newbuf == NULL) { result = -ENOMEM; goto __end; } buffer = newbuf; } c = fgetc(file); if (c == EOF) break; if (c == '\n') { if (prev == '\\') { idx--; continue; } break; } buffer[idx++] = prev = c; } buffer[idx] = '\0'; /* ignore some keywords */ if (buffer[0] == '#') continue; if (!strncmp(buffer, "endmenu", 7)) { struct cond *otemplate; state = READ_STATE_NONE; if (template == NULL) { fprintf(stderr, "Menu level error\n"); exit(EXIT_FAILURE); } otemplate = template; template = template->stack_prev; free_cond(otemplate); continue; } if (!strncmp(buffer, "menu", 4)) { struct cond *ntemplate; state = READ_STATE_MENU; strcpy(buffer, "EMPTY"); ntemplate = create_cond(buffer); ntemplate->stack_prev = template; template = ntemplate; continue; } if (!strncmp(buffer, "config ", 7)) { state = READ_STATE_CONFIG; dep = find_or_create_dep(buffer + 7); if (dep == NULL) { result = -ENOMEM; goto __end; } } if (!strncmp(buffer, "source ", 7)) { state = READ_STATE_NONE; result = include_file(buffer + 7); if (result < 0) goto __end; } switch (state) { case READ_STATE_CONFIG: if (!strncmp(buffer, "\tdepends on ", 12)) add_dep(dep, buffer + 12, template); if (!strncmp(buffer, "\tselect ", 8)) add_select(dep, buffer + 8); continue; case READ_STATE_MENU: if (!strncmp(buffer, "\tdepends on ", 12)) { struct cond *ntemplate; ntemplate = create_cond(buffer + 12); free(template->name); template->name = ntemplate->name; template->dep = ntemplate->dep; template->left = ntemplate->left; template->right = ntemplate->right; template->type = ntemplate->type; free(ntemplate); } continue; } } __end: if (template) free_cond(template); free(buffer); if (file != stdin) fclose(file); return result; } // include a file static int include_file(char *line) { char *word = NULL, *ptr; int result; word = malloc(strlen(line) + 1); get_word(line, word); ptr = word; if (!strncmp(ptr, "sound/", 6)) ptr += 6; if (!strncmp(ptr, "oss/", 4)) return 0; result = read_file(ptr); free(word); return result; } // allocate condition chain static struct cond * create_cond(char *line) { struct cond *first = NULL, *cond, *prev = NULL; char *word = NULL; int i; word = malloc(strlen(line) + 1); if (word == NULL) nomem(); while (get_word(line, word)) { cond = calloc(sizeof(struct cond), 1); if (cond == NULL) nomem(); if (first == NULL) first = cond; if (prev) prev->next = cond; prev = cond; while (word[0] == '(') { for (i = 1; i < strlen(word) + 1; i++) word[i - 1] = word[i]; cond->left++; } for (i = 0; i < strlen(word); i++) { if (word[i] == '!' || word[i] == '=' || word[i] == '&' || word[i] == ')') { if (word[i] == ')') { word[i] = '\0'; cond->right++; continue; } if (!strcmp(word + i, "!=n")) { word[i] = '\0'; break; } fprintf(stderr, "Unknown suffix '%s'\n", word + i); exit(EXIT_FAILURE); } } cond->name = strdup(word); if (cond->name == NULL) nomem(); if (strcmp(cond->name, "EMPTY")) find_or_create_dep(word); if (get_word(line, word)) { if (!strcmp(word, "&&")) cond->type = COND_AND; else if (!strcmp(word, "||")) cond->type = COND_OR; else { fprintf(stderr, "Wrong condition %s\n", word); exit(EXIT_FAILURE); } } } free(word); return first; } // allocate a new dep structure and put it to the global list static struct dep *alloc_mem_for_dep(void) { struct dep * firstdep = all_deps, * ndep; ndep = (struct dep *) calloc(1, sizeof(struct dep)); if (ndep == NULL) nomem(); if (!firstdep) return all_deps = ndep; while (firstdep->next) firstdep = firstdep->next; return firstdep->next = ndep; } // Add a new dependency to the list static struct dep * find_or_create_dep(char *line) { struct dep *new_dep; char *word = NULL; word = malloc(strlen(line) + 1); if (word == NULL) nomem(); get_word(line, word); new_dep = find_dep("<root>", word); if (new_dep != NULL) return new_dep; new_dep = alloc_mem_for_dep(); new_dep->name = strdup(word); // Fill in name of dependency if (new_dep->name == NULL) nomem(); free(word); return new_dep; } // duplicate condition chain static struct cond *duplicate_cond(struct cond *cond) { struct cond *result = NULL, *tmp, *prev = NULL; while (cond) { tmp = calloc(sizeof(struct cond), 1); if (tmp == NULL) nomem(); *tmp = *cond; tmp->name = strdup(cond->name); if (tmp->name == NULL) nomem(); tmp->next = NULL; if (result == NULL) result = tmp; if (prev) prev->next = tmp; prev = tmp; cond = cond->next; } return result; } // join condition chain static struct cond *join_cond(struct cond *cond1, struct cond *cond2) { struct cond *orig = cond1; if (cond1 == NULL) return cond2; if (cond2 == NULL) return cond1; while (cond1->next) cond1 = cond1->next; cond1->next = cond2; return orig; } // Add a new dependency to the current one static void add_dep(struct dep * dep, char *line, struct cond *template) { template = duplicate_cond(template); dep->cond = join_cond(template, create_cond(line)); } // Add a new forced (selected) dependency to the current one static void add_select(struct dep * dep, char *line) { char *word = NULL; struct sel *sel, *nsel; word = malloc(strlen(line) + 1); if (word == NULL) nomem(); get_word(line, word); nsel = calloc(sizeof(struct sel), 1); if (nsel == NULL) nomem(); nsel->name = strdup(word); if (nsel->name == NULL) nomem(); nsel->dep = NULL; sel = dep->sel; if (sel == NULL) dep->sel = nsel; else { while (sel->next) sel = sel->next; sel->next = nsel; } free(word); } // Put the first word in "line" in "word". Put the rest back in "line" static char *get_word(char *line, char *word) { int i, j, c; char *full_line; if (strlen(line) == 0) return NULL; i = 0; while (line[i] == ' ' || line[i] == '\t') i++; c = line[i]; if (c != '\'' && c != '"') { c = ' '; } else { i++; } if (strlen(line) == i) return NULL; full_line = malloc(strlen(line + i) + 1); if (full_line == NULL) nomem(); strcpy(full_line, line + i); for (i = 0; i < strlen(full_line); i++) { if ((c != ' ' && full_line[i] != c) || (c == ' ' && full_line[i] != '\t' && full_line[i] != ' ')) word[i] = full_line[i]; else { // We got the whole word word[i++] = '\0'; while (full_line[i] != '\0' && (full_line[i] == ' ' || full_line[i] == '\t')) i++; for (j = 0; i < strlen(full_line); i++, j++) line[j] = full_line[i]; line[j] = '\0'; free(full_line); return word; } } // This was the last word word[i] = '\0'; line[0] = '\0'; free(full_line); return word; } // Find the dependency named "depname" static struct dep *find_dep(char *parent, char *depname) { struct dep *temp_dep = all_deps; int idx; while (temp_dep) { // fprintf(stderr, "depname = '%s', name = '%s'\n", depname, temp_dep->name); if (!strcmp(depname, temp_dep->name)) return temp_dep; temp_dep = temp_dep->next; } for (idx = 0; kernel_deps[idx]; idx++) { if (!strcmp(kernel_deps[idx], depname)) return NULL; } if (strcmp(parent, "<root>")) fprintf(stderr, "Warning: Unsatisfied dep for %s: %s\n", parent, depname); return NULL; } // Resolve all dependencies static void resolve_dep(struct dep * parent) { struct cond *cond; while (parent) { cond = parent->cond; while (cond) { cond->dep = find_dep(parent->name, cond->name); cond = cond->next; } parent = parent->next; } } // Resolve fixed (selected) dependecies static void resolve_sel(struct dep * parent) { struct sel *sel; while (parent) { sel = parent->sel; while (sel) { sel->dep = find_dep(parent->name, sel->name); sel = sel->next; } parent = parent->next; } } // free condition chain static void free_cond(struct cond *first) { struct cond *next; while (first) { next = first->next; free(first->name); free(first); first = next; } } // free selection chain static void free_sel(struct sel *first) { struct sel *next; while (first) { next = first->next; free(first); first = next; } } // Free memory for all deps in Toplevel and Deps static void del_all_from_list(void) { struct dep *list = all_deps, *next; while (list) { next = list->next; free_cond(list->cond); free_sel(list->sel); if (list->name) free(list->name); free(list); list = next; } } // is toplevel module static int is_toplevel(struct dep *dep) { int idx; char *str; if (dep == NULL) return 0; for (idx = 0; no_cards[idx]; idx++) { str = no_cards[idx]; if (*str == '%') str++; if (*str == '@') str++; if (!strcmp(str, dep->name)) return 0; } return 1; } // is CONFIG_ variable is always true static int is_always_true(struct dep *dep) { int idx; char *str; if (dep == NULL) return 0; for (idx = 0; no_cards[idx]; idx++) { str = no_cards[idx]; if (*str != '%') continue; str++; if (*str == '@') str++; if (!strcmp(str, dep->name)) return 1; } return 0; } // is CONFIG_ variable belongs to all card output static int belongs_to_all(struct dep *dep) { int idx; char *str; if (dep == NULL) return 0; for (idx = 0; no_cards[idx]; idx++) { str = no_cards[idx]; if (*str == '%') str++; if (*str != '@') continue; str++; if (!strcmp(str, dep->name)) return 1; } return 0; } // Print out ALL deps for firstdep (Cards, Deps) static void output_card_list(struct dep *firstdep, int space, int size) { struct dep *temp_dep=firstdep; char *card_name; int tmp_size = 0, first = 1, idx; printf(" ["); for (idx = 0; idx < space; idx++) printf(" "); while(temp_dep) { if (!is_toplevel(temp_dep)) goto __skip; card_name=get_card_name(temp_dep->name); if (card_name) { if (!first) { printf(", "); tmp_size += 2; } else { first = 0; } if (tmp_size + strlen(card_name) + 2 > size) { printf("]\n ["); for (idx = 0; idx < space; idx++) printf(" "); tmp_size = 0; } printf(card_name); tmp_size += strlen(card_name); free(card_name); } __skip: temp_dep=temp_dep->next; } } // Output in acinlude.m4 static void output_acinclude(void) { struct dep *tempdep; char *text; struct cond *cond, *cond_prev; struct sel *sel; printf("dnl ALSA soundcard configuration\n"); printf("dnl Find out which cards to compile driver for\n"); printf("dnl Copyright (c) by Jaroslav Kysela <[EMAIL PROTECTED]>,\n"); printf("dnl Anders Semb Hermansen <[EMAIL PROTECTED]>\n\n"); printf("AC_DEFUN(ALSA_TOPLEVEL_INIT, [\n"); for (tempdep = all_deps; tempdep; tempdep = tempdep->next) { text = convert_to_config_uppercase("CONFIG_", tempdep->name); printf("\t%s=\"\"\n", text); free(text); } printf("])\n\n"); printf("AC_DEFUN(ALSA_TOPLEVEL_ALL, [\n"); for (tempdep = all_deps; tempdep; tempdep = tempdep->next) { if (!belongs_to_all(tempdep)) continue; text = convert_to_config_uppercase("CONFIG_", tempdep->name); if (!strncmp(text, "CONFIG_SND", 10)) { printf("\t%s=\"m\"\n", text); printf("\tAC_DEFINE(%s_MODULE)\n", text); } free(text); } for (tempdep = all_deps; tempdep; tempdep = tempdep->next) { int put_if = 0; if (!is_toplevel(tempdep)) continue; for (cond = tempdep->cond, cond_prev = NULL; cond; cond = cond->next) { if (is_always_true(cond->dep)) continue; if (!put_if) printf("\tif "); else { printf(cond_prev->type == COND_AND ? " &&" : " ||"); printf("\n\t "); } printf("( test \"$CONFIG_%s\" == \"y\" -o \"$CONFIG_%s\" == \"m\" )", cond->name, cond->name); put_if = 1; cond_prev = cond; } if (put_if) printf("; then\n"); text = convert_to_config_uppercase("CONFIG_", tempdep->name); printf("\t"); if (put_if) printf(" "); printf("%s=\"m\"\n", text); printf("\t"); if (put_if) printf(" "); printf("AC_DEFINE(%s_MODULE)\n", text); if (put_if) printf("\tfi\n"); free(text); } printf("])\n\n"); printf("AC_DEFUN(ALSA_TOPLEVEL_SELECT, [\n"); printf("dnl Check for which cards to compile driver for...\n"); printf("AC_MSG_CHECKING(for which soundcards to compile driver for)\n"); printf("AC_ARG_WITH(cards,\n\ [ --with-cards=<list> compile driver for cards in <list>; ]\n\ [ cards may be separated with commas; ]\n\ [ 'all' compiles all drivers; ]\n\ [ Possible cards are: ]\n"); output_card_list(all_deps, 24, 50); printf(" ],\n"); printf(" cards=\"$withval\", cards=\"all\")\n"); printf("if test \"$cards\" = \"all\"; then\n"); printf(" ALSA_TOPLEVEL_ALL\n"); printf(" AC_MSG_RESULT(all)\n"); printf("else\n"); printf(" cards=`echo $cards | sed 's/,/ /g'`\n"); printf(" for card in $cards\n"); printf(" do\n"); printf(" case \"$card\" in\n"); for (tempdep = all_deps; tempdep; tempdep = tempdep->next) { if (!is_toplevel(tempdep)) continue; text = get_card_name(tempdep->name); if (text) { printf("\t%s)\n", text); free(text); for (sel = tempdep->sel; sel; sel = sel->next) { if (is_always_true(sel->dep)) continue; printf("\t\t%s=\"m\"\n", sel->name); printf("\t\tAC_DEFINE(%s_MODULE)\n", sel->name); } text = convert_to_config_uppercase("CONFIG_", tempdep->name); printf("\t\t%s=\"m\"\n", text); printf("\t\tAC_DEFINE(%s_MODULE)\n", text); printf("\t\t;;\n"); free(text); } } printf("\t*)\n"); printf("\t\techo \"Unknown soundcard $card, exiting!\"\n"); printf("\t\texit 1\n"); printf("\t\t;;\n"); printf(" esac\n"); printf(" done\n"); printf(" AC_MSG_RESULT($cards)\n"); printf("fi\n"); for (tempdep = all_deps; tempdep; tempdep = tempdep->next) { text = convert_to_config_uppercase("CONFIG_", tempdep->name); printf("AC_SUBST(%s)\n", text); free(text); } printf("])\n\n"); } // Output in toplevel.conf static void output_makeconf(void) { struct dep *tempdep; char *text; printf("# Soundcard configuration for ALSA driver\n"); printf("# Copyright (c) by Jaroslav Kysela <[EMAIL PROTECTED]>,\n"); printf("# Anders Semb Hermansen <[EMAIL PROTECTED]>\n\n"); for (tempdep = all_deps; tempdep; tempdep = tempdep->next) { text = convert_to_config_uppercase("CONFIG_", tempdep->name); printf("[EMAIL PROTECTED]@\n", text, text); free(text); } } // Output in config.h static void output_include(void) { struct dep *tempdep; char *text; printf("/* Soundcard configuration for ALSA driver */\n"); printf("/* Copyright (c) by Jaroslav Kysela <[EMAIL PROTECTED]>, */\n"); printf("/* Anders Semb Hermansen <[EMAIL PROTECTED]> */\n\n"); for (tempdep = all_deps; tempdep; tempdep = tempdep->next) { text = convert_to_config_uppercase("CONFIG_", tempdep->name); printf("#undef %s_MODULE\n", text); free(text); } } // example: sb16 -> CONFIG_SND_SB16 static char *convert_to_config_uppercase(const char *pre, const char *line) { char *holder, *p; int i; holder = malloc(strlen(line) * 2 + strlen(pre) + 1); if (holder == NULL) nomem(); p = strcpy(holder, pre) + strlen(pre); for (i = 0; i < strlen(line); i++) switch (line[i]) { case '-': *p++ = '_'; break; default: *p++ = toupper(line[i]); break; } *p++ = '\0'; return holder; } #if 0 // example: a'b -> a\'b static char *convert_to_escape(const char *line) { char *holder, *p; int i; holder = malloc(strlen(line) + 1); if (holder == NULL) nomem(); p = holder; for (i = 0; i < strlen(line); i++) switch (line[i]) { case '\'': *p++ = '`'; break; default: *p++ = line[i]; break; } *p++ = '\0'; return holder; } #endif // example: snd-sb16 -> sb16 static char *remove_word(const char *remove, const char *line) { char *holder; int i; holder=malloc(strlen(line)-strlen(remove)+1); if(holder==NULL) { fprintf(stderr, "Not enough memory\n"); exit(EXIT_FAILURE); } for(i=strlen(remove);i<strlen(line);i++) holder[i-strlen(remove)]=line[i]; holder[i-strlen(remove)]='\0'; return holder; } // example: SND_ABCD_DEF -> abcd-def static char *get_card_name(const char *line) { char *result, *tmp = malloc(strlen(line) + 16); int i; if (tmp == NULL) nomem(); for (i = 0; i < strlen(line); i++) { if (line[i] == '_') tmp[i] = '-'; else tmp[i] = tolower(line[i]); } tmp[i] = '\0'; if (strncmp(tmp, "snd-", 4)) return NULL; result = remove_word("snd-", tmp); free(tmp); return result; } // Main function int main(int argc, char *argv[]) { int method = METHOD_ACINCLUDE; int argidx = 1; char *filename; // Find out which method to use if (argc < 2) usage(argv[0]); while (1) { if (argc <= argidx + 1) break; if (strcmp(argv[argidx], "--basedir") == 0) { basedir = strdup(argv[argidx + 1]); if (basedir == NULL) nomem(); argidx += 2; continue; } if (strcmp(argv[argidx], "--hiddendir") == 0) { hiddendir = strdup(argv[argidx + 1]); if (hiddendir == NULL) nomem(); argidx += 2; continue; } break; } if (strcmp(argv[argidx], "--acinclude") == 0) method = METHOD_ACINCLUDE; else if (strcmp(argv[argidx], "--makeconf") == 0) method = METHOD_MAKECONF; else if (strcmp(argv[argidx], "--include") == 0) method = METHOD_INCLUDE; else usage(argv[0]); argidx++; // Check the filename if (argc > argidx) filename = argv[argidx++]; else filename = "Kconfig"; // Read the file into memory if (read_file(filename) < 0) { fprintf(stderr, "Error reading %s: %s\n", filename ? filename : "stdin", strerror(errno)); exit(EXIT_FAILURE); } // Resolve dependencies resolve_dep(all_deps); resolve_sel(all_deps); // Use method switch (method) { case METHOD_ACINCLUDE: output_acinclude(); break; case METHOD_MAKECONF: output_makeconf(); break; case METHOD_INCLUDE: output_include(); break; default: fprintf(stderr, "This should not happen!\n"); usage(argv[0]); break; } // Free some memory del_all_from_list(); exit(EXIT_SUCCESS); } // Print out syntax static void usage(char *programname) { fprintf(stderr, "Usage: %s --acinclude [<cfgfile>]\n", programname); fprintf(stderr, " %s --makeconf [<cfgfile>]\n", programname); fprintf(stderr, " %s --include [<cfgfile>]\n", programname); fprintf(stderr, "\n"); fprintf(stderr, "Options:\n"); fprintf(stderr, " --basedir <basedir>\n"); fprintf(stderr, " --hidendir <hidendir>\n"); exit(EXIT_FAILURE); } Index: Makefile =================================================================== RCS file: /cvsroot/alsa/alsa-driver/utils/Makefile,v retrieving revision 1.14 retrieving revision 1.15 diff -u -r1.14 -r1.15 --- Makefile 6 Aug 2003 11:13:28 -0000 1.14 +++ Makefile 3 Mar 2004 20:19:40 -0000 1.15 @@ -22,6 +22,9 @@ .PHONY: dummy dummy: +mod-deps: mod-deps.o + $(CC) -g $(INCLUDE) mod-deps.o -o $@ + kredirect: kredirect.o $(CC) $(INCLUDE) kredirect.o -o $@ --- Modules.dep DELETED --- ------------------------------------------------------- This SF.Net email is sponsored by: IBM Linux Tutorials Free Linux tutorial presented by Daniel Robbins, President and CEO of GenToo technologies. Learn everything from fundamentals to system administration.http://ads.osdn.com/?ad_id=1470&alloc_id=3638&op=click _______________________________________________ Alsa-cvslog mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/alsa-cvslog