Compiling program code files (.4gl)

The .4gl source files must be compiled to .42m p-code files, in order to be loaded by the runtime system.

Understanding .4gl source compilation

Genero BDL source code modules (with .4gl file extension) must be compiled to p-code modules (with .42m file extension) by using the fglcomp tool.

Compiled p-code modules are independent of the platform and processor architecture. They are interpreted by the Genero runtime system (fglrun).

The following lines show the compilation of the prog.4gl source, in a UNIX™ shell session:

$ cat prog.4gl
MAIN
  DISPLAY "hello"
END MAIN

$ fglcomp prog.4gl

$ ls -s prog.42m
   4 prog.42m

Verbose compilation

Consider using the --verbose option of the compiler to get detailed information about the source compilation:
$ fglcomp --verbose main.4gl
[loading fglhelp]
[parsing main.4gl]
[parsing mod1.4gl]
[parsing mod2.4gl]
[building mod2]
[writing mod2.42m]
[building mod1]
[writing mod1.42m]
[building main]
[writing main.42m]
[total modules: 4 variables: 6 funtions: 274 types: 9 fields: 10]

Compiling several .4gl sources in a single command

Several .4gl source files can be provided to fglcomp: The compiler builds a dependency tree of imported modules, and compiles the files in the calculated order.

For example, if the main.4gl module imports module1.4gl, but does not import module2.4gl, when passing main.4gl module1.4gl module2.4gl as arguments to fglcomp, the compiler will first compile the module1.4gl because it is imported by main.4gl, then main.4gl and finaly module2.4gl (assuming no .42m file exists before executing this command):

$ rm *.42m
$ fglcomp --verbose main.4gl module1.4gl module2.4gl
[loading fglhelp]
[parsing main.4gl]
[parsing module1.4gl]
[building module1]
[writing module1.42m]
[building main]
[writing main.42m]
[parsing module1.4gl]
[building module1]
[writing module1.42m]
[parsing module2.4gl]
[building module2]
[writing module2.42m]
[total modules: 6 variables: 6 funtions: 274 types: 11 fields: 20]

Automatic compilation of imported modules

When compiling a .4gl module that imports other modules with the IMPORT FGL instruction, fglcomp will automatically compile the imported modules, if they are located in the same directory of the current module, and if the .4gl source is more recent as the .42m file.

For more details, see IMPORT FGL module.

Handling fglcomp compiler errors

If an error occurs, the compiler writes by default an error file with the .err extension.

$ cat prog.4gl
MAIN
  LET x = "hello"
END MAIN

$ fglcomp prog.4gl
Compilation was not successful. Errors found: 1.
 The file prog.4gl has been written.

$ cat prog.err
MAIN
  LET x = "hello"
| The symbol 'x' does not represent a defined variable.
| See error number -4369. 
END MAIN

With the -M option, you can force the compiler to display an error message instead of generating an .err error file:

$ fglcomp prog.4gl
xx.4gl:2:8 error:(-4369) The symbol 'x' does not represent a defined variable.

Produce compiler warnings with -W

To improve code quality, enable compiler warnings with the -W option:

$ cat prog.4gl
MAIN
  DATABASE test1
  SELECT COUNT(*) FROM x, OUTER(y) WHERE x.k = y.k
END MAIN

$ fglcomp -W stdsql prog.4gl
xx.4gl:3: warning: SQL statement or language instruction with specific SQL syntax.

When a warning is raised, you can use the -W error option to force the compiler to stop as if an error was found.

Some warnings are generated by default (without using the -W option), when the source code uses a feature that is considered as "fragile" yet to be supported for backward compatibility.

By default warnings go to the stderr stream. When creating a .err file, warnings can be redirected to the .err file with the -W to-err-file option.

For the complete list of warning options, see -W option in fglcomp command reference.