# Strftime on Cygwin

**URL:** <https://www.ruby-forum.com/t/strftime-on-cygwin/125352>\
**Category:** Ruby\
**Created:** [January 8, 2008, 2:22pm UTC](https://www.ruby-forum.com/t/strftime-on-cygwin/125352 "2008-01-08T14:22:35Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![Corinna\_Vinschen](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/50afbb/32.png) [@Corinna\_Vinschen](https://www.ruby-forum.com/u/Corinna_Vinschen)\
**Post date:** [January 8, 2008, 2:22pm UTC](https://www.ruby-forum.com/t/strftime-on-cygwin/125352/1 "2008-01-08T14:22:35Z")

</div>

[Please use the NG for replies. Thanks in advance.]

Hi,

with Cygwin 1.5.25 I removed the link time reference to the non-standard  
timezone() function in Cygwin. Old applications are still able to use  
it, but you don’t get to it when building new applications. Rather  
timezone is now always a variable for newly build apps, as required by  
POSIX.

However, the drawback is that suddenly ruby 1.8.6 doesn’t build anymore.

Ruby on Cygwin uses the replacement function of strftime defined in  
missing/strftime.c. This function uses the timezone() function when  
built on Cygwin.

While this seems to be fixed using finer grained configure checking in  
the stable snapshots on the first glance, the created code is actually  
doing nothing for the %Z format specifier. From `gcc -E strftime.c’:

[…]  
case ‘Z’:

# 469 “./missing/strftime.c”

break;

So the problem persists, just differently.

The question is this: Why is Ruby on Cygwin using its own strftime at  
all, instead of using Cygwin’s strftime?

While looking into this, I found that Configure.in makes a few  
assumptions about Cygwin which are incorrect:

cygwin\*) rb\_cv\_have\_daylight=no  
ac\_cv\_var\_tzname=no  
ac\_cv\_func\_\_setjmp=no  
ac\_cv\_func\_setitimer=no  
;;

and later:

cygwin\*)  
[…]  
AC\_LIBOBJ([strftime])  
;;

All of the above should actually go away. Cygwin has the daylight  
variable, tzname, \_setjmp, setitimer, and, last but not least, strftime,  
which has a POSIX compliant implementation of %Z.

Given that, I’d like to propose the below patch. It’s against the  
stable release 1.8.6-p111, but AFAICS, it applies cleanly to  
configure.in from the stable snapshot as well, just with offsets.

— configure.in.ORIG 2008-01-08 13:11:13.583867700 +0100  
+++ configure.in 2008-01-08 13:11:21.944438700 +0100  
@@ -372,11 +372,7 @@ human\*) ac\_cv\_func\_getpgrp\_void=yes  
ac\_cv\_func\_setitimer=no  
;;  
beos\*) ac\_cv\_func\_link=no;;  
-cygwin\*) rb\_cv\_have\_daylight=no

- ac\_cv\_var\_tzname=no
- ac\_cv\_func\_\_setjmp=no
- ac\_cv\_func\_setitimer=no
- ;;  
+cygwin\*) ;;  
mingw\*) if test “$with\_winsock2” = yes; then  
LIBS="-lws2\_32 $LIBS"  
else  
@@ -1461,7 +1457,6 @@ case “$target\_os” in  
LIBRUBY\_SO=‘cyg$(RUBY\_SO\_NAME)’${MAJOR}${MINOR}.dll  
LIBRUBY=‘lib$(RUBY\_SO\_NAME).dll.a’  
fi
- 

```
 AC_LIBOBJ([strftime])
 ;;

```

mingw\*)  
RUBY\_SO\_NAME=${rb\_cv\_msvcrt}-’$(RUBY\_INSTALL\_NAME)’${MAJOR}${MINOR}

If it’s not ok to disable Ruby’s own implementation of strftime on  
Cygwin for some reason, then you should at least get rid of these two  
lines in configure.in:

```
rb_cv_have_daylight=no
            ac_cv_var_tzname=no

```

This results in a correct compilation of missing/strftime.c in the  
stable snapshot. The old missing/strftime.c in 1.8.6-p111 will still  
not build, though.

Thanks,  
Corinna
