From 628dbc24dec47f84d0c141dd87eebf89e2090552 Mon Sep 17 00:00:00 2001 From: Ryszard Glab Date: Fri, 1 Oct 1999 15:33:05 +0000 Subject: [PATCH] ChangeLog 19991001-17:10 GMT+2 --- harbour/doc/compiler.txt | 210 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100644 harbour/doc/compiler.txt diff --git a/harbour/doc/compiler.txt b/harbour/doc/compiler.txt new file mode 100644 index 0000000000..6b4c2d6cf6 --- /dev/null +++ b/harbour/doc/compiler.txt @@ -0,0 +1,210 @@ +/* +* $Id$ +*/ + +Invoking the Harbour compiler: +============================== + + harbour [options] +or + harbour [options] +or + harbour [options] [options] + + +The command line options have to be separated by at least one space. +The option can start with either '/' character or '-' character. + +The Harbour command line options: +================================= + +/a automatic memvar declaration" +----------------- + This causes that all variables declared by PRIVATE or PUBLIC statements + are automatically declared as MEMVAR variables. + +/b debug info" +----------------- + The compiler generates all information required for debugging + +/d[=] #define +----------------- + +/es[] set exit severity +----------------- + + /es or /es0 - all warnings are ignored and exit code returned by the + compiler (accessed by DOS ERRORLEVEL command) is equal to 0 if + there are no errors in compiled source file + /es1 - all warnings are ignored and exit code returned by the + compiler is set to non-zero value + /es2 - all warnings are treated as errors and no output file + is created. The exit code is set to non-zero value. + +/g output type generated is +----------------- + + /gc output type: C source (.c) (default) + /gf output type: Windows/DOS OBJ32 (.obj) + /gh output type: Harbour Portable Object (.hrb) + /gj output type: Java source (.java) + /gp output type: Pascal source (.pas) + /gr output type: Windows resource (.rc) + +/i add #include file search path +----------------- + +/l suppress line number information +----------------- + The compiler does not generate the source code line numbers in the output + file. The PROCLINE() function will return 0 for modules compiled using + this option. + +/m compile module only +----------------- + +/n no implicit starting procedure +----------------- + The compiler does not create a procedure with the same name as the compiled + file. This causes that any declarations placed before the first PROCEDURE + or FUNCTION statement have the file wide scope and can be accessed/used + in all functions/procedures defined in the compiled source file. All + executable statements placed on the beginning of the file and before the + first PROCEDURE/FUNCTION statement are ignored. + +/o object file drive and/or path +----------------- + +/p generate pre-processed output (.ppo) file +----------------- + The compiler creates the file that contain the result of pre-processing + of the source file. + +/q quiet +----------------- + The compiler does not print any messages during compiling (except the + copyright info). + /q0 be really quiet and don't display even copyright info + +/r[] request linker to search (or none) +----------------- + Currently not supported in Harbour. + +/s syntax check only +----------------- + The compiler checks the syntax only. No output file is generated. + +/t path for temp file creation +----------------- + Currently not used in Harbour (the Harbour compile does not create any + temporary files at this moment). + +/u[] use command def set in (or none) +----------------- + Not supported yet. + +/v variables are assumed M-> +----------------- + All undeclared or unaliased variables are assumed MEMVAR variables + (private or public variables). If this switch is not used then the + scope of such variables is checked at runtime. + +/w[] set warning level number (0..3, default 1) +----------------- + + /w0 - no warnings + /w or /w1 - Clipper compatible warnings + /w2 - some usefull warnings missed in Clipper + /w3 - warnings generated for Harbour language extensions + +/x[] set symbol init function name prefix (for .c only) +----------------- + Sets the prefix added to the generated symbol init function name (in C + output currently). This function is generated automatically for every + PRG module compiled. This additional prefix can be used to suppress + problems with duplicated symbols during linking an application with + some third party libraries. + +/y trace lex & yacc activity +----------------- + The Harbour compiler uses the FLEX and YACC utilities to parse the source + code and to generate the required output file. This option allows to trace + the activity of these utilities. + +/z suppress shortcutting (.and. & .or.) +----------------- + +/10 restrict symbol length to 10 characters +----------------- + All variable and function names are cut to maximum 10 characters. + + +Compilation in batch mode. +========================== + + @ compile list of modules in +----------------- + Not supported yet. + + + +Known incompatibilities between harbour and clipper compilers +============================================================= + +NOTE: + If you want 100% compatible compiler and runtime libraries then +you have to define HARBOUR_STRICT_CLIPPER_COMPATIBILITY option. This +option should be defined in include/hbsetup.h file (in fact this +option is placed into comment by default - you need remove /* */ +characters only). This change have to be done before invoking +the make utility. + + +Handling of undeclared variables +-------------------------------- + When a value is assigned to an undeclared variable and '-v' command +line option is not used then the Clipper compiler assumes that the variable +is a PRIVATE or a PUBLIC variable and generates POPM (pop memvar) opcode. + When a value of undeclared variable is accessed and '-v' command line +option is not used the Clipper compiler generates PUSHV (push variable) +opcode that determines the type of variable at runtime. If the field with +requested name exists in a current workarea then its value is used. If there +is no field then a PRIVATE or a PUBLIC variable is used (if exists). + + The Harbour compiler generates an opcode to determine the type of variable +at runtime (POPVARIABLE or PUSHVARIABLE) in both cases (assignment and access). + +The difference can be checked by the following code: + +PROCEDURE MAIN() +PRIVATE myname + + DBCREATE( "TEST", { { "MYNAME", "C", 10, 0} } ) + USE test NEW + SELECT test + APPEND BLANK + + FIELD->myname := "FIELD" + MEMVAR->myname := "MEMVAR" + + myname := myname + " assigned" + + ? FIELD->myname //In Clipper: "FIELD", In Harbour: "FIELD assigned" + ? MEMVAR->myname //In Clipper: "MEMVAR assigned", In Harbour: "MEMVAR" + + USE + +RETURN + + +Passing an undeclared variable by the reference +----------------------------------------------- + The Clipper compiler uses the special opcode PUSHP to pass a reference +to an undeclared variable ( '@' operator ). The type of passed variable +is checked at runtime (field or memvar). However the field variables +cannot be passed by the reference. It causes that Clipper checks the +memvar variable only and doesn't look for a field. This is the reason +why the Harbour compiler uses the usual PUSHMEMVARREF opcode in such +cases. Notice that the runtime behavior is the same in Clipper and +in Harbour - the generated opcodes are different only. +