blob: 365c7cf6e4f35111deb6e701f060258aa58088f4 [file] [log] [blame]
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
Godefs is a bootstrapping tool for porting the Go runtime to new systems.
It translates C type declarations into C or Go type declarations
with the same memory layout.
Usage: godefs [-g package] [-c cc] [-f cc-arg]... [defs.c ...]
Godefs takes as input a host-compilable C file that includes
standard system headers. From that input file, it generates
a standalone (no #includes) C or Go file containing equivalent
The input to godefs is a C input file that can be compiled by
the host system's standard C compiler (typically gcc).
This file is expected to define new types and enumerated constants
whose names begin with $ (a legal identifier character in gcc).
Godefs compile the given input file with the host compiler and
then parses the debug info embedded in the assembly output.
This is far easier than reading system headers on most machines.
The output from godefs is either C output intended for the
Plan 9 C compiler tool chain (6c, 8c, or 5c) or Go output.
The options are:
-g package
generate Go output using the given package name.
In the Go output, struct fields have leading xx_ prefixes
removed and the first character capitalized (exported).
-c cc
set the name of the host system's C compiler (default "gcc")
-f cc-arg
add cc-arg to the command line when invoking the system C compiler
(for example, -f -m64 to invoke gcc -m64).
Repeating this option adds multiple flags to the command line.
For example, if this is x.c:
#include <sys/stat.h>
typedef struct timespec $Timespec;
enum {
then "godefs x.c" generates:
// godefs x.c
// Constants
enum {
S_IFMT = 0xf000,
S_IFIFO = 0x1000,
S_IFCHR = 0x2000,
// Types
#pragma pack on
typedef struct Timespec Timespec;
struct Timespec {
int64 tv_sec;
int64 tv_nsec;
#pragma pack off
and "godefs -g MyPackage x.c" generates:
// godefs -g MyPackage x.c
package MyPackage
// Constants
const (
S_IFMT = 0xf000;
S_IFIFO = 0x1000;
S_IFCHR = 0x2000;
// Types
type Timespec struct {
Sec int64;
Nsec int64;
package documentation