Commit 096936be authored by Sébastien Villemot's avatar Sébastien Villemot

The preprocessor now compiles the MEX when use_dll is specified

Update documentation accordingly (except on macOS where the solution has not
yet been implemented).

Also include MinGW in the Windows installer.
parent 7d7409be
......@@ -27,8 +27,6 @@ EXTRA_DIST = \
COPYING \
CONTRIBUTING.md \
windows/dynare.nsi \
windows/mexopts-win32.bat \
windows/mexopts-win64.bat \
windows/README.txt \
osx \
examples \
......
......@@ -593,36 +593,29 @@ Octave comes with built-in functionality for compiling mex-files.
@node Prerequisites on Windows
@subsection Prerequisites on Windows
If you are using MATLAB under Windows, install a C++ compiler on your machine and configure it with
MATLAB. There are at least two free compilers you can use. First, there is Microsoft's Visual Studio
Community (@uref{https://www.visualstudio.com/}), which has the largest history of MATLAB support, but
requires much space on the hard-disk. Second, since MATLAB R2015b, MATLAB supports the MinGW-w64 C/C++
Compiler from TDM-GCC. To install this compiler, use the Add-Ons menu of MATLAB. Search for MinGW or
select it from Features.
For older version of MATLAB, in particular before R2014a, it may sometimes make sense to use the gcc compiler
provided by Cygwin. However, integrating it in MATLAB can be quite cumbersome and should be considered as a
legacy option. For details, see
@uref{http://www.dynare.org/DynareWiki/ConfigureMatlabWindowsForMexCompilation,instructions
on the Dynare wiki}.
There is no prerequisite on Windows. Dynare now ships a compilation environment
that can be used with the @code{use_dll} option.
@node Prerequisites on Debian GNU/Linux and Ubuntu
@subsection Prerequisites on Debian GNU/Linux and Ubuntu
Users of MATLAB under Linux need to have a working compilation environment installed. If not already present,
it can be installed via @code{apt-get install build-essential}.
Users of MATLAB under GNU/Linux need a working compilation environment
installed. If not already present, it can be installed via @code{apt install
build-essential}.
Users of Octave under Linux should install the package for MEX file compilation
Users of Octave under GNU/Linux should install the package for MEX file compilation
(under Debian or Ubuntu, it is called @file{liboctave-dev}).
@node Prerequisites on macOS
@subsection Prerequisites on macOS
[TO BE UPDATED]
If you are using MATLAB under macOS, you should install the latest
version of XCode: see
@uref{http://www.dynare.org/DynareWiki/InstallOnMacOSX,instructions on
the Dynare wiki}.
@node Configuration
@section Configuration
......@@ -917,23 +910,6 @@ command).
Prevent Dynare from printing the output of the steps leading up to the
preprocessor as well as the preprocessor output itself.
@item mingw
Tells Dynare that your MATLAB is configured for compiling MEX files with the
MinGW-compiler from TDM-GCC (@pxref{Compiler installation}). This option is
only available under Windows, and is used in conjunction with
@code{use_dll}.
@item msvc
Tells Dynare that your MATLAB is configured for compiling MEX files with
Microsoft Visual C++ (@pxref{Compiler installation}). This option is
only available under Windows, and is used in conjunction with
@code{use_dll}.
@item cygwin
Tells Dynare that your MATLAB is configured for compiling MEX files with
Cygwin (@pxref{Compiler installation}). This option is only available
under Windows, and is used in conjunction with @code{use_dll}.
@item parallel[=@var{CLUSTER_NAME}]
Tells Dynare to perform computations in parallel. If @var{CLUSTER_NAME}
is passed, Dynare will use the specified cluster to perform parallel
......
......@@ -226,6 +226,7 @@ if regexp(firstline, '\s*\/\/', 'once') == 1
end
command = ['"' dynareroot 'preprocessor' arch_ext filesep 'dynare_m" ' fname] ;
command = [ command ' mexext=' mexext ' "matlabroot=' matlabroot '"'];
for i=1:length(varargin)
command = [command ' ' varargin{i}];
end
......@@ -240,6 +241,14 @@ if preprocessoroutput
end
end
% Under Windows, make sure the MEX file is unloaded (in the use_dll case),
% otherwise the preprocessor can't recompile it
if isoctave
clear([fname(1:end-4) '.static'], [fname(1:end-4) '.dynamic'])
else
clear(['+' fname(1:end-4) '/static'], ['+' fname(1:end-4) '/dynamic'])
end
[status, result] = system(command);
if status ~= 0 || preprocessoroutput
disp(result)
......
function dyn_mex(win_compiler,basename,force)
% Compile Dynare model dlls when model option use_dll is used
% if C file is fresher than mex file
%
% INPUTS
% o win_compiler str compiler used under Windows (unused under Linux or OSX):
% 'msvc' (MS Visual C)
% 'cygwin'
% o basename str filenames base
% o force bool recompile if 1
%
% OUTPUTS
% none
%
% Copyright (C) 2015-2017 Dynare Team
%
% This file is part of Dynare.
%
% Dynare is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
% (at your option) any later version.
%
% Dynare is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with Dynare. If not, see <http://www.gnu.org/licenses/>.
Dc = dir([basename '/mode/src/dynamic.c']);
Dmex = dir(['+' basename '/model/dynamic.' mexext]);
% compile only if date of C file is greater than date of mex file
% and force is not True
if ~isempty(Dmex)
if (Dmex.datenum > Dc.datenum) && ~force
disp('Mex files are newer than the source: not recompiled')
return
end
end
if ~isoctave
% Some mex commands are enclosed in an eval(), because otherwise it will make Octave fail
if ispc
if strcmp(win_compiler,'msvc')
% MATLAB/Windows + Microsoft Visual C++
% Add /TP flag as fix for #1227
eval(['mex -O LINKFLAGS="$LINKFLAGS /export:Dynamic" COMPFLAGS="/TP" ' basename '/model/src/dynamic.c ' basename '/model/src/dynamic_mex.c -output +' basename '/dynamic'])
eval(['mex -O LINKFLAGS="$LINKFLAGS /export:Static" COMPFLAGS="/TP" ' basename '/model/src/static.c ' basename '/model/src/static_mex.c -output +' basename '/static'])
elseif strcmp(win_compiler,'mingw')
eval(['mex -O LINKFLAGS="$LINKFLAGS /export:Dynamic" ' basename '/model/src/dynamic.c ' basename '/model/src/dynamic_mex.c -output +' basename '/dynamic'])
eval(['mex -O LINKFLAGS="$LINKFLAGS /export:Static" ' basename '/model/src/static.c ' basename '/model/src/static_mex.c -output +' basename '/static'])
elseif strcmp(win_compiler,'cygwin') %legacy support for Cygwin with mexopts.bat
% MATLAB/Windows + Cygwin g++
eval(['mex -O PRELINK_CMDS1="echo EXPORTS > mex.def & echo ' ...
'mexFunction >> mex.def & echo Dynamic >> mex.def" ' ...
basename '/model/src/dynamic.c ' basename '/model/src/dynamic_mex.c -output +' basename '/dynamic'])
eval(['mex -O PRELINK_CMDS1="echo EXPORTS > mex.def & echo ' ...
'mexFunction >> mex.def & echo Dynamic >> mex.def" ' ...
basename '/model/src/static.c ' basename '/model/src/static_mex.c -output +' basename '/static'])
else
error(['When using the USE_DLL option, you must give either ' ...
'''cygwin'', ''mingw'' or ''msvc'' option to the ''dynare'' command'])
end
elseif isunix && ~ismac
% MATLAB/Linux
if matlab_ver_less_than('8.3')
eval(['mex -O LDFLAGS=''-pthread -shared -Wl,--no-undefined'' ' ...
basename '/model/src/dynamic.c ' basename '/model/src/dynamic_mex.c -output +' basename '/dynamic'])
eval(['mex -O LDFLAGS=''-pthread -shared -Wl,--no-undefined'' ' ...
basename '/model/src/static.c ' basename '/model/src/static_mex.c -output +' basename '/static'])
elseif matlab_ver_less_than('9.1')
eval(['mex -O LINKEXPORT='''' ' basename '/model/src/dynamic.c ' basename '/model/src/dynamic_mex.c -output +' basename '/dynamic'])
eval(['mex -O LINKEXPORT='''' ' basename '/model/src/static.c ' basename '/model/src/static_mex.c -output +' basename '/static'])
else
eval(['mex -O LINKEXPORTVER='''' ' basename '/model/src/dynamic.c ' basename '/model/src/dynamic_mex.c -output +' basename '/dynamic'])
eval(['mex -O LINKEXPORTVER='''' ' basename '/model/src/static.c ' basename '/model/src/static_mex.c -output +' basename '/static'])
end
elseif ismac
% MATLAB/MacOS
if matlab_ver_less_than('8.1')
eval(['mex -O LDFLAGS=''-Wl,-twolevel_namespace -undefined ' ...
'error -arch $ARCHS -Wl,-syslibroot,$SDKROOT ' ...
'-mmacosx-version-min=$MACOSX_DEPLOYMENT_TARGET -bundle'' ' ...
basename '/model/src/dynamic.c ' basename '/model/src/dynamic_mex.c -output +' basename '/dynamic'])
eval(['mex -O LDFLAGS=''-Wl,-twolevel_namespace -undefined ' ...
'error -arch $ARCHS -Wl,-syslibroot,$SDKROOT ' ...
'-mmacosx-version-min=$MACOSX_DEPLOYMENT_TARGET -bundle'' ' ...
basename '/model/src/static.c ' basename '/model/src/static_mex.c -output +' basename '/static'])
elseif matlab_ver_less_than('8.3')
eval(['mex -O LDFLAGS=''-Wl,-twolevel_namespace -undefined ' ...
'error -arch $ARCHS -Wl,-syslibroot,$MW_SDKROOT ' ...
'-mmacosx-version-min=$MACOSX_DEPLOYMENT_TARGET -bundle'' ' ...
basename '/model/src/dynamic.c ' basename '/model/src/dynamic_mex.c -output +' basename '/dynamic'])
eval(['mex -O LDFLAGS=''-Wl,-twolevel_namespace -undefined ' ...
'error -arch $ARCHS -Wl,-syslibroot,$MW_SDKROOT ' ...
'-mmacosx-version-min=$MACOSX_DEPLOYMENT_TARGET -bundle'' ' ...
basename '/model/src/static.c ' basename '/model/src/static_mex.c -output +' basename '/static'])
elseif matlab_ver_less_than('9.1')
eval(['mex -O LINKEXPORT='''' ' basename '/model/src/dynamic.c ' basename '/model/src/dynamic_mex.c -output +' basename '/dynamic'])
eval(['mex -O LINKEXPORT='''' ' basename '/model/src/static.c ' basename '/model/src/static_mex.c -output +' basename '/static'])
else
eval(['mex -O LINKEXPORT='''' LINKEXPORTVER='''' ' basename '/model/src/dynamic.c ' basename '/model/src/dynamic_mex.c -output +' basename '/dynamic'])
eval(['mex -O LINKEXPORT='''' LINKEXPORTVER='''' ' basename '/model/src/static.c ' basename '/model/src/static_mex.c -output +' basename '/static'])
end
end
else
% Octave
eval(['mex ' basename '/model/src/dynamic.c ' basename '/model/src/dynamic_mex.c -o +' basename '/dynamic'])
eval(['mex ' basename '/model/src/static.c ' basename '/model/src/static_mex.c -o +' basename '/static'])
end
Subproject commit 1c33af4844557f9a5ce95a1ab6f3e293006c0811
Subproject commit 4a974bb428d3960aface3e1760b33e169c7c733a
......@@ -54,7 +54,7 @@ Section "Dynare core (preprocessor and M-files)"
SectionIn RO
!insertmacro DETERMINE_CONTEXT
SetOutPath $INSTDIR
File README.txt ..\NEWS mexopts-win32.bat mexopts-win64.bat ..\license.txt ..\VERSION
File README.txt ..\NEWS ..\license.txt ..\VERSION
SetOutPath $INSTDIR\matlab
File /r ..\matlab\*.m
......@@ -124,6 +124,20 @@ SectionEnd
SectionGroupEnd
SectionGroup "MinGW compiler (needed for use_dll option under MATLAB)"
Section "MinGW for 32-bit MATLAB"
SetOutPath $INSTDIR\mingw32
File /r mingw32\*
SectionEnd
Section "MinGW for 64-bit MATLAB"
SetOutPath $INSTDIR\mingw64
File /r mingw64\*
SectionEnd
SectionGroupEnd
Section "Dynare++ (standalone executable)"
SetOutPath $INSTDIR\dynare++
File ..\dynare++\src\dynare++.exe ..\dynare++\extern\matlab\dynare_simul.m ..\dynare++\*.dll
......@@ -159,8 +173,6 @@ Section "Uninstall"
Delete $INSTDIR\README.txt
Delete $INSTDIR\NEWS
Delete $INSTDIR\license.txt
Delete $INSTDIR\mexopts-win32.bat
Delete $INSTDIR\mexopts-win64.bat
Delete $INSTDIR\VERSION
Rmdir /r $INSTDIR\matlab
Rmdir /r $INSTDIR\contrib
......@@ -169,6 +181,8 @@ Section "Uninstall"
Rmdir /r $INSTDIR\doc
Rmdir /r $INSTDIR\examples
Rmdir /r $INSTDIR\scripts
Rmdir /r $INSTDIR\mingw32
Rmdir /r $INSTDIR\mingw64
# We don't force deletion of installation directory (with /r), to avoid deleting important files
Rmdir $INSTDIR
......
@echo off
rem Compile and link options used for building MEX-files using Cygwin,
rem for the 32-bit version of MATLAB.
rem
rem It makes the assumption that you installed Cygwin in C:\CYGWIN,
rem and that you installed either the "mingw64-i686-gcc" package.
rem
rem This file should be renamed to "mexopts.bat" and copied to:
rem C:\Documents and Settings\<Username>\Application Data\MathWorks\MATLAB\<MATLAB version>\
rem
rem This file only supports C code. It can easily be changed to compile C++
rem code by replacing "gcc" by "g++" in COMPILER and LINKER, and by adding
rem "-static-libstdc++" to LINKFLAGS.
rem You will also need the "mingw64-i686-gcc-g++" package.
rem
rem Initial version by Michel Juillard, revised by Sebastien Villemot.
rem Copyright (C) 2009-2013 Dynare Team
rem
rem This file is part of Dynare.
rem
rem Dynare is free software: you can redistribute it and/or modify
rem it under the terms of the GNU General Public License as published by
rem the Free Software Foundation, either version 3 of the License, or
rem (at your option) any later version.
rem
rem Dynare is distributed in the hope that it will be useful,
rem but WITHOUT ANY WARRANTY; without even the implied warranty of
rem MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
rem GNU General Public License for more details.
rem
rem You should have received a copy of the GNU General Public License
rem along with Dynare. If not, see <http://www.gnu.org/licenses/>.
rem ********************************************************************
rem General parameters
rem ********************************************************************
set MATLAB=%MATLAB%
set PATH=%PATH%;c:\cygwin\bin
set MW_TARGET_ARCH=win32
rem ********************************************************************
rem Compiler parameters
rem ********************************************************************
set COMPILER=i686-w64-mingw32-gcc
set COMPFLAGS=-c -fexceptions
set OPTIMFLAGS=-O3
set DEBUGFLAGS=-g -Wall
set NAME_OBJECT=-o
rem ********************************************************************
rem Linker parameters
rem ********************************************************************
set PRELINK_CMDS1=echo EXPORTS > mex.def & echo mexFunction >> mex.def
set LIBLOC=%MATLAB%\bin\win32\
set LINKER=i686-w64-mingw32-gcc
set LINKFLAGS= -static-libgcc -shared mex.def "-L%LIBLOC%"
set LINKFLAGSPOST= -lmex -lmx -lmwlapack -lmwblas
set LINKOPTIMFLAGS=-O3
set LINKDEBUGFLAGS= -g -Wall
set LINK_FILE=
set LINK_LIB=
set NAME_OUTPUT=-o "%OUTDIR%%MEX_NAME%%MEX_EXT%"
set RSP_FILE_INDICATOR=@
set POSTLINK_CMDS1=del mex.def
@echo off
rem Compile and link options used for building MEX-files using Cygwin,
rem for the 64-bit version of MATLAB.
rem
rem It makes the assumption that you installed Cygwin in C:\CYGWIN,
rem and that you installed either the "mingw64-x86_64-gcc" package.
rem
rem This file should be renamed to "mexopts.bat" and copied to:
rem C:\Documents and Settings\<Username>\Application Data\MathWorks\MATLAB\<MATLAB version>\
rem
rem This file only supports C code. It can easily be changed to compile C++
rem code by replacing "gcc" by "g++" in COMPILER and LINKER, and by adding
rem "-static-libstdc++" to LINKFLAGS.
rem You will also need the "mingw64-x86_64-gcc-g++" package.
rem
rem Initial version by Michel Juillard, revised by Sebastien Villemot.
rem Copyright (C) 2009-2013 Dynare Team
rem
rem This file is part of Dynare.
rem
rem Dynare is free software: you can redistribute it and/or modify
rem it under the terms of the GNU General Public License as published by
rem the Free Software Foundation, either version 3 of the License, or
rem (at your option) any later version.
rem
rem Dynare is distributed in the hope that it will be useful,
rem but WITHOUT ANY WARRANTY; without even the implied warranty of
rem MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
rem GNU General Public License for more details.
rem
rem You should have received a copy of the GNU General Public License
rem along with Dynare. If not, see <http://www.gnu.org/licenses/>.
rem ********************************************************************
rem General parameters
rem ********************************************************************
set MATLAB=%MATLAB%
set PATH=%PATH%;c:\cygwin\bin
set MW_TARGET_ARCH=win64
rem ********************************************************************
rem Compiler parameters
rem ********************************************************************
set COMPILER=x86_64-w64-mingw32-gcc
set COMPFLAGS=-c -fexceptions
set OPTIMFLAGS=-O3
set DEBUGFLAGS=-g -Wall
set NAME_OBJECT=-o
rem ********************************************************************
rem Linker parameters
rem ********************************************************************
set PRELINK_CMDS1=echo EXPORTS > mex.def & echo mexFunction >> mex.def
set LIBLOC=%MATLAB%\bin\win64\
set LINKER=x86_64-w64-mingw32-gcc
set LINKFLAGS= -static-libgcc -shared mex.def "-L%LIBLOC%"
set LINKFLAGSPOST= -lmex -lmx -lmwlapack -lmwblas
set LINKOPTIMFLAGS=-O3
set LINKDEBUGFLAGS= -g -Wall
set LINK_FILE=
set LINK_LIB=
set NAME_OUTPUT=-o "%OUTDIR%%MEX_NAME%%MEX_EXT%"
set RSP_FILE_INDICATOR=@
set POSTLINK_CMDS1=del mex.def
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment