Skip to content

Commit e70b4fa

Browse files
authored
Merge pull request #1 from greenlsi/cmake
cmake: minimal support
2 parents 1036538 + 2f48267 commit e70b4fa

3 files changed

Lines changed: 288 additions & 0 deletions

File tree

c/CMakeLists.txt

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
cmake_minimum_required(VERSION 3.15)
2+
project(rxnet
3+
VERSION 0.1.0
4+
DESCRIPTION "Synchronous runtime for reactive models (FSM and Petri Nets)"
5+
HOMEPAGE_URL "https://github.com/greenlsi/rxnet"
6+
LANGUAGES C
7+
)
8+
9+
# Set C standard
10+
set(CMAKE_C_STANDARD 99)
11+
set(CMAKE_C_STANDARD_REQUIRED ON)
12+
set(CMAKE_C_EXTENSIONS OFF)
13+
14+
# Compilation flags
15+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Wpedantic")
16+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_POSIX_C_SOURCE=200809L")
17+
18+
option(RX_TRACE_ENABLE "Enable tracing support in rxnet" OFF)
19+
option(BUILD_TESTS "Build test suite" OFF)
20+
21+
if(BUILD_TESTS AND NOT RX_TRACE_ENABLE)
22+
message(STATUS "BUILD_TESTS=ON requires tracing; enabling RX_TRACE_ENABLE")
23+
set(RX_TRACE_ENABLE ON CACHE BOOL "Enable tracing support in rxnet" FORCE)
24+
endif()
25+
26+
# ==============================================================================
27+
# Main Library: rxnet
28+
# ==============================================================================
29+
30+
add_library(rxnet STATIC
31+
src/runtime.c
32+
src/fsm.c
33+
src/pn.c
34+
src/cyclic.c
35+
src/coop.c
36+
src/thread.c
37+
)
38+
39+
if(RX_TRACE_ENABLE)
40+
target_sources(rxnet PRIVATE src/trace.c)
41+
endif()
42+
43+
# Public headers
44+
target_include_directories(rxnet
45+
PUBLIC
46+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
47+
$<INSTALL_INTERFACE:include>
48+
)
49+
50+
# Compile definitions for trace (optional)
51+
if(RX_TRACE_ENABLE)
52+
target_compile_definitions(rxnet PUBLIC RX_TRACE_ENABLE)
53+
endif()
54+
55+
if(BUILD_TESTS)
56+
enable_testing()
57+
58+
add_executable(test_runtime tests/test_runtime.c)
59+
target_link_libraries(test_runtime PRIVATE rxnet)
60+
add_test(NAME test_runtime COMMAND test_runtime)
61+
62+
add_executable(test_fsm tests/test_fsm.c)
63+
target_link_libraries(test_fsm PRIVATE rxnet)
64+
add_test(NAME test_fsm COMMAND test_fsm)
65+
66+
add_executable(test_pn tests/test_pn.c)
67+
target_link_libraries(test_pn PRIVATE rxnet)
68+
add_test(NAME test_pn COMMAND test_pn)
69+
70+
add_executable(test_trace tests/test_trace.c)
71+
target_link_libraries(test_trace PRIVATE rxnet)
72+
add_test(NAME test_trace COMMAND test_trace)
73+
endif()
74+
75+
# ==============================================================================
76+
# Installation
77+
# ==============================================================================
78+
79+
# Install library
80+
install(TARGETS rxnet
81+
EXPORT rxnetTargets
82+
ARCHIVE DESTINATION lib
83+
)
84+
85+
# Install public headers
86+
install(DIRECTORY include/rxnet
87+
DESTINATION include
88+
FILES_MATCHING PATTERN "*.h"
89+
)
90+
91+
# Install CMake config files for find_package()
92+
install(EXPORT rxnetTargets
93+
FILE rxnetTargets.cmake
94+
NAMESPACE rxnet::
95+
DESTINATION lib/cmake/rxnet
96+
)
97+
98+
# Generate and install version file
99+
include(CMakePackageConfigHelpers)
100+
101+
write_basic_package_version_file(
102+
"${CMAKE_CURRENT_BINARY_DIR}/rxnetConfigVersion.cmake"
103+
VERSION ${PROJECT_VERSION}
104+
COMPATIBILITY SameMajorVersion
105+
)
106+
107+
# Generate and install config file
108+
configure_package_config_file(
109+
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/rxnetConfig.cmake.in"
110+
"${CMAKE_CURRENT_BINARY_DIR}/rxnetConfig.cmake"
111+
INSTALL_DESTINATION lib/cmake/rxnet
112+
)
113+
114+
install(FILES
115+
"${CMAKE_CURRENT_BINARY_DIR}/rxnetConfig.cmake"
116+
"${CMAKE_CURRENT_BINARY_DIR}/rxnetConfigVersion.cmake"
117+
DESTINATION lib/cmake/rxnet
118+
)
119+
120+
# ==============================================================================
121+
# Package for CPack
122+
# ==============================================================================
123+
124+
set(CPACK_PACKAGE_VENDOR "GreenLSI")
125+
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY ${PROJECT_DESCRIPTION})
126+
include(CPack)
127+
128+
# ==============================================================================
129+
# Summary
130+
# ==============================================================================
131+
132+
message(STATUS "")
133+
message(STATUS " rxnet ${PROJECT_VERSION}")
134+
message(STATUS " ======================================")
135+
message(STATUS " Build Type: ${CMAKE_BUILD_TYPE}")
136+
message(STATUS " Trace Enabled: ${RX_TRACE_ENABLE}")
137+
message(STATUS " Build Tests: ${BUILD_TESTS}")
138+
message(STATUS " Install Prefix: ${CMAKE_INSTALL_PREFIX}")
139+
message(STATUS "")

c/cmake/rxnetConfig.cmake.in

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
@PACKAGE_INIT@
2+
3+
# Include the targets file
4+
include("${CMAKE_CURRENT_LIST_DIR}/rxnetTargets.cmake")
5+
6+
# Check that all required targets exist
7+
if(NOT TARGET rxnet::rxnet)
8+
message(FATAL_ERROR "rxnet::rxnet target not found")
9+
endif()
10+
11+
# Set public variables for compatibility
12+
get_target_property(RXNET_INCLUDE_DIRS rxnet::rxnet INTERFACE_INCLUDE_DIRECTORIES)
13+
get_target_property(RXNET_LIBRARIES rxnet::rxnet IMPORTED_LOCATION)
14+
15+
# Handle both BUILD_INTERFACE and INSTALL_INTERFACE
16+
list(APPEND RXNET_INCLUDE_DIRS "${PACKAGE_PREFIX_DIR}/include")
17+
18+
message(STATUS "Found rxnet ${rxnet_VERSION}")
19+
message(STATUS " rxnet libraries: ${RXNET_LIBRARIES}")
20+
message(STATUS " rxnet include dirs: ${RXNET_INCLUDE_DIRS}")
21+
22+
check_required_components(rxnet)

docs/cmake-integration.md

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
# Using rxnet as a Dependency
2+
3+
Este documento explica cómo integrar rxnet como una librería en tus proyectos C/C++.
4+
5+
## Opción 1: Instalación del Sistema
6+
7+
### Paso 1: Compilar e Instalar rxnet
8+
9+
```bash
10+
cd c/
11+
mkdir build && cd build
12+
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local
13+
cmake --build .
14+
make test
15+
cmake --install .
16+
```
17+
18+
### Paso 2: Usar en tu proyecto
19+
20+
En el `CMakeLists.txt` de tu proyecto:
21+
22+
```cmake
23+
cmake_minimum_required(VERSION 3.15)
24+
project(my_project)
25+
26+
# Buscar rxnet en el sistema
27+
find_package(rxnet REQUIRED)
28+
29+
# Tu ejecutable
30+
add_executable(my_app main.c)
31+
32+
# Enlazar con rxnet
33+
target_link_libraries(my_app PRIVATE rxnet::rxnet)
34+
```
35+
36+
Compilar tu proyecto:
37+
38+
```bash
39+
mkdir build && cd build
40+
cmake ..
41+
cmake --build .
42+
```
43+
44+
## Opción 2: Usar rxnet como Subdirectorio
45+
46+
### Paso 1: Estructura del proyecto
47+
48+
```
49+
my_project/
50+
├── CMakeLists.txt
51+
├── src/
52+
│ └── main.c
53+
└── rxnet/ # Submódulo git o copia local
54+
└── c/
55+
```
56+
57+
### Paso 2: CMakeLists.txt
58+
59+
```cmake
60+
cmake_minimum_required(VERSION 3.15)
61+
project(my_project)
62+
63+
# Añadir rxnet como subdirectorio
64+
add_subdirectory(rxnet/c rxnet_build)
65+
66+
# Tu ejecutable
67+
add_executable(my_app src/main.c)
68+
69+
# Enlazar con rxnet (sin namespace cuando se usa add_subdirectory)
70+
target_link_libraries(my_app PRIVATE rxnet)
71+
```
72+
73+
---
74+
75+
## Opción 3: Usar rxnet como Paquete Externo
76+
77+
```cmake
78+
cmake_minimum_required(VERSION 3.15)
79+
project(my_project)
80+
81+
include(FetchContent)
82+
83+
FetchContent_Declare(rxnet
84+
GIT_REPOSITORY https://github.com/greenlsi/rxnet.git
85+
GIT_TAG main
86+
SOURCE_SUBDIR c
87+
)
88+
89+
FetchContent_MakeAvailable(rxnet)
90+
91+
add_executable(my_app src/main.c)
92+
target_link_libraries(my_app PRIVATE rxnet::rxnet)
93+
```
94+
95+
## Instalación Personalizada
96+
97+
Para instalar en un directorio diferente:
98+
99+
```bash
100+
cd c/
101+
mkdir build && cd build
102+
cmake .. -DCMAKE_INSTALL_PREFIX=$HOME/.local
103+
cmake --install .
104+
```
105+
106+
Luego, para encontrarla, usa:
107+
108+
```bash
109+
cmake .. -DCMAKE_PREFIX_PATH=$HOME/.local
110+
```
111+
112+
---
113+
114+
## Opciones de Compilación
115+
116+
Al compilar rxnet, tienes varias opciones:
117+
118+
| Opción | Valor | Descripción |
119+
|--------|-------|-------------|
120+
| `BUILD_TESTS` | ON/OFF | Compilar y ejecutar los tests |
121+
| `RX_TRACE_ENABLE` | ON/OFF | Habilitar tracing |
122+
123+
Ejemplo:
124+
125+
```bash
126+
cmake .. -DBUILD_TESTS=ON
127+
```

0 commit comments

Comments
 (0)