https://github.com/omnetpp/cmake
CMake module for OMNeT++ projects
https://github.com/omnetpp/cmake
cmake omnetpp
Last synced: 3 months ago
JSON representation
CMake module for OMNeT++ projects
- Host: GitHub
- URL: https://github.com/omnetpp/cmake
- Owner: omnetpp
- License: gpl-2.0
- Created: 2021-05-10T09:45:44.000Z (about 5 years ago)
- Default Branch: master
- Last Pushed: 2021-08-22T09:49:30.000Z (almost 5 years ago)
- Last Synced: 2026-02-19T04:40:50.504Z (4 months ago)
- Topics: cmake, omnetpp
- Language: CMake
- Homepage:
- Size: 324 KB
- Stars: 10
- Watchers: 6
- Forks: 5
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
`omnetpp-cmake` — CMake + OMNeT++ = ❤
======================================
*This repository is a community-supported work-in-progress, and may never be fully completed.
Please help us and others like you by contributing. Thanks!*
CMake Modules for building OMNeT++ projects and integrating with you CMake supporting editor.
These CMake modules were originally developed against **OMNeT+ 5.X**, but should also work with **OMNeT++ 6.0** and beyond.
We are currently building our :pencil: documentation website at https://omnetpp.github.io/cmake.
Though this documentation is still work-in-progress, you may already have a look at it!
Usage
-----
The following is *one* of many other ways to do it.
1. Add the repository as a *`git` submodule* to your repository in `cmake`.[1](#f1)
```sh
git submodule add https://github.com/omnetpp/cmake.git cmake
```
⚠ **Note:** If you have other CMake modules it is recommended that you replace `cmake` with `cmake/omnet` and so forth here and in the following steps.
2. Update and/or initialise the submodule.[1](#f2)
```sh
git submodule update --init --recursive
```
3. Create a minimal `CMakeLists.txt` in the root repository folder.
```cmake
project(YourProject)
# It is recommended to increase the minimum version to your current
cmake_minimum_required(VERSION 3.1)
# Change "cmake" if you put the submodule in a different directory
set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
find_package(OmnetPP 6.0 REQUIRED)
# Load the CMake commands for OMNeT++
include(OmnetppHelpers)
```
4. Update your `CMakeLists.txt` with your OMNeT++ project details
```cmake
# Uncomment the following if you have external dependencies like INET
#find_path(INET_DIR NAMES src/inet/package.ned DOC "INET root directory")
#import_opp_target(inet ${INET_DIR}/src/Makefile)
# Define your library/simulation sources
set(SOURCES
src/a.cc
src/b.cc)
add_library(project_library SHARED ${SOURCES})
# Define your messages as well
set(MESSAGE_SOURCES
messages/a.msg
messages/b.msg)
generate_opp_message(project_library
MESSAGE_FILES ${MESSAGE_SOURCES})
# You will need to tweak and add the additional properties for your project
set_target_properties(project_library PROPERTIES
OUTPUT_NAME my_project_sim
NED_FOLDERS src)
# Link the libraries you need for your project; add "inet" if necessary
target_link_libraries(project_library opp_interface)
# This creates an OMNet++ CMake run for you
add_opp_run(project_name
CONFIG omnetpp.ini
DEPENDENCY project_library)
```
### Macros Available
- `generate_opp_message`(`` *`MESSAGE_FILES`* ` ...`)
Generates and links a message file to a given target.
- `import_opp_target`(`` `` [ `` ])
Imports a target from a Makefile created by opp_makemake.
⚠ **Note:** The target must have the same name as in the `Makefile`!
- `add_opp_build_target`(``)
Adds a build target with a given name.
- `add_opp_run`(`` [ *`CONFIG`* `` | *`WORKING_DIRECTORY`* `` | *`NED_FOLDERS`* ` ...` ] *`DEPENDENCY`* `` )
Adds a build target with a given name based on the given dependency.
- `add_opp_test`(`` [*`CONFIG`* `` | *`RUN`* `` | *`SIMTIME_LIMIT`* `` | *`SUFFIX`* ``])
Adds a test target with a given name.
### Interfaces and Library Targets Available
`OmnetPP::header` is a bare interface target with at least the compile definitions and include directories set for the found OMNeT++ setup.
Additionally, the following OMNeT++ libraries are provided as imported library targets:
- `OmnetPP::cmdenv`
- `OmnetPP::common`
- `OmnetPP::envir`
- `OmnetPP::eventlog`
- `OmnetPP::layout`
- `OmnetPP::main`
- `OmnetPP::nedxml`
- `OmnetPP::qtenv`
- `OmnetPP::qtenv-osg`
- `OmnetPP::scave`
- `OmnetPP::sim`
- `OmnetPP::tkenv`
Motivation & Background
-----------------------
For the full motivation and background please [see Raphael Riebl's presentation at the 2015 OMNeT++ Summit][summit-presentation].
Some benefits include:
- CMake is widely used for C/C++ projects
- Convenient user interfaces available for configuring builds
- Solid dependency handling, both *internal* and *external*
- More accessible syntax compared to Makefiles
- Several IDEs support the CMake build system
- Support OMNeT++ 6.0 preview releases (by @thor)
Caveats
-------
There have been some changes which might require fixes or future improvements.
These are primarily changes to make the proof-of-concept employed in Artery also work with OMNet++ 6.0.
However, there are also some minor oddities and questions, uncertainties and the likes of which.
- [ ] `opp_cmake.py` will not take a lot of automatic definitions into account when importing a project
- [ ] `clean_opp_messages()` is unavailable as message files are no longer gathered in a single folder for buliding
- [ ] include path needs to be adjusted manually if `#include "generated_m.h"` is used
- [ ] `add_opp_run` doesn't seem to utilise the parameter `NED_FOLDERS`
Licensing
---------
The CMake modules were based on those in [the OMNet++ V2X simulation framework in `riebl/artery`][artery], which is licensed as GPL-2.0.
References
----------
- [Source repository `riebl/artery`][artery]
- [Presentation at 2015 OMNet++ Summit][summit-presentation]
[artery]: https://github.com/riebl/artery
[artery_checkout]: https://github.com/riebl/artery/tree/a4e013af70d2b5c3223492a518afb57fb92a7a8d/cmake
[summit-presentation]: https://summit.omnetpp.org/archive/2015/assets/pdf/OMNET-2015-17-Slides.pdf
---
1: You could also just download the files and put them where you'd like, or if you want to contribute, *fork it* and add that repository as a submodule! [↩](#a1)
2: You may exchange the paths as you wish, but make sure to update them later on too. [↩](#a2)