J’ai récemment déployé une application sur Mac OS X avec le MATLAB Compiler. Elle n’était utilisée jusqu’à présent que sur Windows et Linux.
Cette application contient un outil qui me permet de récupérer certaines caractéristiques de la machine. Je récupère, entres autres, le nom de l’architecture où s’exécute le code, à savoir Windows, Linux ou Mac.
Code initial de récupération de l’architecture
Voici approximativement comment est codé le log :
fid = fopen('bug.log', 'wt');
if ispc
fprintf(fid, 'OS: Windows\n');
elseif isunix
fprintf(fid, 'OS: Linux\n');
else
fprintf(fid, 'OS: Mac\n');
end
fclose(fid);
Or cette façon de procéder est fausse car, avec Mac OS X, le fichier bug.log contient la ligne suivante :
Bizarre, non ?
D’où vient l’erreur ?
Les fonctions ispc, isunix et ismac utilisent en fait la fonction computer qui renvoi l’architecture de la machine sous forme d’une chaine de caractères qui peut être :
- ‘PCWIN’ ou ‘PCWIN64′ pour Windows
- ‘GLNX86′ ou ‘GLNXA64′ pour Linux
- ‘MACI64′ pour Mac
Les trois architectures devraient donc être bien différenciées.
Pourquoi mon implémentation du log ne fonctionne-t-elle pas correctement ?
Étudions les fonctions ispc, isunix et ismac. Vous pouvez visualiser leur code en ouvrant les fichiers ispc.m, ismac.m et isunix.m dans le MATLAB Editor ou dans n’importe quel éditeur de texte.
ispc
Le fonction ispc compare simplement les deux premiers caractères de la chaine renvoyée par la fonction computer. Si ces deux caractères sont ‘PC’ alors la machine tourne sur Windows.
ismac
Sur le même principe, la fonction ismac teste si les trois premiers caractères de la chaine renvoyée par computer sont ‘MAC’. Tout est normal.
isunix
Surprise, la fonction isunix fait simplement l’inverse de la fonction ispc.
Le code de isunix est équivalent à :
Donc pour MATLAB, tout ce qui n’est pas Windows est forcément Linux !
C’est utile à savoir, je corrige donc mon code.
Code corrigé de récupération de l’architecture
La condition ismac doit donc obligatoirement apparaître avant isunix :
fid = fopen('bug.log', 'wt');
if ispc
fprintf(fid, 'OS: Windows\n');
elseif ismac
fprintf(fid, 'OS: Mac\n');
else
fprintf(fid, 'OS: Linux\n');
end
fclose(fid);
Me voila prévenu, et vous aussi !
Dans un prochain billet, je vous expliquerai l’intérêt pour MATLAB d’assimiler Mac à Linux avec isunix (les utilisateurs avertis connaissent déjà sans aucun doute la réponse).