/*******************************************************************/ /* sbpython3: external configurable build project for Python-3.x. */ /* Copyright (C) 2018--2021 SysDeer Technologies, LLC */ /* Released under the Standard MIT License; see COPYING.SBPYTHON3.*/ /*******************************************************************/ /*******************************************************************/ /* pyexts.c: a simple development-time utility for generating */ /* make rules for python's extension modules. The utility is */ /* included with the sbpython3 project for reference only. */ /* */ /* cc -std=c99 -D_XOPEN_SOURCE=700 pyexts.c */ /*******************************************************************/ #include #include #include "pyexts.h" 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(int argc, char ** argv) { 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 fmt[64]; char uname[64]; if ((argc == 2) && !strcmp(argv[1],"--py-init-func")) { for (p=pyexts; p->name; p++) printf("PY_INIT_FUNC(%s);\n",p->name); return 0; } if ((argc == 2) && !strcmp(argv[1],"--init-func-ptr")) { for (p=pyexts; p->name; p++) { nlen = strlen(p->name); sprintf(fmt,"\t{\"%%s\",%%-%zusPyInit_%%s},%%-%zus\\\n", 20-nlen,23-nlen); printf(fmt,p->name," ",p->name," "); } return 0; } 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+= " "pyext/obj/%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$(PYTHON_SOEXT)\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; }