summaryrefslogtreecommitdiff
path: root/codegen/valaccodecompiler.vala
diff options
context:
space:
mode:
authorJürg Billeter <j@bitron.ch>2009-05-09 18:52:17 +0200
committerJürg Billeter <j@bitron.ch>2009-05-09 19:08:08 +0200
commita65f160da5596170969b191ed3c15a2003d778aa (patch)
tree2227dd132861735f803a5169087a6349653ae32a /codegen/valaccodecompiler.vala
parentdcad683f435baa0a944877465889e37ad078aa5d (diff)
downloadvala-a65f160da5596170969b191ed3c15a2003d778aa.tar.gz
Rename gobject directory to codegen
Diffstat (limited to 'codegen/valaccodecompiler.vala')
-rw-r--r--codegen/valaccodecompiler.vala148
1 files changed, 148 insertions, 0 deletions
diff --git a/codegen/valaccodecompiler.vala b/codegen/valaccodecompiler.vala
new file mode 100644
index 000000000..2f61a3164
--- /dev/null
+++ b/codegen/valaccodecompiler.vala
@@ -0,0 +1,148 @@
+/* valaccodecompiler.vala
+ *
+ * Copyright (C) 2007-2009 Jürg Billeter
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ * Author:
+ * Jürg Billeter <j@bitron.ch>
+ */
+
+using GLib;
+
+/**
+ * Interface to the C compiler.
+ */
+public class Vala.CCodeCompiler {
+ public CCodeCompiler () {
+ }
+
+ static bool package_exists(string package_name) {
+ string pc = "pkg-config --exists " + package_name;
+ int exit_status;
+
+ try {
+ Process.spawn_command_line_sync (pc, null, null, out exit_status);
+ return (0 == exit_status);
+ } catch (SpawnError e) {
+ Report.error (null, e.message);
+ return false;
+ }
+ }
+
+ /**
+ * Compile generated C code to object code and optionally link object
+ * files.
+ *
+ * @param context a code context
+ */
+ [NoArrayLength]
+ public void compile (CodeContext context, string? cc_command, string[] cc_options) {
+ bool use_pkgconfig = false;
+
+ string pc = "pkg-config --cflags";
+ if (!context.compile_only) {
+ pc += " --libs";
+ }
+ if (context.profile == Profile.GOBJECT) {
+ use_pkgconfig = true;
+ pc += " gobject-2.0";
+ if (context.thread) {
+ pc += " gthread-2.0";
+ }
+ }
+ foreach (string pkg in context.get_packages ()) {
+ if (package_exists (pkg)) {
+ use_pkgconfig = true;
+ pc += " " + pkg;
+ }
+ }
+ string pkgflags = "";
+ if (use_pkgconfig) {
+ try {
+ int exit_status;
+ Process.spawn_command_line_sync (pc, out pkgflags, null, out exit_status);
+ if (exit_status != 0) {
+ Report.error (null, "pkg-config exited with status %d".printf (exit_status));
+ return;
+ }
+ } catch (SpawnError e) {
+ Report.error (null, e.message);
+ return;
+ }
+ }
+
+ // TODO compile the C code files in parallel
+
+ if (cc_command == null) {
+ cc_command = "cc";
+ }
+ string cmdline = cc_command;
+ if (context.debug) {
+ cmdline += " -g";
+ }
+ if (context.compile_only) {
+ cmdline += " -c";
+ } else if (context.output != null) {
+ string output = context.output;
+ if (context.directory != null && context.directory != "" && !Path.is_absolute (context.output)) {
+ output = "%s%c%s".printf (context.directory, Path.DIR_SEPARATOR, context.output);
+ }
+ cmdline += " -o " + Shell.quote (output);
+ }
+
+ /* we're only interested in non-pkg source files */
+ var source_files = context.get_source_files ();
+ foreach (SourceFile file in source_files) {
+ if (!file.external_package) {
+ cmdline += " " + Shell.quote (file.get_csource_filename ());
+ }
+ }
+ var c_source_files = context.get_c_source_files ();
+ foreach (string file in c_source_files) {
+ cmdline += " " + Shell.quote (file);
+ }
+
+ // add libraries after source files to fix linking
+ // with --as-needed and on Windows
+ cmdline += " " + pkgflags.strip ();
+ foreach (string cc_option in cc_options) {
+ cmdline += " " + Shell.quote (cc_option);
+ }
+
+ if (context.verbose_mode) {
+ stdout.printf ("%s\n", cmdline);
+ }
+
+ try {
+ int exit_status;
+ Process.spawn_command_line_sync (cmdline, null, null, out exit_status);
+ if (exit_status != 0) {
+ Report.error (null, "cc exited with status %d".printf (exit_status));
+ }
+ } catch (SpawnError e) {
+ Report.error (null, e.message);
+ }
+
+ /* remove generated C source and header files */
+ foreach (SourceFile file in source_files) {
+ if (!file.external_package) {
+ if (!context.save_csources) {
+ FileUtils.unlink (file.get_csource_filename ());
+ }
+ }
+ }
+ }
+}