Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
pebcak protection: some day, someone will use a different version to compile and...
authorMartin Quinson <martin.quinson@loria.fr>
Thu, 21 Jun 2012 08:00:46 +0000 (10:00 +0200)
committerMartin Quinson <martin.quinson@loria.fr>
Thu, 21 Jun 2012 08:00:55 +0000 (10:00 +0200)
include/simgrid_config.h.in
src/surf/surf.c

index e07f48a..a1b3414 100644 (file)
 SG_BEGIN_DECL()
 
 
 SG_BEGIN_DECL()
 
 
-/* Version X.Y.Z will get version number XYZ: all digits concatenated without dots
- * (with Y and Z must be on two positions)*/
-
-#define MAKE_SIMGRID_VERSION(major, minor, patch)       \
-  (100UL * (100UL * (major) + (minor)) + (patch))
+/** Define the version numbers of the used header files. 
+    sg_version() can be used to retrieve the version of the dynamic library.
+    But actually, if these numbers don't match, SimGrid refuses to start (so you shouldn't have to care about sg_version() yourself) */
 
 #define SIMGRID_VERSION_MAJOR @SIMGRID_VERSION_MAJOR@
 #define SIMGRID_VERSION_MINOR @SIMGRID_VERSION_MINOR@
 #define SIMGRID_VERSION_PATCH @SIMGRID_VERSION_PATCH@
 
 
 #define SIMGRID_VERSION_MAJOR @SIMGRID_VERSION_MAJOR@
 #define SIMGRID_VERSION_MINOR @SIMGRID_VERSION_MINOR@
 #define SIMGRID_VERSION_PATCH @SIMGRID_VERSION_PATCH@
 
+/* Version X.Y.Z will get version number XYZ: all digits concatenated without dots
+ * (with Y and Z must be on two positions)*/
+
+#define MAKE_SIMGRID_VERSION(major, minor, patch)       \
+  (100UL * (100UL * (major) + (minor)) + (patch))
 #define SIMGRID_VERSION MAKE_SIMGRID_VERSION(SIMGRID_VERSION_MAJOR, \
                                              SIMGRID_VERSION_MINOR, \
                                              SIMGRID_VERSION_PATCH)
 
 #define SIMGRID_VERSION MAKE_SIMGRID_VERSION(SIMGRID_VERSION_MAJOR, \
                                              SIMGRID_VERSION_MINOR, \
                                              SIMGRID_VERSION_PATCH)
 
+/** Retrieves the version numbers of the used dynamic library (so, DLL or dynlib) , while
+    SIMGRID_VERSION_MAJOR and friends give the version numbers of the used header files */
+XBT_PUBLIC(void) sg_version(int *major,int *minor,int *patch);
+
+/** Check that the link-time and compile-time versions of SimGrid do match.
+  * There is no need to call it yourself, it's done automatically during the SimGrid initialization */
+#define sg_check_version() {                      \
+  int ver_major,ver_minor,ver_patch;              \
+  sg_version(&ver_major,&ver_minor,&ver_patch);   \
+  if ((ver_major != SIMGRID_VERSION_MAJOR) ||     \
+      (ver_minor != SIMGRID_VERSION_MINOR) ||     \
+      (ver_patch != SIMGRID_VERSION_PATCH)) {     \
+    fprintf(stderr,"FATAL ERROR: Your program was compiled with SimGrid version %d.%d.%d, and then linked against SimGrid %d.%d.%d. Please fix this.\n", \
+        SIMGRID_VERSION_MAJOR,SIMGRID_VERSION_MINOR,SIMGRID_VERSION_PATCH,ver_major,ver_minor,ver_patch);                          \
+  }                                               \
+} 
+  
+
 /* take care of DLL usage madness */
 
 #ifdef _XBT_DLL_EXPORT
 /* take care of DLL usage madness */
 
 #ifdef _XBT_DLL_EXPORT
index d48011e..4847470 100644 (file)
@@ -368,8 +368,18 @@ static XBT_INLINE void routing_asr_host_free(void *p)
   xbt_free(elm);
 }
 
   xbt_free(elm);
 }
 
+void sg_version(int *ver_major,int *ver_minor,int *ver_patch) {
+  *ver_major = SIMGRID_VERSION_MAJOR;
+  *ver_minor = SIMGRID_VERSION_MINOR;
+  *ver_patch = SIMGRID_VERSION_PATCH;
+}
+
 void surf_init(int *argc, char **argv)
 {
 void surf_init(int *argc, char **argv)
 {
+
+  XBT_DEBUG("Check that compile time version matches link-time one");
+  sg_check_version();
+
   XBT_DEBUG("Create all Libs");
   host_lib = xbt_lib_new();
   link_lib = xbt_lib_new();
   XBT_DEBUG("Create all Libs");
   host_lib = xbt_lib_new();
   link_lib = xbt_lib_new();
@@ -377,11 +387,11 @@ void surf_init(int *argc, char **argv)
   storage_lib = xbt_lib_new();
   storage_type_lib = xbt_lib_new();
 
   storage_lib = xbt_lib_new();
   storage_type_lib = xbt_lib_new();
 
-  XBT_DEBUG("ADD ROUTING LEVEL");
+  XBT_DEBUG("Add routing levels");
   ROUTING_HOST_LEVEL = xbt_lib_add_level(host_lib,routing_asr_host_free);
   ROUTING_ASR_LEVEL  = xbt_lib_add_level(as_router_lib,routing_asr_host_free);
 
   ROUTING_HOST_LEVEL = xbt_lib_add_level(host_lib,routing_asr_host_free);
   ROUTING_ASR_LEVEL  = xbt_lib_add_level(as_router_lib,routing_asr_host_free);
 
-  XBT_DEBUG("ADD SURF LEVELS");
+  XBT_DEBUG("Add SURF levels");
   SURF_CPU_LEVEL = xbt_lib_add_level(host_lib,surf_resource_free);
   SURF_WKS_LEVEL = xbt_lib_add_level(host_lib,surf_resource_free);
   SURF_LINK_LEVEL = xbt_lib_add_level(link_lib,surf_resource_free);
   SURF_CPU_LEVEL = xbt_lib_add_level(host_lib,surf_resource_free);
   SURF_WKS_LEVEL = xbt_lib_add_level(host_lib,surf_resource_free);
   SURF_LINK_LEVEL = xbt_lib_add_level(link_lib,surf_resource_free);