MAKECINT(1) MAKECINT(1) NAME makecint - C/C++ interpreter-compiler. (cint utility) DESCRIPTION "makecint" is an utility to link compiled C/C++ objects with the Cint C/C++ interpreter. Functions, global variables and classes defined in a C/C++ pre-compiled library can be seamlessly accessed from the interpreter. As you call yacc/lex a compiler-compiler, we call makecint an interpreter-compiler. A pre-compiled library can be dynamically loaded as Dynamic Link Library (DLL) if operating system provides appropriate capability. SEE ALSO CINT(1) (This sounds smooth, however, I recommend to start from very simple example. Linking non-trivial library won't be easy. Contact cint@pcroot.cern.ch if you need help.) SYNOPSIS makecint -mk [Makefile] -o [Object] -H [C++header] -C++ [C++source] <-m> <-p> -dl [DLL] -h [Cheader] -C [Csource] -l [Lib] -i [StubC] -i++ [StubC++] -o [obj] :Object name -dl [dynlib] :Generate dynamic link library object -mk [mkfile] :Create makefile (no actual compilation) -p :Use preprocessor for header files -m :Needed if main() is included in the source file -D [macro] :Define macro -I [incldpath]:Set Include file search path -H [sut].h :C++ header as parameter information file -h [sut].h :C header as parameter information file +P :Turn on preprocessor mode for following header files -P :Turn off preprocessor mode for following header files +V :Turn on class title loading for following header files -V :Turn off class title loading for following header files -C++ [sut].C :Link C++ object. Not accessed unless -H [sut].h is given -C [sut].c :Link C object. Not accessed unless -h [sut].h is given -i++ [stub].h :C++ STUB function parameter information file -i [stub].h :C STUB function parameter information file -c [sut].c :Same as '-h [sut].c -C [sut].c' -l -l[lib] :Compiled object, Library or linker options -U [dir] :Directory to disable interface method generation -Y [0|1] :Ignore std namespace (default=1:ignore) -Z [0|1] :Automatic loading of standard header files -cc [opt] :Compiler option -cint [opt] :Cint option -B [funcname] :Initialization function name -y [LIBNAME] :Name of CINT core DLL, LIBCINT or WILDC(WinNT/95 only) (Space between option specifier and option argument is needed) Detail about command line options are explained later in this manual. OPERATING ENVIRONMENT You must install complete file set of the Cint C/C++ interpreter for using makecint. Please read $CINTSYSDIR/README.txt and $CINTSYSDIR/platform/README.txt for Cint installation. $CINTSYSDIR represents a directory where cint package is copied and installed. CINTSYSDIR environment variable must be set to the name of directory where you installed Cint. It is very important that you have correct version of $CINTSYSDIR/MAKEINFO file. Please read $CINTSYSDIR/platform/README.txt for detail of $CINTSYSDIR/MAKEINFO. OUTLINE OF MAKING A PRECOMPILED LIBRARY Generic outline of making a precompiled library will be described in this section. Files You need to prepare header files [xxx.h] which includes interface of the encapsulated C/C++ library. You also need either source files [xxx.C] [xxx.c], object files [xxx.o], library files [xxx].a or combination of those. Procedure - Create a Makefile First of all, you need to create a Makefile by using makecint. Makecint will automate a process of generating Makefile. In following example, makecint will create a Makefile which compiles "mycint" executable. The "mycint" embeds xxx.C and yyy.o as precompiled library. $ makecint -mk Makefile -o mycint -H xxx.h yyy.h -C++ xxx.C yyy.o Command line options will be explained later in this document. - Modify Makefile Please check the created Makefile and modify it if needed. If your library is simple, modification may not be needed. However, when linking non-trivial libraries, you may need to carefully examine and modify Makefile by hand. - Do make Do make. "mycint" will be compiled and linked. "mycint" is a customized C/C++ interpreter which pre-includes interface to xxx.h and yyy.h. $ make Inside the make, Cint is invoked for making dictionary source code G__cpp_[XXX].C and/or G__c_[XXX].c. These source files include interface methods for enabling seamless access between the interpreter and a compiled code. Examples $CINTSYSDIR/demo/makecint directory contains examples. Refer to $CINTSYSDIR/demo/makecint/README.txt for details. WHAT CAN BE DONE WITH THE PRECOMPILED LIBRARY - Non static global variable and function Non static global variables and functions can be accessed from the interpreter. - Class members Public member of classes and structs can be accessed from the interpreter. You can not access private and protected members from the interpreter. Size of class/struct objects and data-member/base-class offsets match to the compiled code. (If you use a special technique, you can access protected member from the interpreter. SEE '#pragma link C++ class+protected') - Template Instantiated template class and template function can be accessed from the interpreter. Template itself can not be precompiled. - typedef Typedef information is precompiled and can be used from the interpreter. - Inheritance, Class object as member Inheritance and class object members are handled properly when they are precompiled. Precompiled class can be a super-class of an interpreted class. Also, object of pre- compiled class can be a member of an interpreted class. Virtual function defined in precompiled class is only vir- tual within the precompiled object because compiler and interpreter has different virtual function resolution mechanism. There will be a possible enhancement in the future. - Default constructor, copy constructor , destructor If one of default constructor, copy constructor or destructor is declared private (or protected), the class can not be accessed from the interpreter. OPTIONS Space between option specifier and option argument is significant. You must put space between them. For exam- ple, '-o object' is valid but '-oobject' is not. Excep- tions are -D and -I options which accepts arguments like '-DMACRO1' and '-I/home/mydir/include'. -mk [mkfile] : Create interface routine and makefile, no compilation The '-mk [mkfile]' option will specify name of created makefile. For example, $ makecint -mk make.prog1 -o prog1 -H prog1.h -C++ prog1.C $ make -f make.prog1 $ prog1 -o [obj] : specify object(customized C/C++ interpreter) name -o option specifies object name which becomes a cus- tomized C/C++ interpreter. -o option can not be omit- ted, otherwise -dl option must be given. -o and -dl options are exclusive. Only one of them must be given. For example, $ makecint -mk Makefile -o mycint -H prog.h -C++ prog.C $ make Will make customized cint "mycint" including prog.C user specific library. -dl [DLL].sl : Generate dynamic link library -dl option generates dynamic link library(DLL) which can be dynamically linked with cint at run time. For example, $ makecint -mk Makefile -dl func.dl -H func1.h func2.h -C++ func1.C func2.C $ make This will generate a DLL 'func.dl' which includes Position Independent Code of func1.C, func2.C. -dl option compiles user specific Suffix of the dynamic link library can be either '.dl', '.sl', or '.DLL'. You can link func.dl by passing it to cint. Multiple DLL can be linked at a time if there is no cyclic sym- bol dependency. $ cint func.dl othersource.c $ cint func1.dl func2.dl othersource.c You can link the DLL by '#include' or '#pragma include' statement in the source code. '#include' and '#pragma include' behaves exactly the same except that when you try to compile the source code by a compiler '#include' will cause an error. For example, // Interpreted source file #include "func1.dl" #pragma include "func1.dl" main() { . } Operation of the dynamic link library func- tion/global/stub are identical to that of archived version. Option '-o' and '-m' can not be used with '-dl'. Installation and all makecint activity must be done under same OS and compiler environment. If you use Linux, you need to set 'LD_ELF_LIBRARY_PATH=.:$LD_LIBRARY_PATH' to use Dynamic Link Library. Otherwise you need to specify full path. -H [sutpi].h :C++ header as parameter information file With '-H' option, [sutpi].h file is used as parameter information file for the encapsulated C++ object. Cint will analyze the header file and create interface method in G__cpp_[XXX].C. Multiple header files can be given after single '-H' option. Class,struct,union,enum,public member functions and data members, non-static global function and vari- ables, typedefs and macros in precompiled library can be used from interpreter. $ makecint -mk Mkit -o mycint -H src1.h src2.h -C++ src1.C src2.C $ make -f Mkit [sutpi].h file must be compliant to cint syntax limi- tations described in man page file $CINTSYS- DIR/doc/limitati.txt. If [sutpi].h uses C++ language constructs which is not supported by cint, that part must be excluded by "#ifndef __MAKECINT__" or "#ifndef __CINT__". The macro __CINT__ is defined both for cint and makecint and __MAKECINT__ is defined only for makecint. class A { // supported feature #ifndef __MAKECINT__ // unsupported feature #endif }; -i++ [stub].h : give parameter information files for stub function -i++ option does opposite of -H option. While -H option enables access of precompiled object from interpreter, -i++ option enables access of interpreted functions from compiled code. #### Example is in $CINTSYSDIR/demo/makecint/Stub directory $ makecint -mk Makefile -o mycint -H Src.h -i++ Stub.h -C++ Src.C $ make -f Makefile $ mycint Stub.C [stub].h file must be compliant to cint syntax limita- tions described in man page file $CINTSYS- DIR/doc/limitati.txt. Only non-static global func- tions can be specified in [stub].h file. Behavior of class,struct,union,enum and non-static global variable defined in [stub].h is undefined. -C++ [sut].C :Link C++ source code or object With '-C++' option, [sut].C file is used as body of C++ compiled object. If appropriate header file is given by '-H' option, those compiled object can be accessed from the inter- preter. At least one header file must be given by -H option when using -C++ option. Otherwise, makecint fails. Multiple source files can be given after one '-C++'. Suffix of the C++ source files must be prop- erly set in the $CINTSYSDIR/MAKEINFO file. -h [sutpi].h :C header as parameter information file With '-h' option, [sutpi].h file is used as parameter information file for the encapsulated C object. Cint will analyze the file and create interface method in G__c_[XXX].c. Multiple header files can be given after one '-h'. Header file must be written in ANSI-C for- mat. K&R style header is not accepted. struct,union,enum, non-static global function and variables, typedefs and macros in precompiled library can be used from interpreter. $ makecint -mk Makeit -A -o mycint -h csrc1.h csrc2.h -C csrc1.c csrc2.c $ make -f Makeit [sut].h file must be compliant to cint syntax limita- tions described in man page file $CINTSYS- DIR/doc/limitati.txt. If [sut].h uses C++ language constructs which is not supported by cint, that part must be excluded by "#ifndef __MAKECINT__" or "#ifndef __CINT__". The macro __CINT__ is defined both for cint and makecint and __MAKECINT__ is defined only for makecint. -i [stub].h : give parameter information files for stub function -i option does opposite of -h option. While -h option enables access of precompiled object from interpreter, -i option enables access of interpreted functions from compiled code. $ makecint -mk Makefile -o mycint -h Src.h -i Stub.h -C Src.c $ make -f Makefile $ mycint Stub.c [stub].h file must be compliant to cint syntax limita- tions described in man page file $CINTSYS- DIR/doc/limitati.txt. Only non-static global func- tions can be specified in [stub].h file. Behavior of struct,union,enum and non-static global variable defined in [stub].h is undefined. -C [sut].c :Link C source code or object With '-C' option, [sut].c file is used as body of C compiled object. If appropriate header file is given by '-h' option, those compiled object can be accessed from the inter- preter. At least one header file must be given by -h option when using -C option. Multiple source files can be given after one '-C'. Suffix of the C source files must be properly set in the $CINTSYSDIR/MAKEINFO file. -m : specify main() is included in linked object If main() function is included in the precompiled object, '-m' option must be given. This option avoids linking Cint main function. You need to call G__init_cint() and G__calc() to start C/C++ inter- preter from your host program. (See example below) Header file $CINTSYSDIR/G__ci.h has to be included. /* Example host program host.c * $ makecint -mk Makefile -o host -m -I$CINTSYSDIR -h host.h -C host.c * $ make */ #include <G__ci.h> #include "host.h" /* host.h can be an empty file */ main() { int state; char command[100], macrofile[100], *p; state=G__init_cint("cint"); while(0==state) { strcpy(macrofile,G__input("Input macro file >")); if(strcmp(macrofile,"exit")==0) break; if(0==G__loadfile(macrofile)) { strcpy(command,macrofile); p = strchr(command,'.'); if(p) { strcpy(p,"()"); G__calc(command); } G__unloadfile(macrofile); } } G__scratch_all(); } int G__init_cint(char* command) This function will initialize Cint. main() function is automatically executed if exists and returns 1. If main() is not found in it returns 0. It returns -1 if initialization fails. int state; state=G__init_cint("cint source.c"); // 0==state : initialized but no main() // 1==state : initialized and main() called // -1==state: initialization failed After the initialization you can use following func- tions. G__value G__calc(char* expression) This function evaluates C/C++ expression as string. Returned value is in the form of generic object G__value. G__value can be translated to long or double value by 'int G__int(G__value val)' or 'double G__dou- ble(G__value val)' functions. For example, // double f(int a) and void g(void) in source.c double d; G__init_cint("cint source.c"); G__calc("g()"); d=G__double(G__calc("f(1234)")); G__scratch_all(); long G__int(G__value buf) This function converts G__value object to a long int value. double G__double(G__value buf) This function converts G__value object to a double precision float value. int G__loadfile(char* filename) This function loads C/C++ source code or Dynamic Link Library(DLL). If suffix of the filename is .dl , .sl , .so , .dll or .DLL, the file is linked as DLL. Other- wise, C/C++ source file. It returns 0 if the file is successfully loaded, 1 if the file is already loaded and -1 if the file can not be loaded. In case of fatal error, it returns -2. G__init_cint("cint"); G__loadfile("src1.C"); G__loadfile("myLib.dl"); G__loadfile("src2.c"); G__calc("f()"); int G__unloadfile(char* filename) This function unloads C/C++ source code or Dynamic Link Library(DLL). In order to keep consistency, all the files loaded after the specified file will be unloaded. It returns 0 if files are successfully unloaded, -1 if not. It first checks if any of the function defined in the unloading files are busy. G__init_cint("cint src0.c"); G__loadfile("src1.C"); G__loadfile("myLib.dl"); G__loadfile("src2.c"); G__loadfile("src3.C"); .... G__unloadfile("src2.c"); // unload src2.c and src3.C .... G__loadfile("src4.C"); .... G__unloadfile("src4.C"); // unload src4.C .... G__unloadfile("src0.c"); // unload all files int G__pause(void) This function starts debugger interface. It returns 0 except 'i'(ignore) or 'q'(quit) command is used. You can start interactive interface as follows. G__init_cint("cint source.c"); while(G__pause()==0); // pause until 'i' command G__scratch_all(); char* G__input(char* prompt) This function is a command line input front-end func- tion. Although this is not an essential function to the C/C++ interpreter, this is often convenient because readline history and command line editing capability is built-in using GNU readline library. This function returns pointer to a static string buffer. char *buf[100]; G__init_cint("cint"); strcpy(buf,G__input("Input your command >"); G__calc(buf); void G__scratch_all(void) This function terminates interpreter. All the files are unloaded and environment is reset. -p : Use preprocessor before parsing parameter informa- tion files (OLD) If '-p' option is added, parameter information files are preprocessed by real preprocessor. Cint does not parse define macro perfectly. It is recommended to use -p option when you link non-trivial library with heavy define macro usage. Name of C/C++ preprocessor must be set in the $CINTSYSDIR/MAKEINFO file. $ makecint -mk Makeit -p -o mycint -H prog.h -C++ prog.C $ make -f Makeit This option is being obsoleted. Use +P,-P instead. +P,-P : Turn on/off preprocessor The +P and -P are suboptions of -h , -H option which turns on/off preprocessor option on file by file basis. Files after +P will be preprocessed and files after -P won't be preprocessed. You can selectively use preprocessor in following manner. In this example, only C.h and D.h , which are enclosed by +P/-P , will be preprocessed by real C/C++ preprocessor. You must not use -p option when you use +P/-P option. +P option must always come before -P , however, -P can be omitted if all files after +P are preprocessed. Name of C/C++ preprocessor must be set in the $CINTSYSDIR/MAKEINFO file. $ makecint -mk Makeit -o mycint -H A.h B.h +P C.h D.h -P E.h F.h -C++ all.C $ make -f Makeit +V,-V : Turn on/off class title loading The +V and -V are suboptions for -h , -H option which turns on/off loading class title by file basis. Class title will be loaded for the files after +V. Class title won't be loaded for the files after -V. $ makecint -mk Makeit -o mycint -H A.h B.h +V C.h D.h -V E.h F.h -C++ all.C $ make -f Makeit Class title has to be described in class/struct defi- nition in header file as follows. Basically, '//' style comment right after each member declaration will be loaded as class member comment. class ABC { int a; // title of the member variable double b; // title of the member variable int c(); // title of the member function ClassDef(ABC) // title of the class } ; -D [macro] : Define macro -D option defines macro for global variable parameter information file. Global variable parameter informa- tion file will be conditionally parsed with '#ifdef [macro]' statement. You can not put multiple macro names after '-D'. '-D' must be given before every individual macro name. Space between -D and macro name is not significant. You can either go '-Dmacro' or '-D macro'. $ makecint -mk Makeit -DONLINE -o mycint -H source.h -C++ source.C $ make -f Makeit -I [incldpath] : Include file search path -I option specifies include file search path. You can not put multiple path after '-I'. '-I' must be given before every individual include path. Space between -I and pathname is not significant. You can either go '-Ipath' or '-I path'. $ makecint -mk Makeit -I/users/include -I/include -H src.h -C++ src.C $ make -f Makeit -u [undeffile] : Handle undefined typename as class name Fighting againt undefined typename is a tidious work, especially when you do not need public access to those. -u option ignores such symbols and generates dummy code to eliminate this kind of problem. It handles unknown typename as a class name which is not exposed. -u option takes output file name as an argument. All of the undefined typenames will be written out. $ makecint -mk Makeit -u undef.h -H src.h -C++ src.C $ make -mk Makeit -u option is not perfect. If you find problem, you need to fix it manually. -U [dir] : Directory to disable interface method generation If you give this option, cint/makecint will disable dictionary generation for header files exist under given directory. For example, $ makecint -mk makefile -dl src.dll -I/x/inc -U/x/inc -H src.h $ make -f makefile $ cint src.dll Suppose you have /x/inc/mylib.h and it is included from src.h, things defined in /x/inc/mylib.h can not be accessed from the interpreter. -Z [0|1] : Automatic loading of standard header files If you give this option, cint/makecint will automatically load standard header files used in header file given by -h/-H option. Default is off(0). -Z1 must be given to makecint when making dictinoary. For example, // src.h #include <string> // this will trigger implicit loading class myclass { .. }; $ makecint -mk makefile -dl src.dll -Z1 -H src.h $ make -f makefile $ cint src.dll cint> .file 0: myheader.dll // explicitly loaded 1: string // loaded implicitly by shared library 2: string.dll // " 3: bool.h // " -cint [opt] : Cint option -cint option specifies command line option directly gieven to cint. Multiple cint options can be given after -cint. There are a few important cint options which are described below. -cint -H [1-100] : level of inclusion activated for dictionary gen This option controls level of header file inclusion which is activated for dictionary generation. By default, Cint generates dictionary for all include files. With -H option, you can limit up to what level, you want to expose simbols to Cint. $ makecint -mk makefile -dl src.dll -H src.h -cint -H1 Above example limits the level of inclusion to 1, which means dictionary is generated for things declared in src.h only and not for files included from src.h. Do not be confused about makecint's -H option and cint's -H option. -cint -M [newdelmask] : Mask operator new/delete generation Caution: When making cint dictionary or interface method source code, it usually overloads global new and delete operators. If you have yourown new/delete operator, you may want to elimitate new and delete from the dictionary source code. -M option turns off automatic creation of operator new/delete in the dictionary source code. Mask flag is given as hex number described below. #define G__IS_OPERATOR_NEW 0x01 Global operator new is found in user header file. Cint automatically stops generating operator new function in the dictionary. #define G__IS_OPERATOR_DELETE 0x02 Global operator delete is found in user header file. Cint automatically stops generating operator delete function in the dictionary. #define G__MASK_OPERATOR_NEW 0x04 Cint does not generate operator new function in the dictionary because it is explicitly masked by -M0x4 command line option. #define G__MASK_OPERATOR_DELETE 0x08 Cint does not generate operator new function in the dictionary because it is explicitly masked by -M0x8 command line option. #define G__NOT_USING_2ARG_NEW 0x10 Cint uses operator new function with 1 argument in dictionary source code. From cint5.14.60, a new scheme is introduced. In the new method, following flags dominates others. This scheme is intended to fix problems associated with global operator new/delete. Before 5.14.59, -M0x1c or -M0x10 was needed for HP-UX aCC, Solaris CC5 and few other compilers. From 5.14.60, this option is not needed for those platforms any more. #define G__DUMMYARG_NEWDELETE 0x100 If this flag is set, a new operator new/delete scheme is turned on. With this scheme, cint dictionary generates following functions. void* operator new(size_t size,[DLLID]_tag* p); void operator delete(void *p,[DLLID]_tag* x); static void G__operator_delete(void *p); #define G__DUMMYARG_NEWDELETE_STATIC 0x200 This flag makes operator new a static function. So, following functions will be generated. static void* operator new(size_t size,[DLLID]_tag* p); static void operator delete(void *p,[DLLID]_tag* x); static void G__operator_delete(void *p); Default value is -M0x100 for pure CINT and -M0x1c for ROOTCINT. $ makecint -mk Makeit -H src.h -C++ src.C -cint -M0x1c $ make -mk Makeit If you have one argument operator new in your source code, your operator new should look like below. #define G__PVOID (-1) extern "C" long G__getgvp(); void* operator new(size_t size) { if(G__PVOID!=G__getgvp()) { void* tmp=G__getgvp(); G__setgvp(G__PVOID); return(tmp); } // Yourown things... } If you have two argument operator new in your source code, your operator new should look like below. #define G__PVOID (-1) extern "C" long G__getgvp(); void* operator new(size_t size,void* p) { if((long)p==G__getgvp() && G__PVOID!=G__getgvp()) { G__setgvp(G__PVOID); return(p); } // Yourown things... } If you have operator delete in your source code, your operator delete should look like below. #define G__PVOID (-1) extern "C" long G__getgvp(); void operator delete(void *p) { if((long)p==G__getgvp() && G__PVOID!=G__getgvp()) { G__setgvp(G__PVOID); return; } // Yourown things... } -cint -u [undeffile] : Handle undefined typename as class name Fighting againt undefined typename is a tidious work, especially when you do not need public access to those. -u option ignores such symbols and generates dummy code to eliminate this kind of problem. It handles unknown typename as a class name which is not exposed. -u option takes output file name as an argument. All of the undefined typenames will be written out. $ makecint -mk Makeit -H src.h -C++ src.C -cint -u undef.h $ make -mk Makeit -u option is not perfect. If you find problem, you need to fix it manually. -cint -Z [0|1] : Automatic loading of standard header files If you give this option, cint/makecint will automatically load standard header files used in header file given by -h/-H option. Default is off(0). -Z1 must be given to makecint when making dictinoary. For example, // src.h #include <string> // this will trigger implicit loading class myclass { .. }; $ makecint -mk makefile -dl src.dll -H src.h -cint -Z1 $ make -f makefile $ cint src.dll cint> .file 0: myheader.dll // explicitly loaded 1: string // loaded implicitly by shared library 2: string.dll // " 3: bool.h // " BUGS Report bugs and requirements to: cint@pcroot.cern.ch. Bugs tend actually to be fixed if they can be isolated, so it is in your interest to report them in such a way that they can be easily reproduced. If will be helpful if you send your source code with the bug report. SEE ALSO doc/cint.txt AUTHOR Masaharu Goto (cint@pcroot.cern.ch) Copyright (c) 1995~2000 Masaharu Goto