File: getting-started.rst

package info (click to toggle)
ns3 3.46-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 105,864 kB
  • sloc: cpp: 624,863; python: 14,863; ansic: 6,772; makefile: 1,950; sh: 987; javascript: 167; perl: 102
file content (1419 lines) | stat: -rw-r--r-- 57,470 bytes parent folder | download
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
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
.. include:: replace.txt
.. highlight:: console

.. _Getting Started:

Getting Started
---------------

This section is aimed at getting a user to a working state starting
with a machine that may never have had |ns3| installed.  It covers
supported platforms, prerequisites, ways to obtain |ns3|, ways to
build |ns3|, and ways to verify your build and run simple programs.

Overview
********

|ns3| is built as a system of software libraries that work together.
User programs can be written that links with (or imports from) these
libraries.  User programs are written in either the C++ or Python
programming languages.

|ns3| is distributed as source code, meaning that the target system
needs to have a software development environment to build the libraries
first, then build the user program.  |ns3| could in principle be
distributed as pre-built libraries for selected systems, and in the
future it may be distributed that way, but at present, many users
actually do their work by editing |ns3| itself, so having the source
code around to rebuild the libraries is useful.  If someone would like
to undertake the job of making pre-built libraries and packages for
operating systems, please contact the ns-developers mailing list.

In the following, we'll look at three ways of downloading and building
|ns3|.  The first is to download and build an official release
from the main web site.  The second is to fetch and build development
copies of a basic |ns3| installation.  The third is to use an additional
build tool to download more extensions for |ns3|.  We'll walk through each
since the tools involved are slightly different.

Experienced Linux users may wonder at this point why |ns3| is not provided
like most other libraries using a package management tool?  Although there
exist some binary packages for various Linux distributions (e.g. Debian),
most users end up editing and having to rebuild the |ns3| libraries
themselves, so having the source code available is more convenient.
We will therefore focus on a source installation in this tutorial.

For most uses of |ns3|, root permissions are not needed, and the use of
a non-privileged user account is recommended.

Prerequisites
*************

The entire set of available |ns3| libraries has a number of dependencies
on third-party libraries, but most of |ns3| can be built and used with
support for a few common (often installed by default) components:  a
C++ compiler, an installation of Python, a source code editor (such as vim,
emacs, or Eclipse) and, if using the development repositories, an
installation of Git source code control system.  Most beginning users
need not concern themselves if their configuration reports some missing
optional features of |ns3|, but for those wishing a full installation,
the project provides an installation guide
for various systems, available at
https://www.nsnam.org/docs/installation/html/index.html.

As of the most recent |ns3| release (ns-3.44), the following tools
are needed to get started with |ns3|:

============  ===========================================================
Prerequisite  Package/version
============  ===========================================================
C++ compiler  ``clang++`` or ``g++`` (g++ version 9 or greater)
Python        ``python3`` version >=3.8
CMake         ``cmake`` version >=3.13
Build system  ``make``, ``ninja``, ``xcodebuild`` (XCode)
Git           any recent version (to access |ns3| from `GitLab.com <https://gitlab.com/nsnam/ns-3-dev/>`_)
tar           any recent version (to unpack an `ns-3 release <https://www.nsnam.org/releases/>`_)
bunzip2       any recent version (to uncompress an |ns3| release)
============  ===========================================================

To check the default version of Python, type ``python -V``.  To check
the default version of g++, type ``g++ -v``.  If your installation is
missing or too old, please consult the |ns3|
`installation guide <https://www.nsnam.org/docs/installation/html/index.html>`_ for guidance.

From this point forward, we are going to assume that the reader is working in
Linux, macOS, or a Linux emulation environment, and has at least the above
prerequisites.

For example, do not use a directory path such as the below, because one
of the parent directories contains a space in the directory name:

.. sourcecode:: console

  $ pwd
  /home/user/5G simulations/ns-3-dev

Downloading a release of ns-3 as a source archive
+++++++++++++++++++++++++++++++++++++++++++++++++

This option is for the new user who wishes to download and experiment with
the most recently released and packaged version of |ns3|.
|ns3| publishes its releases as compressed source archives, sometimes
referred to as a tarball.
A tarball is a particular format of software archive where multiple
files are bundled together and the archive is usually compressed.
The process for downloading |ns3| via tarball is simple; you just
have to pick a release, download it and uncompress it.

We recommend downloading the most recent release (highest release
number).  Prior to the ns-3.45 release, we offered one downloadable
source code archive, called ``ns-allinone-3.nn.tar.bz2`` (where ``nn``
stands for the release number), which contained the network animator
NetAnim, the bake build tool and the ns-3 release.  Starting with
ns-3.45, we offer two release archives:

#.  ``ns-3.45.tar.bz2``: Contains only ns-3
#.  ``ns-allinone-3.45.tar.bz2``: Contains ns-3 plus some compatible extension modules available in the `ns-3 App Store <https://apps.nsnam.org>`_

We will focus on the first option above.  The instructions for the second
one are basically the same, except that you will need to change into
the ``ns-3.nn`` directory after unpacking it.

Let's assume that you, as a user, wish to build |ns3| in a local
directory called ``workspace``.
If you adopt the ``workspace`` directory approach, you can
get a copy of a release by typing the following into your Linux shell
(substitute the appropriate version numbers, of course)

.. sourcecode:: console

  $ cd
  $ mkdir workspace
  $ cd workspace
  $ wget https://www.nsnam.org/release/ns-3.45.tar.bz2
  $ tar xjf ns-3.45.tar.bz2

Notice the use above of the ``wget`` utility, which is a command-line
tool to fetch objects from the web; if you do not have this installed,
you can use a browser for this step.

Following these steps, you should change into the directory ``ns-3.45``.
You are now ready to build the base |ns3| distribution and may skip ahead
to the section on building |ns3|.

Downloading ns-3 using Git
**************************

The |ns3| code is available in Git repositories on the GitLab.com service
at https://gitlab.com/nsnam/.  The group name ``nsnam`` organizes the
various repositories used by the open source project.

The simplest way to get started using Git repositories is to fork or clone
the ``ns-3-dev`` repository.
If you are new to Git, the terminology of ``fork`` and ``clone``
may be foreign to you; if so, we recommend that you simply ``clone``
(create your own replica) of the repository found on GitLab.com, as
follows:

.. sourcecode:: console

  $ cd
  $ mkdir workspace
  $ cd workspace
  $ git clone https://gitlab.com/nsnam/ns-3-dev.git
  $ cd ns-3-dev

Building ns-3
*************

|ns3| is built with
a build tool called ``CMake``, described below.  Most users will end up
working most directly with the ns3 command-line wrapper for CMake, for the sake
of convenience.

Building with the ns3 CMake wrapper
+++++++++++++++++++++++++++++++++++

The build process consists of two steps: a configuration stage, and then the
actual compilation.  The configuration stage is used to enable and disable
compiler optimizations and other options and to control the scope of the build.
The project will be configured
by default using the ``default`` build profile, which is an optimized
build with debug information (CMAKE_BUILD_TYPE=relwithdebinfo) version.
Let's tell the project to make an optimized build.

To maintain a similar interface for command-line users, we include a
wrapper script for CMake, |ns3|. To tell |ns3| that it should do optimized
builds that include the examples and tests, you will need to execute the
following commands:

.. sourcecode:: console

  $ ./ns3 clean
  $ ./ns3 configure --build-profile=optimized --enable-examples --enable-tests

This runs CMake out of the local directory (which is provided as a convenience
for you).  The first command to clean out the previous build is not
typically strictly necessary but is good practice (but see `Build Profiles`_,
below); it will remove the
previously built libraries and object files found in directory ``build/``.
When the project is reconfigured and the build system checks for various
dependencies, you should see
output that looks similar to the following:

.. sourcecode:: console

  $ ./ns3 configure --build-profile=optimized --enable-examples --enable-tests
  -- CCache is enabled. Precompiled headers are disabled by default.
  -- The CXX compiler identification is GNU 11.2.0
  -- The C compiler identification is GNU 11.2.0
  -- Detecting CXX compiler ABI info
  -- Detecting CXX compiler ABI info - done
  -- Check for working CXX compiler: /usr/bin/c++ - skipped
  -- Detecting CXX compile features
  -- Detecting CXX compile features - done
  -- Detecting C compiler ABI info
  -- Detecting C compiler ABI info - done
  -- Check for working C compiler: /usr/bin/cc - skipped
  -- Detecting C compile features
  -- Detecting C compile features - done
  -- Using default output directory /mnt/dev/tools/source/ns-3-dev/build
  -- Found GTK3_GTK: /usr/lib/x86_64-linux-gnu/libgtk-3.so
  -- GTK3 was found.
  -- LibXML2 was found.
  -- LibRT was found.
  -- Visualizer requires Python bindings
  -- Found Boost: /usr/lib/x86_64-linux-gnu/cmake/Boost-1.74.0/BoostConfig.cmake (found version "1.74.0")
  -- Found PkgConfig: /usr/bin/pkg-config (found version "0.29.2")
  -- GSL was found.
  -- Found Sphinx: /usr/bin/sphinx-build
  -- Looking for sys/types.h
  -- Looking for sys/types.h - found
  -- Looking for stdint.h
  -- Looking for stdint.h - found
  -- Looking for stddef.h
  -- Looking for stddef.h - found
  -- Check size of long long
  -- Check size of long long - done
  -- Check size of int128_t
  -- Check size of int128_t - failed
  -- Check size of __int128_t
  -- Check size of __int128_t - done
  -- Performing Test has_hash___int128_t
  -- Performing Test has_hash___int128_t - Success
  -- Check size of unsigned long long
  -- Check size of unsigned long long - done
  -- Check size of uint128_t
  -- Check size of uint128_t - failed
  -- Check size of __uint128_t
  -- Check size of __uint128_t - done
  -- Performing Test has_hash___uint128_t
  -- Performing Test has_hash___uint128_t - Success
  -- Looking for C++ include inttypes.h
  -- Looking for C++ include inttypes.h - found
  -- Looking for C++ include stat.h
  -- Looking for C++ include stat.h - not found
  -- Looking for C++ include dirent.h
  -- Looking for C++ include dirent.h - found
  -- Looking for C++ include stdlib.h
  -- Looking for C++ include stdlib.h - found
  -- Looking for C++ include signal.h
  -- Looking for C++ include signal.h - found
  -- Looking for C++ include netpacket/packet.h
  -- Looking for C++ include netpacket/packet.h - found
  -- Looking for getenv
  -- Looking for getenv - found
  -- Processing src/antenna
  -- Processing src/aodv
  -- Processing src/applications
  -- Processing src/bridge
  -- Processing src/brite
  -- Brite was not found
  -- Processing src/buildings
  -- Processing src/click
  -- Click was not found
  -- Processing src/config-store
  -- Processing src/core
  -- Looking for C++ include boost/units/quantity.hpp
  -- Looking for C++ include boost/units/quantity.hpp - found
  -- Looking for C++ include boost/units/systems/si.hpp
  -- Looking for C++ include boost/units/systems/si.hpp - found
  -- Boost Units have been found.
  -- Processing src/csma
  -- Processing src/csma-layout
  -- Processing src/dsdv
  -- Processing src/dsr
  -- Processing src/energy
  -- Processing src/fd-net-device
  -- Looking for C++ include net/ethernet.h
  -- Looking for C++ include net/ethernet.h - found
  -- Looking for C++ include netpacket/packet.h
  -- Looking for C++ include netpacket/packet.h - found
  -- Looking for C++ include net/if.h
  -- Looking for C++ include net/if.h - found
  -- Looking for C++ include linux/if_tun.h
  -- Looking for C++ include linux/if_tun.h - found
  -- Looking for C++ include net/netmap_user.h
  -- Looking for C++ include net/netmap_user.h - not found
  -- Looking for C++ include sys/ioctl.h
  -- Looking for C++ include sys/ioctl.h - found
  -- Checking for module 'libdpdk'
  --   No package 'libdpdk' found
  -- Processing src/flow-monitor
  -- Processing src/internet
  -- Processing src/internet-apps
  -- Processing src/lr-wpan
  -- Processing src/lte
  -- Processing src/mesh
  -- Processing src/mobility
  -- Processing src/netanim
  -- Processing src/network
  -- Processing src/nix-vector-routing
  -- Processing src/olsr
  -- Processing src/openflow
  -- Openflow was not found
  -- Processing src/point-to-point
  -- Processing src/point-to-point-layout
  -- Processing src/propagation
  -- Processing src/sixlowpan
  -- Processing src/spectrum
  -- Processing src/stats
  -- Processing src/tap-bridge
  -- Processing src/test
  -- Processing src/topology-read
  -- Processing src/traffic-control
  -- Processing src/uan
  -- Processing src/virtual-net-device
  -- Processing src/wifi
  -- ---- Summary of optional NS-3 features:
  Build profile                 : optimized
  Build directory               : /mnt/dev/tools/source/ns-3-dev/build
  BRITE Integration             : OFF (missing dependency)
  DES Metrics event collection  : OFF (not requested)
  DPDK NetDevice                : OFF (missing dependency)
  Emulation FdNetDevice         : ON
  Examples                      : ON
  File descriptor NetDevice     : ON
  GNU Scientific Library (GSL)  : ON
  GtkConfigStore                : ON
  MPI Support                   : OFF (not requested)
  NS-3 Click Integration        : OFF (missing dependency)
  NS-3 OpenFlow Integration     : OFF (missing dependency)
  Netmap emulation FdNetDevice  : OFF (missing dependency)
  PyViz visualizer              : OFF (missing dependency)
  Python Bindings               : OFF (not requested)
  Real Time Simulator           : ON
  SQLite stats support          : ON
  Tap Bridge                    : ON
  Tap FdNetDevice               : ON
  Tests                         : ON


  Modules configured to be built:
  antenna                   aodv                      applications
  bridge                    buildings                 config-store
  core                      csma                      csma-layout
  dsdv                      dsr                       energy
  fd-net-device             flow-monitor              internet
  internet-apps             lr-wpan                   lte
  mesh                      mobility                  netanim
  network                   nix-vector-routing        olsr
  point-to-point            point-to-point-layout     propagation
  sixlowpan                 spectrum                  stats
  tap-bridge                test                      topology-read
  traffic-control           uan                       virtual-net-device
  wifi


  Modules that cannot be built:
  brite                     click                     mpi
  openflow                  visualizer


  -- Configuring done
  -- Generating done
  -- Build files have been written to: /mnt/dev/tools/source/ns-3-dev/cmake-cache
  Finished executing the following commands:
  mkdir cmake-cache
  cd cmake-cache; /usr/bin/cmake -DCMAKE_BUILD_TYPE=release -DNS3_NATIVE_OPTIMIZATIONS=ON -DNS3_EXAMPLES=ON -DNS3_TESTS=ON -G Unix Makefiles .. ; cd ..


Note the last part of the above output.  Some |ns3| options are not enabled by
default or require support from the underlying system to work properly (``OFF (not requested)``).
Other options might depend on third-party libraries, which if not found will be disabled
(``OFF(missing dependency)``).
If this library were not found, the corresponding |ns3| feature
would not be enabled and a message would be displayed.  Note further that there is
a feature to use the program ``sudo`` to set the suid bit of certain programs.
This is not enabled by default and so this feature is reported as "not enabled."
Finally, to reprint this summary of which optional features are enabled, use
the ``show config`` option to ns3.

Now go ahead and switch back to the debug build that includes the examples and tests.

.. sourcecode:: console

  $ ./ns3 clean
  $ ./ns3 configure --build-profile=debug --enable-examples --enable-tests

The build system is now configured and you can build the debug versions of
the |ns3| programs by simply typing:

.. sourcecode:: console

  $ ./ns3 build

Although the above steps made you build the |ns3| part of the system twice,
now you know how to change the configuration and build optimized code.

A command exists for checking which profile is currently active
for an already configured project:

.. sourcecode:: console

  $ ./ns3 show profile
  Build profile: debug

Here are a few more introductory tips about CMake.

Handling build errors
=====================

|ns3| releases are tested against the most recent C++ compilers available
in the mainstream Linux and macOS distributions at the time of the release.
However, over time, newer distributions are released, with newer compilers,
and these newer compilers tend to be more pedantic about warnings.  |ns3|
configures its build to treat all warnings as errors, so it is sometimes
the case, if you are using an older release version on a newer system,
that a compiler warning will cause the build to fail.

For instance, ns-3.28 was released prior to Fedora 28, which included
a new major version of gcc (gcc-8).  Building ns-3.28 or older releases
on Fedora 28, when GTK+2 is installed, will result in an error such as::

  /usr/include/gtk-2.0/gtk/gtkfilechooserbutton.h:59:8: error: unnecessary parentheses in declaration of '__gtk_reserved1' [-Werror=parentheses]
   void (*__gtk_reserved1);

In releases starting with ns-3.28.1, an option is available in CMake to work
around these issues.  The option disables the inclusion of the '-Werror'
flag to g++ and clang++.  The option is '--disable-werror' and must be
used at configure time; e.g.:

.. sourcecode:: console

  ./ns3 configure --disable-werror --enable-examples --enable-tests

Configure vs. Build
===================

Some CMake commands are only meaningful during the configure phase and some commands are valid
in the build phase.  For example, if you wanted to use the emulation
features of |ns3|, you might want to enable setting the suid bit using
sudo as described above.  This turns out to be a configuration-time command, and so
you could reconfigure using the following command that also includes the examples and tests.

.. sourcecode:: console

  $ ./ns3 configure --enable-sudo --enable-examples --enable-tests

If you do this, ns3 will have run sudo to change the socket creator programs of the
emulation code to run as root.

There are many other configure- and build-time options
available in ns3.  To explore these options, type:

.. sourcecode:: console

  $ ./ns3 --help

We'll use some of the testing-related commands in the next section.

Build Profiles
==============

We already saw how you can configure CMake for ``debug`` or ``optimized`` builds:

.. sourcecode:: console

  $ ./ns3 configure --build-profile=debug

There is also an intermediate build profile, ``release``.  ``-d`` is a
synonym for ``--build-profile``.

The build profile controls the use of logging, assertions, and compiler optimization:

.. table:: Build profiles
    :widths: 10 28 30 30 32

    +----------+---------------------------------------------------------------------------------------------------------------------------------+
    | Feature  | Build Profile                                                                                                                   |
    +          +---------------------------------+-----------------------------+-------------------------------+---------------------------------+
    |          | ``debug``                       | ``default``                 | ``release``                   | ``optimized``                   |
    +==========+=================================+=============================+===============================+=================================+
    | Enabled  | ``NS3_BUILD_PROFILE_DEBUG``     | ``NS3_BUILD_PROFILE_DEBUG`` | ``NS3_BUILD_PROFILE_RELEASE`` | ``NS3_BUILD_PROFILE_OPTIMIZED`` |
    | Features | ``NS_LOG...``                   | ``NS_LOG...``               |                               |                                 |
    |          | ``NS_ASSERT...``                | ``NS_ASSERT...``            |                               |                                 |
    +----------+---------------------------------+-----------------------------+-------------------------------+---------------------------------+
    | Code     | ``NS_BUILD_DEBUG(code)``        | ``NS_BUILD_DEBUG(code)``    | ``NS_BUILD_RELEASE(code)``    | ``NS_BUILD_OPTIMIZED(code)``    |
    | Wrapper  |                                 |                             |                               |                                 |
    | Macro    |                                 |                             |                               |                                 |
    +----------+---------------------------------+-----------------------------+-------------------------------+---------------------------------+
    | Compiler | ``-Og -g``                      | ``-Os -g``                  | ``-O3``                       | ``-O3``                         |
    | Flags    |                                 |                             |                               | ``-march=native``               |
    |          |                                 |                             |                               | ``-mtune=native``               |
    +----------+---------------------------------+-----------------------------+-------------------------------+---------------------------------+

As you can see, logging and assertions are only configured
by default in debug builds, although they can be selectively enabled
in other build profiles by using the ``--enable-logs`` and
``--enable-asserts`` flags during CMake configuration time.
Recommended practice is to develop your scenario in debug mode, then
conduct repetitive runs (for statistics or changing parameters) in
optimized build profile.

If you have code that should only run in specific build profiles,
use the indicated Code Wrapper macro:

.. sourcecode:: cpp

  NS_BUILD_DEBUG(std::cout << "Part of an output line..." << std::flush; timer.Start());
  DoLongInvolvedComputation();
  NS_BUILD_DEBUG(timer.Stop(); std::cout << "Done: " << timer << std::endl;)

By default ns3 puts the build artifacts in the ``build`` directory.
You can specify a different output directory with the ``--out``
option, e.g.

.. sourcecode:: console

  $ ./ns3 configure --out=my-build-dir

Combining this with build profiles lets you switch between the different
compile options in a clean way:

.. sourcecode:: console

  $ ./ns3 configure --build-profile=debug --out=build/debug
  $ ./ns3 build
  ...
  $ ./ns3 configure --build-profile=optimized --out=build/optimized
  $ ./ns3 build
  ...

This allows you to work with multiple builds rather than always
overwriting the last build.  When you switch, ns3 will only compile
what it has to, instead of recompiling everything.

When you do switch build profiles like this, you have to be careful
to give the same configuration parameters each time.  It may be convenient
to define some environment variables to help you avoid mistakes:

.. sourcecode:: console

  $ export NS3CONFIG="--enable-examples --enable-tests"
  $ export NS3DEBUG="--build-profile=debug --out=build/debug"
  $ export NS3OPT=="--build-profile=optimized --out=build/optimized"

  $ ./ns3 configure $NS3CONFIG $NS3DEBUG
  $ ./ns3 build
  ...
  $ ./ns3 configure $NS3CONFIG $NS3OPT
  $ ./ns3 build

Compilers and Flags
===================

In the examples above, CMake uses the GCC C++ compiler, ``g++``, for
building |ns3|. However, it's possible to change the C++ compiler used by CMake
by defining the ``CXX`` environment variable.
For example, to use the Clang C++ compiler, ``clang++``,

.. sourcecode:: console

  $ CXX="clang++" ./ns3 configure
  $ ./ns3 build

One can also set up ns3 to do distributed compilation with ``distcc`` in
a similar way:

.. sourcecode:: console

  $ CXX="distcc g++" ./ns3 configure
  $ ./ns3 build

More info on ``distcc`` and distributed compilation can be found on it's
`project page
<https://code.google.com/p/distcc/>`_
under Documentation section.

To add compiler flags, use the ``CXXFLAGS_EXTRA`` environment variable when
you configure |ns3|.

Install
=======

ns3 may be used to install libraries in various places on the system.
The default location where libraries and executables are built is
in the ``build`` directory, and because ns3 knows the location of these
libraries and executables, it is not necessary to install the libraries
elsewhere.

If users choose to install things outside of the build directory, users
may issue the ``./ns3 install`` command.  By default, the prefix for
installation is ``/usr/local``, so ``./ns3 install`` will install programs
into ``/usr/local/bin``, libraries into ``/usr/local/lib``, and headers
into ``/usr/local/include``.  Superuser privileges are typically needed
to install to the default prefix, so the typical command would be
``sudo ./ns3 install``.  When running programs with ns3, ns3 will
first prefer to use shared libraries in the build directory, then
will look for libraries in the library path configured in the local
environment.  So when installing libraries to the system, it is good
practice to check that the intended libraries are being used.

Users may choose to install to a different prefix by passing the ``--prefix``
option at configure time, such as::

  ./ns3 configure --prefix=/opt/local

If later after the build the user issues the ``./ns3 install`` command, the
prefix ``/opt/local`` will be used.

The ``./ns3 clean`` command should be used prior to reconfiguring
the project if ns3 will be used to install things at a different prefix.

In summary, it is not necessary to call ``./ns3 install`` to use |ns3|.
Most users will not need this command since ns3 will pick up the
current libraries from the ``build`` directory, but some users may find
it useful if their use case involves working with programs outside
of the |ns3| directory.

Clean
=====

Cleaning refers to the removal of artifacts (e.g. files) generated or edited
by the build process.  There are different levels of cleaning possible:

+----------+-------------------+--------------------------------------------------------------------------------+
| Scope    | Command           | Description                                                                    |
+==========+===================+================================================================================+
| clean    | `./ns3 clean`     | Remove artifacts generated by the CMake configuration and the build            |
+----------+-------------------+--------------------------------------------------------------------------------+
| distclean| `./ns3 distclean` | Remove artifacts from the configuration, build, documentation, test and Python |
+----------+-------------------+--------------------------------------------------------------------------------+
| ccache   | `ccache -C`       | Remove all compiled artifacts from the ccache                                  |
+----------+-------------------+--------------------------------------------------------------------------------+

`clean` can be used if the focus is on reconfiguring the way that ns-3 is
presently being compiled.  `distclean` can be used if the focus is
on restoring the ns-3 directory to an original state.

The ccache lies outside of the ns-3 directory (typically in a hidden
directory at `~/.cache/ccache`) and is shared across projects.
Users should be aware that cleaning the ccache will cause cache misses
on other build directories outside of the current working directory.
Cleaning this cache periodically may be helpful to reclaim disk space.
Cleaning the ccache is completely separate from cleaning any files
within the ns-3 directory.

Because clean operations involve removing files, the option conservatively
refuses to remove files if one of the deleted files or directories lies
outside of the current working directory.  Users may wish to precede the
actual clean with a `--dry-run`, when in doubt about what the clean
command will do, because a dry run will print the warning if one exists.
For example::

  ./ns3 clean --dry-run
  ./ns3 clean

One ns3
=======

There is only one ns3 script, at the top level of the |ns3| source tree.
As you work, you may find yourself spending a lot of time in ``scratch/``,
or deep in ``src/...``, and needing to invoke ns3.  You could just
remember where you are, and invoke ns3 like this:

.. sourcecode:: console

  $ ../../../ns3 ...

but that gets tedious, and error prone, and there are better solutions.

One common way when using a text-based editor such as emacs or vim is to
open two terminal sessions and use one to build |ns3| and one to
edit source code.

If you only have the tarball, an environment variable can help:

.. sourcecode:: console

  $ export NS3DIR="$PWD"
  $ function ns3f { cd $NS3DIR && ./ns3 $* ; }

  $ cd scratch
  $ ns3f build

It might be tempting in a module directory to add a trivial ``ns3``
script along the lines of ``exec ../../ns3``.  Please don't.  It's
confusing to newcomers, and when done poorly it leads to subtle build
errors.  The solutions above are the way to go.

Building with CMake
+++++++++++++++++++

The ns3 wrapper script calls CMake directly, mapping Waf-like options
to the verbose settings used by CMake. Calling ``./ns3`` will execute
a series of commands, that will be shown at the end of their execution.
The execution of those underlying commands can be skipped to just
print them using ``./ns3 --dry-run``.

Here is are a few examples showing why we suggest the use of the ns3 wrapper script.

Configuration command
=====================

.. sourcecode:: console

  $ ./ns3 configure --enable-tests --enable-examples -d optimized

Corresponds to

.. sourcecode:: console

  $ cd /ns-3-dev/cmake-cache/
  $ cmake -DCMAKE_BUILD_TYPE=release -DNS3_NATIVE_OPTIMIZATIONS=ON -DNS3_ASSERT=OFF -DNS3_LOG=OFF -DNS3_TESTS=ON -DNS3_EXAMPLES=ON ..

Build command
=============

To build a specific target such as ``test-runner`` we use the following ns3 command:

.. sourcecode:: console

  $ ./ns3 build test-runner

Which corresponds to the following commands:

.. sourcecode:: console

  $ cd /ns-3-dev/cmake-cache/
  $ cmake --build . -j 16 --target test-runner # This command builds the test-runner target with the underlying build system


To build all targets such as modules, examples and tests, we use the following ns3 command:

.. sourcecode:: console

  $ ./ns3 build

Which corresponds to:

.. sourcecode:: console

  $ cd /ns-3-dev/cmake-cache/
  $ cmake --build . -j 16  # This command builds all the targets with the underlying build system

Run command
===========

.. sourcecode:: console

  $ ./ns3 run test-runner

Corresponds to:

.. sourcecode:: console

  $ cd /ns-3-dev/cmake-cache/
  $ cmake --build . -j 16 --target test-runner # This command builds the test-runner target calling the underlying build system
  $ export PATH=$PATH:/ns-3-dev/build/:/ns-3-dev/build/lib:/ns-3-dev/build/bindings/python # export library paths
  $ export LD_LIBRARY_PATH=/ns-3-dev/build/:/ns-3-dev/build/lib:/ns-3-dev/build/bindings/python
  $ export PYTHON_PATH=/ns-3-dev/build/:/ns-3-dev/build/lib:/ns-3-dev/build/bindings/python
  $ /ns-3-dev/build/utils/ns3-dev-test-runner-optimized # call the executable with the real path

Note: the command above would fail if ``./ns3 build`` was not executed first,
since the examples won't be built by the test-runner target.

On Windows, the Msys2/MinGW64/bin directory path must be on the PATH environment variable,
otherwise the DLL's required by the C++ runtime will not be found, resulting in crashes
without any explicit reasoning.

Note: The ns-3 script adds only the ns-3 lib directory path to the PATH,
ensuring the ns-3 DLLs will be found by running programs. If you are using CMake directly or
an IDE, make sure to also include the path to ns-3-dev/build/lib in the PATH variable.

.. _setx : https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/setx/

If you are using one of Windows's terminals (CMD, PowerShell or Terminal), you can use the `setx`_
command to change environment variables permanently or `set` to set them temporarily for that shell:

.. sourcecode:: console

  C:\\Windows\\system32>echo %PATH%
  C:\\Windows\\system32;C:\\Windows;D:\\tools\\msys64\\mingw64\\bin;

  C:\\Windows\\system32>setx PATH "%PATH%;D:\\tools\\msys64\\usr\\bin;" /m

  C:\\Windows\\system32>echo %PATH%
  C:\\Windows\\system32;C:\\Windows;D:\\tools\\msys64\\mingw64\\bin;
  D:\\tools\\msys64\\usr\\bin;

Note: running on an administrator terminal will change the system PATH,
while the user terminal will change the user PATH, unless the `/m` flag is added.


Building with IDEs
++++++++++++++++++

With CMake, IDE integration is much easier. We list the steps on how to use ns-3 with a few IDEs.

Microsoft Visual Studio Code
============================

Start by downloading `VS Code <https://code.visualstudio.com/>`_.

Then install it and then install the CMake and C++ plugins.

This can be done accessing the extensions' menu button on the left.

.. figure:: ../figures/vscode/install_cmake_tools.png

.. figure:: ../figures/vscode/install_cpp_tools.png

It will take a while, but it will locate the available toolchains for you to use.

After that, open the ns-3-dev folder. It should run CMake automatically and preconfigure it.

.. figure:: ../figures/vscode/open_project.png

After this happens, you can choose ns-3 features by opening the CMake cache and toggling them on or off.

.. figure:: ../figures/vscode/open_cmake_cache.png

.. figure:: ../figures/vscode/configure_ns3.png

Just as an example, here is how to enable examples

.. figure:: ../figures/vscode/enable_examples_and_save_to_reload_cache.png

After saving the cache, CMake will run, refreshing the cache. Then VsCode will update its
list of targets on the left side of the screen in the CMake menu.

After selecting a target on the left side menu, there are options to build, run or debug it.

.. figure:: ../figures/vscode/select_target_build_and_debug.png

Any of them will automatically build the selected target.
If you choose run or debug, the executable targets will be executed.
You can open the source files you want, put some breakpoints and then click debug to visually debug programs.

.. figure:: ../figures/vscode/debugging.png

Note: If you are running on Windows, you need to manually add your ns-3 library directory
to the ``PATH`` environment variable. This can be accomplished in two ways.

The first, is to set VSCode's ``settings.json`` file to include the following:

.. sourcecode:: json

  "cmake.environment": {
        "PATH": "${env:PATH};${workspaceFolder}/build/lib"
    }

The second, a more permanent solution, with the following command:

.. sourcecode:: console

  > echo %PATH%
  C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;
  C:\Windows\System32\OpenSSH\;C:\Program Files\dotnet\;C:\Program Files\PuTTY\;C:\Program Files\VSCodium\bin;
  C:\Program Files\Meld\;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\system32;C:\Windows;
  C:\Windows\System32\Wbem;C:\Windows\System32\OpenSSH\;C:\Program Files\dotnet\;C:\Program Files\PuTTY\;
  C:\Program Files\VSCodium\bin;C:\Program Files\Meld\;C:\Users\username\AppData\Local\Microsoft\WindowsApps;

  > setx PATH "%PATH%;C:\path\to\ns-3-dev\build\lib"

  SUCCESS: Specified value was saved.

  > echo %PATH%
  C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;
  ...
  C:\Program Files\VSCodium\bin;C:\Program Files\Meld\;C:\Users\username\AppData\Local\Microsoft\WindowsApps;
  C:\tools\source\ns-3-dev\build\lib;

If you do not setup your ``PATH`` environment variable, you may end up having problems to debug that
look like the following:

.. sourcecode:: console

  =thread-group-added,id="i1"
  GNU gdb (GDB) 14.1
  Copyright (C) 2023 Free Software Foundation, Inc.
  License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
  ...
  ERROR: Unable to start debugging. GDB exited unexpectedly.
  The program 'C:\tools\source\ns-3-dev\build\examples\wireless\ns3-dev-wifi-he-network-debug.exe' has exited with code 0 (0x00000000).

  ERROR: During startup program exited with code 0xc0000135.

Or

.. sourcecode:: console

  =thread-group-added,id="i1"
  GNU gdb (GDB) 14.1
  Copyright (C) 2023 Free Software Foundation, Inc.
  License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
  ...
  ERROR: Unable to start debugging. Unexpected GDB output from command "-exec-run". During startup program exited with code 0xc0000135.
  The program 'C:\tools\source\ns-3-dev\build\examples\wireless\ns3-dev-wifi-he-network-debug.exe' has exited with code 0 (0x00000000).

JetBrains CLion
===============

Start by downloading `CLion <https://www.jetbrains.com/clion/>`_.


The following image contains the toolchain configuration window for
CLion running on Windows (only WSLv2 is currently supported).

.. figure:: ../figures/clion/toolchains.png

CLion uses Makefiles for your platform as the default generator.
Here you can choose a better generator like `ninja` by setting the cmake options flag to `-G Ninja`.
You can also set options to enable examples (`-DNS3_EXAMPLES=ON`) and tests (`-DNS3_TESTS=ON`).

.. figure:: ../figures/clion/cmake_configuration.png

To refresh the CMake cache, triggering the discovery of new targets (libraries, executables and/or modules),
you can either configure to re-run CMake automatically after editing CMake files (pretty slow and easily
triggered) or reload it manually. The following image shows how to trigger the CMake cache refresh.

.. figure:: ../figures/clion/reload_cache.png

After configuring the project, the available targets are listed in a drop-down list on the top right corner.
Select the target you want and then click the hammer symbol to build, as shown in the image below.

.. figure:: ../figures/clion/build_targets.png

If you have selected and executable target, you can click either the play button to execute the program;
the bug to debug the program; the play button with a chip, to run Valgrind and analyze memory usage,
leaks and so on.

.. figure:: ../figures/clion/run_target.png

Code::Blocks
============

Start by installing `Code::Blocks <https://www.codeblocks.org/>`_.

Code::Blocks does not support CMake project natively, but we can use the corresponding CMake
generator to generate a project in order to use it. The generator name depends on the operating
system and underlying build system. https://cmake.org/cmake/help/latest/generator/CodeBlocks.html

.. sourcecode:: console

  $ ./ns3 configure -G"CodeBlocks - Ninja" --enable-examples

  ...

  $ -- Build files have been written to: /ns-3-dev/cmake-cache


There will be a NS3.cbp file inside the cache folder used during configuration (in this case cmake-cache).
This is a Code::Blocks project file that can be opened by the IDE.

When you first open the IDE, you will be greeted by a window asking you to select the compiler you want.

.. figure:: ../figures/codeblocks/compiler_detection.png

After that you will get into the landing page where you can open the project.

.. figure:: ../figures/codeblocks/landing.png

Loading it will take a while.

.. figure:: ../figures/codeblocks/open_project.png

After that we can select a target in the top menu (where it says "all") and click to build, run or debug.
We can also set breakpoints on the source code.

.. figure:: ../figures/codeblocks/breakpoint_and_debug.png

After clicking to build, the build commands of the underlying build system will be printed in the tab at the bottom.
If you clicked to debug, the program will start automatically and stop at the first breakpoint.

.. figure:: ../figures/codeblocks/build_finished_breakpoint_waiting.png

You can inspect memory and the current stack enabling those views in Debug->Debugging Windows->Watches and Call Stack.
Using the debugging buttons, you can advance line by line, continue until the next breakpoint.

.. figure:: ../figures/codeblocks/debug_watches.png

Note: as Code::Blocks doesn't natively support CMake projects, it doesn't refresh the CMake cache, which means you
will need to close the project, run the ``./ns3`` command to refresh the CMake caches after adding/removing
source files to/from the CMakeLists.txt files, adding a new module or dependencies between modules.

Apple XCode
============

Start by installing `XCode <https://developer.apple.com/xcode/>`_.
Then open it for the first time and accept the license.
Then open Xcode->Preferences->Locations and select the command-line tools location.

.. figure:: ../figures/xcode/select_command_line.png

XCode does not support CMake project natively, but we can use the corresponding CMake
generator to generate a project in order to use it. The generator name depends on the operating
system and underlying build system. https://cmake.org/cmake/help/latest/generator/Xcode.html

.. sourcecode:: console

  $ ./ns3 configure -GXcode --enable-examples

  ...

  $ -- Build files have been written to: /ns-3-dev/cmake-cache


There will be a NS3.xcodeproj file inside the cache folder used during configuration
(in this case cmake-cache). This is a XCode project file that can be opened by the IDE.

Loading the project will take a while, and you will be greeted with the following prompt.
Select to automatically create the schemes.

.. figure:: ../figures/xcode/create_schemes.png

After that we can select a target in the top menu and click to run, which will build and run
(if executable, or debug if build with debugging symbols).

.. figure:: ../figures/xcode/target_dropdown.png

After clicking to build, the build will start and progress is shown in the top bar.

.. figure:: ../figures/xcode/select_target_and_build.png

Before debugging starts, Xcode will request for permissions to attach to the process
(as an attacker could pretend to be a debugging tool and steal data from other processes).

.. figure:: ../figures/xcode/debug_permission_to_attach.png

After attaching, we are greeted with profiling information and call stack on the left panel,
source code, breakpoint and warnings on the central panel. At the bottom there are the memory
watches panel in the left and the output panel on the right, which is also used to read the command line.

.. figure:: ../figures/xcode/profiling_stack_watches_output.png


Note: as XCode doesn't natively support CMake projects, it doesn't refresh the CMake cache, which means you
will need to close the project, run the ``./ns3`` command to refresh the CMake caches after adding/removing
source files to/from the CMakeLists.txt files, adding a new module or dependencies between modules.


Testing ns-3
************

You can run the unit tests of the |ns3| distribution by running the
``./test.py`` script:

.. sourcecode:: console

  $ ./test.py --no-build

These tests are run in parallel by ns3. You should eventually
see a report saying that

.. sourcecode:: text

  92 of 92 tests passed (92 passed, 0 failed, 0 crashed, 0 valgrind errors)

This is the important message to check for; failures, crashes, or valgrind
errors indicate problems with the code or incompatibilities between the
tools and the code.

You will also see the summary output from ns3 and the test runner
executing each test, which will actually look something like:

.. sourcecode:: console

  -- CCache is enabled
  -- The CXX compiler identification is GNU 11.2.0
  -- The C compiler identification is GNU 11.2.0

  ...

  -- Configuring done
  -- Generating done
  -- Build files have been written to: /ns-3-dev/cmake-cache

  ...
  Scanning dependencies of target tap-creator
  [  1%] Building CXX object src/fd-net-device/CMakeFiles/tap-device-creator.dir/helper/tap-device-creator.cc.o
  [  1%] Building CXX object src/tap-bridge/CMakeFiles/tap-creator.dir/model/tap-creator.cc.o
  [  1%] Building CXX object src/fd-net-device/CMakeFiles/raw-sock-creator.dir/helper/creator-utils.cc.o
  [  1%] Building CXX object src/tap-bridge/CMakeFiles/tap-creator.dir/model/tap-encode-decode.cc.o
  [  1%] Linking CXX executable ../../../build/src/fd-net-device/ns3-dev-tap-device-creator

   ...

  [100%] Linking CXX executable ../../../build/examples/matrix-topology/ns3-dev-matrix-topology
  [100%] Built target manet-routing-compare
  [100%] Built target matrix-topology
  [1/742] PASS: TestSuite aodv-routing-id-cache
  [2/742] PASS: TestSuite routing-aodv
  [3/742] PASS: TestSuite uniform-planar-array-test
  [4/742] PASS: TestSuite angles

  ...

  [740/742] PASS: Example src/wifi/examples/wifi-manager-example --wifiManager=MinstrelHt --standard=802.11ax-6GHz --serverChannelWidth=160 --clientChannelWidth=160 --serverShortGuardInterval=3200 --clientShortGuardInterval=3200 --serverNss=4 --clientNss=4 --stepTime=0.1
  [741/742] PASS: Example src/lte/examples/lena-radio-link-failure --numberOfEnbs=2 --useIdealRrc=0 --interSiteDistance=700 --simTime=17
  [742/742] PASS: Example src/lte/examples/lena-radio-link-failure --numberOfEnbs=2 --interSiteDistance=700 --simTime=17
  739 of 742 tests passed (739 passed, 3 skipped, 0 failed, 0 crashed, 0 valgrind errors)


This command is typically run by users to quickly verify that an
|ns3| distribution has built correctly.  (Note the order of the ``PASS: ...``
lines can vary, which is okay.  What's important is that the summary line at
the end report that all tests passed; none failed or crashed.)

Both ns3 and ``test.py`` will split up the job on the available CPU cores
of the machine, in parallel.

Running a Script
****************

We typically run scripts under the control of ns3.  This allows the build
system to ensure that the shared library paths are set correctly and that
the libraries are available at run time.  To run a program, simply use the
``--run`` option in ns3.  Let's run the |ns3| equivalent of the
ubiquitous hello world program by typing the following:

.. sourcecode:: console

  $ ./ns3 run hello-simulator

ns3 first checks to make sure that the program is built correctly and
executes a build if required.  ns3 then executes the program, which
produces the following output.

.. sourcecode:: text

  Hello Simulator

Congratulations!  You are now an ns-3 user!

**What do I do if I don't see the output?**

If you see ns3 messages indicating that the build was
completed successfully, but do not see the "Hello Simulator" output,
chances are that you have switched your build mode to ``optimized`` in
the `Building with the ns3 CMake wrapper`_ section, but have missed the change back to
``debug`` mode.  All of the console output used in this tutorial uses a
special |ns3| logging component that is useful for printing
user messages to the console.  Output from this component is
automatically disabled when you compile optimized code -- it is
"optimized out."  If you don't see the "Hello Simulator" output,
type the following:

.. sourcecode:: console

  $ ./ns3 configure --build-profile=debug --enable-examples --enable-tests

to tell ns3 to build the debug versions of the |ns3|
programs that includes the examples and tests.  You must still build
the actual debug version of the code by typing

.. sourcecode:: console

  $ ./ns3

Now, if you run the ``hello-simulator`` program, you should see the
expected output.

Program Arguments
+++++++++++++++++

To feed command line arguments to an |ns3| program use this pattern:

.. sourcecode:: console

  $ ./ns3 run <ns3-program> --command-template="%s <args>"

Substitute your program name for ``<ns3-program>``, and the arguments
for ``<args>``.  The ``--command-template`` argument to ns3 is
basically a recipe for constructing the actual command line ns3 should use
to execute the program.  ns3 checks that the build is complete,
sets the shared library paths, then invokes the executable
using the provided command line template,
inserting the program name for the ``%s`` placeholder.

If you find the above to be syntactically complicated, a simpler variant
exists, which is to include the |ns3| program and its arguments enclosed
by single quotes, such as:

.. sourcecode:: console

  $ ./ns3 run '<ns3-program> --arg1=value1 --arg2=value2 ...'

Another particularly useful example is to run a test suite by itself.
Let's assume that a ``mytest`` test suite exists (it doesn't).
Above, we used the ``./test.py`` script to run a whole slew of
tests in parallel, by repeatedly invoking the real testing program,
``test-runner``.  To invoke ``test-runner`` directly for a single test:

.. sourcecode:: console

  $ ./ns3 run test-runner --command-template="%s --suite=mytest --verbose"

This passes the arguments to the ``test-runner`` program.
Since ``mytest`` does not exist, an error message will be generated.
To print the available ``test-runner`` options:

.. sourcecode:: console

  $ ./ns3 run test-runner --command-template="%s --help"

Debugging
+++++++++

To run |ns3| programs under the control of another utility, such as
a debugger (*e.g.* ``gdb``) or memory checker (*e.g.* ``valgrind``),
you use a similar ``--command-template="..."`` form.

For example, to run your |ns3| program ``hello-simulator`` with the arguments
``<args>`` under the ``gdb`` debugger:

.. sourcecode:: console

  $ ./ns3 run hello-simulator --command-template="gdb %s --args <args>"

Notice that the |ns3| program name goes with the ``--run`` argument,
and the control utility (here ``gdb``) is the first token
in the ``--command-template`` argument.  The ``--args`` tells ``gdb``
that the remainder of the command line belongs to the "inferior" program.
(Some ``gdb``'s don't understand the ``--args`` feature.  In this case,
omit the program arguments from the ``--command-template``,
and use the ``gdb`` command ``set args``.)

We can combine this recipe and the previous one to run a test under the
debugger:

.. sourcecode:: console

  $ ./ns3 run test-runner --command-template="gdb %s --args --suite=mytest --verbose"

Working Directory
+++++++++++++++++

ns3 needs to run from its location at the top of the |ns3| tree.
This becomes the working directory where output files will be written.
But what if you want to keep those files out of the |ns3| source tree?  Use
the ``--cwd`` argument:

.. sourcecode:: console

  $ ./ns3 run program-name --cwd=...

We mention this ``--cwd`` command for completeness; most users will simply
run ns3 from the top-level directory and generate the output data files there.

Running without Building
++++++++++++++++++++++++

As of the ns-3.30 release, a new ns3 option was introduced to allow the
running of programs while skipping the build step.  This can reduce the time
to run programs when, for example, running the same program repeatedly
through a shell script, or when demonstrating program execution.
The option ``--no-build`` modifies the ``run`` option,
skipping the build steps of the program and required ns-3 libraries.

.. sourcecode:: console

  $ ./ns3 run '<ns3-program> --arg1=value1 --arg2=value2 ...' --no-build

Build version
+++++++++++++

As of the ns-3.32 release, a new ns3 configure option ``--enable-build-version``
was introduced which inspects the local ns3 git repository during builds and adds
version metadata to the core module.

This configuration option has the following prerequisites:

- The ns-3 directory must be part of a local git repository
- The local git repository must have at least one ns-3 release tag

or

- A file named version.cache, containing version information, is located in the
  src/core directory

If these prerequisites are not met, the configuration will fail.

When these prerequisites are met and ns-3 is configured with the
``--enable-build-version`` option, the ns3 command ``show version`` can be
used to query the local git repository and display the current version metadata.

.. sourcecode:: console

  $ ./ns3 show version

ns3 will collect information about the build and print out something similar
to the output below.

.. sourcecode:: text

  ns-3.33+249@g80e0dd0-dirty-debug

If ``show version`` is run when ``--enable-build-version`` was not configured,
an error message indicating that the option is disabled will be displayed instead.

.. sourcecode:: text

  Build version support is not enabled, reconfigure with --enable-build-version flag

The build information is generated by examining the current state of the git
repository.  The output of  ``show version`` will change whenever the state
of the active branch changes.

The output of ``show version`` has the following format:

.. sourcecode:: text

  <version_tag>[+closest_tag][+distance_from_tag]@<commit_hash>[-tree_state]-<profile>

version_tag
  version_tag contains the version of the ns-3 code.  The version tag is
  defined as a git tag with the format ns-3*.  If multiple git tags match the
  format, the tag on the active branch which is closest to the current commit
  is chosen.

closest_tag
  closest_tag is similar to version_tag except it is the first tag found,
  regardless of format.  The closest tag is not included in the output when
  closest_tag and version_tag have the same value.

distance_from_tag
  distance_from_tag contains the number of commits between the current commit
  and closest_tag.  distance_from_tag is not included in the output when the
  value is 0 (i.e. when closest_tag points to the current commit)

commit_hash
  commit_hash is the hash of the commit at the tip of the active branch. The
  value is 'g' followed by the first 7 characters of the commit hash. The 'g'
  prefix is used to indicate that this is a git hash.

tree_state
  tree_state indicates the state of the working tree.  When the working tree
  has uncommitted changes this field has the value 'dirty'.  The tree state is
  not included in the version output when the working tree is clean (e.g. when
  there are no uncommitted changes).

profile
  The build profile specified in the ``--build-profile`` option passed to
  ``ns3 configure``

A new class, named Version, has been added to the core module.  The Version class
contains functions to retrieve individual fields of the build version as well
as functions to print the full build version like ``show version``.
The ``build-version-example``  application provides an example of how to use
the Version class to retrieve the various build version fields.  See the
documentation for the Version class for specifics on the output of the Version
class functions.

The version information stored in the Version class is updated every time the
git repository changes.  This may lead to frequent recompilations/linking of
the core module when the ``--enable-build-version`` option is configured.

.. sourcecode:: text

  build-version-example:
  Program Version (according to CommandLine): ns-3.33+249@g80e0dd0-dirty-debug

  Version fields:
  LongVersion:        ns-3.33+249@g80e0dd0-dirty-debug
  ShortVersion:       ns-3.33+*
  BuildSummary:       ns-3.33+*
  VersionTag:         ns-3.33
  Major:              3
  Minor:              33
  Patch:              0
  ReleaseCandidate:
  ClosestAncestorTag: ns-3.33
  TagDistance:        249
  CommitHash:         g80e0dd0
  BuildProfile:       debug
  WorkingTree:        dirty

The CommandLine class has also been updated to support the ``--version``
option which will print the full build version and exit.

.. sourcecode:: text

  ./ns3 run "command-line-example --version" --no-build
  ns-3.33+249@g80e0dd0-dirty-debug

If the ``--enable-build-version`` option was not configured, ``--version``
will print out a message similar to ``show version`` indicating that the build
version option is not enabled.

Source version
++++++++++++++

An alternative to storing build version information in the |ns3| libraries
is to track the source code version used to build the code.  When using
Git, the following recipe can be added to Bash shell scripts to
create a ``version.txt`` file with Git revision information, appended
with a patch of any changes to that revision if the repository is dirty.
The resulting text file can then be saved with any corresponding
|ns3| simulation results.

.. sourcecode:: console

  echo `git describe` > version.txt
  gitDiff=`git diff`
  if [[ $gitDiff ]]
  then
      echo "$gitDiff" >> version.txt
  fi