summaryrefslogtreecommitdiffhomepage
path: root/src/logic
diff options
context:
space:
mode:
Diffstat (limited to 'src/logic')
-rw-r--r--src/logic/slbt_exec_compile.c100
1 files changed, 100 insertions, 0 deletions
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;
+}