aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormitchell <70453897+667e-11@users.noreply.github.com>2012-06-27 13:13:27 -0400
committermitchell <70453897+667e-11@users.noreply.github.com>2012-06-27 13:13:27 -0400
commit0e7bf875d8bf729674cfa779b70f75a50f4030e1 (patch)
tree0861798899c89afa5bb9561074ea79a004fe95fb
parentd847e314957b041d677d4498b1f4f431d3a6e827 (diff)
downloadtextadept-0e7bf875d8bf729674cfa779b70f75a50f4030e1.tar.gz
textadept-0e7bf875d8bf729674cfa779b70f75a50f4030e1.zip
Refactored the Makefile.
-rw-r--r--doc/12_Compiling.md38
-rw-r--r--src/Makefile524
-rw-r--r--src/textadept.c67
3 files changed, 291 insertions, 338 deletions
diff --git a/doc/12_Compiling.md b/doc/12_Compiling.md
index e0274059..2792f6f8 100644
--- a/doc/12_Compiling.md
+++ b/doc/12_Compiling.md
@@ -23,7 +23,7 @@ tools in the `build-essential` package.
Compiling Textadept on Windows is no longer supported. If you wish to do so
however, you need a C compiler that supports the C99 standard (Microsoft's does
-not) and the [GTK+ for Windows bundle][] (2.22 is recommended).
+not) and the [GTK+ for Windows bundle][] (2.24 is recommended).
The preferred way to compile for Windows is cross-compiling from Linux. To do
so, in addition to the GTK bundle mentioned above, you need [MinGW][] with the
@@ -50,25 +50,29 @@ platform you are on) and not a platform-specific binary package.
### Linux and BSD
For Linux systems, simply run `make` in the `src/` directory. The `textadept`
-executable is created in the root directory. Make a symlink from it to
-`/usr/bin/` or elsewhere in your `PATH`.
-
-BSD users please run `make BSD=1`.
+and `textadeptjit` executables are created in the root directory. Make a symlink
+from them to `/usr/bin/` or elsewhere in your `PATH`.
### Cross Compiling for Windows
When cross-compiling from within Linux, first unzip the GTK+ for Windows bundle
-into a new `src/win32gtk` directory. Then modify the `CC`, `CPP`, and `WINDRES`
-variables in the `WIN32` block of `src/Makefile` to match your MinGW
-installation and run `make WIN32=1` to build `../textadept.exe`.
+into a new `src/win32gtk` directory. Then, depending on your MingW installation,
+either run `make win32`, modify the `CROSS` variable in the `win32` block of
+`src/Makefile` and run `make win32`, or run `make CROSS=i486-mingw32- win32` to
+build `../textadept.exe` and `../textadeptjit.exe`.
+
+Please note that a `lua51.dll` is produced for Windows platforms because
+limitations on external Lua library loading do not allow statically linking
+LuaJIT to Textadept. Static linking occurs on all other platforms.
### Mac OSX
After using `jhbuild`, GTK is in `~/gtk` so make a symlink from `~/gtk/inst` to
-`src/gtkosx` in Textadept. Then run `make OSX=1` to build `../textadept.osx`. At
-this point it is recommended to build a new `Textadept.app` from an existing
-one. Download the most recent app and replace `Contents/MacOS/textadept.osx`,
-all `.dylib` files in `Contents/Resources/lib`, and all `.so` files in
+`src/gtkosx` in Textadept. Then run `make` to build `../textadept.osx` and
+`../textadeptjit.osx`. At this point it is recommended to build a new
+`Textadept.app` from an existing one. Download the most recent app and replace
+`Contents/MacOS/textadept.osx`, `Contents/MacOS/textadeptjit.osx`, all `.dylib`
+files in `Contents/Resources/lib`, and all `.so` files in
`Contents/Resources/lib/gtk-2.0/<version>/{engines,immodules,loaders}` with your
own versions in `src/gtkosx/lib`. If you wish, you may also replace the files
in `Contents/Resources/{etc,share}`, but these rarely change.
@@ -86,7 +90,7 @@ lines (put `//` at the start of the line):
#define TextRange Sci_TextRange
#define TextToFind Sci_TextToFind
-### Compiling with LuaJIT
+### Notes on LuaJIT
[LuaJIT][] is a Just-In-Time Compiler for Lua and can boost the speed of Lua
programs. I have noticed that syntax highlighting can be up to 2 times faster
@@ -97,13 +101,5 @@ performance-wise to justify it being Textadept's default runtime. LuaJIT's
[ffi library][], however, appears to be useful for interfacing with external,
non-Lua, libraries.
-You can compile Textadept with LuaJIT by running `make LUAJIT=1` for Linux
-systems, `make OSX=1 LUAJIT=1` for Mac OSX, and `make WIN32=1 LUAJIT=1` for
-Windows systems.
-
-Please note that a `lua51.dll` is produced for Windows platforms because
-limitations on external Lua library loading do not allow statically linking
-LuaJIT to Textadept. Static linking occurs on all other platforms.
-
[LuaJIT]: http://luajit.org
[ffi library]: http://luajit.org/ext_ffi.html
diff --git a/src/Makefile b/src/Makefile
index 044300fe..ccb3ecc9 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -1,330 +1,276 @@
# Copyright 2007-2012 Mitchell mitchell.att.foicica.com. See LICENSE.
-.SUFFIXES: .c .o .h .a .cxx
+ifeq (Linux, $(shell uname -s))
+ ifneq (win32, $(MAKECMDGOALS))
+ CC = gcc
+ CXX = g++
+ LUAFLAGS = -DLUA_USE_LINUX
+ LDFLAGS = -rdynamic -Wl,--retain-symbols-file -Wl,lua.sym -ldl
-# Linux (default)
-CC = gcc
-CPP = g++
-PKG_CONFIG = pkg-config
-PKG_CONFIG_PATH = $PKG_CONFIG_PATH
-ifndef NCURSES
-PLAT_FLAGS = -DGTK -D_XOPEN_SOURCE=700
-else
-PLAT_FLAGS = -DNCURSES -D_XOPEN_SOURCE=700
-endif
-ifdef BSD
-PLAT_FLAGS += -D__BSD__
-endif
-SCI_THREAD_FLAG =
-LUAFLAGS = -DLUA_USE_LINUX
-TEXTADEPT = textadept
-TEXTADEPTJIT = textadeptjit
-TEXTADEPT_RC =
-EXPORTLUASYMS = -rdynamic -Wl,--retain-symbols-file -Wl,lua.sym
-WINDRES =
-LDL = -ldl
-LUAJIT_LIB = libluajit.a
-LUAJIT_MAKE =
-LUADOC = luadoc
+ ifneq (ncurses, $(MAKECMDGOALS))
+ plat_flag = -DGTK
+ ifndef GTK3
+ gtk_version = 2.0
+ else
+ gtk_version = 3.0
+ endif
+ gtk_flags = $(shell pkg-config --cflags gtk+-$(gtk_version))
+ gtk_libs = $(shell pkg-config --libs gtk+-$(gtk_version))
+ else
+ plat_flag = -DNCURSES
+ endif
-# Win32 (WIN32=1)
-ifdef WIN32
-CC = i486-mingw32-gcc -mms-bitfields
-CPP = i486-mingw32-g++ -mms-bitfields -mwindows -static-libgcc -static-libstdc++
-PKG_CONFIG = pkg-config --define-variable=prefix=win32gtk
-PKG_CONFIG_PATH = $(shell pwd)/win32gtk/lib/pkgconfig
-PLAT_FLAGS += -D__WIN32__
-SCI_THREAD_FLAG = -DG_THREADS_IMPL_NONE
-LUAFLAGS = -D_WIN32 -DWIN32
-TEXTADEPT = textadept.exe
-TEXTADEPTJIT = textadeptjit.exe
-TEXTADEPT_RC = textadept_rc.o
-EXPORTLUASYMS = -Wl,--retain-symbols-file -Wl,lua.sym
-WINDRES = i486-mingw32-windres
-LDL =
-LUAJIT_LIB = lua51.dll
-LUAJIT_MAKE = HOST_CC="gcc -m32" CROSS=i486-mingw32- TARGET_SYS=Windows
-LUADOC = luadoc_start.bat
-endif
+ luadoc = luadoc
+ else # (make win32)
+ CROSS = i586-mingw32msvc-
+ CC = gcc
+ CFLAGS = -mms-bitfields
+ CXX = g++
+ CXXFLAGS = -mms-bitfields -mwindows -static-libgcc -static-libstdc++
+ LDFLAGS = -liconv -Wl,--retain-symbols-file -Wl,lua.sym
+ WINDRES = windres
-# Mac OSX (OSX=1)
-ifdef OSX
-CC = gcc -arch i386 -mdynamic-no-pic -mmacosx-version-min=10.5 \
- -isysroot /Developer/SDKs/MacOSX10.5.sdk
-CPP = g++ -arch i386 -mdynamic-no-pic -mmacosx-version-min=10.5 \
- -isysroot /Developer/SDKs/MacOSX10.5.sdk
-PKG_CONFIG = gtkosx/bin/pkg-config --define-variable=prefix=gtkosx
-PKG_CONFIG_PATH = $(shell pwd)/gtkosx/lib/pkgconfig
-PLAT_FLAGS += -D__OSX__
-SCI_THREAD_FLAG =
-LUAFLAGS = -DLUA_USE_MACOSX
-TEXTADEPT = textadept.osx
-TEXTADEPTJIT = textadeptjit.osx
-TEXTADEPT_RC =
-EXPORTLUASYMS = -rdynamic
-WINDRES =
-LDL =
-LUAJIT_LIB = libluajit.a
-LUAJIT_MAKE =
-LUADOC = luadoc
-endif
+ plat_flag = -DGTK
+ gtk_flags = $(shell PKG_CONFIG_PATH=`pwd`/win32gtk/lib/pkgconfig \
+ pkg-config --define-variable=prefix=win32gtk \
+ --cflags gtk+-2.0)
+ gtk_libs = $(shell PKG_CONFIG_PATH=`pwd`/win32gtk/lib/pkgconfig \
+ pkg-config --define-variable=prefix=win32gtk \
+ --libs gtk+-2.0)
-# No debugging unless DEBUG=1.
-ifndef DEBUG
-DEBUG_FLAG = -DNDEBUG
-else
-DEBUG_FLAG = -DDEBUG -DTRACE -g
-endif
+ luadoc = luadoc_start.bat
+ endif
+else ifeq (Darwin, $(shell uname -s))
+ CC = gcc
+ CFLAGS = -arch i386 -mdynamic-no-pic -mmacosx-version-min=10.5 \
+ -isysroot /Developer/SDKs/MacOSX10.5.sdk
+ CXX = g++
+ CXXFLAGS = -arch i386 -mdynamic-no-pic -mmacosx-version-min=10.5 \
+ -isysroot /Developer/SDKs/MacOSX10.5.sdk
+ LUAFLAGS = -DLUA_USE_MACOSX
+ LDFLAGS = -rdynamic
-# Do not compile with LuaJIT unless LUAJIT=1.
-ifndef LUAJIT
-LUADIR = lua
-LUAJIT_FLAG =
-LUAJIT_LIB =
-else
-LUADIR = luajit
-LUAJIT_FLAG = -DLUAJIT
-endif
+ #ifneq (ncurses, $(MAKECMDGOALS))
+ plat_flag = -DGTK
+ gtk_flags = $(shell PKG_CONFIG_PATH=`pwd`/gtkosx/lib/pkgconfig \
+ gtkosx/bin/pkg-config --define-variable=prefix=gtkosx \
+ --cflags gtk+-2.0)
+ gtk_libs = $(shell PKG_CONFIG_PATH=`pwd`/gtkosx/lib/pkgconfig \
+ gtkosx/bin/pkg-config --define-variable=prefix=gtkosx \
+ --libs gtk+-2.0) -framework Cocoa -lgtkmacintegration
+ .DEFAULT_GOAL := osx
+ #else
+ # plat_flag = -DNCURSES
+ # .DEFAULT_GOAL := osx-ncurses
+ #endif
-# Single instance unless NO_SINGLE_INSTANCE=1
-ifndef NO_SINGLE_INSTANCE
-SI_FLAG = -DSINGLE_INSTANCE
-else
-SI_FLAG =
+ luadoc = luadoc
endif
-INCLUDEDIRS = -Iscintilla/include -I$(LUADIR)/src -Igtdialog
-ifdef NCURSES
-INCLUDEDIRS += -Iscintilla/term -Itermkey
+# No debugging unless DEBUG=1.
+ifdef DEBUG
+ CFLAGS += -g
+ CXXFLAGS += -g
endif
-ifdef GTK3
-GTKVERSION = gtk+-3.0
-else
-GTKVERSION = gtk+-2.0
+# Scintilla.
+
+sci_flags = -pedantic -Os $(plat_flag) -DSCI_LEXER -DNDEBUG \
+ -Iscintilla/include -Iscintilla/src -Iscintilla/lexlib -Wall \
+ -Wno-missing-braces -Wno-char-subscripts -Wno-long-long
+ifeq (win32, $(MAKECMDGOALS))
+ sci_flags += -DG_THREADS_IMPL_NONE
endif
-# Textadept
+scintilla_objs = AutoComplete.o CallTip.o Catalogue.o CellBuffer.o \
+ CharClassify.o ContractionState.o Decoration.o Document.o \
+ Editor.o ExternalLexer.o Indicator.o KeyMap.o LineMarker.o \
+ PerLine.o PositionCache.o RESearch.o RunStyles.o \
+ ScintillaBase.o Selection.o Style.o UniConversion.o \
+ ViewStyle.o XPM.o \
+ Accessor.o CharacterSet.o LexerBase.o LexerModule.o \
+ LexerNoExceptions.o LexerSimple.o PropSetSimple.o \
+ StyleContext.o WordList.o
+scintilla_gtk_objs = PlatGTK.o ScintillaGTK.o
-CFLAGS = -std=c99 $(DEBUG_FLAG) $(LUAJIT_FLAG) $(SI_FLAG) -O $(PLAT_FLAGS) \
- $(INCLUDEDIRS) -W -Wall -Wno-sign-compare -Wno-unused
-GTKFLAGS = $(shell PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) $(PKG_CONFIG) \
- --cflags $(GTKVERSION))
-ifndef NCURSES
-CFLAGS += $(GTKFLAGS)
-endif
-GTKLIBS = $(shell PKG_CONFIG_PATH=$(PKG_CONFIG_PATH) $(PKG_CONFIG) \
- --libs $(GTKVERSION))
-ifdef LIBPNG12
-GTKLIBS := $(shell sed -e 's/lpng14/lpng12/;' <<< "$(GTKLIBS)")
-endif
-ifdef OSX
-GTKLIBS += -framework Cocoa -lgtkmacintegration
-endif
-GTDFLAGS = $(PLAT_FLAGS) -DNOHELP -DLIBRARY
-ifndef NCURSES
-GTDFLAGS += $(GTKFLAGS)
-endif
-ifndef NCURSES
-LIBS = $(GTKLIBS)
-else
-LIBS = -lncursesw -lcdk
-endif
+# Textadept.
-TEXTADEPT_OBJS = textadept.o
-LUA_OBJS = lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o \
- linit.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o \
- ltable.o ltm.o lundump.o lvm.o lzio.o \
- lauxlib.o lbaselib.o lbitlib.o lcorolib.o ldblib.o liolib.o lmathlib.o \
- loadlib.o loslib.o ltablib.o lstrlib.o \
- lpeg.o lfs.o
-LUA_SRCS = lua/src/*.c lua/src/lib/*.c
-LUAJIT_OBJS =
-GTDIALOG = gtdialog.o
-ifdef NCURSES
-TERMKEY_OBJS = termkey.o driver-ti.o driver-csi.o
+ta_flags = -std=c99 -O -D_POSIX_C_SOURCE=200809L -D_DARWIN_C_SOURCE \
+ $(plat_flag) -Iscintilla/include -Igtdialog -W -Wall \
+ -Wno-sign-compare -Wno-unused
+ifndef NO_SINGLE_INSTANCE
+ # Single instance unless NO_SINGLE_INSTANCE=1
+ ta_flags += -DSINGLE_INSTANCE
endif
-# Scintilla
+lua_objs = lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o \
+ linit.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o \
+ lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o \
+ lauxlib.o lbaselib.o lbitlib.o lcorolib.o ldblib.o liolib.o \
+ lmathlib.o loadlib.o loslib.o ltablib.o lstrlib.o \
+ lpeg.o lfs.o
+luajit_objs = lpegjit.o lfsjit.o
+termkey_objs = termkey.o driver-ti.o driver-csi.o
-SCIFLAGS = $(DEBUG_FLAG) -pedantic -Os $(PLAT_FLAGS) -DSCI_LEXER \
- $(SCI_THREAD_FLAG) $(INCLUDEDIRS) -Iscintilla/src -Iscintilla/lexlib \
- -Wall -Wno-missing-braces -Wno-char-subscripts -Wno-long-long
-ifndef NCURSES
-SCIFLAGS += -Iscintilla/gtk
-endif
+# Build.
-SCINTILLA_OBJS = AutoComplete.o CallTip.o Catalogue.o CellBuffer.o \
- CharClassify.o ContractionState.o Decoration.o Document.o Editor.o \
- ExternalLexer.o Indicator.o KeyMap.o LineMarker.o PerLine.o \
- PositionCache.o RESearch.o RunStyles.o ScintillaBase.o Selection.o \
- Style.o UniConversion.o ViewStyle.o XPM.o \
- Accessor.o CharacterSet.o LexerBase.o LexerModule.o LexerNoExceptions.o \
- LexerSimple.o PropSetSimple.o StyleContext.o WordList.o
-ifndef NCURSES
-SCINTILLA_GTK_OBJS = PlatGTK.o ScintillaGTK.o
-SCINTILLA_MARSHALLER = scintilla-marshal.o
-SCINTILLA_PLAT_OBJS = $(SCINTILLA_GTK_OBJS) $(SCINTILLA_MARSHALLER)
-else
-SCINTILLA_TERM_OBJS = ScintillaTerm.o
-SCINTILLA_PLAT_OBJS = $(SCINTILLA_TERM_OBJS)
-endif
-SCINTILLA_LEXER = LexLPeg.o
+all: textadept textadeptjit
+ncurses: textadept-ncurses textadeptjit-ncurses
+win32: textadept.exe textadeptjit.exe
+osx: textadept.osx textadeptjit.osx
+osx-ncurses: textadept-ncurses.osx textadeptjit-ncurses.osx
-# Build
+# Dependencies.
-ifdef LUAJIT
-TEXTADEPT_OBJS = textadeptjit.o
-LUA_OBJS = lpegjit.o lfsjit.o
-LUA_SRCS = lua/src/lib/*.c
-LUAJIT_OBJS = $(LUAJIT_LIB)
-SCINTILLA_LEXER = LexLPegjit.o
-TEXTADEPT = $(TEXTADEPTJIT)
-endif
+$(scintilla_objs): scintilla/src/*.cxx scintilla/lexlib/*.cxx
+ $(CROSS)$(CXX) -c $(CXXFLAGS) $(sci_flags) $^
+$(scintilla_gtk_objs): scintilla/gtk/*.cxx
+ $(CROSS)$(CXX) -c $(CXXFLAGS) $(sci_flags) $(gtk_flags) $^
+scintilla-marshal.o: scintilla/gtk/scintilla-marshal.c
+ $(CROSS)$(CC) -c $(CFLAGS) $(gtk_flags) $<
+ScintillaTerm.o: scintilla/term/ScintillaTerm.cxx
+ $(CROSS)$(CXX) -c $(CXXFLAGS) $(sci_flags) -Iscintilla/term -Itermkey $^
+LexLPeg.o: LexLPeg.cxx
+ $(CROSS)$(CXX) -c $(CXXFLAGS) $(LUAFLAGS) $(sci_flags) -DLPEG_LEXER \
+ -DNO_SCITE -Ilua/src $<
+LexLPegjit.o: LexLPeg.cxx
+ $(CROSS)$(CXX) -c $(CXXFLAGS) $(LUAFLAGS) $(sci_flags) -DLPEG_LEXER \
+ -DNO_SCITE -Iluajit/src $< -o $@
+textadept.o: textadept.c
+ $(CROSS)$(CC) -c $(CFLAGS) $(ta_flags) -Ilua/src $(gtk_flags) $<
+textadeptjit.o: textadept.c
+ $(CROSS)$(CC) -c $(CFLAGS) $(ta_flags) -DLUAJIT -Iluajit/src $(gtk_flags) $< \
+ -o $@
+textadept-ncurses.o: textadept.c
+ $(CROSS)$(CC) -c $(CFLAGS) $(ta_flags) -Ilua/src -Iscintilla/term -Itermkey \
+ $< -o $@
+textadeptjit-ncurses.o: textadept.c
+ $(CROSS)$(CC) -c $(CFLAGS) $(ta_flags) -DLUAJIT -Iluajit/src \
+ -Iscintilla/term -Itermkey $< -o $@
+$(lua_objs): lua/src/*.c lua/src/lib/*.c
+ $(CROSS)$(CC) -c $(CFLAGS) $(LUAFLAGS) -Ilua/src $^
+$(luajit_objs): lua/src/lib/*.c
+ $(CROSS)$(CC) -c $(CFLAGS) $(LUAFLAGS) -Iluajit/src $^
+ for lib in $(luajit_objs); do mv $$(echo $$lib | sed 's/jit//g') $$lib; done
+libluajit.a:
+ cd luajit && make CC="$(CC) $(CFLAGS)"
+ cp luajit/src/$@ .
+lua51.dll:
+ cd luajit && make HOST_CC="$(CC) -m32" CROSS=$(CROSS) TARGET_SYS=Windows
+ cp luajit/src/$@ .
+gtdialog.o: gtdialog/gtdialog.c
+ $(CROSS)$(CC) -c $(CFLAGS) -DGTK -DNOHELP -DLIBRARY $(gtk_flags) $<
+gtdialog-ncurses.o: gtdialog/gtdialog.c
+ $(CROSS)$(CC) -c $(CFLAGS) -DNCURSES -DNOHELP -DLIBRARY $< -o $@
+$(termkey_objs): termkey/*.c
+ $(CROSS)$(CC) -c $(CFLAGS) -std=c99 $^
+textadept_rc.o: textadept.rc
+ $(CROSS)$(WINDRES) $^ $@
-all: $(TEXTADEPT)
+# Executables.
-$(SCINTILLA_OBJS): scintilla/src/*.cxx scintilla/lexlib/*.cxx
- $(CPP) $(SCIFLAGS) -c $^
-$(SCINTILLA_GTK_OBJS): scintilla/gtk/*.cxx
- $(CPP) $(SCIFLAGS) $(GTKFLAGS) -c $^
-$(SCINTILLA_TERM_OBJS): scintilla/term/*.cxx
- $(CPP) $(SCIFLAGS) -c $^
-$(SCINTILLA_MARSHALLER): scintilla/gtk/scintilla-marshal.c
- $(CC) $(SCIFLAGS) $(GTKFLAGS) -w -c $<
-$(SCINTILLA_LEXER): LexLPeg.cxx
- $(CPP) $(SCIFLAGS) $(LUAFLAGS) -DLPEG_LEXER -DNO_SCITE -c $< -o $@
-$(TEXTADEPT_OBJS): textadept.c
- $(CC) $(CFLAGS) -c $< -o $@
-$(LUA_OBJS): $(LUA_SRCS)
- $(CC) $(LUAFLAGS) $(INCLUDEDIRS) -c $^
-ifdef LUAJIT
- for lib in $(LUA_OBJS); do mv $$(echo $$lib | sed 's/jit//g') $$lib; done
-endif
-$(LUAJIT_OBJS):
- cd luajit && make $(LUAJIT_MAKE)
- cp luajit/src/$(LUAJIT_LIB) .
-$(GTDIALOG): gtdialog/gtdialog.c
- $(CC) $(GTDFLAGS) $(INCLUDEDIRS) -c $<
-$(TERMKEY_OBJS): termkey/*.c
- $(CC) -std=c99 -c $^
-$(TEXTADEPT):\
- $(SCINTILLA_OBJS) $(SCINTILLA_PLAT_OBJS) $(SCINTILLA_LEXER) \
- $(TEXTADEPT_OBJS) $(LUA_OBJS) $(LUAJIT_OBJS) $(GTDIALOG) \
- $(TERMKEY_OBJS) $(TEXTADEPT_RC)
- $(CPP) $(EXPORTLUASYMS) -o $@ $^ $(LIBS) $(LDL)
- mv $(TEXTADEPT) ../
-$(TEXTADEPT_RC): textadept.rc
- $(WINDRES) $^ $@
-clean:
- rm -f ../$(TEXTADEPT) *.o *.a *.dll
+textadept: $(scintilla_objs) $(scintilla_gtk_objs) scintilla-marshal.o \
+ LexLPeg.o textadept.o $(lua_objs) gtdialog.o
+ $(CROSS)$(CXX) $(CXXFLAGS) -o ../$@ $^ $(gtk_libs) $(LDFLAGS)
+textadeptjit: $(scintilla_objs) $(scintilla_gtk_objs) scintilla-marshal.o \
+ LexLPegjit.o textadeptjit.o $(luajit_objs) libluajit.a gtdialog.o
+ $(CROSS)$(CXX) $(CXXFLAGS) -o ../$@ $^ $(gtk_libs) $(LDFLAGS)
+textadept-ncurses: $(scintilla_objs) ScintillaTerm.o LexLPeg.o \
+ textadept-ncurses.o $(lua_objs) gtdialog-ncurses.o \
+ $(termkey_objs)
+ $(CROSS)$(CXX) $(CXXFLAGS) -o ../$@ $^ -lncursesw -lcdk $(LDFLAGS)
+textadeptjit-ncurses: $(scintilla_objs) ScintillaTerm.o LexLPegjit.o \
+ textadeptjit-ncurses.o $(luajit_objs) libluajit.a \
+ gtdialog-ncurses.o $(termkey_objs)
+ $(CROSS)$(CXX) $(CXXFLAGS) -o ../$@ $^ -lncursesw -lcdk $(LDFLAGS)
+textadept32: textadept; mv ../$< ../$@
+textadeptjit32: textadeptjit; mv ../$< ../$@
+textadept32-ncurses: textadept-ncurses; mv ../$< ../$@
+textadeptjit32-ncurses: textadeptjit-ncurses; mv ../$< ../$@
+textadept.exe: $(scintilla_objs) $(scintilla_gtk_objs) scintilla-marshal.o \
+ LexLPeg.o textadept.o textadept_rc.o $(lua_objs) gtdialog.o
+ $(CROSS)$(CXX) $(CXXFLAGS) -o ../$@ $^ $(gtk_libs) $(LDFLAGS)
+textadeptjit.exe: $(scintilla_objs) $(scintilla_gtk_objs) scintilla-marshal.o \
+ LexLPegjit.o textadeptjit.o textadept_rc.o $(luajit_objs) \
+ lua51.dll gtdialog.o
+ $(CROSS)$(CXX) $(CXXFLAGS) -o ../$@ $^ $(gtk_libs) $(LDFLAGS)
+textadept.osx: textadept; mv ../$< ../$@
+textadeptjit.osx: textadeptjit; mv ../$< ../$@
+textadept-ncurses.osx: textadept-ncurses; mv ../$< ../$@
+textadeptjit-ncurses.osx: textadeptjit-ncurses; mv ../$< ../$@
+
+# Clean.
+
+clean: mostlyclean
+ rm -f ../textadept* *.a *.dll
cd luajit && make clean
+mostlyclean:
+ rm -f *.o
+
+# Documentation.
doc: manual luadoc adeptsense doxygen
manual: ../doc/*.md ../*.md
../doc/bombay -d ../doc -t ../doc --title Textadept --navtitle Manual $^
luadoc: ../modules ../core ../lexers/lexer.lua
- cd ../doc && $(LUADOC) -d . -t . --doclet markdowndoc $^
+ cd ../doc && $(luadoc) -d . -t . --doclet markdowndoc $^
adeptsense: ../modules ../core ../lexers/lexer.lua
- cd ../modules && $(LUADOC) -d lua --doclet lua/adeptsensedoc $^
+ cd ../modules && $(luadoc) -d lua --doclet lua/adeptsensedoc $^
doxygen: ../Doxyfile
doxygen $<
cleandoc:
rm -f ../doc/*.html
rm -rf ../doc/api ../doc/doxygen
-# Package (only for Linux x86_64)
-# Pass 'VERSION=[release version]' to 'make'.
+# Package.
+
+basedir = textadept_$(value VERSION)
+modules = css hypertext java rails rhtml ruby php
-TEXTADEPT32 = $(TEXTADEPT)32
-TEXTADEPTJIT32 = $(TEXTADEPT)jit32
-TEXTADEPT64 = $(TEXTADEPT)
-TEXTADEPTJIT64 = $(TEXTADEPT)jit
-TEXTADEPT64LPNG12 = $(TEXTADEPT).lpng12
-TEXTADEPTJIT64LPNG12 = $(TEXTADEPT)jit.lpng12
-TEXTADEPTWIN32 = $(TEXTADEPT).exe
-TEXTADEPTJITWIN32 = $(TEXTADEPT)jit.exe
-TEXTADEPTMAC = $(TEXTADEPT).osx
-TEXTADEPTJITMAC = $(TEXTADEPT)jit.osx
-RELEASEDIR32 = textadept_$(value VERSION)
-RELEASEDIR64 = $(RELEASEDIR32).x86_64
-RELEASEDIRWIN32 = $(RELEASEDIR32).win32
-RELEASEDIRMAC = $(RELEASEDIR32).osx
-TEXTADEPTAPP = $(RELEASEDIRMAC)/Textadept.app
-PACKAGE32 = ../releases/$(RELEASEDIR32).tgz
-PACKAGE64 = ../releases/$(RELEASEDIR64).tgz
-PACKAGEWIN32 = ../releases/$(RELEASEDIRWIN32).zip
-PACKAGEMAC = ../releases/$(RELEASEDIRMAC).zip
-SRCPACKAGE = ../releases/$(RELEASEDIR32).src.zip
-MODULES = css hypertext java rails rhtml ruby php
-MODULESDIR = $(RELEASEDIR32)/modules
-MODULESPKG = ../releases/$(RELEASEDIR32).modules.zip
+release: doc $(basedir).x86_64 $(basedir).i386 $(basedir).win32 $(basedir).osx \
+ $(basedir).src $(basedir).modules cleanup
-release: ../$(TEXTADEPT) ../$(TEXTADEPT32) ../$(TEXTADEPTWIN32) \
- ../$(TEXTADEPTMAC) ../$(TEXTADEPTLPNG12) doc
- hg archive $(RELEASEDIR32)
- rm $(RELEASEDIR32)/.hg*
- cp -rL ../doc $(RELEASEDIR32)
- hg clone http://foicica.com/hg/scintillua tmp
- mv tmp/lexers $(RELEASEDIR32)
- rm -r tmp
- # Linux x64_64
- cp -r $(RELEASEDIR32) $(RELEASEDIR64)
- cp ../$(TEXTADEPT64) $(RELEASEDIR64)
- if [ -f ../$(TEXTADEPTJIT64) ]; then \
- cp ../$(TEXTADEPTJIT64) $(RELEASEDIR64); \
- fi
- cp ../$(TEXTADEPT64LPNG12) $(RELEASEDIR64)
- if [ -f ../$(TEXTADEPTJIT64LPNG12) ]; then \
- cp ../$(TEXTADEPTJIT64LPNG12) $(RELEASEDIR64); \
- fi
- tar czf $(PACKAGE64) $(RELEASEDIR64)
- rm -r $(RELEASEDIR64)
- # Win32
- cp -r $(RELEASEDIR32) $(RELEASEDIRWIN32)
- cp ../$(TEXTADEPTWIN32) $(RELEASEDIRWIN32)
- if [ -f ../$(TEXTADEPTJITWIN32) ]; then \
- cp ../$(TEXTADEPTJITWIN32) lua51.dll $(RELEASEDIRWIN32); \
- fi
- cp win32gtk/bin/*.dll $(RELEASEDIRWIN32)
- cp -r win32gtk/{etc,lib,share} $(RELEASEDIRWIN32)
- rm -r $(RELEASEDIRWIN32)/lib/{*.a,glib-2.0,gtk-2.0/include,pkgconfig}
- zip -r $(PACKAGEWIN32) $(RELEASEDIRWIN32)
- rm -r $(RELEASEDIRWIN32)
- # Linux 32-bit
- cp ../$(TEXTADEPT32) $(RELEASEDIR32)/$(TEXTADEPT)
- if [ -f ../$(TEXTADEPTJIT32) ]; then \
- cp ../$(TEXTADEPTJIT32) $(RELEASEDIR32)/$(TEXTADEPTJIT); \
- fi
- tar czf $(PACKAGE32) $(RELEASEDIR32)
- # Mac OSX
- mkdir $(RELEASEDIRMAC)
- cp -rL gtkosx $(TEXTADEPTAPP)
- mv $(TEXTADEPTAPP)/Contents/MacOS/ta $(RELEASEDIRMAC)
- cp -r $(RELEASEDIR32)/* $(TEXTADEPTAPP)/Contents/Resources/
- rm -f $(TEXTADEPTAPP)/Contents/Resources/{$(TEXTADEPT),$(TEXTADEPTJIT)}
- mv $(TEXTADEPTAPP)/Contents/Resources/core/images/textadept.icns \
- $(TEXTADEPTAPP)/Contents/Resources/
- cp ../$(TEXTADEPTMAC) $(TEXTADEPTAPP)/Contents/MacOS/
- if [ -f ../$(TEXTADEPTJITMAC) ]; then \
- cp ../$(TEXTADEPTJITMAC) $(TEXTADEPTAPP)/Contents/MacOS/; \
- fi
- zip -r $(PACKAGEMAC) $(RELEASEDIRMAC)
- rm -r $(RELEASEDIRMAC)
- # Source
- rm $(RELEASEDIR32)/{$(TEXTADEPT),$(TEXTADEPTJIT)}
- cp -rL lua luajit scintilla gtdialog LexLPeg.cxx $(RELEASEDIR32)/src/
- cd $(RELEASEDIR32)/src/luajit && make clean && cd ../../../
- rm -r $(RELEASEDIR32)/src/scintilla/.hg
- zip -r $(SRCPACKAGE) $(RELEASEDIR32)
- rm -r $(RELEASEDIR32)
- # Modules
- mkdir -p $(MODULESDIR)
- for module in $(MODULES); do \
+$(basedir): ../textadept ../textadeptjit ../textadept-ncurses \
+ ../textadeptjit-ncurses ../textadept32 ../textadeptjit32 \
+ ../textadept32-ncurses ../textadeptjit32-ncurses ../textadept.exe \
+ ../textadeptjit.exe ../textadept.osx ../textadeptjit.osx lua51.dll
+ hg archive $@
+ rm $@/.hg*
+ cp -rL ../doc $@
+ hg clone /home/mitchell/code/scintillua tmp && mv tmp/lexers $@ && rm -r tmp
+$(basedir).x86_64: ../textadept ../textadeptjit ../textadept-ncurses \
+ ../textadeptjit-ncurses | $(basedir)
+ cp -r $| $@ && cp $^ $@ && tar czf ../releases/$@.tgz $@ && rm -r $@
+$(basedir).i386: ../textadept32 ../textadeptjit32 ../textadept32-ncurses \
+ ../textadeptjit32-ncurses | $(basedir)
+ cp -r $| $@ && cp $^ $@ && tar czf ../releases/$@.tgz $@ && rm -r $@
+$(basedir).win32: ../textadept.exe ../textadeptjit.exe lua51.dll | $(basedir)
+ cp -r $| $@ && cp $^ $@
+ cp win32gtk/bin/*.dll $@ && cp -r win32gtk/etc win32gtk/lib win32gtk/share $@
+ rm -r $@/lib/*.a $@/lib/glib-2.0 $@/lib/gtk-2.0/include $@/lib/pkgconfig
+ zip -r ../releases/$@.zip $@ && rm -r $@
+$(basedir).osx: ../textadept.osx ../textadeptjit.osx | $(basedir)
+ mkdir $@ && cp -rL gtkosx $@/Textadept.app
+ cp $^ $@/Textadept.app/Contents/MacOS/
+ cp -r $|/* $@/Textadept.app/Contents/Resources/
+ mv $@/Textadept.app/Contents/Resources/core/images/textadept.icns \
+ $@/Textadept.app/Contents/Resources/
+ mv $@/Textadept.app/Contents/MacOS/ta $@
+ zip -r ../releases/$@.zip $@ && rm -r $@
+$(basedir).src: | $(basedir)
+ cp -r $| $@ && cp -rL lua luajit scintilla gtdialog LexLPeg.cxx termkey $@/src
+ cd $@/src/luajit && make clean && cd ../../../
+ rm -r $@/src/scintilla/.hg
+ zip -r ../releases/$@.zip $@ && rm -r $@
+$(basedir).modules:
+ mkdir -p $@/modules
+ for module in $(modules); do \
hg clone /home/mitchell/code/textadept/modules/$$module \
- $(MODULESDIR)/$$module; \
+ $@/modules/$$module; \
done
- zip -r $(MODULESPKG) $(MODULESDIR)
- rm -r $(MODULESDIR)
- # Done
- rm -r $(RELEASEDIR32)
+ zip -r ../releases/$@.zip $@ && rm -r $@
+cleanup: ../releases/$(basedir).x86_64.tgz ../releases/$(basedir).i386.tgz \
+ ../releases/$(basedir).win32.zip ../releases/$(basedir).osx.zip \
+ ../releases/$(basedir).src.zip ../releases/$(basedir).modules.zip | \
+ $(basedir)
+ rm -r $|
diff --git a/src/textadept.c b/src/textadept.c
index fdf80595..0b9d9845 100644
--- a/src/textadept.c
+++ b/src/textadept.c
@@ -6,16 +6,18 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#if __WIN32__
+#if __linux__
+#include <unistd.h>
+#elif _WIN32
#include <windows.h>
#define main main_
-#elif __OSX__
+#elif __APPLE__ && !NCURSES
#include <gtkmacintegration/gtkosxapplication.h>
-#elif __BSD__
+//#elif __APPLE__ && NCURSES
+//#include <mach-o/dyld.h>
+#elif (__FreeBSD__ || __NetBSD__ || __OpenBSD__)
#include <sys/types.h>
#include <sys/sysctl.h>
-#else
-#include <unistd.h>
#endif
#if GTK
#include <gtk/gtk.h>
@@ -67,7 +69,7 @@ static Scintilla *focused_view;
#if GTK
static GtkWidget *window, *menubar, *statusbar[2];
static GtkAccelGroup *accel;
-#if __OSX__
+#if __APPLE__ && !NCURSES
static GtkOSXApplication *osxapp;
#endif
#endif
@@ -779,6 +781,7 @@ static int l_rawgetiint(lua_State *L, int index, int n) {
return ret;
}
+#if GTK
/**
* Pushes a menu created from the table at the given valid index onto the stack.
* Consult the LuaDoc for the table format.
@@ -788,9 +791,8 @@ static int l_rawgetiint(lua_State *L, int index, int n) {
* item.
* @param submenu Flag indicating whether or not this menu is a submenu.
*/
-static void l_pushmenu(lua_State *L, int index, void (*callback)(void),
+static void l_pushmenu(lua_State *L, int index, GCallback callback,
int submenu) {
-#if GTK
GtkWidget *menu = gtk_menu_new(), *menu_item = 0, *submenu_root = 0;
const char *label;
lua_pushvalue(L, index); // copy to stack top so relative indices can be used
@@ -822,7 +824,7 @@ static void l_pushmenu(lua_State *L, int index, void (*callback)(void),
if (key || modifiers)
gtk_widget_add_accelerator(menu_item, "activate", accel, key,
modifiers, GTK_ACCEL_VISIBLE);
- g_signal_connect(menu_item, "activate", G_CALLBACK(callback),
+ g_signal_connect(menu_item, "activate", callback,
GINT_TO_POINTER(menu_id));
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item);
}
@@ -832,12 +834,8 @@ static void l_pushmenu(lua_State *L, int index, void (*callback)(void),
}
lua_pop(L, 1); // table copy
lua_pushlightuserdata(L, !submenu_root ? menu : submenu_root);
-#elif NCURSES
- lua_pushnil(L); // TODO: create and push menu (memory management?).
-#endif
}
-#if GTK
/**
* Signal for a menu item click.
*/
@@ -850,7 +848,7 @@ static void m_clicked(GtkWidget*_, void *id) {
static int lgui_menu(lua_State *L) {
luaL_checktype(L, 1, LUA_TTABLE);
#if GTK
- l_pushmenu(L, -1, m_clicked, FALSE);
+ l_pushmenu(L, -1, G_CALLBACK(m_clicked), FALSE);
#elif NCURSES
// TODO: create menu and manage memory.
#endif
@@ -928,7 +926,7 @@ static int lgui__newindex(lua_State *L) {
gtk_box_pack_start(GTK_BOX(vbox), menubar, FALSE, FALSE, 0);
gtk_box_reorder_child(GTK_BOX(vbox), menubar, 0);
gtk_widget_show_all(menubar);
-#if __OSX__
+#if __APPLE__ && !NCURSES
gtk_osxapplication_set_menu_bar(osxapp, GTK_MENU_SHELL(menubar));
gtk_widget_hide(menubar);
#endif
@@ -1294,6 +1292,12 @@ static int lquit(lua_State *L) {
return 0;
}
+#if _WIN32
+char *stpcpy(char *dest, const char *src) {
+ return strcpy(dest, src), dest + strlen(src);
+}
+#endif
+
/**
* Loads and runs the given file.
* @param L The Lua state.
@@ -1475,9 +1479,9 @@ static int lL_init(lua_State *L, int argc, char **argv, int reinit) {
lua_setglobal(L, "_BUFFERS");
lua_getfield(L, LUA_REGISTRYINDEX, "ta_views"), lua_setglobal(L, "_VIEWS");
lua_pushstring(L, textadept_home), lua_setglobal(L, "_HOME");
-#if __WIN32__
+#if _WIN32
lua_pushboolean(L, 1), lua_setglobal(L, "WIN32");
-#elif __OSX__
+#elif __APPLE__
lua_pushboolean(L, 1), lua_setglobal(L, "OSX");
#elif NCURSES
lua_pushboolean(L, 1), lua_setglobal(L, "NCURSES");
@@ -1492,9 +1496,9 @@ static int lL_init(lua_State *L, int argc, char **argv, int reinit) {
if (!locale || !*locale) locale = getenv("LANG");
if (locale && (charset = strchr(locale, '.'))) charset++;
}
- // Note: __WIN32__ uses GetACP() to determine codepage.
- // If __WIN32__ is ever supported, use a codepage -> charset look-up table
- // like glib's `libcharset/localecharset.c`.
+ // Note: _WIN32 uses GetACP() to determine codepage.
+ // If _WIN32 is ever supported, use a codepage -> charset look-up table like
+ // glib's `libcharset/localecharset.c`.
#endif
lua_pushstring(L, charset), lua_setglobal(L, "_CHARSET");
@@ -1653,7 +1657,7 @@ static int w_exit(GtkWidget*_, GdkEventAny*__, void*___) {
return FALSE;
}
-#if __OSX__
+#if __APPLE__ && !NCURSES
/**
* Signal for opening files from OSX.
* Generates an 'appleevent_odoc' event for each document sent.
@@ -2099,7 +2103,7 @@ static void new_window() {
signal(window, "key-press-event", w_keypress);
accel = gtk_accel_group_new();
-#if __OSX__
+#if __APPLE__ && !NCURSES
gtk_osxapplication_set_use_quartz_accelerators(osxapp, FALSE);
osx_signal(osxapp, "NSApplicationOpenFile", w_open_osx);
osx_signal(osxapp, "NSApplicationBlockTermination", w_exit_osx);
@@ -2181,21 +2185,28 @@ int main(int argc, char **argv) {
#endif
char *last_slash = NULL;
-#if !(__WIN32__ || __OSX__ || __BSD__)
+#if __linux__
textadept_home = malloc(FILENAME_MAX);
int _ = readlink("/proc/self/exe", textadept_home, FILENAME_MAX);
if ((last_slash = strrchr(textadept_home, '/'))) *last_slash = '\0';
-#elif __WIN32__
+#elif _WIN32
textadept_home = malloc(FILENAME_MAX);
GetModuleFileName(0, textadept_home, FILENAME_MAX);
if ((last_slash = strrchr(textadept_home, '\\'))) *last_slash = '\0';
-#elif __OSX__
+#elif __APPLE__ && !NCURSES
osxapp = g_object_new(GTK_TYPE_OSX_APPLICATION, NULL);
char *path = quartz_application_get_resource_path();
textadept_home = g_filename_from_utf8((const char *)path, -1, NULL, NULL,
NULL);
g_free(path);
-#elif __BSD__
+//#elif __APPLE__ && NCURSES
+// char *path = malloc(FILENAME_MAX), *p = NULL
+// uint32_t size = FILENAME_MAX;
+// _NSGetExecutablePath(path, &size);
+// textadept_home = realpath(path, NULL);
+// p = strstr(textadept_home, "MacOS"), strcpy(p, "Resources\0");
+// free(path);
+#elif (__FreeBSD__ || __NetBSD__ || __OpenBSD__)
textadept_home = malloc(FILENAME_MAX);
int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1 };
size_t cb = FILENAME_MAX;
@@ -2223,7 +2234,7 @@ int main(int argc, char **argv) {
if (lua = luaL_newstate(), !lL_init(lua, argc, argv, FALSE)) return 1;
new_window();
lL_dofile(lua, "init.lua");
-#if __OSX__
+#if __APPLE__
gtk_osxapplication_ready(osxapp);
#endif
@@ -2283,7 +2294,7 @@ int main(int argc, char **argv) {
return 0;
}
-#if __WIN32__
+#if _WIN32
/**
* Runs Textadept in Windows.
* @see main