frp-arduino / frp-arduino Goto Github PK
View Code? Open in Web Editor NEWArduino programming without the hassle of C.
License: GNU General Public License v3.0
Arduino programming without the hassle of C.
License: GNU General Public License v3.0
@rickardlindberg The tests are currently failing on my fork because the src
files don't match what's in dist/src
.
cabal file
sdist
contains all source code FAILED [1]
...
Failures:
Spec.hs:78:
1) cabal file, sdist, contains all source code
dist/frp-arduino-0.1.0.3> diff -r ../../src src > /home/jwright/Downloads/repos/frp-arduino/test_report.txt 2>&1
Only in ../../src/Arduino: Nano.hs
Is this to force a release each time a significant change is made to the codebase? If so, could you explain the procedure for doing the release properly?
Reactive Banana is a pretty mature FRP project that is heavily based on the push-pull-frp paper.
The main difference is in Reactive.Banana.compile
, which would use the Streams
interface.
The C code that we generate is quite verbose. Does it matter?
In the standard makefile, the LCD example looks like this:
Program: 8258 bytes (25.2% Full)
(.text + .data + .bootloader)
Data: 4 bytes (0.2% Full)
(.data + .bss + .noinit)
When setting gcc optimization level to 3, we get this:
Program: 1390 bytes (4.2% Full)
(.text + .data + .bootloader)
Data: 4 bytes (0.2% Full)
(.data + .bss + .noinit)
Quite an improvement in program size :-)
I'm trying to enforce the C4 process to our issue handling. Specifically this part:
The user or Contributor SHOULD write the issue by describing the problem they face or observe.
The user or Contributor SHOULD seek consensus on the accuracy of their observation, and the value of solving the problem.
Users SHALL NOT log feature requests, ideas, suggestions, or any solutions to problems that are not explicitly documented and provable.
Problems that we agree on can get the "agreed problem" label. Questions and general discussions can get the "question" label.
The Readme points users to the frp-arduino Hackage page for the API reference. However, when you go to the the Hackage page and click on the API link, you get a 404 (page not found) error.
We don't use any Arduino code, just plain AVR. A few lines of bash script could replace Arduino makefile.
Hey, I was wondering how hard it'd be to add support for random delays between samples.
The primary motivation is compressive sensing, where by assuming the signal is sparse, you can reconstruct signals given way fewer samples.
A good example is the single pixel camera from Rice University, which uses a similar technique to reconstruct a scene given only 1 pixel and random samples from the environment.
I think this matches well with the arduino since it has a relatively low possible sample rate (~9.5 kHz), but many processes (near field acoustics for example) require ~44.1kHz given uniform sampling. <-- I'm working on a process where I have to use expensive audio cards, but would really like to just use arduinos
From https://github.com/frp-arduino/frp-arduino/blob/master/src/Arduino/DSL.hs#L87
instance Num (Expression a) where
(+) left right = Expression $ DAG.Add (unExpression left) (unExpression right)
(-) left right = Expression $ DAG.Sub (unExpression left) (unExpression right)
(*) = error "* not yet implemented"
abs = error "abs not yet implemented"
signum = error "signum not yet implemented"
fromInteger value = Expression $ DAG.WordConstant $ fromIntegral value
My Uno has 14 pins, 0-13. I understand that with 0 and 1 being Rx and Tx we don't need them much. But why is there no pin9
definition?
Using cabal is the default way to install Haskell packages.
This project would probably attract more people if it followed that standard convention.
So I've been looking at the C code generation, it reminds me a lot of 2 projects from Galois that we might consider leveraging (although that can sometime be painful in Haskell).
The first is Ivory which is EDSL for systems programming.
The second is CoPilot which came before Ivory. This actually almost exactly matches the current Stream transformations.
Is the codebase currently suitable for production on GHC 7.10.x/7.10.2? The last commit was 7 months ago but the project looks appealing.
I have an Arduino Micro. I see frp only has Arduino.Uno module. For another microcontroller would one need to add an Arduino.Micro module?
IC2 is a bus protocol for interchipset communication. This can be used for expanding the number of pins, or having to arduinos communicate. I think that it'd be nice to abstract above this and have the DSL treat them like streams.
Hi,
I don't have GHC globally installed, but I do have Stack, so in my local environment (Mac), I made this modification and everything works:
$ git diff
diff --git a/make b/make
index b74fec1..8c07a1b 100755
--- a/make
+++ b/make
@@ -35,7 +35,7 @@ then
rm -rf $OUTPUT_DIR
else
mkdir -p $OUTPUT_DIR
- ghc \
+ stack exec -- ghc \
--make \
-Werror \
-fwarn-unused-imports \
It would be nice if this were auto-detected.
Mine is mostly to experiment and learn about designing and implementing a useful DSL.
Then maybe I will do some Arduino project using the DSL :)
I want the LCD example to output the delta similar to the UART example.
I'm curious, as it seems to be quite common that some inputs are needed to be read via interrupts (say, an encoder input that can change fast, and normal 'polling' in a loop would have ended in some state changes missed) - is there something implemented/planned to handle such scenario?
This creates programs that do not make sense.
If I have time, I may try to tackle this. The main idea is changing the definition of DAG.Expression
to DAG.Expression a
for Example:
{-# LANGUAGE GADTs #-}
data Expression a where
Input :: Int -> Expression Int
Not :: Expression Bool -> Expression (Bool -> Bool)
Even :: Integral a => Expression a -> Expression Bool
ByteConstant :: Byte -> Expression Byte
...
...
-- new proposed expression
Apply :: Expression (a -> b) -> Expression a -> Expression b
Aside from helping check the correctness of the Code Generator, this might allow DAG.Expression
to just merge with DSL.Expression
since they're likely be isomorphic.
I don't have a particular project I want to build using this DSL. I have a Arduino starter kit with a book full of examples. I've been trying to implement some examples in the DSL to have something to work on. As the examples get more complex, the language has to be extended or improved.
The next thing I'm interested in using is a LCD display.
I first solution would be just to print a single character on the first cell of the LCD.
Then extend to being able to print strings at arbitrary positions.
This is hard coded in the code generator:
(FoldState) -> do
variable "fold_state" CWord
In the now resolved #1, the main problem is that after having used the resource it was still available for binding.
Linear types (based on linear logic) encode this kind of invariant directly. Here's a slide deck that overviews how to emulate these in Haskell.... but this is the kind of situation where Haskell's type system is abit wanting
Lastly as a bonus, languages like Rust have linear logic built-in for memory safety. That might make it a better target language (and there is even work showing it working on Arduino)
Currently, the generated Arduino code seems to act like a single state machine where the dynamics are governed by the Stream binding to pins (which can be seen as the variables)
I propose introducing Events
(which correspond to guards in HIOA) for transitioning between states.
These could look like
or perhaps
The syntax for the two state system could look like:
type Behavior a = Stream a
switcher :: Behavior a -> Event (Behavior a) -> Behavior a
s1 :: Behavior Int
s2 :: Behavior Int
s3 :: Behavior Bool
s3 = isEven `mapS` s1
s4 :: Behavior (Int, Bool)
s4 = s3 <> s1
s5 :: Behavior (Bool, Int)
s5 = s3 <> s2
-- Triggered if First element is True, Holds behavior to be used if Triggered
buttonEvent :: Behavior (Bool, a) -> Event (Behavior (Bool, a))
e :: Event (Behavior (Bool, Int))
e = buttonEvent s5
pin1 := switch s4 e
Which would change from behavior s4
to behavior s5
when s1
is even
BOARD=Uno make Blink upload
make: *** No rule to make target 'Blink'. Stop.
Output of BOARD=Uno make -np Blink upload
Pastbin: https://pastebin.com/raw/6diutKXr
Github (seems to interpret it as markdown unfortunately):
<D =
?F =
DESKTOP_SESSION = /nix/store/19k6msw4lcfszk7iak0h9ba3navqzffv-desktops/share/xsessions/xterm
.SHELLFLAGS := -c
__NIXOS_SET_ENVIRONMENT_DONE = 1
XDG_SESSION_CLASS = user
XDG_SESSION_TYPE = x11
CWEAVE = cweave
?D =
@d =
XAUTHORITY = /home/chris/.Xauthority
@f =
MAKE_VERSION := 4.2.1
CURDIR := /home/chris/fromLaptopt/usbflash/Haskell/AstatineAlphaAvocado/frp-arduino
SHELL = /bin/sh
RM = rm -f
NIXPKGS_CONFIG = /etc/nix/nixpkgs-config.nix
VTE_VERSION = 5202
_ = /run/current-system/sw/bin/make
PREPROCESS.F =
LINK.m =
XDG_CONFIG_DIRS = /home/chris/.nix-profile/etc/xdg:/nix/var/nix/profiles/default/etc/xdg:/run/current-system/sw/etc/xdg:/etc/profiles/per-user/chris/etc/xdg
OUTPUT_OPTION = -o $@
COMPILE.cpp = $(COMPILE.cc)
MAKEFILE_LIST :=
GNUMAKEFLAGS :=
LINK.p =
XDG_DATA_DIRS = /nix/store/rgzydxvigsp2jfdxl5kfws449q9970hc-gnome-terminal-3.28.2/share:/nix/store/n5ryp9j18r3kp5pzm8jhsa34d25m6wy7-gtk+3-3.22.30/share/gsettings-schemas/gtk+3-3.22.30:/nix/store/bfh60vmi54fshkir5x7i28wqbzlj77fj-gsettings-desktop-schemas-3.28.0/share/gsettings-schemas/gsettings-desktop-schemas-3.28.0:/nix/store/n5ryp9j18r3kp5pzm8jhsa34d25m6wy7-gtk+3-3.22.30/share/gsettings-schemas/gtk+3-3.22.30:/nix/store/j0kslmr2njl81cn1v0292xs4fjgfffdi-nautilus-3.28.1/share/gsettings-schemas/nautilus-3.28.1:/nix/store/n5ryp9j18r3kp5pzm8jhsa34d25m6wy7-gtk+3-3.22.30/share/gsettings-schemas/gtk+3-3.22.30:/nix/store/bfh60vmi54fshkir5x7i28wqbzlj77fj-gsettings-desktop-schemas-3.28.0/share/gsettings-schemas/gsettings-desktop-schemas-3.28.0:/nix/store/n5ryp9j18r3kp5pzm8jhsa34d25m6wy7-gtk+3-3.22.30/share/gsettings-schemas/gtk+3-3.22.30:/nix/store/j0kslmr2njl81cn1v0292xs4fjgfffdi-nautilus-3.28.1/share/gsettings-schemas/nautilus-3.28.1:/nix/store/rgzydxvigsp2jfdxl5kfws449q9970hc-gnome-terminal-3.28.2/share/gsettings-schemas/gnome-terminal-3.28.2:/run/opengl-driver/share:/home/chris/.nix-profile/share:/nix/var/nix/profiles/default/share:/run/current-system/sw/share:/etc/profiles/per-user/chris/share
STRIGI_PLUGIN_PATH = /home/chris/.nix-profile/lib/strigi/:/nix/var/nix/profiles/default/lib/strigi/:/run/current-system/sw/lib/strigi/:/etc/profiles/per-user/chris/lib/strigi/
GI_TYPELIB_PATH = /nix/store/n5ryp9j18r3kp5pzm8jhsa34d25m6wy7-gtk+3-3.22.30/lib/girepository-1.0:/nix/store/7y7v5n4jcd7i7m80dw52hlr4wkc3d1rc-librsvg-2.42.4/lib/girepository-1.0:/nix/store/xgj5fwrgcpgwjgg0w48hfpi041b87l9m-pango-1.42.4/lib/girepository-1.0:/nix/store/myr7211aysclk97jbqx4j5jcdg0kcnjw-gdk-pixbuf-2.36.12/lib/girepository-1.0:/nix/store/5vcsl5z90zs2dpvws3fh1vzd0x9l0khn-atk-2.28.1/lib/girepository-1.0:/nix/store/bfh60vmi54fshkir5x7i28wqbzlj77fj-gsettings-desktop-schemas-3.28.0/lib/girepository-1.0:/nix/store/n5ryp9j18r3kp5pzm8jhsa34d25m6wy7-gtk+3-3.22.30/lib/girepository-1.0:/nix/store/2xkiybrkc43z7pmizmngyg2vkg5axj47-vte-0.52.2/lib/girepository-1.0:/nix/store/j0kslmr2njl81cn1v0292xs4fjgfffdi-nautilus-3.28.1/lib/girepository-1.0:/nix/store/jybinc27bqsral9837rl3gzc9f8aj4sg-gnome-autoar-0.2.3/lib/girepository-1.0:/nix/store/8nqchqk71xv9b6rswkasc6bflqml95fv-gobject-introspection-1.56.0/lib/girepository-1.0:/nix/store/n5ryp9j18r3kp5pzm8jhsa34d25m6wy7-gtk+3-3.22.30/lib/girepository-1.0:/nix/store/7y7v5n4jcd7i7m80dw52hlr4wkc3d1rc-librsvg-2.42.4/lib/girepository-1.0:/nix/store/xgj5fwrgcpgwjgg0w48hfpi041b87l9m-pango-1.42.4/lib/girepository-1.0:/nix/store/myr7211aysclk97jbqx4j5jcdg0kcnjw-gdk-pixbuf-2.36.12/lib/girepository-1.0:/nix/store/5vcsl5z90zs2dpvws3fh1vzd0x9l0khn-atk-2.28.1/lib/girepository-1.0:/nix/store/bfh60vmi54fshkir5x7i28wqbzlj77fj-gsettings-desktop-schemas-3.28.0/lib/girepository-1.0:/nix/store/n5ryp9j18r3kp5pzm8jhsa34d25m6wy7-gtk+3-3.22.30/lib/girepository-1.0:/nix/store/2xkiybrkc43z7pmizmngyg2vkg5axj47-vte-0.52.2/lib/girepository-1.0:/nix/store/j0kslmr2njl81cn1v0292xs4fjgfffdi-nautilus-3.28.1/lib/girepository-1.0:/nix/store/jybinc27bqsral9837rl3gzc9f8aj4sg-gnome-autoar-0.2.3/lib/girepository-1.0:/nix/store/8nqchqk71xv9b6rswkasc6bflqml95fv-gobject-introspection-1.56.0/lib/girepository-1.0
QT_PLUGIN_PATH = /home/chris/.nix-profile/lib/qt4/plugins:/home/chris/.nix-profile/lib/kde4/plugins:/nix/var/nix/profiles/default/lib/qt4/plugins:/nix/var/nix/profiles/default/lib/kde4/plugins:/run/current-system/sw/lib/qt4/plugins:/run/current-system/sw/lib/kde4/plugins:/etc/profiles/per-user/chris/lib/qt4/plugins:/etc/profiles/per-user/chris/lib/kde4/plugins
INFOPATH = /home/chris/.nix-profile/info:/home/chris/.nix-profile/share/info:/nix/var/nix/profiles/default/info:/nix/var/nix/profiles/default/share/info:/run/current-system/sw/info:/run/current-system/sw/share/info:/etc/profiles/per-user/chris/info:/etc/profiles/per-user/chris/share/info
CHECKOUT,v = +$(if
LIBEXEC_PATH = /home/chris/.nix-profile/lib/libexec:/nix/var/nix/profiles/default/lib/libexec:/run/current-system/sw/lib/libexec:/etc/profiles/per-user/chris/lib/libexec
LINK.cc =
XDG_SESSION_PATH = /org/freedesktop/DisplayManager/Session1
MAKE_HOST := x86_64-pc-linux-gnu
PATH = /home/chris/.local/bin/:/home/chris/bin:/run/wrappers/bin:/home/chris/.nix-profile/bin:/nix/var/nix/profiles/default/bin:/run/current-system/sw/bin:/etc/profiles/per-user/chris/bin
LD = ld
TEXI2DVI = texi2dvi
LOCALE_ARCHIVE = /run/current-system/sw/lib/locale/locale-archive
INFINALITY_FT = ultimate3
COMPILE.mod =
XDG_RUNTIME_DIR = /run/user/1000
GDK_PIXBUF_MODULE_FILE = /nix/store/7y7v5n4jcd7i7m80dw52hlr4wkc3d1rc-librsvg-2.42.4/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache
ARFLAGS = rv
LINK.r =
LINT = lint
COMPILE.f =
LINT.c =
YACC.m =
NIX_USER_PROFILE_DIR = /nix/var/nix/profiles/per-user/chris
QTWEBKIT_PLUGIN_PATH = /home/chris/.nix-profile/lib/mozilla/plugins/:/nix/var/nix/profiles/default/lib/mozilla/plugins/:/run/current-system/sw/lib/mozilla/plugins/:/etc/profiles/per-user/chris/lib/mozilla/plugins/
YACC.y =
PREPROCESS.r =
AR = ar
.FEATURES := target-specific order-only second-expansion else-if shortest-stem undefine oneshell archives jobserver output-sync check-symlink load
TANGLE = tangle
XDG_SESSION_DESKTOP =
GITHUB_API_TOKEN = 5bdf1b07e2f409b589763b340775d03a79803168
GET = get
%F =
KDEDIRS = /home/chris/.nix-profile:/nix/var/nix/profiles/default:/run/current-system/sw:/etc/profiles/per-user/chris
DISPLAY = :0
COMPILE.F =
XCURSOR_PATH = /home/chris/.icons:/home/chris/.nix-profile/share/icons:/nix/var/nix/profiles/default/share/icons:/run/current-system/sw/share/icons:/etc/profiles/per-user/chris/share/icons
CTANGLE = ctangle
__ETC_PROFILE_DONE = 1
HOME = /home/chris
.LIBPATTERNS = lib%.so lib%.a
LINK.C = $(LINK.cc)
PWD = /home/chris/Haskell/AstatineAlphaAvocado/frp-arduino
.LOADED :=
LINK.S =
XDG_SEAT = seat0
GTK_PATH = /home/chris/.nix-profile/lib/gtk-2.0:/home/chris/.nix-profile/lib/gtk-3.0:/nix/var/nix/profiles/default/lib/gtk-2.0:/nix/var/nix/profiles/default/lib/gtk-3.0:/run/current-system/sw/lib/gtk-2.0:/run/current-system/sw/lib/gtk-3.0:/etc/profiles/per-user/chris/lib/gtk-2.0:/etc/profiles/per-user/chris/lib/gtk-3.0
LINK.c =
LINK.s =
DBUS_SESSION_BUS_ADDRESS = unix:abstract=/tmp/dbus-JzthXTRqnh,guid=fe8e57c527664edba32d1d3f5cb1d521
LD_LIBRARY_PATH = /run/opengl-driver/lib
LOGNAME = chris
+F =
M2C = m2c
GTK_DATA_PREFIX = /nix/store/b8ailgzkc5sbbhiz6izsylrjaf198788-system-path
CO = co
^D =
XDG_VTNR = 7
MAKELEVEL := 0
COMPILE.m =
SSH_ASKPASS = /nix/store/p74iqqs165jwjxkbhp5383ia0h76l4ks-x11-ssh-askpass-1.2.4.1/libexec/x11-ssh-askpass
COLORTERM = truecolor
MAKE = $(MAKE_COMMAND)
MAKECMDGOALS := Blink upload
SHLVL = 3
NIX_PATH = /home/chris/.nix-defexpr/channels:nixpkgs=/nix/var/nix/profiles/per-user/root/channels/nixos:nixos-config=/etc/nixos/configuration.nix:/nix/var/nix/profiles/per-user/root/channels
NIX_PROFILES = /etc/profiles/per-user/chris /run/current-system/sw /nix/var/nix/profiles/default /home/chris/.nix-profile
AS = as
PREPROCESS.S =
COMPILE.p =
XDG_SESSION_ID = 2
USER = chris
FC = f77
.DEFAULT_GOAL :=
XDG_CURRENT_DESKTOP =
%D =
CPP = $(CC) -E
WEAVE = weave
MAKE_COMMAND := make
LINK.cpp = $(LINK.cc)
F77 = $(FC)
OLDPWD = /home/chris/Haskell/AstatineAlphaAvocado/frp-arduino/makefiles
.VARIABLES :=
PC = pc
F = $(notdir $)
XDG_SEAT_PATH = /org/freedesktop/DisplayManager/Seat0
COMPILE.def =
LEX = lex
MAKEFLAGS = np
MFLAGS = -np
D = $(patsubst %/,%,$(dir $))
LEX.l =
LEX.m =
+D =
COMPILE.r =
BOARD = Uno
NO_AT_BRIDGE = 1
TERMINFO_DIRS = /home/chris/.nix-profile/share/terminfo:/nix/var/nix/profiles/default/share/terminfo:/run/current-system/sw/share/terminfo:/etc/profiles/per-user/chris/share/terminfo
CC = cc
TZDIR = /etc/zoneinfo
GITHUB_USER = chrissound
MAKEFILES :=
YACC = yacc
COMPILE.cc =
<F =
CXX = g++
COFLAGS =
EDITOR = nvim
PAGER = less -R
COMPILE.C = $(COMPILE.cc)
GNOME_TERMINAL_SCREEN = /org/gnome/Terminal/screen/9d8c856e_b747_4cad_bb7d_28b6d866e22d
^F =
COMPILE.S =
LINK.F =
GNOME_TERMINAL_SERVICE = :1.55
SUFFIXES := .out .a .ln .o .c .cc .C .cpp .p .f .F .m .r .y .l .ym .yl .s .S .mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo .w .ch .web .sh .elc .el
COMPILE.c =
COMPILE.s =
MOZ_PLUGIN_PATH = /home/chris/.nix-profile/lib/mozilla/plugins:/nix/var/nix/profiles/default/lib/mozilla/plugins:/run/current-system/sw/lib/mozilla/plugins:/etc/profiles/per-user/chris/lib/mozilla/plugins
.INCLUDE_DIRS = /nix/store/8m2ld502dsx6rbsvv05597qzxha4cnc1-gnumake-4.2.1/include
GIO_EXTRA_MODULES = /nix/store/ka37r5lv7p9j4lary3n0bih4yhzlzj99-dconf-0.28.0-lib/lib/gio/modules:/nix/store/ka37r5lv7p9j4lary3n0bih4yhzlzj99-dconf-0.28.0-lib/lib/gio/modules:/nix/store/ka37r5lv7p9j4lary3n0bih4yhzlzj99-dconf-0.28.0-lib/lib/gio/modules:/nix/store/ka37r5lv7p9j4lary3n0bih4yhzlzj99-dconf-0.28.0-lib/lib/gio/modules:/nix/store/ka37r5lv7p9j4lary3n0bih4yhzlzj99-dconf-0.28.0-lib/lib/gio/modules
.RECIPEPREFIX :=
MAKEINFO = makeinfo
MAKE_TERMERR := /dev/pts/3
OBJC = cc
LINK.f =
TEX = tex
LANG = en_US.UTF-8
TERM = xterm-256color
F77FLAGS = $(FFLAGS)
LINK.o =
%.out:
%.a:
%.ln:
%.o:
%: %.o
$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
%.c:
%: %.c
$(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@
%.ln: %.c
$(LINT.c) -C$* $<
%.o: %.c
$(COMPILE.c) $(OUTPUT_OPTION) $<
%.cc:
%: %.cc
$(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@
%.o: %.cc
$(COMPILE.cc) $(OUTPUT_OPTION) $<
%.C:
%: %.C
$(LINK.C) $^ $(LOADLIBES) $(LDLIBS) -o $@
%.o: %.C
$(COMPILE.C) $(OUTPUT_OPTION) $<
%.cpp:
%: %.cpp
$(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@
%.o: %.cpp
$(COMPILE.cpp) $(OUTPUT_OPTION) $<
%.p:
%: %.p
$(LINK.p) $^ $(LOADLIBES) $(LDLIBS) -o $@
%.o: %.p
$(COMPILE.p) $(OUTPUT_OPTION) $<
%.f:
%: %.f
$(LINK.f) $^ $(LOADLIBES) $(LDLIBS) -o $@
%.o: %.f
$(COMPILE.f) $(OUTPUT_OPTION) $<
%.F:
%: %.F
$(LINK.F) $^ $(LOADLIBES) $(LDLIBS) -o $@
%.o: %.F
$(COMPILE.F) $(OUTPUT_OPTION) $<
%.f: %.F
$(PREPROCESS.F) $(OUTPUT_OPTION) $<
%.m:
%: %.m
$(LINK.m) $^ $(LOADLIBES) $(LDLIBS) -o $@
%.o: %.m
$(COMPILE.m) $(OUTPUT_OPTION) $<
%.r:
%: %.r
$(LINK.r) $^ $(LOADLIBES) $(LDLIBS) -o $@
%.o: %.r
$(COMPILE.r) $(OUTPUT_OPTION) $<
%.f: %.r
$(PREPROCESS.r) $(OUTPUT_OPTION) $<
%.y:
%.ln: %.y
$(YACC.y) $<
$(LINT.c) -C$* y.tab.c
$(RM) y.tab.c
%.c: %.y
$(YACC.y) $<
mv -f y.tab.c $@
%.l:
%.ln: %.l
@$(RM) $*.c
$(LEX.l) $< > $*.c
$(LINT.c) -i $*.c -o $@
$(RM) $*.c
%.c: %.l
@$(RM) $@
$(LEX.l) $< > $@
%.r: %.l
$(LEX.l) $< > $@
mv -f lex.yy.r $@
%.ym:
%.m: %.ym
$(YACC.m) $<
mv -f y.tab.c $@
%.yl:
%.s:
%: %.s
$(LINK.s) $^ $(LOADLIBES) $(LDLIBS) -o $@
%.o: %.s
$(COMPILE.s) -o $@ $<
%.S:
%: %.S
$(LINK.S) $^ $(LOADLIBES) $(LDLIBS) -o $@
%.o: %.S
$(COMPILE.S) -o $@ $<
%.s: %.S
$(PREPROCESS.S) $< > $@
%.mod:
%: %.mod
$(COMPILE.mod) -o $@ -e $@ $^
%.o: %.mod
$(COMPILE.mod) -o $@ $<
%.sym:
%.def:
%.sym: %.def
$(COMPILE.def) -o $@ $<
%.h:
%.info:
%.dvi:
%.tex:
%.dvi: %.tex
$(TEX) $<
%.texinfo:
%.info: %.texinfo
$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@
%.dvi: %.texinfo
$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<
%.texi:
%.info: %.texi
$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@
%.dvi: %.texi
$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<
%.txinfo:
%.info: %.txinfo
$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@
%.dvi: %.txinfo
$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<
%.w:
%.c: %.w
$(CTANGLE) $< - $@
%.tex: %.w
$(CWEAVE) $< - $@
%.ch:
%.web:
%.p: %.web
$(TANGLE) $<
%.tex: %.web
$(WEAVE) $<
%.sh:
%: %.sh
cat $< >$@
chmod a+x $@
%.elc:
%.el:
(%): %
$(AR) $(ARFLAGS) $@ $<
%.out: %
@rm -f $@
cp $< $@
%.c: %.w %.ch
$(CTANGLE) $^ $@
%.tex: %.w %.ch
$(CWEAVE) $^ $@
%:: %,v
$(CHECKOUT,v)
%:: RCS/%,v
$(CHECKOUT,v)
%:: RCS/%
$(CHECKOUT,v)
%:: s.%
$(GET) $(GFLAGS) $(SCCS_OUTPUT_OPTION) $<
%:: SCCS/s.%
$(GET) $(GFLAGS) $(SCCS_OUTPUT_OPTION) $<
.web.p:
$(TANGLE) $<
.l.r:
$(LEX.l) $< > $@
mv -f lex.yy.r $@
.dvi:
.ym:
.f.o:
$(COMPILE.f) $(OUTPUT_OPTION) $<
Blink:
.l:
.m:
$(LINK.m) $^ $(LOADLIBES) $(LDLIBS) -o $@
.ln:
.o:
$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
.y:
.def.sym:
$(COMPILE.def) -o $@ $<
.p.o:
$(COMPILE.p) $(OUTPUT_OPTION) $<
.p:
$(LINK.p) $^ $(LOADLIBES) $(LDLIBS) -o $@
.txinfo.dvi:
$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<
.a:
.yl:
.l.ln:
@$(RM) $*.c
$(LEX.l) $< > $*.c
$(LINT.c) -i $*.c -o $@
$(RM) $*.c
.F.o:
$(COMPILE.F) $(OUTPUT_OPTION) $<
.texi.info:
$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@
.w.c:
$(CTANGLE) $< - $@
.texi.dvi:
$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<
.ch:
.m.o:
$(COMPILE.m) $(OUTPUT_OPTION) $<
.cc:
$(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@
.cc.o:
$(COMPILE.cc) $(OUTPUT_OPTION) $<
.def:
.SUFFIXES: .out .a .ln .o .c .cc .C .cpp .p .f .F .m .r .y .l .ym .yl .s .S .mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo .w .ch .web .sh .elc .el
.c.o:
$(COMPILE.c) $(OUTPUT_OPTION) $<
Makefile:
.r.o:
$(COMPILE.r) $(OUTPUT_OPTION) $<
.r:
$(LINK.r) $^ $(LOADLIBES) $(LDLIBS) -o $@
.ym.m:
$(YACC.m) $<
mv -f y.tab.c $@
.y.ln:
$(YACC.y) $<
$(LINT.c) -C$* y.tab.c
$(RM) y.tab.c
makefile:
.elc:
.l.c:
@$(RM) $@
$(LEX.l) $< > $@
.out:
.C:
$(LINK.C) $^ $(LOADLIBES) $(LDLIBS) -o $@
.r.f:
$(PREPROCESS.r) $(OUTPUT_OPTION) $<
.S:
$(LINK.S) $^ $(LOADLIBES) $(LDLIBS) -o $@
.texinfo.info:
$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@
.c:
$(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@
.w.tex:
$(CWEAVE) $< - $@
.c.ln:
$(LINT.c) -C$* $<
.s.o:
$(COMPILE.s) -o $@ $<
.s:
$(LINK.s) $^ $(LOADLIBES) $(LDLIBS) -o $@
.texinfo.dvi:
$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<
.el:
.lm.m:
@$(RM) $@
$(LEX.m) $< > $@
.y.c:
$(YACC.y) $<
mv -f y.tab.c $@
.web.tex:
$(WEAVE) $<
.texinfo:
.DEFAULT:
.h:
.tex.dvi:
$(TEX) $<
.cpp.o:
$(COMPILE.cpp) $(OUTPUT_OPTION) $<
.cpp:
$(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@
.C.o:
$(COMPILE.C) $(OUTPUT_OPTION) $<
.texi:
.txinfo:
.tex:
.txinfo.info:
$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@
GNUmakefile:
.sh:
cat $< >$@
chmod a+x $@
.S.s:
$(PREPROCESS.S) $< > $@
.mod:
$(COMPILE.mod) -o $@ -e $@ $^
.mod.o:
$(COMPILE.mod) -o $@ $<
.F.f:
$(PREPROCESS.F) $(OUTPUT_OPTION) $<
.w:
.S.o:
$(COMPILE.S) -o $@ $<
.F:
$(LINK.F) $^ $(LOADLIBES) $(LDLIBS) -o $@
upload:
.web:
.sym:
.f:
$(LINK.f) $^ $(LOADLIBES) $(LDLIBS) -o $@
.info:
</details>
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.