Network Simulator - ns-3: Difference between revisions

From NixOS Wiki
imported>EyJhb
ns-3 is a discrete-event network simulator for Internet systems, targeted primarily for research and educational use. This shows how to do development using ns-3
 
Artturin (talk | contribs)
Improve nix expr for cross compilation combatibility, builds without clang, make the makefile work.
 
(2 intermediate revisions by 2 users not shown)
Line 3: Line 3:
== Developing with ns-3 ==
== Developing with ns-3 ==
ns-3 heavily relies on way for running simulations (examples, tutorials, etc.), but we can start developing using a simple Makefile and a shell.nix.
ns-3 heavily relies on way for running simulations (examples, tutorials, etc.), but we can start developing using a simple Makefile and a shell.nix.
We will use [https://www.nsnam.org/doxygen/hello-simulator_8cc_source.html hello-simulator.cc] for this example.
We will use [https://www.nsnam.org/docs/release/3.43/doxygen/d4/d87/hello-simulator_8cc_source.html hello-simulator.cc] for this example.


First create a <code>shell.nix</code>, with the requirements to compile our simulation.
First create a <code>shell.nix</code>, with the requirements to compile our simulation.


<syntaxhighlight lang="nix">
<syntaxhighlight lang="nix">
with import <nixpkgs> {};
{
 
  pkgs ? import <nixpkgs> { },
mkShell {
}:
  buildInputs = with pkgs; [
pkgs.callPackage (
     ns-3
  {
     clang
    mkShell,
     pkg-config
    pkg-config,
  ];
     ns-3,
}
  }:
  mkShell {
     strictDeps = true;
     nativeBuildInputs = [ pkg-config ];
    buildInputs = [ ns-3 ];
  }
) { }
</syntaxhighlight>
</syntaxhighlight>


Then we can create our <code>Makefile</code>, do note the LIBS argument, which is the modules required (not all are build by default, might have to override some settings in ns-3).
Then we can create our <code>Makefile</code>, do note the LIBS argument, which is the modules required (not all are build by default, might have to override some settings in ns-3).


<syntaxhighlight>
<syntaxhighlight lang="make">
# the compiler: gcc for C program, define as g++ for C++
CC ?= gcc
CC = clang++
CXX ?= g++
PKG_CONFIG ?= pkg-config


DEBUG=-DNS3_LOG_ENABLE
DEBUG=-DNS3_LOG_ENABLE


LIBS = libns3-dev-core-debug
LIBS = ns3-core


# compiler flags:
# compiler flags:
#  -g    adds debugging information to the executable file
#  -g    adds debugging information to the executable file
#  -Wall turns on most, but not all, compiler warnings
#  -Wall turns on most, but not all, compiler warnings
CFLAGS  = -g -Wall -Wextra $(shell pkg-config --cflags $(LIBS))
CFLAGS  = -g -Wall -Wextra $(shell $(PKG_CONFIG) --cflags $(LIBS))
LDFLAGS=$(shell pkg-config --libs $(LIBS))
LDFLAGS=$(shell $(PKG_CONFIG) --libs $(LIBS))


# the build target executable:
# the build target executable:
Line 41: Line 48:


$(TARGET): $(TARGET).cc
$(TARGET): $(TARGET).cc
$(CC) $(DEBUG) $(CFLAGS) $(LDFLAGS) -o $(TARGET) $(TARGET).cc
$(CXX) $(DEBUG) $(CFLAGS) $(LDFLAGS) -o $(TARGET) $(TARGET).cc


clean:
clean:
Line 56: Line 63:


Please keep in mind our flag when we compile, regarding debug <code>NS3_LOG_ENABLE</code>.
Please keep in mind our flag when we compile, regarding debug <code>NS3_LOG_ENABLE</code>.
[[Category:Applications]]

Latest revision as of 18:05, 29 October 2024

This is for discrete-event network simulator ns-3.

Developing with ns-3

ns-3 heavily relies on way for running simulations (examples, tutorials, etc.), but we can start developing using a simple Makefile and a shell.nix. We will use hello-simulator.cc for this example.

First create a shell.nix, with the requirements to compile our simulation.

{
  pkgs ? import <nixpkgs> { },
}:
pkgs.callPackage (
  {
    mkShell,
    pkg-config,
    ns-3,
  }:
  mkShell {
    strictDeps = true;
    nativeBuildInputs = [ pkg-config ];
    buildInputs = [ ns-3 ];
  }
) { }

Then we can create our Makefile, do note the LIBS argument, which is the modules required (not all are build by default, might have to override some settings in ns-3).

CC ?= gcc
CXX ?= g++
PKG_CONFIG ?= pkg-config

DEBUG=-DNS3_LOG_ENABLE

LIBS = ns3-core

# compiler flags:
#  -g    adds debugging information to the executable file
#  -Wall turns on most, but not all, compiler warnings
CFLAGS  = -g -Wall -Wextra $(shell $(PKG_CONFIG) --cflags $(LIBS))
LDFLAGS=$(shell $(PKG_CONFIG) --libs $(LIBS))

# the build target executable:
TARGET = hello-simulator

all: $(TARGET)

$(TARGET): $(TARGET).cc
	$(CXX) $(DEBUG) $(CFLAGS) $(LDFLAGS) -o $(TARGET) $(TARGET).cc

clean:
	$(RM) $(TARGET)

Then just place hello-simulator.cc in the same directory as the other files, then run the following commands.

$ nix-shell
$ make
$ ./hello-simulator

Please keep in mind our flag when we compile, regarding debug NS3_LOG_ENABLE.