Y2R
Y2R is a transpiler translating YCP (a legacy language used to write parts of YaST) into Ruby. It was used to translate YCP-based parts of the YaST codebase into Ruby, which will allow us to get rid of YCP completely.
The translation itself is described by a specification.
Installation
Y2R is tested only on openSUSE 12.3. It probably won't work in other openSUSE versions, other Linux distributions, or other operating systems.
The following steps will make YCP Killer run on a vanilla openSUSE 12.3 system.
-
Install Git
$ sudo zypper in git
-
Update
ycpc
Updated
ycpc
is needed because Y2R uses it internally and it relies on some features that are not present inycpc
bundled with openSUSE 12.3.To install updated
ycpc
, install theyast2-core
package fromYaST:Head
:$ sudo zypper ar -f \ http://download.opensuse.org/repositories/YaST:/Head/openSUSE_12.3/ \ YaST:Head $ sudo zypper in -f -r YaST:Head yast2-core
-
Install basic Ruby environment
$ sudo zypper in ruby ruby-devel
-
Install Y2R's dependencies
$ sudo zypper in gcc-c++ make libxml2-devel libxslt-devel # Needed by Nokogiri
-
Install Y2R
$ sudo gem install y2r
-
Done!
You can now start using Y2R.
Usage
Y2R is a command-line tool. You can invoke it using the y2r
command. Its
syntax looks like this:
y2r [options] [<ycp_file>] [<ruby_file>]
Y2R reads YCP code from ycp_file
, generates Ruby code from it and writes it to
ruby_file
. If ruby_file
is omitted, its name is generated by changing
ycp_file
extension to .rb
. If both ycp_file
and ruby_file
are omitted,
standard input and output are used.
Options
Y2R supports the following options:
-
-I, --include-path <path>
Path where to find included files. Can be specified multiple times.
Paths specified using this option are passed to
ycpc
, which is invoked as part of the compilation. -
-M, --module-path <path>
Path where to find modules. Can be specified multiple times.
Paths specified using this option are passed to
ycpc
, which is invoked as part of the compilation. -
--export-private
Export also private symbols from translated modules.
This option is needed because testuites of some YaST modules access also private symbols of various YCP modules. As a result, these YCP modules need to be translated with
--export-private
. -
--as-include-file
Compile as include file.
This option is needed because there is no way to tell a YCP containing a client from one containing an include.
-
--extract-file <file>
Compile only code of specified include file.
This option is useful when you need to compile an include file which is not standalone. The solution is to compile it in context of some other file (which supplies symbols the include depends on) and use
--extract-file
to make sure code corresponding to the include is emitted instead of code corresponding to the wrapping file.The file needs to be specified in exactly the same way as in the
include
statement in the wrapping file. For example, if the wrapping file containsinclude "packages/common.ycp"
you need to specify
--extract-file packages/common.ycp
. -
--report-file <file>
Report specified file as the compiled one.
The reported file is used to construct some class names in generated code.
-
--xml
Print just XML emitted by
ycpc
.This option is useful mainly for debugging.
-
--version
Print version information and exit.
-
--help
Print help and exit.
Known Issues
- The code quality isn't optimal in many places. This was caused by very short development time with little room for refactoring and cleanups. Given that Y2R will be used just once and then mostly forgotten, this is not a big deal.