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
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
|
Editor / IDE integration
========================
You can use any editor or IDE to contribute to Firefox, as long as it can edit
text files. However, there are some steps specific to mozilla-central that may
be useful for a better development experience. This page attempts to document
them.
.. note::
Visual Studio Code is the recommended editor for Firefox development.
Not because it is better than the other editors but because we decided to
focus our energy on a single editor.
.. note::
This page is a work in progress. Please enhance this page with instructions
for your favourite editor.
Visual Studio Code
------------------
.. toctree::
:hidden:
:maxdepth: 1
vscode
Go to :doc:`Visual Studio Code <vscode>` dedicated page.
VIM
---
AutoCompletion
~~~~~~~~~~~~~~
There's C++ and Rust auto-completion support for VIM via
`YouCompleteMe <https://github.com/ycm-core/YouCompleteMe/>`__. As long as that
is installed and you have run :code:`./mach build` or :code:`./mach configure`,
it should work out of the box. Configuration for this lives in
:code:`.ycm_extra_conf` at the root of the repo.
If you don't like YouCompleteMe, other solutions also work, but they'll require
you to create a :code:`compile_commands.json` file (see below for instructions).
Rust auto-completion should work both with the default completer (RLS, as of
this writing), or with `rust-analyzer <https://rust-analyzer.github.io/manual.html#youcompleteme>`__.
ESLint
~~~~~~
The easiest way to integrate ESLint with VIM is using the `Syntastic plugin
<https://github.com/vim-syntastic/syntastic>`__.
In order for VIM to detect jsm files as JS you might want something like this
in your :code:`.vimrc`:
.. code::
autocmd BufRead,BufNewFile *.jsm set filetype=javascript
:code:`mach eslint --setup` installs a specific ESLint version and some ESLint
plugins into the repositories' :code:`node_modules`.
You need something like this in your :code:`.vimrc` to run the checker
automatically on save:
.. code::
autocmd FileType javascript,html,xhtml let b:syntastic_checkers = ['javascript/eslint']
You need to have :code:`eslint` in your :code:`PATH`, which you can get with
:code:`npm install -g eslint`. You need at least version 6.0.0.
You can also use something like `eslint_d
<https://github.com/mantoni/eslint_d.js#editor-integration>`__ which should
also do that automatically:
.. code::
let g:syntastic_javascript_eslint_exec = 'eslint_d'
Emacs
-----
Mozilla-specific packages
~~~~~~~~~~~~~~~~~~~~~~~~~
ESLint
~~~~~~
See `the devtools documentation <https://wiki.mozilla.org/DevTools/CodingStandards#Running_ESLint_in_Emacs>`__
that describes how to integrate ESLint into Emacs.
C/C++ Development Packages
~~~~~~~~~~~~~~~~~~~~~~~~~~
General Guidelines to Emacs C++ Programming
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The following guides give an overview of the C++ editing capabilities of emacs.
It is worth reading through these guides to see what features are available.
The rest of this section is dedicated to Mozilla/Gecko specific setup for
packages.
* `C/C++ Development Environment for Emacs <https://tuhdo.github.io/c-ide.html>`__
* `Emacs as C++ IDE <https://syamajala.github.io/c-ide.html>`__
rtags (LLVM/Clang-based Code Indexing)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Instructions for the installation of rtags are available at the
`rtags github repo <https://github.com/Andersbakken/rtags>`__.
rtags requires a :ref:`compilation database <CompileDB back-end-compileflags>`.
In order for rtags to index correctly, included files need to be copied and
unified compilation files need to be created. Either run a full build of the
tree, or if you only want indexes to be generated for the moment, run the
following commands (assuming you're in the gecko repo root):
.. code::
cd gecko_build_directory
make export
./config.status
To increase indexing speed, it's best to remove unified build files and test
files from database updates. This can be done by creating a :code:`~/.rdmrc`
file with the following contents, with :code:`[src_dir]` replaced with either
the repo or build directory for your checkout:
.. code::
-X */[src_dir]/*Unified*;*/[src_dir]/*/test/*;*/[src_dir]/*/tests/*
Once the rdm daemon is running, the compilation database can be added to rtags
like so:
.. code::
rc -J [gecko_build_directory]/compile_commands.json
Note that this process will take a while initially. However, once the database
is built, it will only require incremental updates. As long as the rdm daemon
is running in the background, the database will be updated based on changes to
files.
irony (LLVM/Clang-based Code Completion)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Instructions on the installation of irony-mode are available at the
`irony-mode github repo <https://github.com/Sarcasm/irony-mode>`__.
irony-mode requires a :ref:`compilation database <CompileDB back-end-compileflags>`.
Note that irony-mode, by default, uses elisp to parse the
:code:`compile_commands.json` file. As gecko is a very large codebase, this
file can easily be multiple megabytes, which can make irony-mode take multiple
seconds to load on a gecko file.
It is recommended to use `this fork of irony-mode <https://github.com/Hylen/irony-mode/tree/compilation-database-guessing-4-pull-request>`__,
which requires the boost System and Filesystem libraries.
`Checking the bug to get this patch into the mainline of irony-mode <https://github.com/Sarcasm/irony-mode/issues/176>`__
is recommended, to see if the fork can be used or if the mainline repo can be
used. Using the Boost version of the irony-mode server brings file load times
to under 1s.
Projectile (Project Management)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Instructions on the installation of projectile are available at the
`projectile github repo <https://github.com/bbatsov/projectile>`__.
Projectile comes preconfigured for many project types. Since, gecko uses its
own special build system (mach), a new project type needs to be added. This can
be done via adding the following elisp configuration command to your emacs
configuration file.
.. code::
(projectile-register-project-type 'gecko
'("mach" "moz.build")
"python mach --log-no-times build"
"python mach mochitest"
"python mach run")
Assuming projectile-global-mode is on, this will allow projectile to run the
correct commands whenever it is working in a gecko repo.
gdb
^^^
Emacs comes with great integration with gdb, especially when using
`gdb-many-windows <https://www.gnu.org/software/emacs/manual/html_node/emacs/GDB-User-Interface-Layout.html>`__.
However, when gdb is invoked via mach, some special arguments
need to be passed in order to make sure the correct display mode is used. To
use M-x gdb with mach on firefox, use the following command:
.. code::
gecko_repo_directory/mach run --debug --debugparams=-i=mi
Eclipse
-------
You can generate an Eclipse project by running:
.. code::
./mach ide eclipse
See also the `Eclipse CDT <https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Eclipse/Eclipse_CDT>`__ docs on MDN.
Visual Studio
-------------
You can run a Visual Studio project by running:
.. code::
./mach ide visualstudio
.. _CompileDB back-end-compileflags:
CompileDB back-end / compileflags
---------------------------------
You can generate a :code:`compile_commands.json` in your object directory by
running:
.. code::
./mach build-backend --backend=CompileDB
This file, the compilation database, is understood by a variety of C++ editors / IDEs
to provide auto-completion capabilities. You can also get an individual compile command by
running:
.. code::
./mach compileflags path/to/file
This is how the :ref:`VIM <VIM>` integration works, for example.
|