From 36de3eaba978eee7d02a104747b6c0f1d1ba2edf Mon Sep 17 00:00:00 2001
From: midipix <writeonce@midipix.org>
Date: Thu, 10 Mar 2016 01:09:23 -0500
Subject: slbt_exec_compile(): initial implementation.

---
 src/logic/slbt_exec_compile.c | 100 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 100 insertions(+)
 create mode 100644 src/logic/slbt_exec_compile.c

(limited to 'src')

diff --git a/src/logic/slbt_exec_compile.c b/src/logic/slbt_exec_compile.c
new file mode 100644
index 0000000..34fc10d
--- /dev/null
+++ b/src/logic/slbt_exec_compile.c
@@ -0,0 +1,100 @@
+/*******************************************************************/
+/*  slibtool: a skinny libtool implementation, written in C        */
+/*  Copyright (C) 2016  Z. Gilboa                                  */
+/*  Released under the Standard MIT License; see COPYING.SLIBTOOL. */
+/*******************************************************************/
+
+#include <string.h>
+#include <stdbool.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/stat.h>
+
+#include <slibtool/slibtool.h>
+#include "slibtool_spawn_impl.h"
+
+int  slbt_exec_compile(
+	const struct slbt_driver_ctx *	dctx,
+	struct slbt_exec_ctx *		ectx)
+{
+	int			ret;
+	int			fdlibs;
+	FILE *			fout;
+	struct slbt_exec_ctx *	actx = 0;
+
+	/* context */
+	if (ectx)
+		slbt_reset_placeholders(ectx);
+	else if ((ret = slbt_get_exec_ctx(dctx,&ectx)))
+		return ret;
+	else
+		actx = ectx;
+
+	/* .libs directory */
+	if (dctx->cctx->drvflags & SLBT_DRIVER_SHARED) {
+		if ((fdlibs = open(ectx->ldirname,O_DIRECTORY)) >= 0)
+			close(fdlibs);
+		else if ((errno != ENOENT) || mkdir(ectx->ldirname,0777)) {
+			slbt_free_exec_ctx(actx);
+			return -1;
+		}
+	}
+
+	/* shared library object */
+	if (dctx->cctx->drvflags & SLBT_DRIVER_SHARED) {
+		if (!(dctx->cctx->drvflags & SLBT_DRIVER_ANTI_PIC)) {
+			*ectx->dpic = "-DPIC";
+			*ectx->fpic = "-fPIC";
+		}
+
+		*ectx->cass = "-c";
+		*ectx->lout[0] = "-o";
+		*ectx->lout[1] = ectx->lobjname;
+
+		if (((ret = slbt_spawn(ectx,true)) < 0) || ectx->exitcode) {
+			slbt_free_exec_ctx(actx);
+			return -1;
+		}
+	}
+
+	/* static archive object */
+	if (dctx->cctx->drvflags & SLBT_DRIVER_STATIC) {
+		slbt_reset_placeholders(ectx);
+
+		if (dctx->cctx->drvflags & SLBT_DRIVER_PRO_PIC) {
+			*ectx->dpic = "-DPIC";
+			*ectx->fpic = "-fPIC";
+		}
+
+		*ectx->cass = "-c";
+		*ectx->lout[0] = "-o";
+		*ectx->lout[1] = ectx->aobjname;;
+
+		if (((ret = slbt_spawn(ectx,true)) < 0) || ectx->exitcode) {
+			slbt_free_exec_ctx(actx);
+			return -1;
+		}
+	}
+
+	/* libtool object */
+	if (!(fout = fopen(ectx->ltobjname,"w"))) {
+		slbt_free_exec_ctx(actx);
+		return -1;
+	}
+
+	ret = fprintf(fout,
+		"# slibtool (pre-alphe) generated file\n\n"
+		"pic_object='%s'\n"
+		"non_pic_object='%s'\n",
+		(dctx->cctx->drvflags & SLBT_DRIVER_SHARED)
+			? ectx->lobjname
+			: "none",
+		(dctx->cctx->drvflags & SLBT_DRIVER_STATIC)
+			? ectx->aobjname
+			: "none");
+
+	fclose(fout);
+	slbt_free_exec_ctx(actx);
+
+	return 0;
+}
-- 
cgit v1.2.3