This post is my notebook for compiling a simple C++ application using the NCBI C++ toolbox (http://www.ncbi.nlm.nih.gov/IEB/ToolBox/CPP_DOC/).
This application prints 'Hello world' and takes two arguments:
'-o'
to specificiy the output filename (default is standard output)'-n'
to set the name to be printed (default: "Word !")
The code I used is the one containing in the distribution of blast 2.2.30
The program itself is a C++ Class, it extends the class CNcbiApplication
(...)
class HelloApp : public CNcbiApplication
{
(...)
}
In the constructor, we just set the name and the version of the program:
HelloApp::HelloApp()
{
CRef<CVersion> version(new CVersion());
version->SetVersionInfo(1, 0, 0);
this->SetFullVersion(version);
}
The destructor is void
HelloApp::~HelloApp()
{
}
an HelloApp::Init() method is used to register the command line arguments.
void HelloApp::Init()
{
CArgDescriptions* arg_desc = new CArgDescriptions ;
arg_desc->SetUsageContext(
GetArguments().GetProgramBasename(),
"Hello NCBI"
);
(...)
in HelloApp::Init() we register the '-o'
argument:
arg_desc->AddDefaultKey(
"o",/* name */
"output_file_name",/* synopsis */
"output file name",/* comment */
CArgDescriptions::eOutputFile, /* argument type */
"-" /* default value*/
);
and the '-n'
argument:
arg_desc->AddDefaultKey(
"n",/* name */
"name",/* synopsis */
"Name",/* comment */
CArgDescriptions::eString, /* argument type */
"World !" /* default value*/
);
once the two arguments have been registered, the new command line is pushed in the application:
SetupArgDescriptions( arg_desc );
the HelloApp::Run() method is the workhorse of the program. Here, we get the output stream and we print the name.
int HelloApp::Run()
{
/* get output stream */
CNcbiOstream& out = this->GetArgs()["o"].AsOutputFile();
out << "Hello " << this->GetArgs()["n"].AsString() << endl;
return 0;
}
All in one:
#include <memory>
#include <limits>
#include "corelib/ncbiapp.hpp"
#include <ctype.h>
USING_NCBI_SCOPE;
/**
* Hello NCBI
* testing NCBI C++ toolbox
* Motivation:
* filter sequences on size
* Author:
* Pierre Lindenbaum PhD 2015
*
*/
class HelloApp : public CNcbiApplication /* extends a basic NCBI application defined in c++/include/corelib/ncbiapp.hpp */
{
public:
/* constructor, just set the version to '1.0.0'*/
HelloApp()
{
CRef<CVersion> version(new CVersion());
version->SetVersionInfo(1, 0, 0);
this->SetFullVersion(version);
}
/* called to initialize rge program.
* The default behavior of this in 'CNcbiApplication' is "do nothing".
* Here, we set the command line arguments.
*/
virtual void Init()
{
CArgDescriptions* arg_desc = new CArgDescriptions ; /* defined in /c++/include/corelib/ncbiargs.hpp */
arg_desc->SetUsageContext(
GetArguments().GetProgramBasename(),
"Hello NCBI"
);
/* argument for output file */
arg_desc->AddDefaultKey(
"o",/* name */
"output_file_name",/* synopsis */
"output file name",/* comment */
CArgDescriptions::eOutputFile, /* argument type */
"-" /* default value*/
);
/* argument for name */
arg_desc->AddDefaultKey(
"n",/* name */
"name",/* synopsis */
"Name",/* comment */
CArgDescriptions::eString, /* argument type */
"World !" /* default value*/
);
/* push this command args */
SetupArgDescriptions( arg_desc );
}
/* class destructor */
virtual ~HelloApp()
{
}
/* workhorse of the program */
virtual int Run()
{
/* get output stream */
CNcbiOstream& out = this->GetArgs()["o"].AsOutputFile();
out << "Hello " << this->GetArgs()["n"].AsString() << endl;
return 0;
}
};
int main(int argc,char** argv)
{
return HelloApp().AppMain(
argc,
argv,
0, /* envp Environment pointer */
eDS_ToStderr,/* log message. In /c++/include/corelib/ncbidiag.hpp */
0, /* Specify registry to load, as per LoadConfig() */
"hello" /* Specify application name */
);
}
Compiling
there is a bunch of libaries available under ncbi-blast-2.2.30+-src/c++/ReleaseMT/lib
and it's hard to know which are the one required for linking. I put everything in my command line. All in one it looks like:
g++ -std=gnu++11 -finline-functions -fstrict-aliasing -fomit-frame-pointer
-Iblast2.2.30/ncbi-blast-2.2.30+-src/c++/include -Iblast2.2.30/ncbi-blast-2.2.30
+-src/c++/ReleaseMT/inc -Wno-deprecated -Wno-deprecated-declarations -o hello h
ello.cpp -Lblast2.2.30/ncbi-blast-2.2.30+-src/c++/ReleaseMT/lib -lblast_app_util
-lblastinput-static -lncbi_xloader_blastdb-static -lncbi_xloader_blastdb_rmt-st
atic -lxblastformat-static -lalign_format-static -ltaxon1-static -lblastdb_forma
t-static -lgene_info-static -lxalnmgr-static -lblastxml-static -lblastxml2-stati
c -lxcgi-static -lxhtml-static -lxblast-static -lxalgoblastdbindex-static -lcomp
osition_adjustment-static -lxalgodustmask-static -lxalgowinmask-static -lseqmask
s_io-static -lseqdb-static -lblast_services-static -lxobjutil-static -lxobjread-
static -lvariation-static -lcreaders-static -lsubmit-static -lxnetblastcli-stati
c -lxnetblast-static -lblastdb-static -lscoremat-static -ltables-static -lxalnmg
r-static -lncbi_xloader_genbank-static -lncbi_xreader_id1-static -lncbi_xreader_
id2-static -lncbi_xreader_cache-static -lxconnext-static -lxconnect-static -ldba
pi_driver-static -lncbi_xreader-static -lxconnext-static -lxconnect-static -lid1
-static -lid2-static -lseqsplit-static -lxcompress-static -lxobjmgr-static -lgen
ome_collection-static -lseqedit-static -lseqset-static -lseq-static -lseqcode-st
atic -lsequtil-static -lpub-static -lmedline-static -lbiblio-static -lgeneral-st
atic -lxser-static -lxutil-static -lxncbi-static -lgomp -lz -lbz2 -ldl -lnsl -lr
t -lm -lpthread -Lblast2.2.30/ncbi-blast-2.2.30+-src/c++/ReleaseMT/lib -lblast_a
pp_util -lblastinput-static -lncbi_xloader_blastdb-static -lncbi_xloader_blastdb
_rmt-static -lxblastformat-static -lalign_format-static -ltaxon1-static -lblastd
b_format-static -lgene_info-static -lxalnmgr-static -lblastxml-static -lblastxml
2-static -lxcgi-static -lxhtml-static -lxblast-static -lxalgoblastdbindex-static
-lcomposition_adjustment-static -lxalgodustmask-static -lxalgowinmask-static -l
seqmasks_io-static -lseqdb-static -lblast_services-static -lxobjutil-static -lxo
bjread-static -lvariation-static -lcreaders-static -lsubmit-static -lxnetblastcl
i-static -lxnetblast-static -lblastdb-static -lscoremat-static -ltables-static -
lxalnmgr-static -lncbi_xloader_genbank-static -lncbi_xreader_id1-static -lncbi_x
reader_id2-static -lncbi_xreader_cache-static -lxconnext-static -lxconnect-stati
c -ldbapi_driver-static -lncbi_xreader-static -lxconnext-static -lxconnect-stati
c -lid1-static -lid2-static -lseqsplit-static -lxcompress-static -lxobjmgr-stati
c -lgenome_collection-static -lseqedit-static -lseqset-static -lseq-static -lseq
code-static -lsequtil-static -lpub-static -lmedline-static -lbiblio-static -lgen
eral-static -lxser-static -lxutil-static -lxncbi-static -lgomp -lz -lbz2 -ldl -l
nsl -lrt -lm -lpthread
Testing
run without arguments:
$ ./hello
Hello World !
run with arguments:
$ ./hello -n Pierre
Hello Pierre
$ ./hello -n Pierre -o test.txt && cat test.txt
Hello Pierre
errors:
$ ./hello -x Pierre
USAGE
hello [-h] [-help] [-xmlhelp] [-o output_file_name] [-n name]
[-logfile File_Name] [-conffile File_Name] [-version] [-version-full]
[-dryrun]
DESCRIPTION
Hello NCBI
Use '-help' to print detailed descriptions of command line arguments
========================================================================
Error: Unknown argument: "x"
get help:
$ ./hello -help
USAGE
hello [-h] [-help] [-xmlhelp] [-o output_file_name] [-n name]
[-logfile File_Name] [-conffile File_Name] [-version] [-version-full]
[-dryrun]
DESCRIPTION
Hello NCBI
OPTIONAL ARGUMENTS
-h
Print USAGE and DESCRIPTION; ignore all other parameters
-help
Print USAGE, DESCRIPTION and ARGUMENTS; ignore all other parameters
-xmlhelp
Print USAGE, DESCRIPTION and ARGUMENTS in XML format; ignore all other
parameters
-o <File_Out>
output file name
Default = `-'
-n <String>
Name
Default = `World !'
-logfile <File_Out>
File to which the program log should be redirected
-conffile <File_In>
Program's configuration (registry) data file
-version
Print version number; ignore other arguments
-version-full
Print extended version data; ignore other arguments
-dryrun
Dry run the application: do nothing, only test all preconditions
get xml help:
$ ./hello -xmlhelp | xmllint --format -
<?xml version="1.0"?>
<ncbi_application xmlns="ncbi:application" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:schemaLocation="ncbi:application ncbi_application.xsd">
<program type="regular">
<name>hello</name>
<version>1.0.0</version>
<description>Hello NCBI</description>
</program>
<arguments>
<key name="conffile" type="File_In" optional="true">
<description>Program's configuration (registry) data file</description>
<synopsis>File_Name</synopsis>
</key>
<key name="logfile" type="File_Out" optional="true">
<description>File to which the program log should be redirected</description>
<synopsis>File_Name</synopsis>
</key>
<key name="n" type="String" optional="true">
<description>Name</description>
<synopsis>name</synopsis>
<default>World !</default>
</key>
<key name="o" type="File_Out" optional="true">
<description>output file name</description>
<synopsis>output_file_name</synopsis>
<default>-</default>
</key>
<flag name="dryrun" optional="true">
<description>Dry run the application: do nothing, only test all preconditions</description>
</flag>
<flag name="h" optional="true">
<description>Print USAGE and DESCRIPTION; ignore all other parameters</description>
</flag>
<flag name="help" optional="true">
<description>Print USAGE, DESCRIPTION and ARGUMENTS; ignore all other parameters</description>
</flag>
<flag name="version" optional="true">
<description>Print version number; ignore other arguments</description>
</flag>
<flag name="version-full" optional="true">
<description>Print extended version data; ignore other arguments</description>
</flag>
<flag name="xmlhelp" optional="true">
<description>Print USAGE, DESCRIPTION and ARGUMENTS in XML format; ignore all other parameters</description>
</flag>
</arguments>
</ncbi_application>
That's it,
Pierre
No comments:
Post a Comment