-
-
Notifications
You must be signed in to change notification settings - Fork 2
/
MakeMexWindows.m
171 lines (131 loc) · 6.28 KB
/
MakeMexWindows.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
% ----------------------------------------------------------------------------------------------- %
% MakeMex - Generating Windows x64 MEX File for GLPK
% Generates the MEX file of GLPK for Windows x64 system by downloading GLPK
% 4.65, Unpacking it, Compiling it and Compiling the MEX.
% Reference:
% 1. See https://github.com/blegat/glpkmex.
% Remarks:
% 1. Was verified on computer with MSVC 2017 Professional. For other
% compilers (Community edition or different version) please update
% 'MSVC_xxx_COMMON_TOOLS_PATH'.
% TODO:
% 1. A
% Release Notes:
% - 1.0.002 25/03/2022 Royi Avital
% * Added support for MSVC 2022 on MATLAB R2022a.
% * Added support for GLPK 5.0.
% - 1.0.001 14/08/2020 Royi Avital
% * Fixed a bug with support for MSVC 2019.
% * Set the default compiler to be MSVC 2019.
% - 1.0.000 30/04/2020 Royi Avital
% * First release version.
% ----------------------------------------------------------------------------------------------- %
%% Setting Environment Parameters
close('all');
clear('all');
clc();
FALSE = 0;
TRUE = 1;
OFF = 0;
ON = 1;
FILE_SEP = filesep();
PATH_SEP = pathsep();
MSVC_VERSION_150_PROFESSIONAL = 1; %<! MSVC 2017 Professtional Edition
MSVC_VERSION_150_COMMUNITY = 2; %<! MSVC 2019 Community Edition
MSVC_VERSION_160_PROFESSIONAL = 3; %<! MSVC 2019 Professional Edition
MSVC_VERSION_160_COMMUNITY = 4; %<! MSVC 2019 Community Edition
MSVC_VERSION_170_PROFESSIONAL = 5; %<! MSVC 2022 Professional Edition
MSVC_VERSION_170_COMMUNITY = 6; %<! MSVC 2022 Community Edition
MSVC_150_PROFESSIONAL_COMMON_TOOLS_PATH = 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\Tools\';
MSVC_150_COMMUNITY_COMMON_TOOLS_PATH = 'C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\Tools\';
MSVC_160_PROFESSIONAL_COMMON_TOOLS_PATH = 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\Tools\';
MSVC_160_COMMUNITY_COMMON_TOOLS_PATH = 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Tools\';
MSVC_170_PROFESSIONAL_COMMON_TOOLS_PATH = 'C:\Program Files\Microsoft Visual Studio\2022\Professional\Common7\Tools\';
MSVC_170_COMMUNITY_COMMON_TOOLS_PATH = 'C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\Tools\';
BUILD_BATCH_FILENAME = 'Build_GLPK_MEX.bat';
MEX_API_R2018A = '-R2018a'; %<! Large Arrays (64 Bit Indices), Interleaved Complex Arrays
MEX_API_R2017B = '-R2017b'; %<! Large Arrays (64 Bit Indices), Separate Complex Arrays
MEX_API_LARGE_ARRAY = '-largeArrayDims'; %<! Large Arrays (64 Bit Indices), Separate Complex Arrays (Basically like R2017b)
MEX_API_COMPATIBLE_ARRAY = '-compatibleArrayDims'; %<! 32 Bit Indices, Separate Complex Arrays
GLPK_VERSION_4_65 = 1;
GLPK_VERSION_5_00 = 2;
cGlpkVersion = {['4.65'], ['5.0']};
%% User Settings
glpkVersion = GLPK_VERSION_5_00;
msvcVersion = MSVC_VERSION_170_PROFESSIONAL;
% Requires CPU with AVX2, Might be faster
cCompFlags = ' /MT /O2 /Ob3 /Oi /arch:AVX2 ';
mexCompFlags = ' /MT /O2 /Ob3 /Oi /arch:AVX2 ';
% Use the default
useCompFlags = OFF;
% Add support for arrays larger than ~2^31 elements (MEX_API_R2018A,
% MEX_API_R2018A, MEX_API_LARGE_ARRAY)
mexApi = MEX_API_R2017B;
%% Inner Settings
switch(glpkVersion)
case(GLPK_VERSION_4_65)
glpkString = 'GLPK 4.65';
glpkFileName = 'glpk-4.65.tar.gz';
glpkUrl = 'https://ftp.gnu.org/gnu/glpk/glpk-4.65.tar.gz';
glpkFolder = 'glpk-4.65';
mexFileName = 'glpkcc.cpp';
libFileName = 'glpk.lib';
case(GLPK_VERSION_5_00)
glpkString = 'GLPK 5.00';
glpkFileName = 'glpk-5.0.tar.gz';
glpkUrl = 'https://ftp.gnu.org/gnu/glpk/glpk-5.0.tar.gz';
glpkFolder = 'glpk-5.0';
mexFileName = 'glpkcc.cpp';
libFileName = 'glpk.lib';
end
switch(msvcVersion)
case(MSVC_VERSION_150_PROFESSIONAL)
msvcCommonToolsPath = MSVC_150_PROFESSIONAL_COMMON_TOOLS_PATH;
case(MSVC_VERSION_150_COMMUNITY)
msvcCommonToolsPath = MSVC_150_COMMUNITY_COMMON_TOOLS_PATH;
case(MSVC_VERSION_160_PROFESSIONAL)
msvcCommonToolsPath = MSVC_160_PROFESSIONAL_COMMON_TOOLS_PATH;
case(MSVC_VERSION_160_COMMUNITY)
msvcCommonToolsPath = MSVC_160_COMMUNITY_COMMON_TOOLS_PATH;
case(MSVC_VERSION_170_PROFESSIONAL)
msvcCommonToolsPath = MSVC_170_PROFESSIONAL_COMMON_TOOLS_PATH;
case(MSVC_VERSION_170_COMMUNITY)
msvcCommonToolsPath = MSVC_170_COMMUNITY_COMMON_TOOLS_PATH;
end
glpkWin64BuildFolder = [glpkFolder, FILE_SEP, 'w64', FILE_SEP];
glpkSrcFolder = [glpkFolder, FILE_SEP, 'src', FILE_SEP];
workingFolderPath = [pwd(), FILE_SEP];
%% Downloading Data & Setting Environment
disp(['Downloading ', glpkString, ' from Official Site']);
disp([' ']);
glpkFilePath = websave(glpkFileName, glpkUrl);
disp(['Unpacking the TAR File']);
disp([' ']);
cFileNames = untar(glpkFileName);
copyfile(BUILD_BATCH_FILENAME, glpkWin64BuildFolder);
currFolder = cd(glpkWin64BuildFolder);
%% Compilation
% Compiling the GLPK Library
disp(['Compiling the GLPK Library']);
disp([' ']);
% TODO: Make the Batch File with support for input compiling flags ('cCompFlags')
system(['"', msvcCommonToolsPath, 'vsdevcmd.bat" -arch=x64 && ', BUILD_BATCH_FILENAME]);
cd(currFolder);
if(useCompFlags == ON)
cCompFlags = ['COMPFLAGS="$COMPFLAGS ', mexCompFlags, '"'];
else
cCompFlags = ['COMPFLAGS="$COMPFLAGS"'];
end
includeFolder = ['-I', glpkSrcFolder];
libFolder = ['-L', glpkWin64BuildFolder];
disp(['Compiling the MEX File']);
disp([' ']);
mex('-v', mexApi, cCompFlags, includeFolder, libFolder, mexFileName, libFileName);
% Verify
disp(['Verifying the MEX File: If it shows "MEX interface to GLPK Version ', cGlpkVersion{glpkVersion}, '" all worked!']);
disp([' ']);
glpkcc(); %<! Should display the version
clear('all'); %<! In order to remove the MEX from memory
%% Restore Defaults
% set(0, 'DefaultFigureWindowStyle', 'normal');
% set(0, 'DefaultAxesLooseInset', defaultLoosInset);