summary refs log tree commit diff
path: root/pkgs/applications/virtualization/bochs/default.nix
blob: f5740dda4e9bb61c1b772de095ae855a4f564234 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
{ stdenv, fetchurl, config
, pkgconfig, libtool
, gtk, mesa, readline, libX11, libXpm
, docbook_xml_dtd_45, docbook_xsl
, sdlSupport ? true, SDL2 ? null
, termSupport ? true , ncurses ? null
, wxSupport ? true, wxGTK ? null
# Optional, undocumented dependencies
, wgetSupport ? false, wget ? null
, curlSupport ? false, curl ? null
}:

assert sdlSupport -> (SDL2 != null);
assert termSupport -> (ncurses != null);
assert wxSupport -> (gtk != null && wxGTK != null);
assert wgetSupport -> (wget != null);
assert curlSupport -> (curl != null);

stdenv.mkDerivation rec {

  name = "bochs-${version}";
  version = "2.6.8";

  src = fetchurl {
    url = "http://downloads.sourceforge.net/project/bochs/bochs/${version}/${name}.tar.gz";
    sha256 = "1kl5cmbz6qgg33j5vv9898nzdppp1rqgy24r5pv762aaj7q0ww3r";
  };

  # The huge list of configurable options
  # Blatantly based on ffmpeg expressions

  termSupport = config.bochs.termSupport or true;
  sdlSupport = config.bochs.sdlSupport or true;
  wxSupport = config.bochs.wxSupport or false;
  largefile = config.bochs.largefile or true;
  idleHack = config.bochs.idleHack or true;
  plugins = config.bochs.plugins or false; # Warning! Broken
  a20Pin = config.bochs.a20Pin or true;
  emulate64Bits = config.bochs.emulate64Bits or false;
  smp = config.bochs.smp or false;
  largeRamfile = config.bochs.largeRamfile or true;
  repeatSpeedups = config.bochs.repeatSpeedups or false;
  handlersChaining = config.bochs.handlersChaining or false;
  traceLinking = config.bochs.traceLinking or false;
  configurableMSRegs = config.bochs.configurableMSRegs or false;
  showIPS = config.bochs.showIPS or true;
  debugger = config.bochs.debugger or false;
  disasm = config.bochs.disasm or false;
  debuggerGui = config.bochs.debuggerGui or false;
  gdbStub = config.bochs.gdbStub or false;
  IODebug = config.Bochs.IODebug or false;
  fpu = config.bochs.fpu or true;
  svm = config.bochs.svm or false;
  avx = config.bochs.avx or false;
  evex = config.bochs.evex or false;
  x86Debugger = config.bochs.x86Debugger or false;
  pci = config.bochs.pci or true;
  uhci = config.bochs.uhci or false;
  ohci = config.bochs.ohci or false;
  ne2k = config.bochs.ne2k or true;
  pNIC = config.bochs.pNIC or true;
  e1000 = config.bochs.e1000 or true;
  clgd54xx = config.bochs.clgd54xx or true;
  voodoo = config.bochs.voodoo or true;
  cdrom = config.bochs.cdrom or true;
  sb16 = config.bochs.sb16 or true;
  es1370 = config.bochs.es1370 or true;
  gameport = config.bochs.gameport or true;
  busMouse = config.bochs.busMouse or false;

  buildInputs = with stdenv.lib;
  [ pkgconfig libtool gtk mesa readline libX11 libXpm docbook_xml_dtd_45 docbook_xsl ]
  ++ optionals termSupport [ ncurses ]
  ++ optionals sdlSupport [ SDL2 ]
  ++ optionals wxSupport [ wxGTK ]
  ++ optionals wgetSupport [ wget ]
  ++ optionals curlSupport [ curl ];

  configureFlags = [
    "--with-x=yes"
    "--with-x11=yes"

    "--with-rfb=no"
    "--with-vncsrv=no"
    "--with-svga=no" # it doesn't compile on NixOS
    "--with-wx=no"

    # These will always be "yes" on NixOS
    "--enable-ltdl-install=yes"
    "--enable-readline=yes"
    "--enable-all-optimizations=yes"
    "--enable-logging=yes"
    "--enable-xpm=yes"

    # ... whereas these, always "no"!
    "--enable-cpp=no"
    "--enable-instrumentation=no"

    "--enable-docbook=no" # Broken - it requires docbook2html

    # Dangerous options - they are marked as "incomplete/experimental" on Bochs documentation
    "--enable-3dnow=no"
    "--enable-usb-xhci=no"
    "--enable-monitor-mwait=no"
    "--enable-raw-serial=no" ]
    # Boolean flags
    ++ stdenv.lib.optional termSupport "--with-term"
    ++ stdenv.lib.optional sdlSupport "--with-sdl2"
    ++ stdenv.lib.optional wxSupport "--with-wx"
    ++ stdenv.lib.optional largefile "--enable-largefile"
    ++ stdenv.lib.optional idleHack "--enable-idle-hack"
    ++ stdenv.lib.optional plugins "--enable-plugins"
    ++ stdenv.lib.optional a20Pin "--enable-a20-pin"
    ++ stdenv.lib.optional emulate64Bits "--enable-x86-64"
    ++ stdenv.lib.optional smp "--enable-smp"
    ++ stdenv.lib.optional largeRamfile "--enable-large-ramfile"
    ++ stdenv.lib.optional repeatSpeedups "--enable-repeat-speedups"
    ++ stdenv.lib.optional handlersChaining "--enable-handlers-chaining"
    ++ stdenv.lib.optional traceLinking "--enable-trace-linking"
    ++ stdenv.lib.optional configurableMSRegs "--enable-configurable-msrs"
    ++ stdenv.lib.optional showIPS "--enable-show-ips"
    ++ stdenv.lib.optional debugger "--enable-debugger"
    ++ stdenv.lib.optional disasm "--enable-disasm"
    ++ stdenv.lib.optional debuggerGui "--enable-debugger-gui"
    ++ stdenv.lib.optional gdbStub "--enable-gdb-stub"
    ++ stdenv.lib.optional IODebug "--enable-iodebug"
    ++ stdenv.lib.optional fpu "--enable-fpu"
    ++ stdenv.lib.optional svm "--enable-svm"
    ++ stdenv.lib.optional avx "--enable-avx"
    ++ stdenv.lib.optional evex "--enable-evex"
    ++ stdenv.lib.optional x86Debugger "--enable-x86-debugger"
    ++ stdenv.lib.optional pci "--enable-pci"
    ++ stdenv.lib.optional uhci "--enable-usb"
    ++ stdenv.lib.optional ohci "--enable-usb-ohci"
    ++ stdenv.lib.optional ne2k "--enable-ne2000"
    ++ stdenv.lib.optional pNIC "--enable-pnic"
    ++ stdenv.lib.optional e1000 "--enable-e1000"
    ++ stdenv.lib.optional clgd54xx "--enable-clgd54xx"
    ++ stdenv.lib.optional voodoo "--enable-voodoo"
    ++ stdenv.lib.optional cdrom "--enable-cdrom"
    ++ stdenv.lib.optional sb16 "--enable-sb16"
    ++ stdenv.lib.optional es1370 "--enable-es1370"
    ++ stdenv.lib.optional busMouse "--enable-busmouse"
    ;

  NIX_CFLAGS_COMPILE="-I${gtk}/include/gtk-2.0/ -I${libtool}/include/";
  NIX_LDFLAGS="-L${libtool}/lib";

  hardening_format = false;

  meta = with stdenv.lib; {
    description = "An open-source IA-32 (x86) PC emulator";
    longDescription = ''
    Bochs is an open-source (LGPL), highly portable IA-32 PC emulator,
    written in C++, that runs on most popular platforms. It includes
    emulation of the Intel x86 CPU, common I/O devices, and a custom
    BIOS.
    '';
    homepage = http://bochs.sourceforge.net/;
    license = licenses.lgpl2Plus;
    maintainers = [ maintainers.AndersonTorres ];
    platforms = platforms.linux;
  };
}

# TODO: study config.bochs.* implementation (like config.ffmpeg.* options)
# TODO: investigate the wxWidgets problem (maybe upstream devteam didn't update wxGTK GUI)
# TODO: investigate svga support - the Bochs sources explicitly cite /usr/include/svga.h