Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
TASTE
uPython-mirror
Commits
136f6752
Commit
136f6752
authored
Jan 07, 2014
by
Damien George
Browse files
Factor and simplify Makefile's and mpconfig.
parent
880ce2d7
Changes
11
Hide whitespace changes
Inline
Side-by-side
py/mpconfig.h
View file @
136f6752
...
...
@@ -4,26 +4,52 @@
#include
<mpconfigport.h>
#ifndef INT_FMT
// printf format spec to use for machine_int_t and friends
#ifdef __LP64__
// Archs where machine_int_t == long, long != int
#define UINT_FMT "%lu"
#define INT_FMT "%ld"
#else
// Archs where machine_int_t == int
#define UINT_FMT "%u"
#define INT_FMT "%d"
// Any options not explicitly set in mpconfigport.h will get default
// values below.
/*****************************************************************************/
/* Micro Python emitters */
// Whether to emit CPython byte codes (for debugging/testing)
// Enabling this overrides all other emitters
#ifndef MICROPY_EMIT_CPYTHON
#define MICROPY_EMIT_CPYTHON (0)
#endif
// Whether to emit x64 native code
#ifndef MICROPY_EMIT_X64
#define MICROPY_EMIT_X64 (0)
#endif
#endif //INT_FMT
// Whether to emit thumb native code
#ifndef MICROPY_EMIT_THUMB
#define MICROPY_EMIT_THUMB (0)
#endif
// Any options not explicitly set in mpconfigport.h will get default
// values below.
// Whether to enable the thumb inline assembler
#ifndef MICROPY_EMIT_INLINE_THUMB
#define MICROPY_EMIT_INLINE_THUMB (0)
#endif
/*****************************************************************************/
/* Internal debugging stuff */
// Whether to collect memory allocation stats
#ifndef MICROPY_MEM_STATS
#define MICROPY_MEM_STATS (1)
#define MICROPY_MEM_STATS (0)
#endif
/*****************************************************************************/
/* Fine control over Python features */
// Whether to include REPL helper function
#ifndef MICROPY_ENABLE_REPL_HELPERS
#define MICROPY_ENABLE_REPL_HELPERS (0)
#endif
// Whether to support float and complex types
#ifndef MICROPY_ENABLE_FLOAT
#define MICROPY_ENABLE_FLOAT (0)
#endif
// Whether to support slice object and correspondingly
...
...
@@ -31,3 +57,19 @@
#ifndef MICROPY_ENABLE_SLICE
#define MICROPY_ENABLE_SLICE (1)
#endif
/*****************************************************************************/
/* Miscellaneous settings */
// printf format spec to use for machine_int_t and friends
#ifndef INT_FMT
#ifdef __LP64__
// Archs where machine_int_t == long, long != int
#define UINT_FMT "%lu"
#define INT_FMT "%ld"
#else
// Archs where machine_int_t == int
#define UINT_FMT "%u"
#define INT_FMT "%d"
#endif
#endif //INT_FMT
py/py.mk
0 → 100644
View file @
136f6752
# default settings; can be overriden in main Makefile
ifndef
PY_SRC
PY_SRC
=
../py
endif
ifndef
BUILD
BUILD
=
build
endif
# to create the build directory
$(BUILD)
:
mkdir
-p
$@
# where py object files go (they have a name prefix to prevent filename clashes)
PY_BUILD
=
$(BUILD)
/py.
# py object files
PY_O_BASENAME
=
\
nlrx86.o
\
nlrx64.o
\
nlrthumb.o
\
malloc.o
\
qstr.o
\
vstr.o
\
unicode.o
\
lexer.o
\
lexerunix.o
\
parse.o
\
scope.o
\
compile.o
\
emitcommon.o
\
emitpass1.o
\
emitcpy.o
\
emitbc.o
\
asmx64.o
\
emitnx64.o
\
asmthumb.o
\
emitnthumb.o
\
emitinlinethumb.o
\
runtime.o
\
map.o
\
obj.o
\
objbool.o
\
objboundmeth.o
\
objcell.o
\
objclass.o
\
objclosure.o
\
objcomplex.o
\
objdict.o
\
objexcept.o
\
objfloat.o
\
objfun.o
\
objgenerator.o
\
objinstance.o
\
objint.o
\
objlist.o
\
objmodule.o
\
objnone.o
\
objrange.o
\
objset.o
\
objslice.o
\
objstr.o
\
objtuple.o
\
objtype.o
\
builtin.o
\
builtinimport.o
\
vm.o
\
showbc.o
\
repl.o
\
# prepend the build destination prefix to the py object files
PY_O
=
$(
addprefix
$(PY_BUILD)
,
$(PY_O_BASENAME)
)
$(PY_BUILD)emitnx64.o
:
$(PY_SRC)/emitnative.c $(PY_SRC)/emit.h mpconfigport.h
$(CC)
$(CFLAGS)
-DN_X64
-c
-o
$@
$<
$(PY_BUILD)emitnthumb.o
:
$(PY_SRC)/emitnative.c $(PY_SRC)/emit.h mpconfigport.h
$(CC)
$(CFLAGS)
-DN_THUMB
-c
-o
$@
$<
$(PY_BUILD)%.o
:
$(PY_SRC)/%.S
$(CC)
$(CFLAGS)
-c
-o
$@
$<
$(PY_BUILD)%.o
:
$(PY_SRC)/%.c mpconfigport.h
$(CC)
$(CFLAGS)
-c
-o
$@
$<
# optimising vm for speed, adds only a small amount to code size but makes a huge difference to speed (20% faster)
$(PY_BUILD)vm.o
:
$(PY_SRC)/vm.c
$(CC)
$(CFLAGS)
-O3
-c
-o
$@
$<
# header dependencies
$(PY_BUILD)parse.o
:
$(PY_SRC)/grammar.h
$(PY_BUILD)compile.o
:
$(PY_SRC)/grammar.h
$(PY_BUILD)/emitcpy.o
:
$(PY_SRC)/emit.h
$(PY_BUILD)emitbc.o
:
$(PY_SRC)/emit.h
py/repl.c
View file @
136f6752
#include
"misc.h"
#include
"mpconfig.h"
#include
"repl.h"
#if MICROPY_ENABLE_REPL_HELPERS
bool
str_startswith_word
(
const
char
*
str
,
const
char
*
head
)
{
int
i
;
for
(
i
=
0
;
str
[
i
]
&&
head
[
i
];
i
++
)
{
...
...
@@ -42,3 +45,5 @@ bool mp_repl_is_compound_stmt(const char *line) {
}
return
n_paren
>
0
||
n_brack
>
0
||
n_brace
>
0
;
}
#endif // MICROPY_ENABLE_REPL_HELPERS
py/repl.h
View file @
136f6752
#if MICROPY_ENABLE_REPL_HELPERS
bool
mp_repl_is_compound_stmt
(
const
char
*
line
);
#endif
stm/mpconfigport.h
View file @
136f6752
...
...
@@ -2,11 +2,10 @@
// options to control how Micro Python is built
#define MICROPY_ENABLE_FLOAT (1)
#define MICROPY_EMIT_CPYTHON (0)
#define MICROPY_EMIT_X64 (0)
#define MICROPY_EMIT_THUMB (1)
#define MICROPY_EMIT_INLINE_THUMB (1)
#define MICROPY_ENABLE_REPL_HELPERS (1)
#define MICROPY_ENABLE_FLOAT (1)
// type definitions for the specific machine
...
...
unix-cpy/Makefile
View file @
136f6752
PYSRC
=
../py
BUILD
=
build
# define main target
PROG
=
cpy
all
:
$(PROG)
# include py core make definitions
include
../py/py.mk
# program for deletion
RM
=
/bin/rm
# compiler settings
CC
=
gcc
CFLAGS
=
-I
.
-I
$(PYSRC)
-Wall
-Werror
-ansi
-std
=
gnu99
-Os
#-DNDEBUG
CFLAGS
=
-I
.
-I
$(PY
_
SRC)
-Wall
-Werror
-ansi
-std
=
gnu99
-Os
#-DNDEBUG
LDFLAGS
=
-lm
# source files
SRC_C
=
\
main.c
\
PY_O
=
\
nlrx86.o
\
nlrx64.o
\
malloc.o
\
qstr.o
\
vstr.o
\
unicode.o
\
lexer.o
\
lexerunix.o
\
parse.o
\
scope.o
\
compile.o
\
emitcommon.o
\
emitpass1.o
\
emitcpy.o
\
runtime.o
\
map.o
\
obj.o
\
objbool.o
\
objboundmeth.o
\
objcell.o
\
objclass.o
\
objclosure.o
\
objcomplex.o
\
objdict.o
\
objexcept.o
\
objfloat.o
\
objfun.o
\
objgenerator.o
\
objinstance.o
\
objint.o
\
objlist.o
\
objmodule.o
\
objnone.o
\
objrange.o
\
objset.o
\
objslice.o
\
objstr.o
\
objtuple.o
\
objtype.o
\
builtin.o
\
builtinimport.o
\
vm.o
\
showbc.o
\
repl.o
\
OBJ
=
$(
addprefix
$(BUILD)
/,
$(SRC_C:.c=.o)
$(PY_O)
)
OBJ
=
$(
addprefix
$(BUILD)
/,
$(SRC_C:.c=.o)
)
$(PY_O)
LIB
=
PROG
=
cpy
$(PROG)
:
$(BUILD) $(OBJ)
$(CC)
-o
$@
$(OBJ)
$(LIB)
$(LDFLAGS)
$(BUILD)
:
mkdir
-p
$@
strip
$(PROG)
size
$(PROG)
$(BUILD)/%.o
:
%.c
$(CC)
$(CFLAGS)
-c
-o
$@
$<
$(BUILD)/%.o
:
$(PYSRC)/%.S
$(CC)
$(CFLAGS)
-c
-o
$@
$<
$(BUILD)/%.o
:
$(PYSRC)/%.c mpconfigport.h
$(CC)
$(CFLAGS)
-c
-o
$@
$<
$(BUILD)/emitnx64.o
:
$(PYSRC)/emitnative.c $(PYSRC)/emit.h
$(CC)
$(CFLAGS)
-DN_X64
-c
-o
$@
$<
$(BUILD)/emitnthumb.o
:
$(PYSRC)/emitnative.c $(PYSRC)/emit.h
$(CC)
$(CFLAGS)
-DN_THUMB
-c
-o
$@
$<
# optimising vm for speed, adds only a small amount to code size but makes a huge difference to speed (20% faster)
$(BUILD)/vm.o
:
$(PYSRC)/vm.c
$(CC)
$(CFLAGS)
-O3
-c
-o
$@
$<
$(BUILD)/main.o
:
mpconfigport.h
$(BUILD)/parse.o
:
$(PYSRC)/grammar.h
$(BUILD)/compile.o
:
$(PYSRC)/grammar.h
$(BUILD)/emitcpy.o
:
$(PYSRC)/emit.h
$(BUILD)/emitbc.o
:
$(PYSRC)/emit.h
clean
:
/bin/rm
-rf
$(BUILD)
$(RM)
-f
$(PROG)
$(RM)
-rf
$(BUILD)
.PHONY
:
clean
.PHONY
:
all
clean
unix-cpy/main.c
View file @
136f6752
...
...
@@ -11,7 +11,6 @@
#include
"obj.h"
#include
"compile.h"
#include
"runtime0.h"
#include
"runtime.h"
void
do_file
(
const
char
*
file
)
{
mp_lexer_t
*
lex
=
mp_lexer_new_from_file
(
file
);
...
...
unix-cpy/mpconfigport.h
View file @
136f6752
...
...
@@ -2,9 +2,6 @@
#define MICROPY_ENABLE_FLOAT (1)
#define MICROPY_EMIT_CPYTHON (1)
#define MICROPY_EMIT_X64 (0)
#define MICROPY_EMIT_THUMB (0)
#define MICROPY_EMIT_INLINE_THUMB (0)
// type definitions for the specific machine
...
...
unix/Makefile
View file @
136f6752
PYSRC
=
../py
BUILD
=
build
# define main target
PROG
=
py
all
:
$(PROG)
# include py core make definitions
include
../py/py.mk
# program for deletion
RM
=
/bin/rm
# compiler settings
CC
=
gcc
CFLAGS
=
-I
.
-I
$(PYSRC)
-Wall
-Werror
-ansi
-std
=
gnu99
-Os
#-DNDEBUG
CFLAGS
=
-I
.
-I
$(PY
_
SRC)
-Wall
-Werror
-ansi
-std
=
gnu99
-Os
#-DNDEBUG
LDFLAGS
=
-lm
# source files
SRC_C
=
\
main.c
\
PY_O
=
\
nlrx86.o
\
nlrx64.o
\
nlrthumb.o
\
malloc.o
\
qstr.o
\
vstr.o
\
unicode.o
\
lexer.o
\
lexerunix.o
\
parse.o
\
scope.o
\
compile.o
\
emitcommon.o
\
emitpass1.o
\
emitcpy.o
\
emitbc.o
\
asmx64.o
\
emitnx64.o
\
asmthumb.o
\
emitnthumb.o
\
emitinlinethumb.o
\
runtime.o
\
map.o
\
obj.o
\
objbool.o
\
objboundmeth.o
\
objcell.o
\
objclass.o
\
objclosure.o
\
objcomplex.o
\
objdict.o
\
objexcept.o
\
objfloat.o
\
objfun.o
\
objgenerator.o
\
objinstance.o
\
objint.o
\
objlist.o
\
objmodule.o
\
objnone.o
\
objrange.o
\
objset.o
\
objslice.o
\
objstr.o
\
objtuple.o
\
objtype.o
\
builtin.o
\
builtinimport.o
\
vm.o
\
showbc.o
\
repl.o
\
OBJ
=
$(
addprefix
$(BUILD)
/,
$(SRC_C:.c=.o)
$(PY_O)
)
OBJ
=
$(
addprefix
$(BUILD)
/,
$(SRC_C:.c=.o)
)
$(PY_O)
LIB
=
-lreadline
# the following is needed for BSD
#LIB += -ltermcap
PROG
=
py
$(PROG)
:
$(BUILD) $(OBJ)
$(CC)
-o
$@
$(OBJ)
$(LIB)
$(LDFLAGS)
strip
$(PROG)
size
$(PROG)
$(BUILD)
:
mkdir
-p
$@
$(BUILD)/%.o
:
%.c
$(CC)
$(CFLAGS)
-c
-o
$@
$<
$(BUILD)/%.o
:
$(PYSRC)/%.S
$(CC)
$(CFLAGS)
-c
-o
$@
$<
$(BUILD)/%.o
:
$(PYSRC)/%.c mpconfigport.h
$(CC)
$(CFLAGS)
-c
-o
$@
$<
$(BUILD)/emitnx64.o
:
$(PYSRC)/emitnative.c $(PYSRC)/emit.h mpconfigport.h
$(CC)
$(CFLAGS)
-DN_X64
-c
-o
$@
$<
$(BUILD)/emitnthumb.o
:
$(PYSRC)/emitnative.c $(PYSRC)/emit.h mpconfigport.h
$(CC)
$(CFLAGS)
-DN_THUMB
-c
-o
$@
$<
# optimising vm for speed, adds only a small amount to code size but makes a huge difference to speed (20% faster)
$(BUILD)/vm.o
:
$(PYSRC)/vm.c
$(CC)
$(CFLAGS)
-O3
-c
-o
$@
$<
$(BUILD)/main.o
:
mpconfigport.h
$(BUILD)/parse.o
:
$(PYSRC)/grammar.h
$(BUILD)/compile.o
:
$(PYSRC)/grammar.h
$(BUILD)/emitcpy.o
:
$(PYSRC)/emit.h
$(BUILD)/emitbc.o
:
$(PYSRC)/emit.h
clean
:
/bin/rm
-rf
$(BUILD)
$(RM)
-f
$(PROG)
$(RM)
-rf
$(BUILD)
.PHONY
:
clean
.PHONY
:
all
clean
unix/main.c
View file @
136f6752
...
...
@@ -20,6 +20,52 @@
#include
<readline/history.h>
#endif
static
void
execute_from_lexer
(
mp_lexer_t
*
lex
,
mp_parse_input_kind_t
input_kind
,
bool
is_repl
)
{
if
(
lex
==
NULL
)
{
return
;
}
if
(
0
)
{
// just tokenise
while
(
!
mp_lexer_is_kind
(
lex
,
MP_TOKEN_END
))
{
mp_token_show
(
mp_lexer_cur
(
lex
));
mp_lexer_to_next
(
lex
);
}
mp_lexer_free
(
lex
);
return
;
}
mp_parse_node_t
pn
=
mp_parse
(
lex
,
input_kind
);
mp_lexer_free
(
lex
);
if
(
pn
==
MP_PARSE_NODE_NULL
)
{
// parse error
return
;
}
//printf("----------------\n");
//parse_node_show(pn, 0);
//printf("----------------\n");
mp_obj_t
module_fun
=
mp_compile
(
pn
,
is_repl
);
if
(
module_fun
==
mp_const_none
)
{
// compile error
return
;
}
// execute it
nlr_buf_t
nlr
;
if
(
nlr_push
(
&
nlr
)
==
0
)
{
rt_call_function_0
(
module_fun
);
nlr_pop
();
}
else
{
// uncaught exception
mp_obj_print
((
mp_obj_t
)
nlr
.
ret_val
);
printf
(
"
\n
"
);
}
}
static
char
*
str_join
(
const
char
*
s1
,
int
sep_char
,
const
char
*
s2
)
{
int
l1
=
strlen
(
s1
);
int
l2
=
strlen
(
s2
);
...
...
@@ -80,28 +126,11 @@ static void do_repl(void) {
}
mp_lexer_t
*
lex
=
mp_lexer_new_from_str_len
(
"<stdin>"
,
line
,
strlen
(
line
),
false
);
mp_parse_node_t
pn
=
mp_parse
(
lex
,
MP_PARSE_SINGLE_INPUT
);
mp_lexer_free
(
lex
);
if
(
pn
!=
MP_PARSE_NODE_NULL
)
{
//mp_parse_node_show(pn, 0);
mp_obj_t
module_fun
=
mp_compile
(
pn
,
true
);
if
(
module_fun
!=
mp_const_none
)
{
nlr_buf_t
nlr
;
if
(
nlr_push
(
&
nlr
)
==
0
)
{
rt_call_function_0
(
module_fun
);
nlr_pop
();
}
else
{
// uncaught exception
mp_obj_print
((
mp_obj_t
)
nlr
.
ret_val
);
printf
(
"
\n
"
);
}
}
}
execute_from_lexer
(
lex
,
MP_PARSE_SINGLE_INPUT
,
true
);
}
}
void
do_file
(
const
char
*
file
)
{
static
void
do_file
(
const
char
*
file
)
{
// hack: set dir for import based on where this file is
{
const
char
*
s
=
strrchr
(
file
,
'/'
);
...
...
@@ -115,53 +144,12 @@ void do_file(const char *file) {
}
mp_lexer_t
*
lex
=
mp_lexer_new_from_file
(
file
);
//const char *pysrc = "def f():\n x=x+1\n print(42)\n";
//mp_lexer_t *lex = mp_lexer_from_str_len("<>", pysrc, strlen(pysrc), false);
if
(
lex
==
NULL
)
{
return
;
}
if
(
0
)
{
// just tokenise
while
(
!
mp_lexer_is_kind
(
lex
,
MP_TOKEN_END
))
{
mp_token_show
(
mp_lexer_cur
(
lex
));
mp_lexer_to_next
(
lex
);
}
mp_lexer_free
(
lex
);
}
else
{
// compile
mp_parse_node_t
pn
=
mp_parse
(
lex
,
MP_PARSE_FILE_INPUT
);
mp_lexer_free
(
lex
);
if
(
pn
!=
MP_PARSE_NODE_NULL
)
{
//printf("----------------\n");
//parse_node_show(pn, 0);
//printf("----------------\n");
mp_obj_t
module_fun
=
mp_compile
(
pn
,
false
);
//printf("----------------\n");
execute_from_lexer
(
lex
,
MP_PARSE_FILE_INPUT
,
false
);
}
#if MICROPY_EMIT_CPYTHON
if
(
!
comp_ok
)
{
printf
(
"compile error
\n
"
);
}
#else
if
(
1
&&
module_fun
!=
mp_const_none
)
{
// execute it
nlr_buf_t
nlr
;
if
(
nlr_push
(
&
nlr
)
==
0
)
{
rt_call_function_0
(
module_fun
);
nlr_pop
();
}
else
{
// uncaught exception
mp_obj_print
((
mp_obj_t
)
nlr
.
ret_val
);
printf
(
"
\n
"
);
}
}
#endif
}
}
static
void
do_str
(
const
char
*
str
)
{
mp_lexer_t
*
lex
=
mp_lexer_new_from_str_len
(
"<stdin>"
,
str
,
strlen
(
str
),
false
);
execute_from_lexer
(
lex
,
MP_PARSE_SINGLE_INPUT
,
false
);
}
typedef
struct
_test_obj_t
{
...
...
@@ -192,12 +180,6 @@ static const mp_obj_type_t test_type = {
{
&
mp_const_type
},
"Test"
,
.
print
=
test_print
,
.
make_new
=
NULL
,
.
call_n
=
NULL
,
.
unary_op
=
NULL
,
.
binary_op
=
NULL
,
.
getiter
=
NULL
,
.
iternext
=
NULL
,
.
methods
=
{
{
"get"
,
&
test_get_obj
},
{
"set"
,
&
test_set_obj
},
...
...
@@ -212,6 +194,11 @@ mp_obj_t test_obj_new(int value) {
return
o
;
}
int
usage
(
void
)
{
printf
(
"usage: py [-c <command>] [<filename>]
\n
"
);
return
1
;
}
int
main
(
int
argc
,
char
**
argv
)
{
qstr_init
();
rt_init
();
...
...
@@ -227,12 +214,24 @@ int main(int argc, char **argv) {
if
(
argc
==
1
)
{
do_repl
();
}
else
if
(
argc
==
2
)
{