Table of Contents
You can compile your applications for any of several runtimes using any of several techniques. In this chapter we'll look at invoking the compiler and its various options directly from the command line.
You can also invoke compilation using the Developer Toolbar, or by using URLs to invoke the OpenLaszlo Server directly. Both these techniques are described in Section 1.4.2, “The Developer Toolbar”in Chapter 4. Overview of OpenLaszlo Application Development.
In OpenLaszlo, 'the compiler' consists (currently) of two phases:
the view compiler, which compiles LZX to JavaScript
the script compiler, which compiles JavaScript to the target
runtime (SWF8, SWF1o and DHTML). lzc
invokes both those phases (although
you can ask for the intermediate output).
The Debugger needs an OL server to be able to evaluate forms (it calls the server to compile the form and then loads and runs the result). It will try to talk to OL server (using the url the application was loaded from), so it should 'just work', so long as you are running a server, even if you don't use the server for compiling your application.
Note | |
---|---|
If you use the command-line compiler to compile a SOLO application, you won't be able to evaluate any expression that requires the Debugger to send code to the server for compilation. |
To run lzc you must do so from a current directory that matches the value of LPS_HOME, and LPS_HOME must be set to the correct value for the build.
Say the application to be compiled is
$LPS_HOME/laszlo-explorer/basics/mediatst.lzx
To compile it correctly you would set the current directory first:
cd $LPS_HOME;
and then compile using
lzc --script --runtime=dhtml laszlo-explorer/basics/mediatst.lzx;
Let's say the file $LPS_HOME/laszlo-explorer/basics/mediatst.lzx wants to reference the file $LPS_HOME/laszlo-explorer/basics/assets/background.jpg. It might contain the following reference.
<canvas> <view resource="assets/background.jpg"/> </canvas>
Running LZC from other than LPS_HOME will result in a file not found error.
Here are the options available for compilation:
Options:
lists all options.
Set the name/var property to value (See Compiler.getProperties).
Short for -Dname=true.
Write progress information to standard output.
Turns on/off media cache. Default is off.
Action to take on compilation errors. Defaults to warn.
Location of script cache directory (default <lps>/work/scache).
Location of media cache directory (default <lps>/work/cache/cmcache).
Doesn't flush script cache before compiling.
Output options:
Compile to swf8, swf9, or dhtml.
The name of the output file. This option is only valid when there is one input file.
Output directory.
Add debugging information into the output object.
Add profiling information into the output object.
Logging options:
Logging level (See org.apache.log4j.Level)
Logging level (See org.apache.log4j.Level)
Log4j properties files
Specify logfile (output still goes to console as well)
Writes the schema to standard output.
Writes JavaScript to standard output.
You can define compile-time constants to `lzc` by using `-D_name_=_value_`, where _value_ should be either `true` or `false`. By convention, we use `$` as the first character of _name_, but nothing enforces that.
The compiler will compile only the chosen branch of an if statement when the condition expression is a compile-time constant (i.e., just the constant name, no other computation). For example:
if ($slow) { ... slow way ... } else { ... fast way ... }
You can define compile-time constants to `lzc` by using `-D_name_=_value_`, where _value_ should be either `true` or `false`. By convention, we use `$` as the first character of _name_, but nothing enforces that. The compiler will compile only the chosen branch of an if statement when the condition expression is a compile-time constant (i.e., just the constant name, no other computation).
For example:
if ($slow) { ... slow way ... } else { ... fast way ... } Can be made to run fast by `lzc -Dslow=false`
As part of the architectural overhaul, we have created a new version of the client
runtime (LFC plus kernel). To invoke an application compiled for DHMTML, use the
?lzr=dhtml
query.
The ?lzr
parameter selects the runtime. Your choices are swf8, swf9,
and dhtml. The default is specified in lps/config/lps.properties
as
compiler.runtime.default
. The default runtime selector is swf8.
The ?lzt
parameter is the 'request type', in general what kind of
'wrapper' page will be generated around your application. Your choices are: app_console or
html. app_console is the developer console, html is your app in an html page. The latter can
be used as a model for embedding your app in a custom page, or you can simply embed using an
iframe:
<iframe src=".../app.lzx?lzt=html"></iframe>
The default for ?lzt
is specified in lps/config/lps.properties as
defaultRequestType. The default value is app_console.
Mnemonics:
lzr - Laszlo Runtime
lzt - Laszlo request Type
So, for example, to view an LZX application in DHTML within a browser, download it from
a live server with an url parameter requesting the DHTML runtime
lzt=html
: http://myserver/mylaszloapp.lzx?lzr=dhtml. To
request the SWF runtime, use http://myserver/mylaszloapp.lzx?lzr=swf.
To specify that the application run in the Developer Toolbar, use the
lzt
flag: lzt=app_console
loads the application with
the Developer Toolbar. lzr=swf8
and lzr=swf9
loads
the application compiled for the SWF8 or SWF9 runtime, with the Developer Toolbar. Two lzr
values have been added for future use, but are not currently supported: j2me, and
svg
When compiling an application to the swf10 runtime, there is an incremental compilation mode which may help to speed up recompiling the application.
The incremental compilation mode should be from the fcsh
compiler shell
utility (located in WEB-INF/bin/fcsh
). This is a utility which is specific to
compiling for the swf10 runtime. An application can be compiled within the fcsh
shell, and the shell left running. When the source code is modified, you can recompile the
application from within the shell.
This should be substantially faster than invoking the compiler via lzc
,
because internal state of the flash 10 backend compiler is kept in memory in the Java
virtual machine, rather than having to be reloaded from disk.
Where you would normally run lzc --runtime=swf10 yourapp.lzx
, instead you
use the modified fcsh
shell, as follows. It supports a lzc
command which has the same arguments: run fcsh
shell script (lives in
WEB-INF/bin
)
FLEX_HOME=../../WEB-INF/bin/.. Adobe Flex Compiler SHell (fcsh) Version 4.0.0 build 6898 Copyright (c) 2004-2007 Adobe Systems, Inc. All rights reserved.
(fcsh) lzc --runtime=swf9 app.lzx calling lzc Compiling: app.lzx to app.swf9.swf swf9 compiler options changes, cleaning working dir Executing compiler: (cd /var/folders/xh/xhmdrA41HCKjjiditeqN1k+++TI/-Tmp-/lzswf9/./build/app; /Users/hqm/openlaszlo/trunk/WEB-INF/bin/mxmlc -load-config=/Users/hqm/openlaszlo/trunk/WEB-INF/frameworks/flex-config.xml -compiler.show-actionscript-warnings=false -compiler.source-path+=/var/folders/xh/xhmdrA41HCKjjiditeqN1k+++TI/-Tmp-/lzswf9/./build/app -compiler.headless-server=true -compiler.fonts.advanced-anti-aliasing=true -output /var/folders/xh/xhmdrA41HCKjjiditeqN1k+++TI/-Tmp-/lzswf9/./build/app/app.swf -default-size 800 600 -compiler.library-path+=/Users/hqm/openlaszlo/trunk/lps/includes/lfc/LFC9.swc -compiler.library-path+=/Users/hqm/openlaszlo/trunk/WEB-INF/flexlib -includes \$debug \$profile \$backtrace \$runtime \$swf7 \$swf8 \$as2 \$swf9 \$swf10 \$as3 \$dhtml \$j2me \$svg \$js1 -target-player=9.0.0 -compiler.incremental=true -frame two LzSpriteApplication -file-specs=/var/folders/xh/xhmdrA41HCKjjiditeqN1k+++TI/-Tmp-/lzswf9/./build/app/LzPreloader.as) option EMIT_AS3_ONLY set, returning without invoking flex compiler, call 'lcompile #' to compile as3 lzc returned /Users/hqm/openlaszlo/trunk/demos/lzpix/app.swf9.swf fcsh: Assigned 1 as the compile target id Loading configuration file /Users/hqm/openlaszlo/trunk/WEB-INF/frameworks/flex-config.xml /var/folders/xh/xhmdrA41HCKjjiditeqN1k+++TI/-Tmp-/lzswf9/./build/app/app.swf (403317 bytes) (fcsh)
then if you modify one or more .lzx
files, you recompile incrementally by
saying lcompile 1
(or whatever the ID number assigned by fcsh
in
the previous command)
touch classes/pivotlayout.lzx
(fcsh) lcompile 1
lcompile, calling lzc with args:
--lzxonly
--incremental
--runtime=swf9
app.lzx
Compiling: app.lzx to app.swf9.swf
Executing compiler: (cd /var/folders/xh/xhmdrA41HCKjjiditeqN1k+++TI/-Tmp-/lzswf9/./build/app; /Users/hqm/openlaszlo/trunk/WEB-INF/bin/mxmlc -load-config=/Users/hqm/openlaszlo/trunk/WEB-INF/frameworks/flex-config.xml -compiler.show-actionscript-warnings=false -compiler.source-path+=/var/folders/xh/xhmdrA41HCKjjiditeqN1k+++TI/-Tmp-/lzswf9/./build/app -compiler.headless-server=true -compiler.fonts.advanced-anti-aliasing=true -output /var/folders/xh/xhmdrA41HCKjjiditeqN1k+++TI/-Tmp-/lzswf9/./build/app/app.swf -default-size 800 600 -compiler.library-path+=/Users/hqm/openlaszlo/trunk/lps/includes/lfc/LFC9.swc -compiler.library-path+=/Users/hqm/openlaszlo/trunk/WEB-INF/flexlib -includes \$debug \$profile \$backtrace \$runtime \$swf7 \$swf8 \$as2 \$swf9 \$swf10 \$as3 \$dhtml \$j2me \$svg \$js1 -target-player=9.0.0 -compiler.incremental=true -frame two LzSpriteApplication -file-specs=/var/folders/xh/xhmdrA41HCKjjiditeqN1k+++TI/-Tmp-/lzswf9/./build/app/LzPreloader.as)
option EMIT_AS3_ONLY set, returning without invoking flex compiler, call lcompile #
to compile as3
Loading configuration file /Users/hqm/openlaszlo/trunk/WEB-INF/frameworks/flex-config.xml
Recompile: /private/var/folders/xh/xhmdrA41HCKjjiditeqN1k+++TI/-Tmp-/lzswf9/build/app/$lzc$class_pivotlayout.as
Reason: The source file or one of the included files has been updated.
Files changed: 1 Files affected: 0
/var/folders/xh/xhmdrA41HCKjjiditeqN1k+++TI/-Tmp-/lzswf9/./build/app/app.swf (403318 bytes)
renaming /var/folders/xh/xhmdrA41HCKjjiditeqN1k+++TI/-Tmp-/lzswf9/./build/app/app.swf to /Users/hqm/openlaszlo/trunk/demos/lzpix/app.swf9.swf
(fcsh)
You can keep modifying files and calling lcompile 1
to recompile
incrementally.
LZO stands for "LasZlo Object" file format.
For awhile, the 'lzc' compiler has been able to compile files into .lzo
binary files by using the -c
flag. It stored the library code in an intermediate
platform-independent format.
In the latest release the compiler can also store precompiled platform-specific object code for both the DHTML and SWF10 runtime in the library, so that linking an application with libraries should be faster than ever.
To compile a library to include native object code for both runtimes, you call
lzc
as follows, specifying one or more runtimes to place in the library.
lzc -c --runtime=swf10,dhtml mylibrary.lzx
We have a new rule, which is that when you compile a library that makes any external references to classes or globals in another library, that library must be already compiled down to an external binary library lzo file, and one which contains the target runtime.
For example let's say you are an ice-cream manufacturer, and have some new equipment that makes ice-cream bars. Your machine came with some software from the factory which makes basic tubs of icecream, and then you extend that software with your own custom class to make ice-cream bars.
Let's say the manufacturer supplied an lzx
file to be included when you
compile, called extdessert.lzx
that defines a base icecream
class. It's source code might be:
extdessert.lzx: <library> <class name="icecream"> ... </class> </library>
Then your code might look like:
libdir/mylib.lzx: <library> <include href="../extdessert.lzx"/> <class name="icreambar" extends="icecream"> <attribute name="coating" type="string" value="chocolate"/> <attribute name="icecreamflavor" type="string" value="vanilla"/> .... </class> </library>
Now you want to go to compile your code into a library.
If we want to compile to swf10, the extdessert
file MUST be first
compiled to an lzo
which contains a swf10 runtime target , or the flash10
compiler will not be able to link against it properly when you build your library.
So you would in that case first build the extdessert.lzx
into an
lzo
:
lzc -c --runtime=swf10 extdessert.lzx
and then your custom class library can be linked against it
lzc -c --runtime=swf10 libdir/mylib.lzx
So basically the rule is that when building a lzo
library that depends on
extending or referencing classes from other files, those files MUST be compiled to swf10
lzo
's first.
When the compiler detects an error that makes it impossible to compile the application, the error is reported in the browser window, or, if you invoked compilation using lzc, in the terminal window.
When the compiler detects code that may be problematic but does not prevent compilation, it issues a warning. If you have debugging enabled, the warning is displayed there. See Chapter 51, Debugging for a detailed discussion of how to detect errors.
You can enclose blocks of code within <switch>
elements that are associated with a specific runtime. The
<switch>
is a compiler directive that instructs the
compiler to compile or omit blocks according to the target runtime to which the application
is being compiled. Within a <switch>
block, use
<when>
to specify the runtime using a compile-time
constant, like this:
<when property="compile-time-constant-name">
compile-time-constant-name
can be $debug
,
$profile
, $backtrace
, $runtime
,
$swf7
, $swf8
, $as2
,
$swf9
, $swf10
, $as3
,
$dhtml
, $j2me
, $svg
, or
$js1
.
Example 49.1. <switch> using <when> for conditional compilation
<canvas
height
="20
" width
="100%
">
<switch
>
<when
property
="$dhtml
">
<text
>This program has been compiled for DHTML
</text
>
</when
>
<otherwise
>
<text
>This program has been compiled for SWF
</text
>
</otherwise
>
</switch
>
</canvas
>
<!-- * X_LZ_COPYRIGHT_BEGIN ***************************************************
* Copyright 2007, 2009 Laszlo Systems, Inc. All Rights Reserved. *
* Use is subject to license terms. *
* X_LZ_COPYRIGHT_END ****************************************************** -->
You can also use unless
in a similar way.
Example 49.2. <switch> using <unless> for conditional compilation
<canvas
height
="20
" width
="100%
">
<switch
>
<unless
property
="$swf10
">
<text
>Not SWF10
</text
>
</unless
>
<otherwise
>
<text
>Must be SWF10
</text
>
</otherwise
>
</switch
>
</canvas
>
<!-- * X_LZ_COPYRIGHT_BEGIN ***************************************************
* Copyright 2007, 2009, 2011 Laszlo Systems, Inc. All Rights Reserved. *
* Use is subject to license terms. *
* X_LZ_COPYRIGHT_END ****************************************************** -->
You can also use this syntax:
<when property="$runtime" value="swf9"> // checks for string equality
And for back compatibility:
<when runtime="swf9">
Copyright © 2002-2010 Laszlo Systems, Inc. All Rights Reserved. Unauthorized use, duplication or distribution is strictly prohibited. This is the proprietary information of Laszlo Systems, Inc. Use is subject to license terms.