Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
ApplicationInfo.cc
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* ApplicationInfo.cc (C) 2000-2020 */
9/* */
10/* Informations sur une application. */
11/*---------------------------------------------------------------------------*/
12/*---------------------------------------------------------------------------*/
13
14#include "arcane/utils/ApplicationInfo.h"
15#include "arcane/utils/String.h"
16#include "arcane/utils/CommandLineArguments.h"
17#include "arcane/utils/PlatformUtils.h"
18#include "arcane/utils/List.h"
19#include "arcane/utils/Property.h"
20
21/*---------------------------------------------------------------------------*/
22/*---------------------------------------------------------------------------*/
23
24namespace Arcane
25{
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
31{
32 public:
34 const VersionInfo& version)
35 : m_command_line_args(args), m_version(version), m_is_debug(false), m_application_name(name)
36 {
37 }
38 public:
39 CommandLineArguments m_command_line_args;
40 VersionInfo m_version; //!< Numéro de version
41 bool m_is_debug; //!< \a true s'il s'agit d'une version debug.
42 String m_version_date; //!< Date de la version.
43 String m_application_name; //!< Nom de l'application
44 String m_code_name; //!< Nom du code
45 String m_target_full_name; //!< Nom complet de la cible
46 String m_osname; //!< Nom de l'OS
47 String m_data_os_dir; //!< Répertoire des fichiers config dépendant OS
48 String m_data_dir; //!< Répertoire des fichiers de config communs
49 StringList m_args;
50 StringList m_dynamic_libraries_name;
51 UniqueArray<std::byte> m_runtime_config_file_content;
52};
53
54/*---------------------------------------------------------------------------*/
55/*---------------------------------------------------------------------------*/
56
57ApplicationInfo::
58ApplicationInfo()
59: m_argc(nullptr)
60, m_argv(nullptr)
62{
63 _init("Arcane");
64}
65
66/*---------------------------------------------------------------------------*/
67/*---------------------------------------------------------------------------*/
68
69ApplicationInfo::
70ApplicationInfo(int* argc,char*** argv,const String& name,const VersionInfo& aversion)
71: m_argc(nullptr)
72, m_argv(nullptr)
73, m_p(new ApplicationInfoPrivate(CommandLineArguments(argc,argv),name,aversion))
74{
75 _init(name);
76}
77
78/*---------------------------------------------------------------------------*/
79/*---------------------------------------------------------------------------*/
80
81ApplicationInfo::
82ApplicationInfo(const StringList& aargs,const String& name,
83 const VersionInfo& aversion)
84: m_argc(nullptr)
85, m_argv(nullptr)
86, m_p(new ApplicationInfoPrivate(CommandLineArguments(aargs),name,aversion))
87{
88 _init(name);
89}
90
91/*---------------------------------------------------------------------------*/
92/*---------------------------------------------------------------------------*/
93
94ApplicationInfo::
95ApplicationInfo(const CommandLineArguments& aargs,const String& name,
96 const VersionInfo& aversion)
97: m_argc(nullptr)
98, m_argv(nullptr)
99, m_p(new ApplicationInfoPrivate(aargs,name,aversion))
100{
101 _init(name);
102}
103
104/*---------------------------------------------------------------------------*/
105/*---------------------------------------------------------------------------*/
106
107ApplicationInfo::
108ApplicationInfo(const ApplicationInfo& rhs)
109: m_argc(nullptr)
110, m_argv(nullptr)
111, m_p(new ApplicationInfoPrivate(*rhs.m_p))
112{
113 _setArgs();
114}
115
116/*---------------------------------------------------------------------------*/
117/*---------------------------------------------------------------------------*/
118
119ApplicationInfo& ApplicationInfo::
120operator=(const ApplicationInfo& rhs)
121{
122 if (&rhs!=this){
123 auto old_p = m_p;
124 m_p = new ApplicationInfoPrivate(*rhs.m_p);
125 delete old_p;
126 _setArgs();
127 }
128 return *this;
129}
130
131/*---------------------------------------------------------------------------*/
132/*---------------------------------------------------------------------------*/
133
134ApplicationInfo::
135~ApplicationInfo()
136{
137 delete m_p;
138}
139
140/*---------------------------------------------------------------------------*/
141/*---------------------------------------------------------------------------*/
142
143void ApplicationInfo::
144_setArgs()
145{
146 m_argc = m_p->m_command_line_args.commandLineArgc();
147 m_argv = m_p->m_command_line_args.commandLineArgv();
148}
149
150/*---------------------------------------------------------------------------*/
151/*---------------------------------------------------------------------------*/
152
153void ApplicationInfo::
154_init(const String& name)
155{
156 _setArgs();
157
158 m_p->m_version_date = "0";
159 m_p->m_data_os_dir = String();
160 m_p->m_data_dir = String();
161
162 {
163 String s = platform::getEnvironmentVariable("ARCANE_USER_CONFIG_FILE_NAME");
164 if (!s.null())
165 m_p->m_code_name = s;
166 else
167 m_p->m_code_name = name;
168 }
169
170 {
171 String s = platform::getEnvironmentVariable("ARCANE_SHARE_PATH");
172 if (!s.null())
173 m_p->m_data_dir = s;
174 else{
175 s = platform::getEnvironmentVariable("STDENV_PATH_SHR");
176 if (!s.null())
177 m_p->m_data_dir = s;
178 }
179 }
180 {
181 String s = platform::getEnvironmentVariable("ARCANE_LIB_PATH");
182 if (!s.null())
183 m_p->m_data_os_dir = s;
184 else{
185 String s = platform::getEnvironmentVariable("STDENV_PATH_LIB");
186 if (!s.null())
187 m_p->m_data_os_dir = s;
188 }
189 }
190
191 if (dataDir().null() || dataOsDir().null()){
192 // Considère que les infos partagées et les libs sont
193 // au même endroit qui est celui de l'exécutable.
194 String exe_full_path = platform::getExeFullPath();
195 String exe_path = platform::getFileDirName(exe_full_path);
196 if (dataDir().null())
197 setDataDir(exe_path);
198 if (dataOsDir().null())
199 setDataOsDir(exe_path);
200 }
201
202 m_p->m_target_full_name = "TargetUnknown";
203
204#ifdef ARCANE_DEBUG
205 m_p->m_is_debug = true;
206#else
207 m_p->m_is_debug = false;
208#endif
209}
210
211/*---------------------------------------------------------------------------*/
212/*---------------------------------------------------------------------------*/
213
215applicationName() const
216{
217 return m_p->m_application_name;
218}
219
220/*---------------------------------------------------------------------------*/
221/*---------------------------------------------------------------------------*/
222
224codeVersion() const
225{
226 return m_p->m_version;
227}
228
229/*---------------------------------------------------------------------------*/
230/*---------------------------------------------------------------------------*/
231
233dataOsDir() const
234{
235 return m_p->m_data_os_dir;
236}
237
239setDataOsDir(const String& v)
240{
241 m_p->m_data_os_dir = v;
242}
243
244/*---------------------------------------------------------------------------*/
245/*---------------------------------------------------------------------------*/
246
248dataDir() const
249{
250 return m_p->m_data_dir;
251}
252
253/*---------------------------------------------------------------------------*/
254/*---------------------------------------------------------------------------*/
255
257setDataDir(const String& v)
258{
259 m_p->m_data_dir = v;
260}
261
262/*---------------------------------------------------------------------------*/
263/*---------------------------------------------------------------------------*/
264
266versionMajor() const
267{
268 return m_p->m_version.versionMajor();
269}
270
271/*---------------------------------------------------------------------------*/
272/*---------------------------------------------------------------------------*/
273
275versionMinor() const
276{
277 return m_p->m_version.versionMinor();
278}
279
280/*---------------------------------------------------------------------------*/
281/*---------------------------------------------------------------------------*/
282
284versionPatch() const
285{
286 return m_p->m_version.versionPatch();
287}
288
289/*---------------------------------------------------------------------------*/
290/*---------------------------------------------------------------------------*/
291
293isDebug() const
294{
295 return m_p->m_is_debug;
296}
297
298/*---------------------------------------------------------------------------*/
299/*---------------------------------------------------------------------------*/
300
302codeName() const
303{
304 return m_p->m_code_name;
305}
306
307/*---------------------------------------------------------------------------*/
308/*---------------------------------------------------------------------------*/
309
311targetFullName() const
312{
313 return m_p->m_target_full_name;
314}
315
316/*---------------------------------------------------------------------------*/
317/*---------------------------------------------------------------------------*/
318
319int* ApplicationInfo::
320commandLineArgc() const
321{
322 return m_argc;
323}
324
325/*---------------------------------------------------------------------------*/
326/*---------------------------------------------------------------------------*/
327
328char*** ApplicationInfo::
329commandLineArgv() const
330{
331 return m_argv;
332}
333
334/*---------------------------------------------------------------------------*/
335/*---------------------------------------------------------------------------*/
336
338args(StringList& aargs) const
339{
340 m_p->m_command_line_args.fillArgs(aargs);
341}
342
343/*---------------------------------------------------------------------------*/
344/*---------------------------------------------------------------------------*/
345
347addDynamicLibrary(const String& lib_name)
348{
349 m_p->m_dynamic_libraries_name.add(lib_name);
350}
351
352/*---------------------------------------------------------------------------*/
353/*---------------------------------------------------------------------------*/
354
357{
358 return m_p->m_dynamic_libraries_name;
359}
360
361/*---------------------------------------------------------------------------*/
362/*---------------------------------------------------------------------------*/
363
366{
367 return m_p->m_command_line_args;
368}
369
370/*---------------------------------------------------------------------------*/
371/*---------------------------------------------------------------------------*/
372
375{
376 m_p->m_application_name = v;
377}
378
379/*---------------------------------------------------------------------------*/
380/*---------------------------------------------------------------------------*/
381
383setCodeVersion(const VersionInfo& version)
384{
385 m_p->m_version = version;
386}
387
388/*---------------------------------------------------------------------------*/
389/*---------------------------------------------------------------------------*/
390
392setCodeName(const String& code_name)
393{
394 m_p->m_code_name = code_name;
395}
396
397/*---------------------------------------------------------------------------*/
398/*---------------------------------------------------------------------------*/
399
402{
403 m_p->m_command_line_args = aargs;
404 _setArgs();
405}
406
407/*---------------------------------------------------------------------------*/
408/*---------------------------------------------------------------------------*/
409
411setIsDebug(bool v)
412{
413 m_p->m_is_debug = v;
414}
415
416/*---------------------------------------------------------------------------*/
417/*---------------------------------------------------------------------------*/
418
421{
422 m_p->m_runtime_config_file_content = content;
423}
424
425/*---------------------------------------------------------------------------*/
426/*---------------------------------------------------------------------------*/
427
430{
431 return m_p->m_runtime_config_file_content;
432}
433
434/*---------------------------------------------------------------------------*/
435/*---------------------------------------------------------------------------*/
436
438addParameterLine(const String& line)
439{
440 m_p->m_command_line_args.addParameterLine(line);
441}
442
443/*---------------------------------------------------------------------------*/
444/*---------------------------------------------------------------------------*/
445
446template<typename V> void ApplicationInfo::
447_applyPropertyVisitor(V& p)
448{
449 auto b = p.builder();
450
451 p << b.addString("CodeName")
452 .addDescription("Name of the code")
453 .addGetter([](auto a) { return a.x.codeName(); })
454 .addSetter([](auto a) { a.x.setCodeName(a.v); });
455
456 p << b.addString("DataDir")
457 .addDescription("Directory containing os independant files")
458 .addGetter([](auto a) { return a.x.dataDir(); })
459 .addSetter([](auto a) { a.x.setDataDir(a.v); });
460
461 p << b.addString("DataOsDir")
462 .addDescription("Directory containing os dependant files")
463 .addGetter([](auto a) { return a.x.dataOsDir(); })
464 .addSetter([](auto a) { a.x.setDataOsDir(a.v); });
465
466 p << b.addBool("Debug")
467 .addDescription("Indicate if debug mode is active")
468 .addGetter([](auto a) { return a.x.isDebug(); })
469 .addSetter([](auto a) { a.x.setIsDebug(a.v); });
470
471 p << b.addString("CodeVersion")
472 .addDescription("Version (x.y.z) of the code")
473 .addSetter([](auto a) { a.x.setCodeVersion(VersionInfo(a.v)); })
474 .addGetter([](auto a) { return a.x.codeVersion().versionAsString(); });
475
476 p << b.addStringList("DynamicLibraries")
477 .addDescription("Dynamic libraries to load at startup")
478 .addSetter([](auto a)
479 {
480 for(String s : a.v)
481 a.x.addDynamicLibrary(s);
482 })
483 .addGetter([](auto a) { return a.x.dynamicLibrariesName(); });
484}
485
486/*---------------------------------------------------------------------------*/
487/*---------------------------------------------------------------------------*/
488
489ARCANE_REGISTER_PROPERTY_CLASS(ApplicationInfo,());
490
491/*---------------------------------------------------------------------------*/
492/*---------------------------------------------------------------------------*/
493
494} // End namespace Arcane
495
496/*---------------------------------------------------------------------------*/
497/*---------------------------------------------------------------------------*/
498
String m_target_full_name
Nom complet de la cible.
bool m_is_debug
true s'il s'agit d'une version debug.
String m_data_os_dir
Répertoire des fichiers config dépendant OS.
String m_data_dir
Répertoire des fichiers de config communs.
VersionInfo m_version
Numéro de version.
String m_version_date
Date de la version.
String m_application_name
Nom de l'application.
const String & dataDir() const
Retourne le chemin où se trouve les fichiers de données.
const String & codeName() const
Retourne le nom du code de calcul lié l'application.
void setCommandLineArguments(const CommandLineArguments &args)
Positionne les arguments de la ligne de commande.
int * m_argc
Nombre d'arguments de la ligne de commande.
void addParameterLine(const String &line)
Ajoute un paramètre Arcane à la ligne de commande.
void setCodeVersion(const VersionInfo &version_info)
Positionne le numéro de version.
ByteConstSpan runtimeConfigFileContent() const
Contenu du fichier de configuration de l'application.
void setDataDir(const String &v)
Positionne le chemin où se trouve les fichiers de données.
void setIsDebug(bool v)
Positionne l'état de débug.
const String & applicationName() const
Nom de l'application.
void addDynamicLibrary(const String &lib_name)
Ajoute la bibliothèque lib_name à la liste des bibliothèques chargées dynamiquements.
int versionMajor() const
Retourne le numéro de version majeure de l'application.
int versionMinor() const
Retourne le numéro de version mineure de l'application.
const String & targetFullName() const
Retourne le nom complet de la cible.
const CommandLineArguments & commandLineArguments() const
Arguments de la ligne de commande.
void args(StringList &args) const
Remplit args avec les arguments de la ligne de commande.
const VersionInfo & codeVersion() const
Numéro de version.
const VersionInfo & version() const
Numéro de version.
char *** m_argv
Tableau des arguments de la ligne de commande.
int versionPatch() const
Retourne le numéro de version patch de l'application.
void setApplicationName(const String &v)
Positionne le nom de l'application.
bool isDebug() const
Retourne true si on s'exécute en mode debug.
void setRuntimeConfigFileContent(ByteConstSpan content)
Positionne le contenu du fichier de configuration de l'application.
const String & dataOsDir() const
Retourne le chemin où se trouve les fichiers de données dépendant de l'OS.
void setDataOsDir(const String &v)
Positionne le chemin où se trouve les fichiers de données dépendant de l'OS.
StringCollection dynamicLibrariesName() const
Liste des bibliothèques dynamiques.
void setCodeName(const String &code_name)
Positionne le nom du code.
Arguments de la ligne de commande.
void addParameterLine(const String &line)
Ajoute un paramètre.
void fillArgs(StringList &args) const
Remplit args avec arguments de la ligne de commande.
Informations sur une version.
Definition VersionInfo.h:46
int versionMajor() const
Retourne le numéro de version majeur.
Definition VersionInfo.h:64
int versionMinor() const
Retourne le numéro de version mineur.
Definition VersionInfo.h:66
int versionPatch() const
Retourne le numéro de version patch.
Definition VersionInfo.h:68
Chaîne de caractères unicode.
Vecteur 1D de données avec sémantique par valeur (style STL).
String getExeFullPath()
Retourne le nom complet avec le chemin de l'exécutable.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
Span< const std::byte > ByteConstSpan
Vue en lecture seule d'un tableau à une dimension de caractères.
Definition UtilsTypes.h:706
List< String > StringList
Tableau de chaînes de caractères unicode.
Definition UtilsTypes.h:667