mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-27 05:13:10 +00:00
Added internalize_scripts.py in preparation for ending reliance on "standard" scripts in /usr/local/share
This commit is contained in:
parent
99000e68b7
commit
6abf3db13e
2 changed files with 105 additions and 2 deletions
15
Makefile.cpp
15
Makefile.cpp
|
@ -86,7 +86,6 @@ HAVE_GETTEXT=0
|
|||
|
||||
COMMON_FILES := util.cpp halloc.cpp halloc_util.cpp fallback.cpp
|
||||
|
||||
|
||||
#
|
||||
# All objects that the system needs to build fish, except fish.o
|
||||
#
|
||||
|
@ -96,7 +95,7 @@ FISH_OBJS := function.o builtin.o complete.o env.o exec.o expand.o \
|
|||
tokenizer.o wildcard.o wgetopt.o wutil.o input.o output.o intern.o \
|
||||
env_universal.o env_universal_common.o input_common.o event.o \
|
||||
signal.o io.o parse_util.o common.o screen.o path.o \
|
||||
parser_keywords.o iothread.o
|
||||
parser_keywords.o iothread.o builtin_scripts.o
|
||||
|
||||
FISH_INDENT_OBJS := fish_indent.o print_help.o common.o \
|
||||
parser_keywords.o wutil.o tokenizer.o
|
||||
|
@ -159,6 +158,17 @@ HDR_FILES_SRC := doc_src/index.hdr.in doc_src/commands.hdr.in doc_src/design.hdr
|
|||
|
||||
HDR_FILES := $(subst .hdr.in,.hdr,$(HDR_FILES_SRC))
|
||||
|
||||
#
|
||||
# Internalized scripts
|
||||
#
|
||||
|
||||
GENERATED_INTERN_SCRIPT_FILES := builtin_scripts.h builtin_scripts.cpp
|
||||
|
||||
# Use a pattern rule so that Make knows to only issue one invocation
|
||||
# per http://www.gnu.org/software/make/manual/make.html#Pattern-Intro
|
||||
builtin%scripts.h builtin%scripts.cpp: internalize_scripts.py
|
||||
./internalize_scripts.py share/functions/*.fish
|
||||
|
||||
#
|
||||
# Files containing documentation for external commands.
|
||||
#
|
||||
|
@ -876,6 +886,7 @@ distclean: clean
|
|||
|
||||
clean:
|
||||
rm -f *.o doc.h doc.tmp doc_src/*.doxygen doc_src/*.cpp doc_src/*.o doc_src/commands.hdr
|
||||
rm -f $(GENERATED_INTERN_SCRIPT_FILES)
|
||||
rm -f tests/tmp.err tests/tmp.out tests/tmp.status tests/foo.txt
|
||||
rm -f $(PROGRAMS) fish_tests tokenizer_test key_reader
|
||||
rm -f share/config.fish etc/config.fish doc_src/index.hdr doc_src/commands.hdr
|
||||
|
|
92
internalize_scripts.py
Executable file
92
internalize_scripts.py
Executable file
|
@ -0,0 +1,92 @@
|
|||
#!/usr/bin/python
|
||||
|
||||
import string, sys, os.path
|
||||
|
||||
escapes = {}
|
||||
escapes['\a'] = r'\a'
|
||||
escapes['\b'] = r'\b'
|
||||
escapes['\f'] = r'\f'
|
||||
escapes['\n'] = r'\n'
|
||||
escapes['\r'] = r'\r'
|
||||
#escapes['\t'] = r'\t'
|
||||
# Let's replace tabs with four spaces
|
||||
# so the text looks nicely indented in the C source
|
||||
escapes['\t'] = r' '
|
||||
escapes['\v'] = r'\v'
|
||||
# escapes['\''] = r'\''
|
||||
escapes['\"'] = r'\"'
|
||||
escapes['\\'] = r'\\'
|
||||
|
||||
def escape(c):
|
||||
if c in escapes:
|
||||
return escapes[c]
|
||||
elif c not in string.printable:
|
||||
return "\\x%x" % ord(c)
|
||||
else:
|
||||
return c
|
||||
|
||||
def stringize(line):
|
||||
newline = '"'
|
||||
for c in line:
|
||||
newline += escape(c)
|
||||
newline += '"'
|
||||
return newline
|
||||
|
||||
class cfunc:
|
||||
def __init__(self, name, lines):
|
||||
self.name = name
|
||||
self.lines = lines
|
||||
|
||||
def cdef(self):
|
||||
result = ""
|
||||
result += "static const char * const %s = \n\t" % self.cfunc_name()
|
||||
result += '\n\t'.join(self.lines)
|
||||
result += ';\n'
|
||||
return result
|
||||
|
||||
def cfunc_name(self):
|
||||
munged_name = string.replace(self.name, '-', '_')
|
||||
return "function_%s" % munged_name
|
||||
|
||||
funcs = []
|
||||
for file in sys.argv[1:]:
|
||||
fd = open(file, 'r')
|
||||
newlines = []
|
||||
for line in fd:
|
||||
newlines.append(stringize(line))
|
||||
fd.close()
|
||||
name = os.path.basename(file)
|
||||
name, ext = os.path.splitext(name)
|
||||
funcs.append(cfunc(name, newlines))
|
||||
|
||||
# Sort our functions by name
|
||||
funcs.sort(key=cfunc.cfunc_name)
|
||||
|
||||
# Output our header
|
||||
fd = open('builtin_scripts.h', 'w')
|
||||
fd.write('/* This file is generated by internalize_scripts.py */\n\n')
|
||||
fd.write("""struct builtin_script_t {
|
||||
const char *name;
|
||||
const char *def;
|
||||
};""")
|
||||
|
||||
fd.write('\n')
|
||||
fd.write('\n')
|
||||
fd.write('extern const struct builtin_script_t builtin_scripts[%d];\n' % len(funcs))
|
||||
fd.write('\n')
|
||||
fd.close()
|
||||
|
||||
# Output the function definitions
|
||||
fd = open('builtin_scripts.cpp', 'w')
|
||||
fd.write('/* This file is generated by internalize_scripts.py */\n\n')
|
||||
fd.write('#include "builtin_scripts.h"\n\n')
|
||||
for func in funcs:
|
||||
fd.write(func.cdef())
|
||||
fd.write('\n')
|
||||
|
||||
# Output the refs
|
||||
func_refs = ["{%s, %s}" % (stringize(func.name), func.cfunc_name()) for func in funcs]
|
||||
fd.write('const struct builtin_script_t builtin_scripts[%d] =\n' % len(funcs))
|
||||
fd.write('{\n\t')
|
||||
fd.write(',\n\t'.join(func_refs))
|
||||
fd.write('\n};\n')
|
Loading…
Reference in a new issue