mkconfig_d

Name
Description
D Language Units
See Also
Bugs
Website
Author

Name

mkconfig_d - mkconfig D language units

Description

The D language units create an import file for use by D programs.

D Language Units

d-main

The d-main unit creates a configuration file for D programs.

Check variables are output as type enum where possible. Other variables are also output as enums where possible.

e.g. D2
enum bool _d_tango_lib = false;
enum int _csiz_long_double = 16;
enum int D_VERSION = 2;
enum string SYSTYPE = "Linux";
e.g. D1

enum : bool { _d_tango_lib = true };
enum : int { _csiz_long_double = 16 };
enum : int { D_VERSION = 1 };
string SYSTYPE = "Linux";
module
module-name

Sets the module name to be output to the output file.

noprefix

Turns off prefix (C_TYP_, C_ST_, C_ENUM_, C_UN_, C_MACRO_) generation in the converted C code.

standard

Executes any Standard checks for the D language. Currently there are checks for: (a) import of std.string for D version 2; (b) see if the ’string’ type is valid; and (c) to see if the tango library is in use. If ’string’ is not valid, an alias is added to the configuration file. The tango library check creates a check variable named ’_d_tango_lib’.

import name-e

Checks to see if module can be imported.

e.g.
import std.stdio
Check Variable: _import_std_stdio

lib function [libs, ...]

Check to see if the library function function exists. If the optional libs are specified, the test will try first without the libraries, then with the first set of libraries specified linked in, then the next set, etc. Sets of libraries to be tested are separated by commas. If link libraries are specified, any value in the cache is ignored, and the function is retested.

class class [libs, ...]

Check to see if the class class exists. If the optional libs are specified, the test will try first without the libraries, then with the first set of libraries specified, then the next set, etc. Sets of libraries to be tested are separated by commas.

member struct-name member

Check to see if member is a member of struct-name.

size type-name

Check the size of type-name

type type-name

Check to see if type-name exists. This is used internally to see if ’string’ is valid.

D Language Units - C Language Interface

All C language types are converted to the corresponding D language type when output (operating system, architecture and compiler dependent). Any variables with two leading underscores will be converted to ’_t_’.
chdr
header

Checks to see if the C Language header exists. The chdr and csys directives must appear before other C language directives. The appropriate headers must be checked so that structure, typedef, defines and declarations may be extracted.

e.g.
chdr stdlib.h
Check Variable: _hdr_stdlib

csys header

Checks to see if the C language sys/header exists. The chdr and csys directives must appear before other C language directives.

e.g.
csys types.h
Check Variable: _sys_types

csizes

Checks the sizes of the standard C data types. This directive is required for most of the D/C language interface directives. Operating system, architecture and compiler dependent.

Output:
alias char C_TYP_char;
alias short C_TYP_short;
alias int C_TYP_int;
alias long C_TYP_long;
alias long C_TYP_long_long;
alias float C_TYP_float;
alias double C_TYP_double;
alias real C_TYP_long_double;
enum int _csiz_char = 1;
enum int _csiz_short = 2;
enum int _csiz_int = 4;
enum int _csiz_long = 8;
enum int _csiz_long_long = 8;
enum int _csiz_float = 4;
enum int _csiz_double = 8;
enum int _csiz_long_double = 16;

clib function [libs, ...]

Check to see if the C library function function exists. If the optional libs are specified, the test will try first without the libraries, then with the first set of libraries specified linked in, then the next set, etc. Sets of libraries to be tested are separated by commas.

Execute mkc.sh -reqlib after creating the output file to output the libraries required for linking.

mkc.sh -reqlib creates the list of libraries required for linking based on the output file. This allows the user to modify the output file and only the necessary libraries will be linked in.

mkc.sh -reqlib is executed with a command line argument of the output file name created by mkconfig.sh. The output library file defaults to ’mkconfig.reqlibs’, but may be changed with the -o command line option.

e.g.
clib quotactl
Check Variable: _clib_quotactl

clib bindtextdomain -lintl, -lintl -liconv
[will test w/o any library, then with -lintl, then with both -lintl and -liconv]

cdefine {short|int|long|longlong|hex|hexlong|hexlonglong|float|string}
def

Checks if a C #define of def exists. A D language ’enum’ will be output to the output file. The type is used to properly convert the C definition. The type output as the D enum will be the appropriate type that has the same size. All floats are output as double enums.

e.g.
cdefine hex LC_ALL
cdefine string _PATH_MOUNTED
Check Variable: _cdefine_LC_ALL

ctype {int|float} type-name

type-name will be converted to a D language alias for the type. The size of the type will be determined, and the corresponding D type will be used to alias the type. The C language type will be renamed to C_TYP_<type>. All further instances of that type in the output will also be converted. The int or float keyword indicates whether or not type-name is an integer type or a floating point type. For structures, character pointers, function pointers or if the actual typedef is wanted, use ctypedef.

e.g.
ctype int uid_t
Check Variable: _ctype_uid_t
Output:

alias uint C_TYP_uid_t;
static assert ((C_TYP_uid_t).sizeof == 4);
enum int _ctype_uid_t = 4;

ctypedef type-name

Checks for the typedef type-name, and if it exists, outputs the D language alias for that typedef. Unlike the ctype directive, the size of the object is not determined. The typedef is converted to a D alias as is and output. If the type that is converted from is not defined, further ctype or ctypedef directives will be need to be added to the configuration file. The ’awk’ program is a requirement for this directive.

For structures, the cstruct directive should be used.

e.g.
ctypedef __caddr_t
ctypedef caddr_t
Output:

alias _t_caddr_t caddr_t;
// from: typedef __caddr_t caddr_t;
alias char *_t_caddr_t;
// from: typedef char * __caddr_t;

cmacro macro-name req-header [req-hdr2 [...]] rettype [type1 ...]

macro-name will be converted to a D language function to replace the macro. The C language macro will be renamed to C_MACRO_<macro>. req-header is the list of headers where macro-name will be found. The return type of macro-name must be listed after the required headers, and if macro-name takes arguments, then the list of types must be specified at the end of the cmacro directive. The return type is only used for D version 1. D version 2 will always set the macro return type to ’auto’. The ’awk’ program is a requirement for this directive.

e.g.
cmacro MIN sys/types.h int int int
Check Variable: _cmacro_MIN
auto C_MACRO_MIN(int a, int b) { return ((a) < (b) ? (a) : (b)); }
enum bool _cmacro_MIN = true;

cstruct struct-name

cunion union-name
cenum
enum-name
Checks to see if struct struct-name or a typedef definition for struct-name exists. The structure will be modified for the D language and output to the output file. Note that any types used by the structure must be checked for first using the ctype or ctypedef directives. The structure will be renamed to C_ST_struct-name (C_UN for unions, C_ENUM for enums). The ’awk’ program is a requirement for this directive.

e.g.
ctype int __time_t
ctype int __suseconds_t
cstruct timeval
Output:

struct C_ST_timeval
{
C_TYP___time_t tv_sec;
C_TYP___suseconds_t tv_usec;
};
alias long C_TYP___time_t;
alias long C_TYP___suseconds_t;
static assert ((C_TYP___time_t).sizeof == 8);
static assert ((C_TYP___suseconds_t).sizeof == 8);
static assert ((C_ST_timeval).sizeof == 16);
enum bool _cstruct_timeval = true;
enum int _ctype___time_t = 8;
enum int _ctype___suseconds_t = 8;

cmember struct-name member

Checks to see if member is a member of struct-name. The cstruct directive for the structure must appear before this directive.

e.g.
cmember statvfs f_basetype
Output:

enum bool _cmem_statvfs_f_basetype = false;

cmembertype struct-name member

Gets the type of struct-name.member. The cstruct directive for the structure must appear before this directive.

e.g.
cmembertype getquota_args gqa_uid
Output:

enum bool _cmembertype_getquota_args_gqa_uid = true;

cmemberxdr struct-name member

Aliases the appropriate xdr function for struct-name.member.
The cstruct directive for the structure must appear
before this directive.

e.g.
cmemberxdr getquota_args gqa_uid
Output:

alias xdr_int xdr_gqa_uid;
enum bool _cmemberxdr_getquota_args_gqa_uid = true;

cdcl [args [noconst]] function

Checks to see if function is declared and outputs the declaration to the output file. If the args keyword is present, the number of arguments to the function is counted, and the check variables: _c_args_function, _c_arg_N_function, and c_type_function are written to the output file. _c_args_function indicates the number of arguments that should be passed to the function. _c_arg_N_function indicates the type of argument where N refers to the argument position. _c_type_function indicates the return type of the function. If the noconst keyword is present, all ’const’ keywords are stripped from the type. All C declarations are wrapped in an ’extern (C) { ... }’ block in the output file. The ’awk’ program is a requirement for this directive.

e.g.
cdcl args noconst setmntent
Output:

extern (C) {
FILE *setmntent (const char *_t_file, const char *_t_mode) ;
}
enum string _c_arg_1_setmntent = "char *";
enum string _c_arg_2_setmntent = "char *";
enum string _c_type_setmntent = "FILE *";
enum bool _cdcl_setmntent = true;
enum int _c_args_setmntent = 2;

See Also

iffe(1) autoconf(1) dist(7) mkconfig(7) mkconfig_c(7) mkconfig_env(7)

Bugs

Send bug reports to: brad.lanam.di_at_gmail.com

Website

http://www.gentoo.com/di/mkconfig.html

Author

This program is Copyright 2011-2012 by Brad Lanam, Walnut Creek CA

Brad Lanam, Walnut Creek, CA (brad.lanam.di_at_gmail.com)