diff options
Diffstat (limited to 'plugins/perl')
-rw-r--r-- | plugins/perl/Makefile.am | 20 | ||||
-rwxr-xr-x | plugins/perl/generate_header.py | 29 | ||||
-rw-r--r-- | plugins/perl/meson.build | 73 |
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: '', +) |