# DEVELOPERS This file aims to describe an introduction for developers to work on the code base of radare2 project. ## Code style In order to contribute with patches or plugins we encourage you to use the same coding style as the rest of the code base. You may find some notes on this topic [here](https://github.com/radare/radare2/blob/master/CONTRIBUTING.md#coding-style-guidelines) and doc/vim. ### Editor configuration Vim/Neovim: ```vim setl cindent setl tabstop=4 setl noexpandtab setl cino=:0,+0,(2,J0,{1,}0,>4,)1,m2 ``` Emacs: ```elisp (c-add-style "radare2" '((c-basic-offset . 4) (tab-width . 4) (indent-tabs-mode . t) ;;;; You would need (put 'c-auto-align-backslashes 'safe-local-variable 'booleanp) to enable this ;; (c-auto-align-backslashes . nil) (c-offsets-alist (arglist-intro . ++) (arglist-cont . ++) (arglist-cont-nonempty . ++) (statement-cont . ++) ))) ``` You may use directory-local variables by putting ```elisp ((c-mode . ((c-file-style . "radare2")))) ``` into `.dir-locals.el`. ## Modules The radare2 code base is modularized into different libraries that are found in libr/ directory. The binr/ directory contains the programs that use the libraries. It is possible to generate PIC/nonPIC builds of the libraries and also to create a single static library, so you can use a single library archive (.a) to link your programs and get your programs using radare framework libraries without depending on them. See doc/static for more info. The following presentation gives a good overview of the libraries: http://radare.org/get/lacon-radare-2009/ ## API As mentioned in README.md, the API itself is maintained in a different repository. The API function definitions in C header files are derived from and documented in the radare2-bindings repository, found at: ```sh git clone git://github.com/radare/radare2-bindings ``` Currently the process of updating the header files from changed API bindings requires human intervention, to ensure that proper review occurs. Incorrect definitions in the C header files will trigger a build failure in the bindings repository. If you are able to write a plugin for various IDE that can associate the bindings with the header files, such a contribution would be very welcome. ## Dependencies radare2 can be built without any special dependency. It just requires a C compiler, a GNU make and a unix-like system. ## Cross compilation The instructions to crosscompile r2 to Windows are in doc/windows. You may find other documents in doc/ explaining how to build it on iOS, linux-arm and others, but the procedure is like this: - define `CC` - use a different compiler profile with `--with-compiler` - use a different OS with `--with-ostype` - type `make` - install in `DESTDIR` ## Source repository The source of radare2 can be found in the following github repository. ```sh git clone git://github.com/radare/radare2 ``` Other packages radare2 depends on, such as Capstone, are pull from their git repository as required. To get an up to date copy of the repository you should perform the following steps: ```sh git pull ``` If you have conflicts in your local copy it's because you have modified files which are conflicting with the incoming patchsets. To get a clean source directory type the following command: ```sh git clean -xdf git reset --hard ``` ## Compilation Inter-module rebuild dependencies are not handled automatically and require human interaction to recompile the affected modules. This is a common issue and can end up having outdated libraries trying to use deprecated structures which may result into segfaults. You have to make clean on the affected modules or just, if you are not sure enough that everything is ok just make clean the whole project. If you want to accelerate the build process after full make cleans you should use ccache in this way: ``` export CC="ccache gcc" ``` ## Installation Developers use to modify the code, type make and then try. radare2 have a specific makefile target that allows you to install system wide but using symlinks instead of hard copies. ```sh sudo make symstall ``` This kind of installation is really helpful if you do lot of changes in the code for various reasons. - only one install is required across multiple builds - installation time is much faster ## Regression testing The source of the radare2 regression test suite can be found in the following github repository. ```sh git clone git://github.com/radare/radare2-regressions ``` See the `README.md` file in that repository for further information. The existing test coverage can always do with improvement, so if you can contribute additions tests that would be gratefully accepted. ## Reporting bugs If you notice any misfeature, issue, error, problem or you just don't know how to do something which is supposed to be covered by this framework. You should report it into the github issues page. https://github.com/radare/radare2/issues Otherwise, if you are looking for some more feedback I will encourage you to send an email to any of the emails enumerated in the AUTHORS file. Anyway, if you want to get even more feedback and discuss this in a public place: join the #radare channel on irc.freenode.net. The issues page of Github contains a list of all the bugs that have been reported classified with labels by difficulty, type, milestone, etc. it is a good place to start if you are looking to contribute. ## Contributing with patches All the development happens in the git repository. It is good that all patches can be applied against the `git HEAD`. I can get patches in unidiff format like this: ```sh git diff > p ``` ## HOW TO RELEASE - Set `RELEASE=1` in global.mk and r2-bindings/config.mk.acr. - Use `bsdtar` from libarchive package. GNU tar is broken. RADARE2 --- - bump revision - `./configure` - `make dist` R2-BINDINGS --- - `./configure --enable-devel` - `make` - `make dist` - Update the i[paths on the website](https://github.com/radareorg/radareorg/blob/master/source/download_paths.rst) --pancake