Skip to content

Commit f2dde92

Browse files
committed
work in progress
1 parent 0d5ae4a commit f2dde92

6 files changed

Lines changed: 115 additions & 83 deletions

File tree

cmake/generate_fmu.cmake

Lines changed: 105 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,101 +1,133 @@
11

2-
function(generateFMU modelIdentifier fmiVersion)
2+
function(generateFMU modelIdentifier)
33

44
set(options)
55
set(oneValueArgs RESOURCE_FOLDER)
6-
set(multiValueArgs)
6+
set(multiValueArgs FMI_VERSIONS)
77
cmake_parse_arguments(FMU "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
88

99
if (NOT FMU_RESOURCE_FOLDER)
1010
set(FMU_RESOURCE_FOLDER "")
11-
endif()
11+
endif ()
1212

13-
target_sources(${modelIdentifier} PRIVATE "$<TARGET_OBJECTS:fmu4cpp_base>")
13+
# Require at least one fmi version; default to fmi2 if none provided
14+
if (NOT FMU_FMI_VERSIONS)
15+
message(FATAL_ERROR "generateFMU requires at least one FMI version to be specified")
16+
endif ()
1417

15-
set(TARGET_PLATFORM)
16-
if (fmiVersion STREQUAL "fmi2")
18+
# Expect the user to provide modelIdentifier as an OBJECT library.
19+
# We will build per-version shared libraries from those object files.
20+
set(COMMON_OBJECTS "$<TARGET_OBJECTS:fmu4cpp_base>")
1721

18-
if ("${CMAKE_SIZEOF_VOID_P}" STREQUAL "8")
19-
set(BITNESS 64)
20-
else ()
21-
set(BITNESS 32)
22-
endif ()
2322

24-
if (WIN32)
25-
set(TARGET_PLATFORM win${BITNESS})
26-
elseif (APPLE)
27-
set(TARGET_PLATFORM darwin${BITNESS})
28-
else ()
29-
set(TARGET_PLATFORM linux${BITNESS})
30-
endif ()
23+
foreach (fmiVersion IN LISTS FMU_FMI_VERSIONS)
3124

32-
target_compile_definitions("${modelIdentifier}" PRIVATE FMI2)
33-
target_sources(${modelIdentifier} PRIVATE "$<TARGET_OBJECTS:fmu4cpp_fmi2>")
34-
elseif (fmiVersion STREQUAL "fmi3")
25+
set(TARGET_PLATFORM)
26+
if (fmiVersion STREQUAL "fmi2")
3527

36-
set(TARGET_PLATFORM "x86")
37-
if ("${CMAKE_SIZEOF_VOID_P}" STREQUAL "8")
38-
set(TARGET_PLATFORM "${TARGET_PLATFORM}_64")
39-
endif ()
28+
if ("${CMAKE_SIZEOF_VOID_P}" STREQUAL "8")
29+
set(BITNESS 64)
30+
else ()
31+
set(BITNESS 32)
32+
endif ()
33+
34+
if (WIN32)
35+
set(TARGET_PLATFORM win${BITNESS})
36+
elseif (APPLE)
37+
set(TARGET_PLATFORM darwin${BITNESS})
38+
else ()
39+
set(TARGET_PLATFORM linux${BITNESS})
40+
endif ()
41+
42+
set(VERSION_OBJECTS "$<TARGET_OBJECTS:fmu4cpp_fmi2>")
43+
set(VERSION_DEFS FMI2)
44+
45+
elseif (fmiVersion STREQUAL "fmi3")
46+
47+
set(TARGET_PLATFORM "x86")
48+
if ("${CMAKE_SIZEOF_VOID_P}" STREQUAL "8")
49+
set(TARGET_PLATFORM "${TARGET_PLATFORM}_64")
50+
endif ()
51+
52+
if (WIN32)
53+
set(TARGET_PLATFORM ${TARGET_PLATFORM}-windows)
54+
elseif (APPLE)
55+
set(TARGET_PLATFORM ${TARGET_PLATFORM}-darwin)
56+
else ()
57+
set(TARGET_PLATFORM ${TARGET_PLATFORM}-linux)
58+
endif ()
59+
60+
set(VERSION_OBJECTS "$<TARGET_OBJECTS:fmu4cpp_fmi3>")
61+
set(VERSION_DEFS FMI3)
4062

41-
if (WIN32)
42-
set(TARGET_PLATFORM ${TARGET_PLATFORM}-windows)
43-
elseif (APPLE)
44-
set(TARGET_PLATFORM ${TARGET_PLATFORM}-darwin)
4563
else ()
46-
set(TARGET_PLATFORM ${TARGET_PLATFORM}-linux)
64+
message(FATAL_ERROR "Unknown FMI version: ${fmiVersion}. Supported versions are 'fmi2' and 'fmi3'.")
4765
endif ()
4866

49-
target_compile_definitions("${modelIdentifier}" PRIVATE FMI3)
50-
target_sources(${modelIdentifier} PRIVATE "$<TARGET_OBJECTS:fmu4cpp_fmi3>")
5167

52-
else ()
53-
message(FATAL_ERROR "Unknown FMI version: ${fmiVersion}. Supported versions are 'fmi2' and 'fmi3'.")
54-
endif ()
68+
set(fmuOutputDir "${CMAKE_BINARY_DIR}/${fmiVersion}")
69+
set(modelOutputDir "${fmuOutputDir}/${modelIdentifier}")
70+
set(binaryOutputDir "${modelOutputDir}/binaries/${TARGET_PLATFORM}")
71+
5572

56-
target_include_directories("${modelIdentifier}" PRIVATE "${PROJECT_SOURCE_DIR}/export/include")
57-
target_compile_definitions("${modelIdentifier}" PRIVATE FMU4CPP_MODEL_IDENTIFIER="${modelIdentifier}")
73+
# versioned shared library target built from object libraries
74+
set(versionTarget "${modelIdentifier}_${fmiVersion}")
75+
add_library(${versionTarget} SHARED
76+
${COMMON_OBJECTS}
77+
"$<TARGET_OBJECTS:${modelIdentifier}>"
78+
${VERSION_OBJECTS}
79+
)
5880

5981

60-
set(outputDir "$<1:${CMAKE_BINARY_DIR}/${modelIdentifier}/binaries/${TARGET_PLATFORM}>")
82+
target_compile_definitions(${versionTarget} PRIVATE ${VERSION_DEFS})
83+
target_compile_definitions(${modelIdentifier} PUBLIC FMU4CPP_MODEL_IDENTIFIER=\"${versionTarget}\")
84+
target_include_directories(${modelIdentifier} PUBLIC "${PROJECT_SOURCE_DIR}/export/include")
6185
62-
if (WIN32)
63-
set_target_properties(${modelIdentifier}
64-
PROPERTIES
65-
RUNTIME_OUTPUT_DIRECTORY "${outputDir}"
66-
)
67-
else ()
68-
set_target_properties(${modelIdentifier}
69-
PROPERTIES
70-
PREFIX ""
71-
LIBRARY_OUTPUT_DIRECTORY "${outputDir}"
86+
87+
if (WIN32)
88+
set_target_properties(${versionTarget}
89+
PROPERTIES
90+
RUNTIME_OUTPUT_DIRECTORY "${binaryOutputDir}"
91+
)
92+
else ()
93+
set_target_properties(${versionTarget}
94+
PROPERTIES
95+
PREFIX ""
96+
LIBRARY_OUTPUT_DIRECTORY "${binaryOutputDir}"
97+
)
98+
endif ()
99+
100+
# Generate modelDescription.xml
101+
add_custom_command(TARGET ${versionTarget} POST_BUILD
102+
WORKING_DIRECTORY "${fmuOutputDir}"
103+
COMMAND ${CMAKE_COMMAND} -E echo "Generating modelDescription.xml for ${versionTarget}"
104+
COMMAND descriptionGenerator ${modelIdentifier} "${binaryOutputDir}/$<TARGET_FILE_NAME:${versionTarget}>"
105+
VERBATIM
72106
)
73-
endif ()
74107
75-
# Generate modelDescription.xml
76-
add_custom_command(TARGET ${modelIdentifier} POST_BUILD
77-
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
78-
COMMAND descriptionGenerator ${modelIdentifier} "${outputDir}/$<TARGET_FILE_NAME:${modelIdentifier}>")
79-
80-
if (FMU_RESOURCE_FOLDER STREQUAL "")
81-
add_custom_command(TARGET ${modelIdentifier} POST_BUILD
82-
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/${modelIdentifier}"
83-
COMMAND ${CMAKE_COMMAND} -E tar "c" "${modelIdentifier}.fmu" --format=zip
84-
"${CMAKE_BINARY_DIR}/${modelIdentifier}/binaries"
85-
"${CMAKE_BINARY_DIR}/${modelIdentifier}/modelDescription.xml")
86-
87-
else ()
88-
message("[generateFMU] Using resourceFolder=${FMU_RESOURCE_FOLDER} for model with identifier='${modelIdentifier}'")
89-
90-
file(COPY "${FMU_RESOURCE_FOLDER}/" DESTINATION "${CMAKE_BINARY_DIR}/${modelIdentifier}/resources")
91-
92-
add_custom_command(TARGET ${modelIdentifier} POST_BUILD
93-
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}/${modelIdentifier}"
94-
COMMAND ${CMAKE_COMMAND} -E tar "c" "${modelIdentifier}.fmu" --format=zip
95-
"resources"
96-
"${CMAKE_BINARY_DIR}/${modelIdentifier}/binaries"
97-
"${CMAKE_BINARY_DIR}/${modelIdentifier}/modelDescription.xml")
98-
endif ()
108+
if (FMU_RESOURCE_FOLDER STREQUAL "")
109+
add_custom_command(TARGET ${versionTarget} POST_BUILD
110+
WORKING_DIRECTORY "${modelOutputDir}"
111+
COMMAND ${CMAKE_COMMAND} -E tar "c" "${modelIdentifier}.fmu" --format=zip
112+
"${modelOutputDir}/binaries"
113+
"${modelOutputDir}/modelDescription.xml"
114+
VERBATIM)
115+
116+
else ()
117+
message("[generateFMU-${fmiVersion}] Using resourceFolder=${FMU_RESOURCE_FOLDER} for model with identifier='${modelIdentifier}'")
118+
119+
file(COPY "${FMU_RESOURCE_FOLDER}/" DESTINATION "${modelOutputDir}/resources")
120+
121+
add_custom_command(TARGET ${versionTarget} POST_BUILD
122+
WORKING_DIRECTORY "${modelOutputDir}"
123+
COMMAND ${CMAKE_COMMAND} -E echo "Packaging ${modelIdentifier}.fmu in ${modelOutputDir}"
124+
COMMAND ${CMAKE_COMMAND} -E tar "c" "${modelIdentifier}.fmu" --format=zip
125+
"resources"
126+
"${modelOutputDir}/binaries"
127+
"${modelOutputDir}/modelDescription.xml"
128+
VERBATIM)
129+
endif ()
99130
131+
endforeach ()
100132
101133
endfunction()
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

2-
add_library(bouncing_ball SHARED
2+
add_library(bouncing_ball OBJECT
33
"bouncing_ball.cpp"
44
)
55

6-
generateFMU("bouncing_ball" "fmi3")
6+
generateFMU("bouncing_ball" FMI_VERSIONS "fmi2" "fmi3")
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

2-
add_library(resource SHARED
2+
add_library(resource OBJECT
33
"resource.cpp"
44
)
55

6-
generateFMU("resource" "fmi2" RESOURCE_FOLDER "${CMAKE_CURRENT_SOURCE_DIR}/resources")
6+
generateFMU("resource" FMI_VERSIONS "fmi2" RESOURCE_FOLDER "${CMAKE_CURRENT_SOURCE_DIR}/resources")
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

2-
add_library(simple_pendulum SHARED
2+
add_library(simple_pendulum OBJECT
33
"simple_pendulum.cpp"
44
)
55

6-
generateFMU(simple_pendulum "fmi2")
6+
generateFMU(simple_pendulum FMI_VERSIONS "fmi3")
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

2-
add_library(van_der_pol SHARED
2+
add_library(van_der_pol OBJECT
33
"van_der_pol.cpp"
44
)
55

6-
generateFMU(van_der_pol "fmi3")
6+
generateFMU(van_der_pol FMI_VERSIONS "fmi3")

src/CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11

22
# library must have SHARED linkage
3-
add_library(${modelIdentifier} SHARED
3+
add_library(${modelIdentifier} OBJECT
44
"model.cpp"
55
)
66

77
# Generate FMU
8-
generateFMU("${modelIdentifier}" ${fmi_version} RESOURCE_FOLDER "${PROJECT_SOURCE_DIR}/resources")
8+
generateFMU("${modelIdentifier}" FMI_VERSIONS ${fmi_version} RESOURCE_FOLDER "${PROJECT_SOURCE_DIR}/resources")
99

1010
# write the identifier to file so that the CI process knows what to package
1111
set(OUTPUT_FILE "${CMAKE_BINARY_DIR}/model.txt")

0 commit comments

Comments
 (0)