torutkのブログ

ソフトウェア・エンジニアのブログ

オープンソースCORBA実装のTAOのビルドでエラー

TAO-1.5.1のSolaris10/SunStudio11でのビルドがエラーとなりました。
TAO/orbsvcs/FTRT_Event_Serviceのビルドで

ld: 重大なエラー: ライブラリ -lTAO_Strategies: 見つかりません。

たしかにこの時点でlibTAO_Strategies.soを検索しても見つからない。おかしい、TAOのコアライブラリの1つなので、orbsvcs下のビルド時にはすでにビルドされているはずです。
で、TAO/GNUmakefile(mwc.plで生成したもの)を見ると、TAO-1.5用のものから変わっています。

all: ACE ACEXML ACEXML_Parser ACEXML_XML_Svc_Conf_Parser Kokyu ACE_FlReactor
 ACE_QtReactor ACE_TkReactor ACE_XtReactor SSL gperf HTBP RMCast TMCast
 Send_Msg_Receiver Send_Msg_Sender RMCast_Receiver RMCast_Sender TAO_IDL_FE
 TAO_IDL_BE TAO_IDL_EXE TAO Codeset AnyTypeCode CodecFactory PI PortableServer
 Utils CosNaming_IDL CosNaming CosConcurrency_IDL CosConcurrency
 CosConcurrency_Skel CosConcurrency_Serv Concurrency_Service IORTable Svc_Utils
 IFR_Client Valuetype Messaging DynamicInterface CosEvent_IDL CosEvent
 CosEvent_Skel CosEvent_Serv CosEvent_Service RTSched Dump_Schedule BiDir_GIOP
 RTEvent RTEvent_Skel RTEvent_Serv RTSchedEvent Event_Service IORManipulation
 PortableGroup FTORB_Utils PI_Server FtRtEvent FTRT_EventChannel
 FTRT_Event_Service FT_ServerORB FT_ClientORB CosNotification_IDL CosNotification
 FaultTolerance FTRTEC_Factory_Service FTRT_ClientORB FTRTEC_Gateway_Service
 CosNotification_Skel FT_ReplicationManager_Lib FT_ReplicationManager
 Fault_Detector ETCL DynamicAny CosNotification_Serv Fault_Notifier ImR_Client
 TypeCodeFactory IFRService IFR_Service TAO_IFR_BE TAO_IFR_EXE ImR_Activator_IDL
 ImR_Locator_IDL ImR_Activator ImR_Activator_Service ImR_Locator
 ImR_Locator_Service tao_imr CosTrading_IDL CosTrading CosTrading_Skel
 CosTrading_Serv CosLifeCycle LifeCycle_Service ObjRefTemplate IORInterceptor
 CosLoadBalancing LoadManager LoadMonitor DsLogAdmin_IDL DsLogAdmin
 DsLogAdmin_Skel DsLogAdmin_Serv Basic_Logging_Service DsEventLogAdmin_IDL
 DsEventLogAdmin DsEventLogAdmin_Skel DsEventLogAdmin_Serv Event_Logging_Service
 DsNotifyLogAdmin_IDL DsNotifyLogAdmin DsNotifyLogAdmin_Skel DsNotifyLogAdmin_Serv
 Notify_Logging_Service RTEventLogAdmin_IDL RTEventLogAdmin RTEventLogAdmin_Skel
 RTEventLogAdmin_Serv RTEvent_Logging_Service CosNaming_Skel CosNaming_Serv
 NT_Naming_Service Naming_Service Notify_Service NT_Notify_Service
 Scheduling_Service TAO_Service CosTime Time_Service_Clerk Time_Service_Server
 Trading_Service CosProperty_IDL CosProperty CosProperty_Skel CosProperty_Serv AV
 CosNotification_Persist HTIOP RTCORBA RTPortableServer RTCORBAEvent RTKokyuEvent
 RT_Notification Security SSLIOP CSD_Framework CSD_ThreadPool Domain RTScheduler
 SmartProxies Strategies TAO_FlResource TAO_QtResource TAO_TkResource
 TAO_XtResource catior nsadd nsdel nslist
    :
 FTRT_Event_Service: ACE TAO_IDL_EXE TAO Codeset AnyTypeCode CodecFactory PI
 PortableServer Utils CosNaming Svc_Utils Valuetype Messaging RTSched RTEvent
 RTEvent_Skel RTEvent_Serv RTSchedEvent IORManipulation PortableGroup FTORB_Utils
 PI_Server FtRtEvent FTRT_EventChannel
        @cd orbsvcs/FTRT_Event_Service/Event_Service && $(MAKE) -f GNUmakefile.FTRT_Event_Service all

makeのALLターゲットが依存しているターゲットの中に、ビルドエラーが発生した"FTRT_Event_Service"とエラーの原因となるライブラリを生成する"Strategies"が含まれています。一方FTRT_Event_Serviceターゲットが依存しているターゲット中にはStrategiesが記述されていません。そのため、ALLターゲットの記述順番にビルドされるのでFTRT_Event_Serviceがビルドされる時点ではまだStrategiesがビルドされていないのでエラーになるものと考えられます。

ということで、安直な解決はエラーが出た時点でStrategiesを手動でビルドしてから再度全体のビルドをする方法です。

TAO/orbsvcs/FTRT_Event_Service/Factory_Service/FTRTEC_Factory_Service.mpcファイルを修正し、Strategiesに依存する記述を追加するのが本来の解決方法ではないかと思います。

Factory_Service$ diff -c FTRTEC_Factory_Service.mpc.orig FTRTEC_Factory_Service.mpc
*** FTRTEC_Factory_Service.mpc.orig     2004年  9月  8日 (水)
--- FTRTEC_Factory_Service.mpc  2006年  4月 29日 (土)
***************
*** 1,7 ****
  // -*- MPC -*-
  // FTRTEC_Factory_Service.mpc,v 1.8 2004/09/07 23:40:59 jtc Exp

! project(FTRTEC_Factory_Service): orbsvcsexe, fault_tolerance, notification, event_skel {
    after    += FaultTolerance
    exename   = ftrtec_factory_service

--- 1,7 ----
  // -*- MPC -*-
  // FTRTEC_Factory_Service.mpc,v 1.8 2004/09/07 23:40:59 jtc Exp

! project(FTRTEC_Factory_Service): orbsvcsexe, fault_tolerance, notification, event_skel, strategies {
    after    += FaultTolerance
    exename   = ftrtec_factory_service

Factory_Service$