summary refs log tree commit diff stats
path: root/plugins/perl
diff options
context:
space:
mode:
authorPatrick Griffis <tingping@tingping.se>2016-12-13 16:12:03 -0500
committerPatrick Griffis <tingping@tingping.se>2017-06-13 23:54:51 -0400
commit628100c19f5d82747170acdf2917cba8c119ccbf (patch)
tree351a7e9714a1a58390ba349808df5703cef25c3e /plugins/perl
parent2edf50d4ddc61ce6f73bf02263c9bdd09632c66b (diff)
build: Replace Autotools with Meson
Quick rundown of benefits:

- Much faster:
  - Autotools (with autogen): 22 seconds
  - Meson: 7 seconds
  - Meson (with ccache): 2 seconds

- Simpler:
  - ~1000 lines smaller
  - Single simple language

- Potentially better Windows (Visual Studio) support

What is not done:

- Complete Windows support
- OSX support (easy)

Closes #2013
Closes #1937
Closes #1803
Diffstat (limited to 'plugins/perl')
-rw-r--r--plugins/perl/Makefile.am20
-rwxr-xr-xplugins/perl/generate_header.py29
-rw-r--r--plugins/perl/meson.build73
3 files changed, 102 insertions, 20 deletions
diff --git a/plugins/perl/Makefile.am b/plugins/perl/Makefile.am
deleted file mode 100644
index af721e7e..00000000
--- a/plugins/perl/Makefile.am
+++ /dev/null
@@ -1,20 +0,0 @@
-
-EXTRA_DIST=generate_header lib/HexChat.pm lib/Xchat.pm lib/HexChat/Embed.pm lib/HexChat/List/Network.pm \
-	lib/HexChat/List/Network/Entry.pm lib/HexChat/List/Network/AutoJoin.pm lib/IRC.pm
-
-libdir = $(hexchatlibdir)
-
-lib_LTLIBRARIES = perl.la
-perl_la_SOURCES = perl.c
-perl_la_LDFLAGS = $(PERL_LDFLAGS) $(PLUGIN_LDFLAGS) -module
-perl_la_LIBADD = $(GLIB_LIBS)
-perl_la_CPPFLAGS = -I$(top_srcdir)/src/common
-perl_la_CFLAGS = $(PERL_CFLAGS) $(GLIB_CFLAGS)
-
-BUILT_SOURCES = hexchat.pm.h irc.pm.h
-CLEANFILES = $(BUILT_SOURCES)
-
-hexchat.pm.h irc.pm.h: lib/HexChat.pm lib/Xchat.pm lib/HexChat/Embed.pm \
-	lib/HexChat/List/Network.pm lib/HexChat/List/Network/Entry.pm \
-	lib/HexChat/List/Network/AutoJoin.pm lib/IRC.pm
-	cd $(srcdir); perl generate_header
diff --git a/plugins/perl/generate_header.py b/plugins/perl/generate_header.py
new file mode 100755
index 00000000..ba7e02a3
--- /dev/null
+++ b/plugins/perl/generate_header.py
@@ -0,0 +1,29 @@
+#!/usr/bin/env python3
+
+import sys
+from os.path import basename
+
+out_file = sys.argv[1]
+in_files = sys.argv[2:]
+
+
+def escape_perl(file):
+    ret = ''
+    for line in file:
+        # Escape " and \, strip empty space, shove in C strings.
+        ret += '"' + line.strip().replace('\\', '\\\\').replace('"', '\\"') + '\\n"\n'
+    return ret
+
+
+with open(out_file, 'w') as o:
+    o.write('"BEGIN {\\n"\n')
+    for in_file in in_files:
+        o.write("\"$INC{{'{}'}} = 'Compiled into the plugin.';\\n\"\n".format(basename(in_file)))
+    o.write('"}\\n"\n')
+
+    for in_file in in_files:
+        o.write('"{\\n"\n')
+        o.write('"#line 1 \\"{}\\"\\n"\n'.format(basename(in_file)))
+        with open(in_file) as i:
+            o.write(escape_perl(i))
+        o.write('"}\\n"\n')
diff --git a/plugins/perl/meson.build b/plugins/perl/meson.build
new file mode 100644
index 00000000..49011884
--- /dev/null
+++ b/plugins/perl/meson.build
@@ -0,0 +1,73 @@
+generate_perl_header = find_program('generate_header.py')
+
+hexchat_perl_module = custom_target('hexchat-perl-header',
+  input: [
+    'lib/HexChat.pm',
+    'lib/Xchat.pm',
+    'lib/HexChat/Embed.pm',
+    'lib/HexChat/List/Network.pm',
+    'lib/HexChat/List/Network/Entry.pm',
+    'lib/HexChat/List/Network/AutoJoin.pm',
+  ],
+  output: 'hexchat.pm.h',
+  command: [generate_perl_header, '@OUTPUT@', '@INPUT@']
+)
+
+irc_perl_module = custom_target('irc-perl-header',
+  input: 'lib/IRC.pm',
+  output: 'irc.pm.h',
+  command: [generate_perl_header, '@OUTPUT@', '@INPUT@']
+)
+
+perl = find_program('perl')
+
+ret = run_command([perl, '-MExtUtils::Embed', '-e', 'ccopts'])
+if ret.returncode() != 0
+  error('perl: Failed to get cflags')
+endif
+perl_cflags = []
+foreach flag : ret.stdout().strip().split(' ')
+  if flag.startswith('-I') or flag.startswith('-D')
+    perl_cflags += flag
+  endif
+endforeach
+
+ret = run_command([perl, '-MExtUtils::Embed', '-e', 'ldopts'])
+if ret.returncode() != 0
+  error('perl: Failed to get ldflags')
+endif
+perl_ldflags = []
+foreach flag : ret.stdout().strip().split(' ')
+  if flag.startswith('-L') or flag.startswith('-l')
+    perl_ldflags += flag
+  endif
+endforeach
+
+perl_cflags += [
+  # Perl has its own 'config.h' that we must override
+  # TODO: Just rename ours to something more unique.
+  '-include', meson.build_root() + '/config.h'
+]
+
+if not cc.links('''
+#define PERL_NO_INLINE_FUNCTIONS
+#include <EXTERN.h>
+#include <perl.h>
+
+int main(void) {
+  PerlInterpreter *my_perl = perl_alloc();
+  return 0;
+}
+''', args: perl_cflags + perl_ldflags)
+  error('found perl not suitable for plugin')
+endif
+
+shared_module('perl',
+  sources: ['perl.c', hexchat_perl_module, irc_perl_module],
+  dependencies: [libgio_dep, hexchat_plugin_dep],
+  c_args: perl_cflags,
+  link_args: perl_ldflags,
+  install: true,
+  install_dir: plugindir,
+  name_prefix: '',
+)