summaryrefslogtreecommitdiff
path: root/adk/tools/pkgrebuild.c
diff options
context:
space:
mode:
Diffstat (limited to 'adk/tools/pkgrebuild.c')
-rw-r--r--adk/tools/pkgrebuild.c273
1 files changed, 273 insertions, 0 deletions
diff --git a/adk/tools/pkgrebuild.c b/adk/tools/pkgrebuild.c
new file mode 100644
index 000000000..e7f037ae5
--- /dev/null
+++ b/adk/tools/pkgrebuild.c
@@ -0,0 +1,273 @@
+/*
+ * pkgrebuild - recognize required package rebuilds in OpenADK
+ *
+ * Copyright (C) 2010,2011 Waldemar Brodkorb <wbx@openadk.org>
+ *
+ * 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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <ctype.h>
+#include <dirent.h>
+#include <fcntl.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include "strmap.h"
+
+StrMap *configmap, *configoldmap, *pkgmap;
+
+/*
+static void iter(const char *key, const char *value, const void *obj) {
+ fprintf(stderr, "key: %s value: %s\n", key, value);
+}
+*/
+
+static void iter_disabled(const char *key, const char *value, const void *obj) {
+
+ char hvalue[256];
+ char tfile[256];
+ int fd;
+
+ memset(hvalue, 0, 256);
+ if (strmap_exists(configmap, key) == 0) {
+ //fprintf(stderr, "disabled variables: %s\n", key);
+ if (strmap_get(pkgmap, key, hvalue, sizeof(hvalue)) == 1) {
+ //fprintf(stderr, "Symbol is a flavour/choice: %s\n", hvalue);
+ if (snprintf(tfile, 256, ".rebuild.%s", hvalue) < 0)
+ perror("can not create file variable.");
+ fd = open(tfile, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
+ close(fd);
+ }
+ }
+
+}
+
+static void iter_enabled(const char *key, const char *value, const void *obj) {
+
+ char hvalue[256];
+ char tfile[256];
+ int fd;
+
+ memset(hvalue, 0, 256);
+ if (strmap_exists(configoldmap, key) == 0) {
+ //fprintf(stderr, "enabled variables: %s\n", key);
+ if (strmap_get(pkgmap, key, hvalue, sizeof(hvalue)) == 1) {
+ //fprintf(stderr, "Symbol is a flavour/choice\n");
+ if (snprintf(tfile, 256, ".rebuild.%s", hvalue) < 0)
+ perror("can not create file variable.");
+ fd = open(tfile, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
+ close(fd);
+ }
+ }
+}
+
+static char *toupperstr(char *string) {
+
+ int i;
+ char *str;
+
+ /* transform to uppercase variable name */
+ str = strdup(string);
+ for (i=0; i<(int)strlen(str); i++) {
+ if (str[i] == '+')
+ str[i] = 'X';
+ if (str[i] == '-')
+ str[i] = '_';
+ str[i] = toupper(str[i]);
+ }
+ return(str);
+}
+
+
+
+int main() {
+
+ FILE *config, *configold, *pkg;
+ char *key, *value, *string, *token, *check;
+ char *pkg_name, *keystr, *realpkgname;
+ char buf[128];
+ char path[320];
+ char pbuf[320];
+ DIR *pkgdir;
+ struct dirent *pkgdirp;
+
+ pkg_name = NULL;
+ /* read Makefile's for all packages */
+ pkgmap = strmap_new(1024);
+ pkgdir = opendir("package");
+ while ((pkgdirp = readdir(pkgdir)) != NULL) {
+ /* skip dotfiles */
+ if (strncmp(pkgdirp->d_name, ".", 1) > 0) {
+ if (snprintf(path, 320, "package/%s/Makefile", pkgdirp->d_name) < 0)
+ perror("can not create path variable.");
+ pkg = fopen(path, "r");
+ if (pkg == NULL)
+ continue;
+
+ while (fgets(pbuf, 320, pkg) != NULL) {
+ if (strncmp(pbuf, "PKG", 3) == 0) {
+ string = strstr(pbuf, "PKG_NAME:=");
+ if (string != NULL) {
+ string[strlen(string)-1] = '\0';
+ key = strtok(string, ":=");
+ value = strtok(NULL, "=\t");
+ if (value != NULL)
+ pkg_name = strdup(value);
+ }
+ string = strstr(pbuf, "PKG_SUBPKGS:=");
+ if (string != NULL) {
+ string[strlen(string)-1] = '\0';
+ key = strtok(string, ":=");
+ value = strtok(NULL, "=\t");
+ token = strtok(value, " ");
+ while (token != NULL) {
+ keystr = malloc(256);
+ memset(keystr, 0, 256);
+ strncat(keystr, "ADK_PACKAGE_", 12);
+ strncat(keystr, token, strlen(token));
+ strmap_put(pkgmap, keystr, pkgdirp->d_name);
+ token = strtok(NULL, " ");
+ free(keystr);
+ keystr = NULL;
+ }
+ }
+ string = strstr(pbuf, "PKG_SUBPKGS+=");
+ if (string != NULL) {
+ string[strlen(string)-1] = '\0';
+ key = strtok(string, "+=");
+ value = strtok(NULL, "=\t");
+ token = strtok(value, " ");
+ while (token != NULL) {
+ keystr = malloc(256);
+ memset(keystr, 0, 256);
+ strncat(keystr, "ADK_PACKAGE_", 12);
+ strncat(keystr, token, strlen(token));
+ strmap_put(pkgmap, keystr, pkgdirp->d_name);
+ token = strtok(NULL, " ");
+ free(keystr);
+ keystr = NULL;
+ }
+ }
+ string = strstr(pbuf, "PKG_FLAVOURS_");
+ if (string != NULL) {
+ check = strstr(pbuf, ":=");
+ if (check != NULL) {
+ string[strlen(string)-1] = '\0';
+ key = strtok(string, ":=");
+ realpkgname = strdup(key+13);
+ value = strtok(NULL, "=\t");
+ token = strtok(value, " ");
+ while (token != NULL) {
+ keystr = malloc(256);
+ memset(keystr, 0, 256);
+ strncat(keystr, "ADK_PACKAGE_", 12);
+ strncat(keystr, realpkgname, strlen(realpkgname));
+ strncat(keystr, "_", 1);
+ strncat(keystr, token, strlen(token));
+ strmap_put(pkgmap, keystr, pkgdirp->d_name);
+ token = strtok(NULL, " ");
+ free(keystr);
+ keystr = NULL;
+ }
+ } else {
+ string[strlen(string)-1] = '\0';
+ key = strtok(string, "+=");
+ realpkgname = strdup(key+13);
+ value = strtok(NULL, "=\t");
+ token = strtok(value, " ");
+ while (token != NULL) {
+ keystr = malloc(256);
+ memset(keystr, 0, 256);
+ strncat(keystr, "ADK_PACKAGE_", 12);
+ strncat(keystr, realpkgname, strlen(realpkgname));
+ strncat(keystr, "_", 1);
+ strncat(keystr, token, strlen(token));
+ strmap_put(pkgmap, keystr, pkgdirp->d_name);
+ token = strtok(NULL, " ");
+ free(keystr);
+ keystr = NULL;
+ }
+ }
+ }
+ string = strstr(pbuf, "PKG_CHOICES_");
+ if (string != NULL) {
+ string[strlen(string)-1] = '\0';
+ key = strtok(string, ":=");
+ value = strtok(NULL, "=\t");
+ token = strtok(value, " ");
+ while (token != NULL) {
+ keystr = malloc(256);
+ memset(keystr, 0, 256);
+ strncat(keystr, "ADK_PACKAGE_", 12);
+ strncat(keystr, toupperstr(pkg_name), strlen(pkg_name));
+ strncat(keystr, "_", 1);
+ strncat(keystr, token, strlen(token));
+ strmap_put(pkgmap, keystr, pkgdirp->d_name);
+ token = strtok(NULL, " ");
+ free(keystr);
+ keystr = NULL;
+ }
+ }
+ }
+ }
+ fclose(pkg);
+ }
+ }
+ closedir(pkgdir);
+
+ config = fopen(".config", "r");
+ if (config == NULL)
+ perror(".config is missing.");
+
+ configmap = strmap_new(1024);
+ while (fgets(buf, 128, config) != NULL) {
+ if (strncmp(buf, "ADK_PACKAGE", 11) == 0) {
+ key = strtok(buf, "=");
+ value = strtok(NULL, "=");
+ strmap_put(configmap, key, value);
+ }
+ }
+ fclose(config);
+
+ configold = fopen(".config.old", "r");
+ if (configold == NULL)
+ perror(".config.old is missing.");
+
+ configoldmap = strmap_new(1024);
+ while (fgets(buf, 128, configold) != NULL) {
+ if (strncmp(buf, "ADK_PACKAGE", 11) == 0) {
+ key = strtok(buf, "=");
+ value = strtok(NULL, "=");
+ strmap_put(configoldmap, key, value);
+ }
+ }
+ fclose(configold);
+
+ //fprintf(stdout, "Config Count: %d\n", strmap_get_count(configmap));
+ //fprintf(stdout, "Config Old Count: %d\n", strmap_get_count(configoldmap));
+
+ strmap_enum(configoldmap, iter_disabled, NULL);
+ strmap_enum(configmap, iter_enabled, NULL);
+ //strmap_enum(pkgmap, iter, NULL);
+
+ strmap_delete(pkgmap);
+ strmap_delete(configmap);
+ strmap_delete(configoldmap);
+
+ return(0);
+}