Sender: MARS (Fangq), News District: Programming
Title: Deploying Kylix 3 Applications [zz]
Sending station: Dama Biggreen BBS (Sun Oct 13 23:48:21 2002), station letter
http://www.rick-ross.com/papers/k3/k3deploy.html
Deploying Kylix 3 Applications
Rick Ross - Pillar Technology Group, Inc.
Introduction
Common Issues
DETERMININING Required Libraries
How Shared Object Libraries Are Located
Additional Environment Variables
DBEXPRESS APPLICATIONS
Configuration Files
Borland Runtime Packages
Console Applications
GUI OR X WINDOW APPLICATIONS
Apache CGI Applications
Apache DSO Applications
Shared Object Libraries
Visibroker / CORBA Applications
WebSnap Applications
An Example Startup Script
Installation Applications
Tarballs
Rpm
Loki Setup
Additional Resources
Introduction
This Paper Lays The GroundWork for Understanding How
Linux Expects Applications to BE Installed. It looks at the
Various Ways That Shared Objects Are Located, How To
Ensure Environment Variables Are Properly Set, And Other
Issues Related to Installing Applications. developers Will B
Guided by providing tips and recommendations for each
TYPE OF Application That Kylix Can Generate. Finally, Three
Tools Will Be Discussed and Demonstrated to show how to
Bundle Up An Application That IS Ready for Deployment.
Common Issues
Regardless of the Type of Kylix Application That Needs To BE
Deployed, All Types Have Several Issues in Common. this
Section Will Address these Common Issues and present
Solustrations to solid.
DETERMININING Required Libraries
All Kylix Applications, Regardless of Size, Require Additional
Shared Libraries. Fortunately, Most of the Required Libraries
Are Present on MOST MODERN Linux Distributions. The
Easiest Way To Determine What Shared Libraries Anapplication Requires Is To Use The LDD Utility. Passing The
Name of An Application Or Shared Object Library AS A
Parameter to this Utility Will List All of the Libraries That Are
STATILOW Is a Listing of Running The LDD
Command on the Kylix 2 Version As Well as The Kylix 3
Version.
(Kylix 2)
$ ldd ./guihelloworld
/LIB/LIBNOVERSION.SO.1 => /Lib/Libnoversion.so.1
(0x40018000)
Libqtintf.so => /opt/kylix/bin/libqtintf.so (0x4001a000)
LIBX11.SO.6 => /usr/x11r6/lib/libx11.so.6 (0x401ad000)
Libpthread.SO.0 => /Lib/i686/libpthread.so.0 (0x4028d000)
Libdl.so.2 => /lib/libdl.so.2 (0x402a2000)
Libc.so.6 => /Lib/i686/libc.so.6 (0x402a6000)
Libqt.so.2 => /opt/kylix/bin/libqt.so.2 (0x403d6000)
/LIB/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
LIBXEXT.SO.6 => /usr/x11r6/lib/libxext.so.6 (0x40a6e000)
Libsm.so.6 => /usr/x11r6/lib/libsm.so.6 (0x40A7C000)
Libice.SO.6 => /usr/x11r6/lib/ludibice.so.6 (0x40A85000)
Libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0x40A9C000)
LibSTDC - libc6.1-1.so.2 => /usr/lib/libstdc -libc6.1-1.so.2
(0x40ABB000)
Libm.so.6 => /Lib/i686/libm.so.6 (0x40AFD000)
(Kylix 3)
$ ldd ./guihelloworld
/LIB/LIBNOVERSION.SO.1 => /Lib/Libnoversion.so.1
(0x40018000)
Libx11.SO.6 => /usr/x11r6/lib/libx11.so.6 (0x40031000)
Libpthread.so.0 => /Lib/i686/libpthread.so.4 (0x4010f000)
Libdl.so.2 => /lib/libdl.so.2 (0x40124000)
Libc.so.6 => /lib/i686/libc.so.6 (0x40128000)
/LIB/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
There Are A Couple of Things to Notice. First, Observe That
The Kylix 2 Version Requires Fourteen Shared Object Libraries, While The Kylix 3 Version Appears To Only Require Six.
Second, Notice That in the Kylix 3 Version, There is no static
Dependency on the QT Librarie in the example shown
ABOVE, All of the Required Libraries Have Been Found. if A
Library Cannot Be Located When the Application IS Run, AN
Error Message Similar To The Following Would Appear.
(Kylix 2)
$ ./Guihelloworld: Error While Loading Shared Libraries:
Libqtintf.so: Cannot Load Shared Object
File: No Such File or Directory
(Kylix 3)
$ ./Guihelloworld: Error While Loading Shared Libraries:
./Guihelloworld: undefined Symbol: initpansistrings
Now loops at the output from running ldd on a "broky"
Kylix 2 Guihelloworld Looks Like this:
(Kylix 2)
$ ldd ./guihelloworld
/LIB/LIBNOVERSION.SO.1 => /Lib/Libnoversion.so.1
(0x40018000)
Libqtintf.so => NOT FOUND
LIBX11.SO.6 => /usr/x11r6/lib/libx11.so.6 (0x40029000)
Libpthread.SO.0 => /Lib/i686/libpthread.so.s (0x40109000)
Libdl.so.2 => /lib/libdl.so.2 (0x4011e000)
Libc.so.6 => /Lib/i686/libc.so.4 (0x40122000)
/LIB/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
With Kylix 2 IT Is Easy to Determine That a Required Shared
Object Library is not being located. NOTICE THE "Not found"
That is next to the library trat.
However, Kylix 3 Makes Things a Much More Difficult in
Regards to knowing Which Shared Object Libraries Are
Required (at Least with the qt related libraries). Look at The
LDD Output Below for the Kylix 3 Version.
(Kylix 3)
$ ldd ./guihelloworld
/LIB/LIBNOVERSION.SO.1 => /Lib/Libnoversion.so.1
(0x40018000)
Libx11.SO.6 => /usr/x11r6/lib/libx11.so.6 (0x40031000) libpthread.so.0 => /Lib/i686/libpthread.so.40 (0x4010f000)
Libdl.so.2 => /lib/libdl.so.2 (0x40124000)
Libc.so.6 => /lib/i686/libc.so.6 (0x40128000)
/LIB/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
NOTICE THAT IT LOOKS The Same as The Working Version!
A Couple of Things Have Changed with Kylix 3. By Default,
The Qt Libraries Are Loaded Dynamically At Run-Time. Instead
Of looking for libqt.so, Kylix 3 Applications Look for
Libborqt.so. Borland Has bundled libqtf.so and libqt.so in
The new libborqt.so. by using libborqt.so, Borland Can
Guarantee That The Propr Libaries Are Being loaded. for
Those Who Want To Use EXISTING QT Libraries (Which May OR
May not be compatible) SET the CLX_USE_LIBQT
Environment Variable. (Don't forget to deploy libqtintf.so,
THough) The Environment Variable Option Option Only Works for
Delphi Applications, C Applications Must #define
CLX_USE_LIBQT and Recompile.
How Shared Object Libraries Are Located
Linux Has Several Methods That Determine How Shared
Object Libraries Are Loaded. First, IF The Binary Has A
DT_RPATH DYNAMIC Section Attribute and The
DT_Runpath Attribute Does NOT EXIST, THE DIRECTORIES
Specified in this section Second, All, ALL
Directories That Are listed in the environment variable
LD_Library_Path Are Searched. Third, The Directories
Specified in The DT_Runpath Dynamic Section Are
Searched. Fourth, The Program Loader Looks in A Special
Cached file named /etc/ld.so.cache. this file lists
Directories Where Previous Libraries Have Been Found. IT IS
Important to Note, HoWever, That this file can be skipped.
(See the man page on ld.so for more information; e.g. manld.so). Finally, if The Library Has Not Been Located After Using
The Previous Methods, The Dynamic Linker Searches the / LIB
Directory and the / usr / lib Directory.
Note
Currently, Kylix Has No Method for Setting Either T
DT_RPATH AND DT_RUNPATH Attributes of A
Executable File. Perhaps a Future Version of Kylix Will
Support the attributes.
The only exception to these rules are for applications That
Have Either The Set User ID OR Set Group ID Bits Set. There
Applications Do Not Search The LD_Library_Path
Environment Variable, TO Avoid Potential Security Risks.
With this information in mind, There Are Three Different
Solutions to Ensure That Libraries Are Located.
Set the ld_library_path environment variable
Add an entry to /etc/ld.so.conf and running ldconfig
Place The Libraries or a Symbolic Link Into The / LIB OR / USR / LIB
Directory.
Choosing An Appropriate Method
For Applications That Do Not Require Special Permissions,
Setting the ld_library_path is the best solution,
Providing the Most Control over Where Files Are Located.
Additionally, Root Privileges Will Not Be Necessary in Order To
Install the application.
Shared Object Libraries and Those Applications That Require
Special Privileges SHOULD Place a Symbolic Link in The
/ USR / LIB DIRECTORY THAT Points to the Installation Directory of
The application. Using this Solution Requires root privileges.
Finally, IF The Previous Solutions Are Not Options, Add AN
Entry to the /etc/ld.so.conf File and Run The LDConfig Utility
Which Updates The System. This Method Also Requires Root
Permissions.
Additional Environment Variables
Kylix As Well As Most Glibc Functions Use the lang
Environment Variable To Determine How To Display Localespecific Information Like Date and Time Formats, Monetary
And Other Region Specific Data. This Environment Variable
SHOULD always be set to some value. if the lang
Environment Variable Is Not Set, IT Needs to Be Set To An
ApproPriate Value. Also, Any Application Specific
Environment Variables Need to Be Set As Well.
There is Three Ways of Setting Environment Variables.
They area
Use an application specific Startup Script to set the
Environment variable.
Use an application specific Configuration File To set the
Environment variable, like the apache httpd.conf
Configuration File. This Method Usually Requires Root
Permissions.
Set a system wide environment variable within
/ etc / profile file. Also Requires Root Permissions.
Unfortunately, There is not one universal, Optimal Solution
Since It Depends on The Type of Application. Later, in The
Application Specific Sections, this Topic IS Addressed ONCE
Again.
DBEXPRESS APPLICATIONS
DBEXPRESS Applications Have Additional Library
REQUIREVER, LOOKING AT The Output generated by
The LDD Utility Will NOT Reveal Which Libraries the Application
Needs, As They is loaded Dynamically At Runtime. for Each
Different Database An Application Communicates with, Two
Additional Shared Libraries Are Needed. One Library IS
Supplied with kylix and the other is the library sales
The Maker of The Database. Two Properties of The THE
TsqlConnection Component List the needed Shared Object
Listed in The Table Below Are The Required Shared
Object Libraries Needed for Each Database.
Database Required Shared Libraries for DBEXPRESS APPS
Kylix Libraries
(Libraryname property) Client Libraries
VendorLib property
DB2 Libsqldb2.so libdb2.so
Informix Libsqlinf.so Libinfclient.so.1.0.0
Interbase libsqlib.so lobgds.so.0
Mysql libsqlmy.so libmysqlclient.so.10.0.0
Oracle Libsqlora.so LibClntsh.so.8.0
PostgreSQL libsqlpg.so libpg.so
As this information is constantly changing, Other Versions Of
Client Libraries May Work. Be Sure To Look At The Latest
Information Available At The Borland Web Site
(www.borland.com/kylix/).
Applications That Use A Descendant of
TcustomClientDataSet (E.g. TclientDataSet OR
TsqlClientDataSet Components OR A TDATSETPROVIDER
Must also include libmidas.so.1 in addition to the shared
Libaries Listed Above. This Library Will Not Appear in The
Output of the ldd utility, since it is loading Dynamical.
The only other file what must be deployed is the
DBXRES.EN.1.0 Resource File. IT Contains Various Resources
For DBEXPRESS Applications.
Configuration Files
Linux is a true multi-user platform. MOST Applications Usually
Have TWO Configuration Files, A Global Configuration File AS
Well as a user specific Configuration File. Global
Configuration Files Are Traditionally Installed In The / ETC
Directory. Other Locations for Global Configuration Files Are
Sometimes Located in The Application Directory OR A
Subdirectory of the Application. One Important Item To Note
Is That Global Configuration Files Should Be Treated AS
Read-only and shop not be modified onCE Installed. User
Configuration Files Are Typically Found With User 抯
Home Directory In an Application Specific Subdirectory. All
Changes to configurations should Only Occur With
Located in the user 抯 Home Directory.
Borland Runtime Packages
Packages Are A Shared Object Library with Additional
Routines. Therefore, Applications That Are Built WithPackages Need To Be Deployed with the package
Needed by the application. The LDD Utility Will List All
Staticly Linked Packages That An Application NEEDS. BE AN APPLICATION
Sure to include All Packages That Are Also Dynamically
LINKED.
The Borland Runtime Packages Provide FunctionAry To
Other packages. Thase dependencies are shown in the
Fighe.
Figure 1
The Package Dependencies Figure IS Read from top top
Bottom. Look at the VisualDbclx package. It Requires The
VisualClx and the dataclx package. In turn, Both
VisualClx and Dataclx Require The RTL (Formerly
BaseClx) Package. Applications That Use Functionality
Found in The VisualDbclx Package Will Also Need To
Deploy the VisualClx, Dataclx and RTL Packages.
Listed in The Table Below, Are The Names of The Actual
Library Files That Are Needed for Deployment.
Package Name BPL Library File (K1) BPL Library File (K2)
BPL Library File (K3)
BaseClx / RTL BPLBaseClx.so.6.0 bplbaseclx.so.6.5
BPLRTL.SO.6.9
VisualClx bplvisualclx.so.4.0 bplvisualClx.so.6.5
BPLVISUALCLX.SO.6.9
Dataclx bpldataclx.so.6.0 bpldatlx.so.6.5
BPLDATACLX.SO.6.9
NetClx bplnetClx.so.6.0 bplnetClx.so.6.5 bplnetClx.so.6.9
VisualDbclx bplvisualdbclx.so.6.0 bplvisualdbclx.so.6.5
BPLVISUALDBCLX.SO.6.9
NetDataClx bplnetdataclx.so.6.0 bplnetdataclx.so.6.5
BplnetDataclx.so.6.9
Indy bplindy.so.6.0 bplindy.so.6.5 bplindy.so.6.9
SOAPRTL N / A N / A BPLSOAPRTL.SO.6.9
WebdbsnapClx n / a bplwebdbsnapclx.so. 6.5
BPLWEBDBSNAPCLX.SO.6.9
WebSnapClx N / A BPLSNAPCLX.SO.6.5 BPLSNAPCLX.SO.6.9
XMLRT N / A BPLXMLRT.SO.6.5 BPLXMLRT.SO.6.9
In The next Table, Each Unit is listed That Can Be buy with
An Application. for Each Unit, One Column Lists Any SharedObject Libraries That Are Specifically Mentioned. The Other
Column lists which package the unit is contained.
Unit Shared Object Libraries Located In Package (s)
Adaptreq WebSnApCLX
Apacheapp
Apachehttp
AutoAdap WebSnapClx
AutoAdapsm WebSnapClx
Autodisp NetClx
Bindhelp libqt.so.21
Libborqt-6.9-qt2.3.so1
Libqtintf-6.9-qt2.3.so1 VisualClx
BRKRCONST NETCLX
CGIApp
CGIHTTP
Classes RTL
Compprod WebDSNAPCLX
Contnrs RTL
CONVUTILS RTL
CopyPRSR NetClx
Corba
CORBCNST
Cosnaming
Dateutils RTL
DB Dataclx
DBADAPT WebSnapClx
DBADAPTIMG WebSnapCLX
DBClient Dataclx
DBCommon Dataclx
DBConnadmin Dataclx
DBCONSTS DATACLX
DBLOCAL DATACLX
Dblocals Dataclx
DBWeb NetDataClx
DBXPRESS DATACLX
DBXPRESSWEB NETDATACLX
DIRSEL VISUALCLX
DSINTF Dataclx
DSPROD NETDATACLX
ENCDDECD SOAPRTL
FMTBCD Dataclx
Helpintfs RTL
HTTPAPP NetClx
Httpd libhtpd.so
Httpparse WebSnapClx
HTTPPROD NETCLX
Httpsoaptopasbind SOAPRTL
Httputil SOAPRTL
Idabout
Idantifreeze
Idantifreezebase indee
Idasn1UTIL IND
IdassignedNumBers IND
IDAUThentication IND
IDAUThenticationDigest Indy
IDAUThenticationManager IND
IDAUTHENTICATIONNTLM INDY
IDBaseComponent IND
IDBLOCKCIPHERINTERCEPT INDY
IDCHARGENSERVER INDY
IDCHARGENUDPSERVER INDY
IDCODER INDY
IDCODER3TO4 INDY
IDCODERHEADER INDY
IDCodermime IND
IDCoderQuotedPrintable Indy
IDCODERUE IND
IDCoderxxe IND
IDcomponent Indy
IDcompressionIntercept libz.so.1 inde
IDCONTAINERS IND
IDCOOKIE IND
IDCOOKIEMANAGER INDY
IDCUSTOMHTTPSERVER INDY
IDDateTimeStamp Indy
IDDaytime inde
IDdaytimeServer Indyiddaytimeudp Indy
IDdaytimeudpserver Indy
IDDictServer IND
IDDiscardServer INDY
IDDiscardudpserver inde
IDDNSRESOLVER IND
Idecho Indy
IDECHOSERVER INDY
IDECHOUDP INDY
IDECHOUDPSERVER INDY
IdemailAddress IND
IDEXCEPTION IND
IDFinger IND
IDFINGERSERVER INDY
IDFTP INDY
IDFTPCOMMON INDY
IDFTPLIST INDY
IDFTPSERVER INDY
IDGLOBAL INDY
IDGOPHER INDY
IDGopherConsts INDY
IDGopherServer Indy
IDHASH INDY
IDHASHCRC INDY
IDHASHELF INDY
IDHSHMESSAGEDIGEST IND
IDHEADERLIST INDY
IDHL7 IND
IDHOSTNAMSERVER INDY
IDHTTP INDY
IDHTTPHEADERINFO INDY
IDHTTPSERVER INDY
IDICMPCLIENT IND
IDIDENT INDY
IDIDENTSERVER INDY
IDIMAP4 IND
IDIMAP4SERVER INDY
IDIntercept IND
IDioHandler INDY
IDioHandlersocket INDY
IdioHandlerstream Indy
IDioHandlerthrottle IND
IDIPMCastBase IND
IDIPMCastClient INDY
IDIPMCASTSERVER IND
IDIPWATCH INDY
Idirc Indy
Idircserver Indy
IDLOGBASE INDY
IDLOGDEBUG INDY
IDLOGEVENT IND
Idlogfile inde
IDLOGSTREAM IND
IDLPR INDY
IDMailbox INDY
IDMAPPEDFTP IND
IDMAPPEDPORTTCP IND
IDMappedPortudp Indy
IDMESSAGE IND
IDMESSAGECLIENT IND
IDMessageCoder INDY
IDMessageCodermime Indy
IDMESSAGECODERUUE IND
IDMessageCoderxxe IND
IDMESSAGECOLLECTION IND
IDMIMETIPES INDY
IDMULTIPARTFORMDATA IND
IDNETWORKCALCULATOR INDY
IDNNTP INDY
IDNNTPSERVER INDY
IDNTLM INDY
IDPOP3 INDY
IDPOP3SERVER INDY
IDQOTD IND
IDQOTDSERVER IND
IDQOTDUDP INDY
IDQOTDUDPSERVER INDY
IDrawbase inde
IdrawClient Indy
IdrawFunctions INDY
Idrawheaders INDY
IdremoteCmdClient Indy
IDRemoteCmdserver IndyidResourceStrings IND
IDREXEC INDY
IDREXECSERVER IND
IDRFCReply IND
IDRSH INDY
IDRSHSERVER INDY
IDServerioHandler INDY
IDServerioHandlersocket IND
IDSIMPLESERVER INDY
IDSMTP INDY
IDSMTPSERVER INDY
IDSNMP IND
IDSNPP INDY
IDSNTP INDY
IDSocketHandle IND
IDSOCKS INDY
IDSSLOPENSSL INDY
IDSSLOPENSSLHEADERS INDY
IDSTACK INDY
IDSTACKCONSTS INDY
IDSTACKLINUX IND
IDStream Indy
IDStrings IND
IDSync INDY
IDSYSLOG INDY
IDSysLogMessage IND
IDSyslogServer Indy
IDTCPCLIENT IND
IDTCPCONNECTION IND
IDTCPSERVER INDY
IDTCPSTREAM INDY
IDTELNET IND
IDTELNETSERVER IND
IDTHREAD IND
IdthreadComponent Indy
Idthreadmgr inde
IDthreadMgrdefault IND
Idthreadmgrpool indead
Idthreadsafe Indy
IDTIME IND
IDTIMESERVER INDY
IDTIMEUDP IND
IDTIMEUDPSERVER IND
IDTRIVIALFTP IND
IDTRIVIALFTPBASE IND
IDTRIVIALFTPSERVER INDY
IDTunnelCommon Indy
IDTunnelMaster INDY
IDTunnelslave inde
IDUDPBASE INDY
IDUDPCLIENT INDY
IDUDPSERVER INDY
Iduri Indy
IDUSERACCOUNTS IND
IDVCard INDY
IDWHOIS IND
IDWhoisServer INDY
IndySockTransport Indy
InIfiles RTL
Intfinfo SOAPRTL
INVCONST SOAPRTL
Invoker SOAPRTL
InvokeRegistry SOAPRTL
Invrules SOAPRTL
Jspas libjs.borland.so WebSnapCLX
JSPasintf WebSnapCLX
JSPasobj WebSnapCLX
JStypes WebSnapClx
Kerneldefs RTL
Kernelioctl RTL
Libc LibbrokenLocale.so.1
Libc.so.6
Libcrypt.so.1
Libdl.so.2
Libm.so.6
Libnsl.so.1
LIBNSS_COMPAT.SO.2
Libnss_DNS.so.2
Libnss_files.so.2
Libnss_hesiod.so.2
Libnss_LDap.so.2
LIBNSS_NISPLUS.SO.2
LIBNSS_NIS.SO.2
Libpthread.so.0
LibResolv.so.2
Librt.so.1
Libthread_db.so.1libutil.so.1
RTL
Libcarpa libresolv.so.2 RTL
Libcelf
LibCRPC RTL
Libcrpcsvc Libnsl.so.1
Librpcsvc.so.1 RTL
Masks RTL
Maskutils RTL
Math RTL
Midas Dataclx
Midcomp WebDSNAPCLX
MidConst libmidas.so.1 DataClx
Miditems WebdSnapClx
MidProd WebDSNAPCLX
OpConvert SOAPRTL
OptosoapDomconv SOAPRTL
OptosoapDomcustom SOAPRTL
ORBPAS40 LiborbPas45.so.1
Libvport_r.so
Liborb_r.so
Oxmldom XMLRTL
Pagtems WebDSnApCLX
Provider Dataclx
Qactnlist VisualClx
QButtons VisualClx
QChecklst VisualClx
QClipbrd VisualClx
Qcomctrls VisualClx
QCONSTS VisualClx
QControls VisualClx
QDBACTNS VisualDbCLX
QDBCONSTS VisualDbCLX
QDBCTRLS VisualDbCLX
QDBGRIDS VisualDbCLX
QDBLogdlg VisualDbCLX
QDbpwdlg VisualdbCLX
QDialogs VisualClx
QextCtrls VisualClx
QFileCtrls VisualClx
QFiledialog VisualClx
QForms Libpthread.so.0 VisualClx
QGraphics VisualClx
QGrids VisualClx
QIMGList VisualClx
Qmask VisualClx
Qmenus VisualClx
QPrinters VisualClx
QSearch VisualClx
QSTDACTNS VisualClx
QStdctrls VisualClx
QStyle VisualClx
Qt VisualClx
Qtypes VisualClx
ReqFiles WebSnapClx
Reqmulti WebSnapClx
Rio SOAPRTL
RTLCONSTS RTL
SCRPTMGR WebDSNAPCLX
Sesscoln WebSnapClx
ShareExcept Libborunwind.so.6
SiteComp WebSnapClx
SiteConst WebSnapClx
SiteProd WebSnapClx
Soapattach SOAPRTL
Soapattachintf soaprtl
SOAPCONN SOAPRTL
SOAPCONST SOAPRTL
SOAPDM SOAPRTL
SOAPDOMCONV SOAPRTL
SOAPENV SOAPRTL
SOAPHTTPCLIENT SOAPRTL
SOAPHTPDISP SOAPRTL
SOAPHTTPSINV SOAPRTL
SOAPHTTRANS SOAPRTL
SOAPLINKED SOAPRTL
SOAPMEMDIAG
SOAPMIDAS SOAPRTL
SOAPPASINV SOAPRTL
SockApp
SockAppHlpr
SockAppNotifySockAppReg
Sockets NetClx
SockHTTP
SockRequestInterpreter
SockTransport
SQLConst Dataclx
SQLEXPR Dataclx
SQLTIMST Dataclx
Stdconvs RTL
Strhlpr RTL
Strutils RTL
SvrConst
Svrhttpindy
Svrinfoconsole
SVRINFOCONST
SvrinFomodule
Svrlog
Svrlogcolsettingsframe
SvrlogdetAildlg
SvrlogdetailFrame
Svrlogframe
Svrmainform
SVRPROPDLG
SvrsockRequest
SvrstatsFrame
Syncobjs RTL
Sysconst RTL
Sysinit Dataclx
Indy
NetCLX
NetDataClx
RTL
SOAPRTL
VisualClx
VisualDbCLX
WebDSNAPCLX
WebSnapCLX
XMLRTL
System Libborunwind.so.6
Libc.so.6
Libdl.so.2
Libpthread.so.0
Libefence.so2 rtl
SYSUTILS LIBUUID.SO.1 RTL
Types RTL
Typetrans Soaprtl
Typinfo RTL
Varcmplx RTL
Varconv RTL
Varhlpr RTL
Variants RTL
VARUTILS RTL
WBMCONST WebDSnApCLX
WebAdapt WebSnapClx
WebAppdbgabout
WebAuto WebSnapClx
Webautosm WebSnapClx
Webbroker
WebBrokersoap SOAPRTL
Webcntxt NetClx
WebComp WebdSnapCLX
WebConst NetClx
WebContnrs WebSnapCLX
WebDISP WebSnapClx
WebFact WebSnapClx
Webform WebSnapClx
WebModu WebSnapClx
WebNode SOAPRTL
WebReq
Webscript WebSnapClx
Webscriptsm WebSnapClx
Webservexp SOAPRTL
Websess WebSnapClx
WebUsers WebSnapClx
WSDLBIND SOAPRTL
WSDLINTF SOAPRTL
WSDLITEMS SOAPRTL
WSDLNode SOAPRTL
WSDLPUB SOAPRTL
WSDLSoAP SOAPRTL
XDOM XMLRTL
Xercesxmldom libxyercesxmldom.so.1 xmlrtl
XLIB LIBX11.SO.6 RTL
XMLBROKR WebDsnApCLX
XMLConst Xmlrtl
XmlDataToschema Xmlrtl
XMLDoc XMLRTL
XMLDOM XMLRTL
XMLINTF XMLRTL
Xmlschema Xmlrtl
Xmlschematags XMLRTL
XMLUTIL
XMLXFORM WebDSnApCLX
XPM libxpm.so.4 WebDSNAPCLX
Xsbuiltins RTL
XSlProd Soaprtl
Zlib Libz.so.1 WebSnapCLX
Zlibconst RTL1 Libqt.SO.2, Libborqt-6.9-Qt2.3.so and libqtintf-6.9-qt2.3.so
Are the qt libraries That Are Loaded Dynamically. Either
Libborqt.so is loaded or Both Libqtintf.so and libqt.so are
Loaded.
2 The libefence.so shared library is only used
System.Pas Has Been Compiled with The Symbol Efernce
Defined.
One Final Note About The Table Above. It Only Shows Those
Libraries That Are Declared With IT. OR, To Say IT Another
Way, Just Because A Unit Does Not Reference A Specific
Shared Object Library, IT May Still Need The Library THROUGH ITS
Dependencies Upon Other Units.
Console Applications
A console application is an application that does not need
AN X Window System To Be Present. Therefore, Console
Applications Should Avoid Using Any Unit That Begins with
The Letter "Q", The xlib unit or the xpm unit.
For Console Applications Requiring Environment Variables,
An Application Specific Startup Script be used. in A
Later Section, An Example of A Startup Script Will Be Shown.
GUI OR X WINDOW APPLICATIONS
At a minimum, graphical applications require the libqtintf.so
Shared library to be deployed along with the application.
Currently, Borland Only Supports the libqt.2.3.0 violet
Kylix 2, Libqt.2.2.4) That ISTALLED with KYLIX. HOWEVER,
Later Versions of Libqt Should Work, Provided That They Have
BEEN Compiled with GCC Version 2.96 or Higher and The
CLX_USE_LIBQT Environment Variable IS Set.
For Graphical Applications Requiring Environment Variables,
An Application Specific Startup Script Should Be Used. AN
Example Is Shown Later in This Paper.
Apache CGI Applications
Since CGI Applications Are Simply Consolec Applications, The
Same Rules As Console Apply. Therefore, CGIApplications Should Avoid Using Any Unit That Begins with
The Letter "Q", The xlib unit or the xpm unit. do not count
ON AN X Window Server Being Installed On A Server
CONFIGURED with apache.
CGI Applications That Require Environment Variables MUST
Be set within the httpd.conf file. The setenv directive
Provides the means to evpose environment variables to
CGI Applications.
For cgi Applications That Are Not Being Deployed to the THE
Standard CGI-BIN DIRECTORY LOCATED BELOW THE Document Root
(Which is specified with the documentroot directive), add
An additional section to the httpd.conf file. it Should Look
Similar to The Example Below.
Scriptalias / Mycgi / "Directory of CGI Application"
ALLOWOVERRIDE NONE
Options Execcgi
ORDER ALOW, DENY
ALLOW FROM ALL
DBEXPRESS CGI Applications Must Specify THE
LD_LIBRARY_PATH Environment Variable in The
Httpd.conf file. Also, The Lang Environment Variable Must
Be set to an appprike value within the httpd.conf file as
Well. Specifying the location of the database configuration
Files, The Home Environment Variable Should Be Set To The
Directory That Contains The. capital subdirectory. IF a
Home Directory Is Not Set, The Global Configuration File
Located IN / USR / local / etc Will be used.
Apache DSO Applications
As mentionsed previously, Production Apache Systems
Typically Do Not Have An X Window System Installed.
Therefore, DSO Applications Should Avoid Using Any Unit
That Begins with the letter "q", The xlib unit or the xpm unit.
Two Choices Are Available for Setting Environment
Variables in dso applications. One option is to modify the
/ usr / sbin / apachectl (or /etc/init.d/httpd) Script and addthe appropriate environment variables. The Other Option IS
To Modify The Global Configuration File Named / etc / profile,
Adding the nextary Environment Variables. Either Option
Requires root permissions.
Additional entries to the httpd.conf file area required for DSO
Applications. a loadModule Directive Specifies the module
Name and the location of the dso. in adduion, a location
Directive Indicates the path to activate the dso
Application. a portion of the httpd.conf file is shown below.
LoadModule MyDSoApp_Module
/
SetHandler "Name of Library - All Lowercase" -Handler
There IS One Additional Requirement for DSO APPLICATIONS
That use dbexpress components. The lang and home
Environment Variables Need to Be Set in a manner
Mentioned in the previous section.
Shared Object Libraries
Shared Object Libraries That Use the Sharexcept Unit Must
Deploy the libborunwind.so.6 along with the standard
Deployment Libraries.
Visibroker / CORBA Applications
Corba Applications Can Be Either Console Or Gui, So They
FOLLOW The Same Rules as Normal Applications. In Additional,
Three Additional Shared Object Libraries Must Be Deployed.
They area: liborbPas45.so.1, libvport_r.so and liborb_r.so.
WebSnap Applications
Since WebSnap Applications Are Specialized CGI or DSO
Applications, They Follow The Same Rules As CGI / DSO
Applications. Additionally, WebSnap Applications Must Also
Deploy libjs.borland.so
An Example Startup Script
A Bash Script Provides More Flexibility for Applications That
Need to Ensure That Libraries Can Be Located WHEN THE
Application is loaded. An Example Script is shown Below.
Remember to Substute THE Approate Installation
Directory and Executable name #! / bin / bash
# Sample Installation Startup Script
# Change the next two variables to specify where the
Application
# Resides.
App_install_dir =
App_path = $ app_install_dir / bin /
App_LD_PATH = $ app_install_dir / lib
# VisualClx Script Tips
# ---------------
# Deploying Libborqt.so?
# Then Make Sure The Following EXISTS IN App_LD_PATH:
# ilborqt-6.9.0-qt2.3.so
# a s f l e t t t t
# Using the folowing command:
# ln -s libborqt-6.9.0-qt2.3.so libborqt-6.9-qt2.3.so
#
# T} option is to deploy (libqtintf.so) Which Requires
# The environment variable
#
# export clx_use_libqt = yes
#
# set. (UNComment the Above line). The Make Sure That
# libqtintf-6.9.0-qt2.3.so
# is located in the app_ld_path.
#
# Now create a Soft link to the above file using the
FOLLOWING:
# ln -s libqtintf-6.9.0-qt2.3.so libqtintf-6.9-qt2.3.so
#
# If You Will Be Using An EXISTING LIBQT, MAKE SURE THAT
# libqt.so.2
# e斯斯 in a directory listed in your ld_library_path.
#
# 中erWise make sure that That
# libqt.so.2.3.0
# is in the app_ld_path and create a link using the
FOLLOWING
# ln -s libqt.so.2.3.0 Libqt.so.2
#
# ------------------------
# First Check to See IF We Have An LD_Library_path
Environment Variable, ENVIRONMENT Variable
IF [-n "$ ld_library_path"]; then
# we do, so prepend our path first
Export
LD_Library_Path = "$ app_ld_path: $ ld_library_pa
TH "
Else
# we do not, so we will create the env var.
Export ld_library_path = "$ app_ld_path"
Fi
# Make Sure WE Have Something Specified for the lang
Environment Variable, ENVIRONMENT Variable
IF [-z "$ lang"]; then
# set lang to an appropriate value
Export lang = en_usfi
# Now Run the Application, Passing Any Parameters That
WHERE specified.
$ app_path $ *
In this Example Script, The Binary File Is Expected To BE
Located in The Bin Directory. Similarly, The Libraries Are
Expected to be located in the lib Directory. Remember to
Mark the script as an executable with the chmod
COMMAND.
CHMOD A X mystartscript.sh
Download The Above Script from here.
Installation Applications
A Number of Installation Utilities Are Available for Installing
Applications in Linux. There Are Command Line Utilities AS
Well as graphical utilities. Some Utilities Are Designed for
Specific Linux Distributions That Use the RPM (Red Hat
Package Manager) Database and Other Utilities Use A
Different Method. This Section Will Explain Three Popular
Methods.
Tarballs
A Tarball IS A FANCY NAME for a Collection of Files. The prefix
TAPE IS An Acronym for Tape Archive. Originally, Tar Was Used
To create one big file from a bunch of files and then write
THE TAR File to the Tape Drive. Tarballs Are The Most Widely
Used Distribution Method for Installing Software on the Linux. INSTALLING
And Other UNIX Based Platforms. Creating a Tarball IS Easily
Performed Using The Tar Command Line Utility That Coms
WITH EVERY Linux Distribution.
THE Convention for Creating Tarballs Is for All of the Files That
Are Combined That They Are Placed in a prot in
Subdirectory. Suppose That a Tarball Needs to Be CREATED
For an application named myawesomeapp. an Example
Directory Structure Might Look Like this:
/
MyawesomeApp.1.0 /
Bin /
LIB /
MAN /
Creating a Tarball Using this Directory Structure IS Easily
Accomplished use the folowing command in The Working
Directory.
TAR CVF
MyAwesomeApp.1.0 / The above command produces a tarball in the working directory. Tar files typically are named with an extension of ".tar" by convention. Tarballs, by default, are not compressed. In order to reduce download times, they are frequently . compressed Compressed tarballs have an extension of ".gz" appended to the name Create a compressed tarball by adding the letter "z" to the command Compressing the MyAwesomeApp tarball would be accomplished using the following command:.. tar cvzfMyAwesomeApp.1.0 / Extracting Files from a Tarball IS Accomplished Using A Different Command. Use the Following Command To Extract Files from An Uncompressed Tarball. Tar XVF
Tarballs That Are Compressed Can Be Extracted Using The Following Command. Tar XVF
To Examine Files in a Tarball, Use the Following Command. Tar TF
Tarballs are easy to create and distribute, however, they do have some limitations. The biggest limitation is that there is no way for a Linux distribution to know what software is installed. This makes removing software from a system may require manually removing files from various system directories (eg global configuration files in the / etc directory). On the plus side, tarballs are great for placing everything in a single file. in addition, since almost every distribution has the tar utility installed, there is no need to provide an installation executable. Other options do exist for manipulating tarballs. The man pages (man tar) are a good source of further information. RPM One of the major Linux distributors, Red Hat, needed a method for installing, updating and removing software easier. The Result of their efforts is the red hat package manager (rpm). RPM is Gaining Popular iMONG Linux Distributions But Not All Distributions Use the rpm method. Other Linux Distributors ProV ide alternates for handling the same types of tasks. The first step in creating an RPM is to take the source files needed to build the application. A spec file is read which informs RPM how to build the package. Several sections are in the spec file , one of, which provides the instructions for compiling or building the package. Another section lists instructions for installing the package. A good resource for learning the details of RPM and how to build RPMs is found in the online book titled "Maximum RPM"
and is available at: http://www.rpmdp.org/rpmbook/ There are also graphical toolkits used in creating RPMs One is available at http://www.rusthq.com/ Loki Setup An open source graphical utility named.. . Loki Setup is available for writing installation applications It is based on XML and GTk Borland uses a modified version of Loki Setup to install Kylix XML files describe the particular information needed to install the application More information is found at http:... // www.lokigames.com/development/setup.php3. Commercial Application If a commercial installation application is needed, InstallShield has a product called InstallShield Multiplatform that is written in Java. It provides the capability of deploying Linux applications as well as many other platforms. More information is found at http://www.installshield.com Additional Resources Kylix 2 Development by Eric Whipple and Rick Ross, published by Wordware, ISBN # 1556227744 Additional online resources can be found at http:. // rick-r Oss.com? Copyright 2001,2002 by rick ross. All rights reserved. All trademarks area. Last Modified: Oct 02, 2002 12:33 PM [q] - ☆ Source:. Green bbs.dartmouth.edu. [From: mars.bbs@bbs.dartmou]