Dno can be installed by downloading and unpacking a release tarball or by cloning from github.
Unless you want to hack on dno itself, installing from a tarball is the recommended option.
Dno is expected to run on any Unix-like operating system: Linux, BSD, MacOSX.
It is built using GNU
autotools, so any OS supported by
autotools should work. It is unlikely
that Windows(tm) will ever be supported.
Dno requires bash, make,
sed, gawk,
perl, and either dialog or
whiptail in order to run.
For building and installing dno, gcc is also
required.
To build documentation: pandoc,
xsltproc and the docbook xslt stylesheets (v5)
are required. Tarball-based installations provide pre-built
documentation so do not need these.
If you want to modify dno, you should also install
autotools.
Releases can be found in the github project releases directory: https://github.com/marcmunro/dno/tree/main/releases.
You can download a tarball by clicking on it and then finding and clicking on the "download raw file" button.
To unpack the tarball (this will create a new directory called
dno):
~$ tar xvzf dno_VERSION.tgz
Note: the v option above gives verbose
feedback. Use this to get a warm fuzzy feeling when you
unpack the tarball.
Move to the new dno directory and run
./configure:
~$ cd dno dno$ ./configure checking for sed... yes checking for gawk... yes checking for perl... yes checking for gcc... gcc checking whether the C compiler works... yes checking for C compiler default output file name... a.out checking for suffix of executables... checking whether we are cross compiling... no checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether gcc accepts -g... yes checking for gcc option to accept ISO C89... none needed checking for dialog... no checking for whiptail... /usr/bin/whiptail checking Checking terminal-based menu command... /usr/bin/whiptail checking for pandoc... /usr/bin/pandoc checking for xsltproc... /usr/bin/xsltproc checking for xmllint... /usr/bin/xmllint checking for DocBook stylesheet... /usr/share/xml/docbook/stylesheet/docbook-xsl-ns checking build system type... x86_64-unknown-linux-gnu checking host system type... x86_64-unknown-linux-gnu checking Checking arduino installation dir... /usr/share/arduino checking for /usr/share/arduino/hardware/arduino/avr/boards.txt... yes configure: creating ./config.status config.status: creating Makefile.global config.status: creating bin/dno_commands_for config.status: creating bin/dno_bpp config.status: creating bin/dno_dirinfo config.status: creating bin/dno_prog config.status: creating bin/dno_menu config.status: creating bin/dno_ino2c config.status: creating bin/dno config.status: creating man/BOARD_INFO.md config.status: creating man/BOARD_OPTIONS.md config.status: creating man/BOARD_TYPE.md config.status: creating man/dno.md config.status: creating man/dno_bpp.md config.status: creating man/dno_checksize.md config.status: creating man/dno_commands_for.md config.status: creating man/dno_dirinfo.md config.status: creating man/dno_menu.md config.status: creating man/dno_prog.md config.status: creating man/dno_requote.md config.status: creating man/dno_ino2c.md config.status: creating README.md config.status: creating docs/dno_vars.ent dno$
This determines where dno should be installed, among other
things. Note that this step will fail if you don't have the
basic pre-requisites (gawk,
sed, etc) installed. If it fails, install
the programs it is asking for, and run it again.
Now we build the dno_requote command and
prepare the dno man pages for installation using
make:
dno$ make
CC, LD [dno_requote]
PANDOC man/dno_bpp.1
PANDOC man/dno_checksize.1
PANDOC man/dno_commands_for.1
PANDOC man/dno_dirinfo.1
PANDOC man/dno_ino2c.1
PANDOC man/dno.1
PANDOC man/dno_menu.1
PANDOC man/dno_prog.1
PANDOC man/dno_requote.1
PANDOC man/BOARD_INFO.5
PANDOC man/BOARD_OPTIONS.5
PANDOC man/BOARD_TYPE.5
PANDOC docs/parts/BOARD_INFO.xml
PANDOC docs/parts/BOARD_OPTIONS.xml
PANDOC docs/parts/BOARD_TYPE.xml
PANDOC docs/parts/dno_bpp.xml
PANDOC docs/parts/dno_checksize.xml
PANDOC docs/parts/dno_commands_for.xml
PANDOC docs/parts/dno_dirinfo.xml
PANDOC docs/parts/dno_ino2c.xml
PANDOC docs/parts/dno.xml
PANDOC docs/parts/dno_menu.xml
PANDOC docs/parts/dno_prog.xml
PANDOC docs/parts/dno_requote.xml
XMLLINT docs/full_doc.xml
Creating importer for system base stylesheet for docs...
/usr/bin/xsltproc <docbook sources>.xml --> html/index.html
Computing chunks...
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Writing pr01.html for preface(introduction)
Writing ch01.html for chapter
Writing ch02.html for chapter
Writing ch03.html for chapter
Writing ch04.html for chapter
Writing ch05.html for chapter(directory-system)
Writing ch06.html for chapter
Writing ch07.html for chapter(docs)
Writing ch08.html for chapter
Writing ch09.html for chapter(benchmarks)
Writing ch10.html for chapter
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Writing ch11.html for chapter
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Writing apa.html for appendix
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Writing apb.html for appendix
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Writing apc.html for appendix
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Writing apd.html for appendix
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Writing ape.html for appendix
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Writing apf.html for appendix
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Writing apg.html for appendix
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Writing aph.html for appendix
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Writing api.html for appendix
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Writing apj.html for appendix
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Writing apk.html for appendix
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Unexpected appendix.autolabel value: ; using default.
Writing apl.html for appendix(gpl)
Writing index.html for book
Writing dno.css for book
dno$
If you happen to already have the tools installed that are needed for creating dno documentation, this step will build the documentation from source (as shown above) rather than using the distributed versions. Either way, you will now be ready to install.
Installation needs to be done as root. You can use
sudo if you must
[1], or become root using su and
run make install:
dno$ su Password: dno# make install Installing dno executables in /usr/local/bin Install dno man pages in /usr/local/share/man dno# exit dno$
That's it. You are done.
Note that if you install a new Arduino IDE after this, you should repeat the above installation steps. This will ensure that dno can find the newly installed Arduino tools.
The steps for this are much the same as for installing from
the tarball, but all build tools
must be installed. This means that in
addition to gawk, sed
perl, and gcc, the
following must also be present:
pandoc;
xmllint;
This can often be found in a package called
libxml2-utils.
xsltproc;
docbook5 stylesheets.
You may find these in a package called
docbook-xsl-ns.
When you run the following clone operation a new directory will be created under your current directory:
~$ git clone https://github.com/marcmunro/dno.git Cloning into 'dno'... remote: Enumerating objects: 278, done. remote: Counting objects: 100% (58/58), done. remote: Compressing objects: 100% (43/43), done. remote: Total 278 (delta 23), reused 42 (delta 15), pack-reused 220 (from 1) Receiving objects: 100% (278/278), 30.90 MiB | 4.29 MiB/s, done. Resolving deltas: 100% (157/157), done. ~$
Move to the new dno directory and run
./configure. Be sure to check the output
for any indication that our pre-requisites are not installed.
Run make. This should build everything,
including documentation and man pages from scratch.
[1] The big problem with sudo is that it is generally configured to allow an unprivileged user to do anything that root can do without the need for any password other than your own. What this means is that your user password becomes the single means of authentication for all administrative tasks. If you think this is unduly alarmist try typing
~$ sudo su -
Now you have a root shell. You can do absolutely anything at this point (though it may be audited), and you should be very concerned. Sudo was designed to allow non-root users to perform specific privileged tasks. In this mode of use it makes a lot of sense and poses little risk. Having sudo allow anything should be regarded as poor security practice.