summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--project/pyexts.c287
1 files changed, 287 insertions, 0 deletions
diff --git a/project/pyexts.c b/project/pyexts.c
new file mode 100644
index 0000000..cec86e9
--- /dev/null
+++ b/project/pyexts.c
@@ -0,0 +1,287 @@
+/*******************************************************************/
+/* bpython2: external configurable build project for Python-2.7. */
+/* Copyright (C) 2018 Z. Gilboa */
+/* Released under the Standard MIT License; see COPYING.BPYTHON2. */
+/*******************************************************************/
+
+/*******************************************************************/
+/* pyexts.c: a simple development-time utility for generating */
+/* make rules for python's extension modules. The utility is */
+/* included with the bpython2 project for reference only. */
+/* */
+/* cc -std=c99 -D_XOPEN_SOURCE=700 pyexts.c */
+/*******************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+
+#define PYEXT_LIST(...) (const char *[]){__VA_ARGS__,0}
+#define PYEXT_SIMPLE(name,...) {name,PYEXT_LIST(__VA_ARGS__),0,0,0,0}
+
+#define PYEXT_COMMON(name,hvar,lvar,...) {name,PYEXT_LIST(__VA_ARGS__), \
+ PYEXT_LIST(hvar),0, \
+ PYEXT_LIST(lvar),0}
+
+#define PYEXT_ALTSTD(name,cstd,...) {name,PYEXT_LIST(__VA_ARGS__), \
+ 0,PYEXT_LIST(cstd),0,0}
+
+struct pyext_meta {
+ const char * name;
+ const char ** srcs;
+ const char ** hdrs;
+ const char ** cstd;
+ const char ** vars;
+ const char ** deps;
+};
+
+static const struct pyext_meta pyexts[] = {
+ PYEXT_SIMPLE("_multibytecodec","cjkcodecs/multibytecodec"),
+ PYEXT_SIMPLE("_codecs_cn", "cjkcodecs/_codecs_cn"),
+ PYEXT_SIMPLE("_codecs_hk", "cjkcodecs/_codecs_hk"),
+ PYEXT_SIMPLE("_codecs_jp", "cjkcodecs/_codecs_jp"),
+ PYEXT_SIMPLE("_codecs_kr", "cjkcodecs/_codecs_kr"),
+ PYEXT_SIMPLE("_codecs_tw", "cjkcodecs/_codecs_tw"),
+ PYEXT_SIMPLE("_codecs_iso2022","cjkcodecs/_codecs_iso2022"),
+
+ PYEXT_SIMPLE("_bisect", "_bisectmodule"),
+ PYEXT_SIMPLE("_collections", "_collectionsmodule"),
+ PYEXT_SIMPLE("_csv", "_csv"),
+ PYEXT_SIMPLE("_ctypes_test", "_ctypes/_ctypes_test"),
+ PYEXT_SIMPLE("_functools", "_functoolsmodule"),
+ PYEXT_SIMPLE("_heapq", "_heapqmodule"),
+ PYEXT_SIMPLE("_hotshot", "_hotshot"),
+ PYEXT_SIMPLE("_json", "_json"),
+ PYEXT_SIMPLE("_locale", "_localemodule"),
+ PYEXT_SIMPLE("_lsprof", "_lsprof","rotatingtree"),
+ PYEXT_SIMPLE("_random", "_randommodule"),
+ PYEXT_SIMPLE("_socket", "socketmodule","timemodule"),
+ PYEXT_SIMPLE("_struct", "_struct"),
+ PYEXT_SIMPLE("_testcapi", "_testcapimodule"),
+
+ PYEXT_SIMPLE("array", "arraymodule"),
+ PYEXT_SIMPLE("audioop", "audioop"),
+ PYEXT_SIMPLE("binascii", "binascii"),
+ PYEXT_SIMPLE("cPickle", "cPickle"),
+ PYEXT_SIMPLE("cStringIO", "cStringIO"),
+ PYEXT_SIMPLE("cmath", "cmathmodule","_math"),
+ PYEXT_SIMPLE("crypt", "cryptmodule"),
+ PYEXT_SIMPLE("datetime", "datetimemodule","timemodule"),
+ PYEXT_SIMPLE("fcntl", "fcntlmodule"),
+ PYEXT_SIMPLE("future_builtins","future_builtins"),
+ PYEXT_SIMPLE("grp", "grpmodule"),
+ PYEXT_SIMPLE("itertools", "itertoolsmodule"),
+ PYEXT_SIMPLE("math", "mathmodule","_math"),
+ PYEXT_SIMPLE("mmap", "mmapmodule"),
+ PYEXT_SIMPLE("operator", "operator"),
+ PYEXT_SIMPLE("ossaudiodev", "ossaudiodev"),
+ PYEXT_SIMPLE("parser", "parsermodule"),
+ PYEXT_SIMPLE("resource", "resource"),
+ PYEXT_SIMPLE("select", "selectmodule"),
+ PYEXT_SIMPLE("spwd", "spwdmodule"),
+ PYEXT_SIMPLE("strop", "stropmodule"),
+ PYEXT_SIMPLE("syslog", "syslogmodule"),
+ PYEXT_SIMPLE("termios", "termios"),
+ PYEXT_SIMPLE("time", "timemodule"),
+ PYEXT_SIMPLE("unicodedata", "unicodedata"),
+
+ PYEXT_COMMON("_curses", "$(CFLAGS_NCURSES)", "$(LDFLAGS_NCURSES)", "_cursesmodule"),
+ PYEXT_COMMON("_curses_panel", "$(CFLAGS_NCURSES)", "$(LDFLAGS_NCURSES)", "_curses_panel"),
+ PYEXT_COMMON("_elementtree", "-UVERSION", "-lexpat", "_elementtree"),
+ PYEXT_COMMON("_hashlib", 0, "-lssl -lcrypto", "_hashopenssl"),
+ PYEXT_COMMON("_ssl", 0, "-lssl -lcrypto", "_ssl"),
+ PYEXT_COMMON("bz2", 0, "-lbz2", "bz2module"),
+ PYEXT_COMMON("gdbm", 0, "-lgdbm", "gdbmmodule"),
+ PYEXT_COMMON("readline", 0, "-lreadline", "readline"),
+ PYEXT_COMMON("pyexpat", 0, "-lexpat", "pyexpat"),
+ PYEXT_COMMON("zlib", 0, "-lz", "zlibmodule"),
+
+ PYEXT_COMMON("_ctypes",0,"-lffi",
+ "_ctypes/_ctypes",
+ "_ctypes/callbacks",
+ "_ctypes/callproc",
+ "_ctypes/stgdict",
+ "_ctypes/cfield"),
+
+ PYEXT_COMMON("_io",0,0,
+ "_io/bufferedio",
+ "_io/bytesio",
+ "_io/fileio",
+ "_io/iobase",
+ "_io/_iomodule",
+ "_io/stringio",
+ "_io/textio"),
+
+ PYEXT_COMMON("_multiprocessing",0,0,
+ "_multiprocessing/multiprocessing",
+ "_multiprocessing/socket_connection",
+ "_multiprocessing/semaphore"),
+
+ PYEXT_COMMON("_sqlite3",
+ "$(CFLAGS_SQLITE)",
+ "$(LDFLAGS_SQLITE)",
+ "_sqlite/cache",
+ "_sqlite/connection",
+ "_sqlite/cursor",
+ "_sqlite/microprotocols",
+ "_sqlite/module",
+ "_sqlite/prepare_protocol",
+ "_sqlite/row",
+ "_sqlite/statement",
+ "_sqlite/util"),
+
+ PYEXT_COMMON("dbm",
+ "$(CFLAGS_DBM)",
+ "$(LDFLAGS_DBM)",
+ "dbmmodule"),
+
+ PYEXT_ALTSTD("linuxaudiodev",
+ "-std=gnu99",
+ "linuxaudiodev"),
+
+ {0,0,0,0,0,0},
+};
+
+static void pyext_uppercase(char * buf, const char * name)
+{
+ const char * src;
+ char * dst;
+
+ src = name;
+ dst = buf;
+
+ for (; *src; )
+ *dst++ = ((*src >= 'a') && (*src <= 'z'))
+ ? 'A' - 'a' + *src++ : *src++;
+
+ *dst = 0;
+}
+
+int main(void)
+{
+ const struct pyext_meta * p;
+ size_t nlen;
+ const char ** parg;
+ const char * dtab;
+ const char * otab;
+ const char * htab;
+ const char * stab;
+ const char * ltab;
+ const char * rtab;
+ const char * vtab;
+ const char * name;
+ char uname[64];
+
+ for (p=pyexts; p->name; p++) {
+ /* init */
+ name = (p->name[0] == '_') ? &p->name[1] : p->name;
+ nlen = strlen(name);
+
+ pyext_uppercase(uname,name);
+
+ /* pretty */
+ dtab = (nlen <= 4)
+ ? "\t\t\t"
+ : (nlen <= 12)
+ ? "\t\t" : "\t";
+
+ otab = (nlen <= 3)
+ ? "\t\t\t"
+ : (nlen <= 11)
+ ? "\t\t" : "\t";
+
+ ltab = (nlen <= 2)
+ ? "\t\t\t"
+ : (nlen <= 10)
+ ? "\t\t" : "\t";
+
+ rtab = (nlen <= 1)
+ ? "\t\t\t"
+ : (nlen <= 9)
+ ? "\t\t" : "\t";
+
+ vtab = (nlen <= 6)
+ ? "\t\t"
+ : (nlen <= 14)
+ ? "\t" : "";
+
+ htab = (nlen <= 8)
+ ? "\t\t" : "\t";
+
+ stab = (nlen <= 9)
+ ? "\t\t" : "\t";
+
+
+ /* output */
+ printf("# %s\n",p->name);
+
+ for (parg=p->srcs; *parg; parg++)
+ printf("PYEXT_%s_SRCS%s+= "
+ "Modules/%s.c\n",
+ uname,dtab,*parg);
+
+ printf("\n");
+ printf("PYEXT_%s_LOBJS%s= $(PYEXT_%s_SRCS:.c=.lo)\n",uname,otab,uname);
+ printf("PYEXT_%s_OBJS%s= $(PYEXT_%s_SRCS:.c=.o)\n",uname,dtab,uname);
+ printf("\n");
+
+ for (parg=p->hdrs; parg && *parg; parg++)
+ printf("$(PYEXT_%s_LOBJS):%s"
+ "CFLAGS_CONFIG += %s\n",
+ uname,htab,*parg);
+
+ for (parg=p->hdrs; parg && *parg; parg++)
+ printf("$(PYEXT_%s_OBJS):%s"
+ "CFLAGS_CONFIG += %s\n",
+ uname,stab,*parg);
+
+ for (parg=p->cstd; parg && *parg; parg++)
+ printf("$(PYEXT_%s_LOBJS):%s"
+ "CFLAGS_LAST += %s\n",
+ uname,otab,*parg);
+
+ for (parg=p->cstd; parg && *parg; parg++)
+ printf("$(PYEXT_%s_OBJS):%s"
+ "CFLAGS_LAST += %s\n",
+ uname,dtab,*parg);
+
+ if (p->hdrs || p->cstd)
+ printf("\n");
+
+ printf("PYEXT_%s_SHARED%s= pyext/%s$(OS_LIB_SUFFIX)\n",uname,ltab,p->name);
+ printf("PYEXT_%s_STATIC%s= pyext/%s$(OS_ARCHIVE_EXT)\n",uname,ltab,p->name);
+ printf("\n");
+
+ for (parg=p->vars; parg && *parg; parg++)
+ printf("$(PYEXT_%s_SHARED):%s"
+ "LDFLAGS_DYNEXT += %s\n",
+ uname,vtab,*parg);
+
+ for (parg=p->deps; parg && *parg; parg++)
+ printf("$(PYEXT_%s_SHARED):%s%s\n",uname,vtab,*parg);
+
+ printf("$(PYEXT_%s_SHARED):%s$(PYEXT_%s_LOBJS)\n",uname,vtab,uname);
+ printf("$(PYEXT_%s_STATIC):%s$(PYEXT_%s_OBJS)\n",uname,vtab,uname);
+
+ printf("\n");
+ printf("pyext-%s-shared:%s$(PYEXT_%s_SHARED)\n",name,rtab,uname);
+ printf("pyext-%s-static:%s$(PYEXT_%s_STATIC)\n",name,rtab,uname);
+
+ printf("\n");
+ printf("pyext-%s-clean:\n",name);
+ printf("\trm -f $(PYEXT_%s_LOBJS)\n",uname);
+ printf("\trm -f $(PYEXT_%s_OBJS)\n",uname);
+ printf("\trm -f $(PYEXT_%s_SHARED)\n",uname);
+ printf("\trm -f $(PYEXT_%s_STATIC)\n",uname);
+
+ printf("\n");
+ printf("clean:\tpyext-%s-clean\n",name);
+
+ printf("\n");
+ printf(".PHONY:\tpyext-%s-shared\n",name);
+ printf(".PHONY:\tpyext-%s-static\n",name);
+ printf(".PHONY:\tpyext-%s-clean\n",name);
+ printf("\n\n");
+ }
+
+ return 0;
+}