diff --git a/py/mpconfig.h b/py/mpconfig.h index 9acfc142f5..9ff3dd77b6 100644 --- a/py/mpconfig.h +++ b/py/mpconfig.h @@ -312,4 +312,6 @@ typedef double mp_float_t; #endif //INT_FMT // Modifier for function which doesn't return +#ifndef NORETURN #define NORETURN __attribute__((noreturn)) +#endif diff --git a/py/mpz.c b/py/mpz.c index d6eca30685..8eed283f04 100644 --- a/py/mpz.c +++ b/py/mpz.c @@ -1092,8 +1092,11 @@ mpz_t *mpz_gcd(const mpz_t *z1, const mpz_t *z2) { */ mpz_t *mpz_lcm(const mpz_t *z1, const mpz_t *z2) { - if (z1->len == 0 || z2->len == 0) - return mpz_zero(); + // braces below are required for compilation to succeed with CL, see bug report + // https://connect.microsoft.com/VisualStudio/feedback/details/864169/compilation-error-when-braces-are-left-out-of-single-line-if-statement + if (z1->len == 0 || z2->len == 0) { + return mpz_zero(); + } mpz_t *gcd = mpz_gcd(z1, z2); mpz_t *quo = mpz_zero(); diff --git a/py/objint.c b/py/objint.c index c8bcb6080c..73b4c5d0be 100644 --- a/py/objint.c +++ b/py/objint.c @@ -303,7 +303,7 @@ STATIC mp_obj_t int_from_bytes(uint n_args, const mp_obj_t *args) { // convert the bytes to an integer machine_uint_t value = 0; - for (const byte* buf = bufinfo.buf + bufinfo.len - 1; buf >= (byte*)bufinfo.buf; buf--) { + for (const byte* buf = (const byte*)bufinfo.buf + bufinfo.len - 1; buf >= (byte*)bufinfo.buf; buf--) { value = (value << 8) | *buf; } diff --git a/py/runtime.c b/py/runtime.c index a5a5bc5a4a..7a701fec57 100644 --- a/py/runtime.c +++ b/py/runtime.c @@ -27,6 +27,7 @@ #include #include #include +#include #include "mpconfig.h" #include "nlr.h" @@ -1074,11 +1075,12 @@ import_error: uint pkg_name_len; const char *pkg_name = mp_obj_str_get_data(dest[0], &pkg_name_len); - char dot_name[pkg_name_len + 1 + qstr_len(name)]; + const uint dot_name_len = pkg_name_len + 1 + qstr_len(name); + char *dot_name = alloca(dot_name_len); memcpy(dot_name, pkg_name, pkg_name_len); dot_name[pkg_name_len] = '.'; memcpy(dot_name + pkg_name_len + 1, qstr_str(name), qstr_len(name)); - qstr dot_name_q = qstr_from_strn(dot_name, sizeof(dot_name)); + qstr dot_name_q = qstr_from_strn(dot_name, dot_name_len); mp_obj_t args[5]; args[0] = MP_OBJ_NEW_QSTR(dot_name_q); diff --git a/windows/.gitignore b/windows/.gitignore new file mode 100644 index 0000000000..d26ef4db7f --- /dev/null +++ b/windows/.gitignore @@ -0,0 +1,9 @@ +*.user +*.*sdf +*.suo +*.sln +*.exe +*.pdb +*.ilk +*.filters +/build/* diff --git a/windows/README b/windows/README index 28940f2c3d..88ee5ffce3 100644 --- a/windows/README +++ b/windows/README @@ -1,10 +1,26 @@ This is experimental, community-supported Windows port of MicroPython. It is based on Unix port, and expected to remain so. +The port requires additional testing, debugging, and patches. Please +consider to contribute. + To cross-compile under Debian/Ubuntu Linux system: sudo apt-get install mingw32 mingw32-binutils mingw32-runtime make CROSS_COMPILE=i586-mingw32msvc- -The port requires additional testing, debugging, and patches. Please -consider to contribute. + +To compile under Cygwin: + +Install following packages using cygwin's setup.exe: mingw-gcc-g++ make +make CROSS_COMPILE=i686-pc-mingw32- + + +To compile using Visual Studio 2013: + +Open micropython.vcxproj and build + + +To compile using Visual Studio 2013 commandline: + +msbuild micropython.vcxproj diff --git a/windows/init.c b/windows/init.c index f78dd4c807..5bb29b8f38 100644 --- a/windows/init.c +++ b/windows/init.c @@ -25,7 +25,12 @@ */ #include +#include void init() { +#ifdef __MINGW32__ putenv("PRINTF_EXPONENT_DIGITS=2"); +#else + _set_output_format(_TWO_DIGIT_EXPONENT); +#endif } diff --git a/windows/micropython.vcxproj b/windows/micropython.vcxproj new file mode 100644 index 0000000000..62886d1a19 --- /dev/null +++ b/windows/micropython.vcxproj @@ -0,0 +1,102 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {740F3C30-EB6C-4B59-9C50-AE4D5A4A9D12} + micropython + + + + Application + true + v120 + MultiByte + + + Application + false + v120 + true + MultiByte + + + Application + true + v120 + MultiByte + + + Application + false + v120 + true + MultiByte + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/windows/mpconfigport.h b/windows/mpconfigport.h index 4436b8a197..3651a6120f 100644 --- a/windows/mpconfigport.h +++ b/windows/mpconfigport.h @@ -31,6 +31,7 @@ #define MICROPY_USE_READLINE (0) #endif +#define MICROPY_PATH_MAX (260) //see minwindef.h for msvc or limits.h for mingw #define MICROPY_EMIT_X64 (0) #define MICROPY_EMIT_THUMB (0) #define MICROPY_EMIT_INLINE_THUMB (0) @@ -46,9 +47,12 @@ // type definitions for the specific machine -#ifdef __LP64__ +#if defined( __MINGW32__ ) && defined( __LP64__ ) typedef long machine_int_t; // must be pointer size typedef unsigned long machine_uint_t; // must be pointer size +#elif defined ( _MSC_VER ) && defined( _WIN64 ) +typedef __int64 machine_int_t; +typedef unsigned __int64 machine_uint_t; #else // These are definitions for machines where sizeof(int) == sizeof(void*), // regardless for actual size. @@ -67,3 +71,43 @@ extern const struct _mp_obj_fun_native_t mp_builtin_open_obj; #include "realpath.h" #include "init.h" + + +// MSVC specifics +#ifdef _MSC_VER + +// Sanity check + +#if ( _MSC_VER < 1800 ) + #error Can only build with Visual Studio 2013 toolset +#endif + + +// CL specific overrides from mpconfig + +#define NORETURN __declspec(noreturn) +#define MICROPY_EXTRA_CONSTANTS { "dummy", 0 } //can't have zero-sized array + + +// CL specific definitions + +#define restrict +#define inline __inline +#define STDIN_FILENO 0 +#define STDOUT_FILENO 1 +#define STDERR_FILENO 2 +#define PATH_MAX MICROPY_PATH_MAX +#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) +#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) + + +// System headers (needed e.g. for nlr.h) + +#include //for NULL +#include //for assert + + +// Functions implemented in platform code + +int snprintf(char *dest, size_t count, const char *format, ...); +#endif diff --git a/windows/msvc/common.props b/windows/msvc/common.props new file mode 100644 index 0000000000..300de46a53 --- /dev/null +++ b/windows/msvc/common.props @@ -0,0 +1,22 @@ + + + + + + $(ProjectDir) + $(ProjectDir)build\$(Configuration)$(Platform)\ + + + + .\;.\build;.\msvc;..\py + _USE_MATH_DEFINES;_CRT_SECURE_NO_WARNINGS;_MBCS;%(PreprocessorDefinitions) + false + Level1 + false + + + true + + + + \ No newline at end of file diff --git a/windows/msvc/debug.props b/windows/msvc/debug.props new file mode 100644 index 0000000000..c0a22be854 --- /dev/null +++ b/windows/msvc/debug.props @@ -0,0 +1,13 @@ + + + + + + + + + DEBUG;%(PreprocessorDefinitions) + + + + diff --git a/windows/msvc/genhdr.targets b/windows/msvc/genhdr.targets new file mode 100644 index 0000000000..453d2ff1eb --- /dev/null +++ b/windows/msvc/genhdr.targets @@ -0,0 +1,76 @@ + + + + + + + + $(MsBuildThisFileDirectory)..\..\py\ + $(MsBuildThisFileDirectory)..\build\genhdr\ + + + + + + + + + + + + + + + + + + + + + + + $(DestDir)qstrdefs.preprocessed.h + $(MsBuildThisFileDirectory)..\..\unix\qstrdefsport.h + $(DestDir)qstrdefs.generated.h + + + + + + + + + + + + + + + + + + + + + + + + + $(GitHash)-dirty + + + $(DestDir)py-version.h + + + + + + + + + + + + diff --git a/windows/msvc/release.props b/windows/msvc/release.props new file mode 100644 index 0000000000..ea0bf433d3 --- /dev/null +++ b/windows/msvc/release.props @@ -0,0 +1,16 @@ + + + + + + + + true + true + + + true + + + + diff --git a/windows/msvc/snprintf.c b/windows/msvc/snprintf.c new file mode 100644 index 0000000000..d200a4cbc8 --- /dev/null +++ b/windows/msvc/snprintf.c @@ -0,0 +1,44 @@ +/* +* This file is part of the Micro Python project, http://micropython.org/ +* +* The MIT License (MIT) +* +* Copyright (c) 2013, 2014 Damien P. George +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +* THE SOFTWARE. +*/ + +#include +#include +#include + +// _snprintf/vsnprintf are fine, except the 'F' specifier is not handled +int snprintf(char *dest, size_t count, const char *format, ...) { + const size_t fmtLen = strlen(format) + 1; + char *fixedFmt = alloca(fmtLen); + for (size_t i = 0; i < fmtLen; ++i) + fixedFmt[i] = format[i] == 'F' ? 'f' : format[i]; + + va_list args; + va_start(args, format); + const int ret = vsnprintf(dest, count, fixedFmt, args); + va_end(args); + + return ret; +} diff --git a/windows/msvc/sources.props b/windows/msvc/sources.props new file mode 100644 index 0000000000..9af7d6e117 --- /dev/null +++ b/windows/msvc/sources.props @@ -0,0 +1,17 @@ + + + + $(MsbuildThisFileDirectory)..\..\ + + + + + + + + + + + + + diff --git a/windows/msvc/unistd.h b/windows/msvc/unistd.h new file mode 100644 index 0000000000..ece86fa749 --- /dev/null +++ b/windows/msvc/unistd.h @@ -0,0 +1,28 @@ +/* +* This file is part of the Micro Python project, http://micropython.org/ +* +* The MIT License (MIT) +* +* Copyright (c) 2013, 2014 Damien P. George +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +* THE SOFTWARE. +*/ + +// There's no unistd.h, but this is the equivalent +#include