More fixes for Mingw+MSYS and DLL support

View: New views
2 Messages — Rating Filter:   Alert me  

More fixes for Mingw+MSYS and DLL support

by carlo.bramix :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Hello.
I attached a patch to this message with some fixes that I would like to suggest.

* configure.ac: Added AC_LIBTOOL_WIN32_DLL for enabling the creation of shared libraries.
* configure.ac: Added -I$(top_srcdir)/include to LIBCDIO_CFLAGS, it allows to build outside the source tree.
* configure.ac: Added LT_NO_UNDEFINED for adding '-no-undefined' switch to libtool when building win32 shared libraries.
* configure.ac: Check for Windows.h presence if under Mingw (included for using Sleep() function).
* configure.ac: Check for more missing functions: setenv(), unsetenv(), sleep(), gmtime_r(), localtime_r().

* example/cdchange.c: If sleep() function does not exist, it tries to emulate it with a similar code (require inclusion of Windows.h)

* src/cddb.c:
* lib/cdda_interface/scsi_interface.c: Compilation fails because u_int32_t is undefined. It has been changed to uint32_t to be compliant to all other parts of the libraries.

* lib/cdda_interface/Makefile.am:
* lib/iso9660/Makefile.am:
* lib/cdio++/Makefile.am:
* lib/paranoia/Makefile.am:
* lib/udf/Makefile.am:
* lib/driver/Makefile.am: added LT_NO_UNDEFINED to libtool flags.

* lib/iso9660/iso9660.c: Added replacements for setenv(), unsetenv(), gmtime_r(), localtime_r().

Sincerely,

Carlo Bramini.


diff -r -u libcdio/configure.ac libcdio-new/configure.ac
--- libcdio/configure.ac Thu Jun 19 13:41:40 2008
+++ libcdio-new/configure.ac Tue Jun 24 11:09:21 2008
@@ -355,6 +355,9 @@
 fi
 dnl
 
+dnl Enable the creation of shared libraries under Win32.
+AC_LIBTOOL_WIN32_DLL
+
 dnl AM_PROG_LIBTOOL tests whether we have GNU ld
 dnl this must come before checking --with-versioned-libs
 dnl which requires GNU ld.
@@ -406,7 +409,7 @@
 dnl Checks for header files.
     
 LIBCDIO_CDDA_LIBS='$(top_builddir)/lib/cdda_interface/libcdio_cdda.la'
-LIBCDIO_CFLAGS='-I$(top_srcdir)/lib/driver -I$(top_srcdir)/include/'
+LIBCDIO_CFLAGS='-I$(top_srcdir)/lib/driver -I$(top_builddir)/include -I$(top_srcdir)/include/'
 LIBCDIO_LIBS='$(top_builddir)/lib/driver/libcdio.la'
 LIBCDIO_DEPS="$LIBCDIO_LIBS"
 LIBCDIOPP_LIBS='$(top_builddir)/lib/cdio++/libcdio++.la'
@@ -427,6 +430,9 @@
 AC_SUBST(LIBISO9660_LIBS)
 AC_SUBST(LIBUDF_LIBS)
 
+dnl Libtool flag for strict linkage
+LT_NO_UNDEFINED=
+
 case $host_os in
      aix*)
        ## Don't use AIX driver until starts to really work
@@ -502,11 +508,13 @@
    defined as a variable. In cygwin it is a function too])
  ;;
      mingw*)
+ AC_CHECK_HEADERS(windows.h)
  AC_DEFINE([MINGW32], [1],
                   [Define 1 if you are compiling using MinGW])
      AC_DEFINE([HAVE_WIN32_CDROM], [1],
                   [Define 1 if you have MinGW CD-ROM support])
  LIBS="$LIBS -lwinmm -mwindows"
+ LT_NO_UNDEFINED="-no-undefined"
    cd_drivers="${cd_drivers}, MinGW "
  ;;
      freebsd4.*|freebsd5.*|freebsd6*|freebsd7*|dragonfly*|kfreebsd*)
@@ -527,6 +535,8 @@
  ;;
 esac
 
+AC_SUBST(LT_NO_UNDEFINED)
+
 AC_MSG_CHECKING(extern long timezone variable)
 AC_LINK_IFELSE([
 #ifdef NEED_TIMEZONEVAR
@@ -561,7 +571,8 @@
 
 AC_CHECK_FUNCS( [bzero drand48 ftruncate geteuid getgid \
  getuid getpwuid gettimeofday lstat memcpy memset \
- rand seteuid setegid snprintf  tzset vsnprintf readlink] )
+ rand seteuid setegid snprintf setenv unsetenv tzset \
+ sleep vsnprintf readlink gmtime_r localtime_r] )
 
 # check for timegm() support
 AC_CHECK_FUNC(timegm, AC_DEFINE(HAVE_TIMEGM,1,
diff -r -u libcdio/example/cdchange.c libcdio-new/example/cdchange.c
--- libcdio/example/cdchange.c Mon Mar 24 15:30:55 2008
+++ libcdio-new/example/cdchange.c Tue Jun 24 11:11:44 2008
@@ -38,6 +38,22 @@
 #ifdef HAVE_ERRNO_H
 # include <errno.h>
 #endif
+
+#ifdef HAVE_WINDOWS_H
+# include <windows.h>
+#endif
+
+#ifndef HAVE_SLEEP
+static void
+sleep(unsigned int ms)
+{
+#if defined(_WIN32)
+    Sleep(ms);
+#else
+#error sleep() unimplemented
+#endif
+}
+#endif
 
 #include <cdio/cdio.h>
 int
diff -r -u libcdio/lib/cdda_interface/Makefile.am libcdio-new/lib/cdda_interface/Makefile.am
--- libcdio/lib/cdda_interface/Makefile.am Fri Jun 13 19:26:22 2008
+++ libcdio-new/lib/cdda_interface/Makefile.am Tue Jun 24 10:30:35 2008
@@ -57,7 +57,7 @@
 lib_LTLIBRARIES = libcdio_cdda.la
 
 libcdio_cdda_la_SOURCES = $(libcdio_cdda_sources)
-libcdio_cdda_la_ldflags = -version-info $(libcdio_cdda_la_CURRENT):$(libcdio_cdda_la_REVISION):$(libcdio_cdda_la_AGE)
+libcdio_cdda_la_ldflags = -version-info $(libcdio_cdda_la_CURRENT):$(libcdio_cdda_la_REVISION):$(libcdio_cdda_la_AGE) @LT_NO_UNDEFINED@
 
 INCLUDES = $(LIBCDIO_CFLAGS)
 
diff -r -u libcdio/lib/cdda_interface/scsi_interface.c libcdio-new/lib/cdda_interface/scsi_interface.c
--- libcdio/lib/cdda_interface/scsi_interface.c Fri Jun 13 19:26:23 2008
+++ libcdio-new/lib/cdda_interface/scsi_interface.c Tue Jun 24 10:16:12 2008
@@ -575,7 +575,7 @@
 static int
 scsi_read_toc2 (cdrom_drive_t *d)
 {
-  u_int32_t foo,bar;
+  uint32_t foo,bar;
 
   int i;
   track_t i_tracks;
diff -r -u libcdio/lib/cdio++/Makefile.am libcdio-new/lib/cdio++/Makefile.am
--- libcdio/lib/cdio++/Makefile.am Thu Mar 20 19:02:38 2008
+++ libcdio-new/lib/cdio++/Makefile.am Tue Jun 24 09:45:13 2008
@@ -50,7 +50,7 @@
 libcdiopp_sources = cdio.cpp devices.cpp
 
 libcdio___la_SOURCES = $(libcdiopp_sources)
-libcdio___la_ldflags = -version-info $(libcdiopp_la_CURRENT):$(libcdiopp_la_REVISION):$(libcdiopp_la_AGE)
+libcdio___la_ldflags = -version-info $(libcdiopp_la_CURRENT):$(libcdiopp_la_REVISION):$(libcdiopp_la_AGE) @LT_NO_UNDEFINED@
 
 libiso9660pp_la_CURRENT = 0
 libiso9660pp_la_REVISION = 0
@@ -59,6 +59,6 @@
 libiso9660pp_sources = iso9660.cpp
 
 libiso9660___la_SOURCES = $(libiso9660pp_sources)
-libiso9660___la_ldflags = -version-info $(libiso9660pp_la_CURRENT):$(libiso9660pp_la_REVISION):$(libiso9660pp_la_AGE)
+libiso9660___la_ldflags = -version-info $(libiso9660pp_la_CURRENT):$(libiso9660pp_la_REVISION):$(libiso9660pp_la_AGE) @LT_NO_UNDEFINED@
 
-INCLUDES = -I$(top_srcdir)/include/
+INCLUDES = -I$(top_srcdir)/include/ -I$(top_builddir)/include
diff -r -u libcdio/lib/driver/Makefile.am libcdio-new/lib/driver/Makefile.am
--- libcdio/lib/driver/Makefile.am Thu Mar 27 17:40:50 2008
+++ libcdio-new/lib/driver/Makefile.am Tue Jun 24 08:08:43 2008
@@ -101,7 +101,7 @@
 libcdio_la_LIBADD  = @LIBICONV@
 
 libcdio_la_SOURCES = $(libcdio_sources)
-libcdio_la_ldflags = -version-info $(libcdio_la_CURRENT):$(libcdio_la_REVISION):$(libcdio_la_AGE)
+libcdio_la_ldflags = -version-info $(libcdio_la_CURRENT):$(libcdio_la_REVISION):$(libcdio_la_AGE) @LT_NO_UNDEFINED@
 
 INCLUDES = $(LIBCDIO_CFLAGS)
 
diff -r -u libcdio/lib/iso9660/Makefile.am libcdio-new/lib/iso9660/Makefile.am
--- libcdio/lib/iso9660/Makefile.am Thu Mar 20 19:02:38 2008
+++ libcdio-new/lib/iso9660/Makefile.am Tue Jun 24 08:46:10 2008
@@ -66,7 +66,7 @@
  xa.c
 
 libiso9660_la_LIBADD = @LIBCDIO_LIBS@
-libiso9660_la_ldflags = -version-info $(libiso9660_la_CURRENT):$(libiso9660_la_REVISION):$(libiso9660_la_AGE)
+libiso9660_la_ldflags = -version-info $(libiso9660_la_CURRENT):$(libiso9660_la_REVISION):$(libiso9660_la_AGE) @LT_NO_UNDEFINED@
 libiso9660_la_dependencies = libcdio.la
 
 INCLUDES = $(LIBCDIO_CFLAGS)
diff -r -u libcdio/lib/iso9660/iso9660.c libcdio-new/lib/iso9660/iso9660.c
--- libcdio/lib/iso9660/iso9660.c Tue Jun  3 08:40:15 2008
+++ libcdio-new/lib/iso9660/iso9660.c Tue Jun 24 09:36:45 2008
@@ -57,6 +57,22 @@
 #include <errno.h>
 #endif
 
+#ifndef HAVE_SETENV
+static int
+setenv(const char *envname, const char *envval, int overwrite)
+{
+  return -1;
+}
+#endif
+
+#ifndef HAVE_UNSETENV
+static int
+unsetenv(const char *envname)
+{
+  return -1;
+}
+#endif
+
 #ifndef HAVE_TIMEGM
 static time_t
 timegm(struct tm *tm)
@@ -76,7 +92,35 @@
   return ret;
 }
 #endif
+
+#ifndef HAVE_GMTIME_R
+static struct tm *
+gmtime_r(const time_t *timer, struct tm *result)
+{
+    struct tm *tmp = gmtime(timer);
+
+    if (tmp) {
+        *result = *tmp;
+        return result;
+    }
+    return tmp;
+}
+#endif
 
+#ifndef HAVE_LOCALTIME_R
+static struct tm *
+localtime_r(const time_t *timer, struct tm *result)
+{
+    struct tm *tmp = localtime(timer);
+
+    if (tmp) {
+        *result = *tmp;
+        return result;
+    }
+    return tmp;
+}
+#endif
+
 static const char _rcsid[] = "$Id: iso9660.c,v 1.40 2008/06/03 08:40:15 rocky Exp $";
 
 /* Variables to hold debugger-helping enumerations */
diff -r -u libcdio/lib/paranoia/Makefile.am libcdio-new/lib/paranoia/Makefile.am
--- libcdio/lib/paranoia/Makefile.am Thu Mar 20 19:02:38 2008
+++ libcdio-new/lib/paranoia/Makefile.am Tue Jun 24 09:42:53 2008
@@ -56,7 +56,7 @@
 lib_LTLIBRARIES = libcdio_paranoia.la
 
 libcdio_paranoia_la_SOURCES = $(libcdio_paranoia_sources)
-libcdio_paranoia_la_ldflags = -version-info $(libcdio_paranoia_la_CURRENT):$(libcdio_paranoia_la_REVISION):$(libcdio_paranoia_la_AGE)
+libcdio_paranoia_la_ldflags = -version-info $(libcdio_paranoia_la_CURRENT):$(libcdio_paranoia_la_REVISION):$(libcdio_paranoia_la_AGE) @LT_NO_UNDEFINED@
 
 INCLUDES = $(LIBCDIO_CFLAGS)
 
diff -r -u libcdio/lib/udf/Makefile.am libcdio-new/lib/udf/Makefile.am
--- libcdio/lib/udf/Makefile.am Thu Mar 20 19:02:38 2008
+++ libcdio-new/lib/udf/Makefile.am Tue Jun 24 09:42:03 2008
@@ -53,6 +53,6 @@
 
 libudf_la_SOURCES = udf.c udf_file.c udf_fs.c udf_time.c filemode.c
 
-libudf_la_LIBADD = @LIBCDIO_LIBS@
+libudf_la_LIBADD = @LIBCDIO_LIBS@ @LT_NO_UNDEFINED@
 
 INCLUDES = $(LIBCDIO_CFLAGS)
diff -r -u libcdio/src/cddb.c libcdio-new/src/cddb.c
--- libcdio/src/cddb.c Mon Apr 14 17:30:27 2008
+++ libcdio-new/src/cddb.c Tue Jun 24 10:15:27 2008
@@ -47,7 +47,7 @@
       the total length of the disk, and
       the number of tracks.
 */
-u_int32_t
+uint32_t
 cddb_discid(CdIo_t *p_cdio, track_t i_tracks)
 {
   int i,t,n=0;
diff -r -u libcdio/src/cddb.h libcdio-new/src/cddb.h
--- libcdio/src/cddb.h Mon Apr 14 17:30:27 2008
+++ libcdio-new/src/cddb.h Tue Jun 24 10:13:50 2008
@@ -37,7 +37,7 @@
       the total length of the disk, and
       the number of tracks.
 */
-u_int32_t cddb_discid(CdIo_t *p_cdio, track_t i_tracks);
+uint32_t cddb_discid(CdIo_t *p_cdio, track_t i_tracks);
 
 #ifdef HAVE_CDDB
 #include <cddb/cddb.h>


More fixes for Mingw+MSYS and DLL support

by R. Bernstein :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

Thank you for your thorough fixes, patch and ChangeLog entry. Your patch
has been applied in CVS and should be part of the next release.

carlo\.bramix reports:
 > Hello.
 > I attached a patch to this message with some fixes ...