clean_paths += config/config.h.tmp
cc_bin = $(CC) $(embed_cflags) $(CFLAGS) $^ $(embed_ldflags) $(LDFLAGS) -fPIE \
- $(OUTPUT_OPTION)
+ -I src $(OUTPUT_OPTION)
clean_paths += dev/python-proposed
generated_dependencies += dev/python-proposed.d
-dev/python-proposed: dev/python.c
+dev/python-proposed: dev/python.c src/bup/compat.c src/bup/io.c
rm -f dev/python
$(cc_bin)
clean_paths += dev/bup-exec
generated_dependencies += dev/bup-exec.d
dev/bup-exec: CFLAGS += -D BUP_DEV_BUP_EXEC=1
-dev/bup-exec: lib/cmd/bup.c src/bup/io.c
+dev/bup-exec: lib/cmd/bup.c src/bup/compat.c src/bup/io.c
$(cc_bin)
clean_paths += dev/bup-python
generated_dependencies += dev/bup-python.d
dev/bup-python: CFLAGS += -D BUP_DEV_BUP_PYTHON=1
-dev/bup-python: lib/cmd/bup.c src/bup/io.c
+dev/bup-python: lib/cmd/bup.c src/bup/compat.c src/bup/io.c
$(cc_bin)
clean_paths += lib/cmd/bup
generated_dependencies += lib/cmd/bup.d
-lib/cmd/bup: lib/cmd/bup.c src/bup/io.c
+lib/cmd/bup: lib/cmd/bup.c src/bup/compat.c src/bup/io.c
$(cc_bin)
clean_paths += lib/bup/_helpers$(soext)
// http://docs.python.org/3/c-api/intro.html#include-files
#include <Python.h>
-#if PY_MAJOR_VERSION > 2
-#define bup_py_main Py_BytesMain
-# else
-#define bup_py_main Py_Main
+#include "bup/compat.h"
+
+#if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 8
+# define bup_py_main bup_py_bytes_main
+#elif PY_MAJOR_VERSION > 2
+# define bup_py_main Py_BytesMain
+#else
+# define bup_py_main Py_Main
#endif
int main(int argc, char **argv)
#include <sys/types.h>
#include <unistd.h>
+#include "bup/compat.h"
#include "bup/io.h"
static int prog_argc = 0;
free(parent);
}
-#if PY_MAJOR_VERSION > 2
-#define bup_py_main Py_BytesMain
-# else
-#define bup_py_main Py_Main
+#if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 8
+# define bup_py_main bup_py_bytes_main
+#elif PY_MAJOR_VERSION > 2
+# define bup_py_main Py_BytesMain
+#else
+# define bup_py_main Py_Main
#endif
#if defined(BUP_DEV_BUP_PYTHON) && defined(BUP_DEV_BUP_EXEC)
--- /dev/null
+
+#define PY_SSIZE_T_CLEAN
+#define _GNU_SOURCE 1 // asprintf
+#undef NDEBUG
+
+// According to Python, its header has to go first:
+// http://docs.python.org/2/c-api/intro.html#include-files
+// http://docs.python.org/3/c-api/intro.html#include-files
+#include <Python.h>
+
+#include "bup/compat.h"
+#include "bup/io.h"
+
+#if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 8
+
+int bup_py_bytes_main(int argc, char **argv)
+{
+ wchar_t **wargv = PyMem_RawMalloc(argc * sizeof(wchar_t *));
+ if (!wargv)
+ die(2, "memory insufficient to decode command line arguments");
+ int i;
+ for (i = 0; i < argc; i++) {
+ size_t wargn;
+ wargv[i] = Py_DecodeLocale(argv[i], &wargn);
+ if (!wargv[i]) {
+ switch (wargn) {
+ case (size_t) -1:
+ die(2, "too little memory to decode command line argument %d\n",
+ i);
+ break;
+ case (size_t) -2:
+ die(2, "unable to decode command line argument %d\n", i);
+ break;
+ default:
+ die(2, "unexpected error from Py_DecodeLocale(): %zu\n", wargn);
+ break;
+ }
+ exit(2);
+ }
+ }
+ return Py_Main(argc, wargv);
+}
+
+#endif // PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 8
--- /dev/null
+#pragma once
+
+int bup_py_bytes_main(int argc, char **argv);