ruby 1.9.1-p243 @ Visual C++ 2008 -落とし穴 GL/LTCG Reloaded

ruby 1.9.1-p243 @ Visual C++ 2008 -落とし穴 GL/LTCG Edition は本当に落とし穴で泣かされたが、そのままGL/LTCG無しで通すのも癪だし、再チャレンジ枠を設けることにした。
まず始めに、GL/LTCGなしで configure + nmake。msvcr90-ruby-191.libが出来た辺りでCtrl+Cで強制終了する。こうすることで、清く正しいsh……じゃない、清く正しいdef/libを回収する。
次に、-GL/LTCG + configure + nmakeで、encのビルドで死ぬまで流す。

(snip)
   ライブラリ enc/encdb.lib とオブジェクト enc/encdb.exp を作成中
encdb.obj : error LNK2001: 外部シンボル "_rb_encdb_dummy" は未解決です。
encdb.obj : error LNK2001: 外部シンボル "_rb_encdb_replicate" は未解決です。
encdb.obj : error LNK2001: 外部シンボル "_rb_encdb_alias" は未解決です。
encdb.obj : error LNK2001: 外部シンボル "_rb_encdb_declare" は未解決です。
.ext/i386-mswin32_90/enc/encdb.so : fatal error LNK1120: 外部参照 4 が未解決です。
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\cl.EXE"' : リターン コード '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio 9.0\VC\BIN\nmake.EXE"' : リターン コード '0x2'
Stop.

そして、回収したdef, libを適用してnmake。タイムスタンプを更新しておかないと死ぬハメになる。

そして

OpenSSLモジュールのコンパイルではまった。
問題はOpenSSL 使用トラブル - BiBoLoGらしいので、さくっと修正してやったが、Ruby1.9 上のopensslライブラリがビルドできない。 - サイログ。MiyakoとかRubyとかなんとか+Miyako ACCESS MAPまで派生してくれた、なんてことだ……。
少々調べてみると、事は簡単で、

/* +++ ossl_x509attr.c (164- +++ */
#if defined(HAVE_ST_X509_ATTRIBUTE_SINGLE) || defined(HAVE_ST_SINGLE)  // x509_attributes_st.singleがあるかどうかで切り替えていて
#  define OSSL_X509ATTR_IS_SINGLE(attr)  ((attr)->single)
#  define OSSL_X509ATTR_SET_SINGLE(attr) ((attr)->single = 1)
#else
#  define OSSL_X509ATTR_IS_SINGLE(attr)  (!(attr)->set)
#  define OSSL_X509ATTR_SET_SINGLE(attr) ((attr)->set = 0)
#endif

で、

/* +++ x509.h (213- +++ */

/* a sequence of these are used */
typedef struct x509_attributes_st
	{
	ASN1_OBJECT *object;
	int single; /* 0 for a set, 1 for a single item (which is wrong) */  // ← x509_attributes_st.singleがあるのに
	union	{
		char		*ptr;
/* 0 */		STACK_OF(ASN1_TYPE) *set;   
/* 1 */		ASN1_TYPE	*single;
		} value;
	} X509_ATTRIBUTE;
/* extconf.h */

#ifndef EXTCONF_H
#define EXTCONF_H
#define HAVE_ASSERT_H 1
#define HAVE_OPENSSL_SSL_H 1
#define HAVE_OPENSSL_CONF_API_H 1
#define HAVE_RB_STR_SET_LEN 1
#define HAVE_RB_BLOCK_CALL 1
#define HAVE_ERR_PEEK_LAST_ERROR 1
#define HAVE_BN_MOD_ADD 1
#define HAVE_BN_MOD_SQR 1
#define HAVE_BN_MOD_SUB 1
#define HAVE_BN_PSEUDO_RAND_RANGE 1
#define HAVE_BN_RAND_RANGE 1
#define HAVE_CONF_GET1_DEFAULT_CONFIG_FILE 1
#define HAVE_EVP_CIPHER_CTX_SET_PADDING 1
#define HAVE_EVP_CIPHERFINAL_EX 1
#define HAVE_EVP_CIPHERINIT_EX 1
#define HAVE_EVP_DIGESTFINAL_EX 1
#define HAVE_EVP_DIGESTINIT_EX 1
#define HAVE_EVP_MD_CTX_CLEANUP 1
#define HAVE_EVP_MD_CTX_CREATE 1
#define HAVE_EVP_MD_CTX_DESTROY 1
#define HAVE_EVP_MD_CTX_INIT 1
#define HAVE_HMAC_CTX_CLEANUP 1
#define HAVE_HMAC_CTX_INIT 1
#define HAVE_PEM_DEF_CALLBACK 1
#define HAVE_PKCS5_PBKDF2_HMAC_SHA1 1
#define HAVE_X509V3_SET_NCONF 1
#define HAVE_X509V3_EXT_NCONF_NID 1
#define HAVE_X509_CRL_ADD0_REVOKED 1
#define HAVE_X509_CRL_SET_ISSUER_NAME 1
#define HAVE_X509_CRL_SET_VERSION 1
#define HAVE_X509_CRL_SORT 1
#define HAVE_OBJ_NAME_DO_ALL_SORTED 1
#define HAVE_SSL_SESSION_GET_ID 1
#define HAVE_OPENSSL_CLEANSE 1
#define HAVE_VA_ARGS_MACRO 1
#define HAVE_OPENSSL_ENGINE_H 1
#define HAVE_ENGINE_ADD 1
#define HAVE_ENGINE_LOAD_BUILTIN_ENGINES 1
#define HAVE_ENGINE_GET_DIGEST 1
#define HAVE_ENGINE_GET_CIPHER 1
#define HAVE_ENGINE_CLEANUP 1
#define HAVE_OPENSSL_OCSP_H 1
#endif
// HAVE_ST_X509_ATTRIBUTE_SINGLE がない!

と言う理由だった。まったく……