Hi everyone,
As I said, in my tests with CMake, I also managed build Nupic on Windows
using Visual Studio (but I got the same runtime errors occured on OSX with
XCode).
I attached some instructions on this message but unfortunatelly I cant send
Windows native libraries ("external" folder with DLLs and LIBs) due to
gmail blocker (I also dont know how pull an entire folder to github repo)
but I can send by shared google drive folder.
It would be interesting more help to conclude this task (ie. CMake
conversion) since now I will have to dedicate my spare time to my
dissertation.. :-(
Best wishes, David
=================
Download software
=================
-Microsoft Visual Studio 2012
-CMake 2.8:
http://www.cmake.org/files/v2.8/cmake-2.8.11.2-win32-x86.exe
-Python 2.7.5 32bit ("install just for me" option) *:
http://www.python.org/download/releases/2.7.5/
Set environment variables:
PYTHONPATH = path where python is: C:\Python27\Lib
PYTHONHOME = path where python is: C:\Python27
NTA_ROOTDIR = path the project is installed: %USERPROFILE%\nta\eng
-Numpy 1.7.1 32bit (install in same folder that Python)
http://sourceforge.net/projects/numpy/files/NumPy/1.7.1/numpy-1.7.1-win32-superpack-python2.7.exe/download
-Swig for Windows *:
http://www.swig.org/download.html
* Tip: copy to root and not ProgramFiles (found error probally due to spaces)
and include in PATH env variable on Windows.
=======================
Porting Code to Win32
=======================
Remove in NTA_CXXFLAGS_BASE variable (CMakeLists.txt top file):
-Wreturn-type -Wunused-variable -Wno-deprecated
-Include a new folder for Win32 based on:
/nupic-master/external/Darwin64 =>
/nupic-master/external/win32
(If you want I have the Win32 folder with need libraries (apr, zlib, etc)
ported to Windows)
include in
/nupic-master/nta/engine/network.cpp
/nupic-master/nta/utils/Ramdom.hpp
/nupic-master/nta/algorithms/unittests/NearestNeighborUnitTest.cpp:
#ifdef _MSC_VER
#undef min
#undef max
#endif
('max' and 'min' are macros already defined by MSVC which create conflits with
Nupic code)
in /nupic-master/nta/engine/UniformLinkPolicy.cpp
replace:
return std::make_pair<Fraction, Fraction>(lowerIndex, upperIndex);
to:
return std::make_pair(lowerIndex, upperIndex);
(c++11 deduces the data type, thus it emit error when find explicit declaration)
in /nupic-master/nta/types/Fraction.cpp
replace:
std::swap<int>(numerator_, denominator_);
to:
std::swap(numerator_, denominator_);
(c++11 deduces the data type, thus it emit error when find explicit declaration)
in /nupic-master/nta/ntypes/Buffer.hpp
replace:
size = r->memStream_.readsome(bytes, size);
to:
#ifdef _MSC_VER
size = r->memStream_._Readsome_s(bytes, size, (std::streamsize)size);
#else
size = r->memStream_.readsome(bytes, size);
#endif
in /nupic-master/nta/os/env.cpp
replace:
#if defined(NTA_PLATFORM_darwin64) || defined(NTA_PLATFORM_darwin86)
#include <crt_externs.h>
#else
extern char **_environ;
#endif
to:
#if !defined(_MSC_VER)
#if defined(NTA_PLATFORM_darwin64) || defined(NTA_PLATFORM_darwin86)
#include <crt_externs.h>
#else
extern char **_environ;
#endif
#endif
in /nupic-master/nta/algorithms/bit_history.cpp
replace:
if (denom < 0.00001 or dcNew > DUTY_CYCLE_UPDATE_INTERVAL)
to:
if (denom < 0.00001 || dcNew > DUTY_CYCLE_UPDATE_INTERVAL)
(i.e. change "or" to "||")
in /nupic-master/nta/os/Directory.cpp
replace stuff like this:
wcwd
wpath.c_str()
to:
LPSTR(wcwd)
LPCSTR(wpath.c_str())
(Error messages will be help to find more of this problem)
In /nupic-master/external/common/include/boost/throw_exception.hpp:
replace:
#ifdef BOOST_NO_EXCEPTIONS
void throw_exception( std::exception const & e ); // user defined
#else
to:
#undef BOOST_NO_EXCEPTIONS
#ifdef BOOST_NO_EXCEPTIONS
void throw_exception( std::exception const & e ); // user defined
#else
in /nupic-master/nta/os/OS.cpp
replace:
#elif NTA_PLATFORM_win32
//We only run on XP/2003 and above
#undef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#include <psapi.h>
#endif
to:
#elif NTA_PLATFORM_win32
//We only run on XP/2003 and above
#undef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
#include <psapi.h>
#pragma comment(lib, "psapi.lib")
#endif
(i.e. add #pragma to "psapi.lib")
in /nupic-master/nta/engine/RegionImplFactory.cpp
#elif defined(NTA_PLATFORM_win32)
const char * filename = "cpp_region.dll";
#endif
to:
#elif defined(NTA_PLATFORM_win32)
const char * filename = "libcpp_region.dll";
#endif
(CMake generates same prefix to both Unix and Win32 libraries)
in any file where you found:
#include <unistd.h>
replace to:
#ifdef WIN32
#include <windows.h>
#else
#include <unistd.h>
#endif
in any file where you found env::get to get environment paths replace the path
separator like this:
found = Env::get("HOMEPATH", homePath);
std::replace(homePath.begin(), homePath.end(), '\\', '/');
in C:/Python2.7/include/pyconfig.h
replace:
pragma comment(lib,"python27_d.lib")
to:
pragma comment(lib,"python27.lib")
("python27_d.lib" is a library used for debug in Python)
and delete or hide PY_DEBUG directive:
#ifdef _DEBUG
//# define Py_DEBUG
#endif
===================
Building with CMake
===================
When generate choose Visual Studio 11 (i.e. 2012)
_______________________________________________
nupic mailing list
[email protected]
http://lists.numenta.org/mailman/listinfo/nupic_lists.numenta.org