Skip to content

Commit 97cc592

Browse files
committed
support building for multiple fmi versions in the same cmake build
1 parent f2dde92 commit 97cc592

21 files changed

Lines changed: 72 additions & 37 deletions

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ set(CMAKE_CXX_STANDARD 17)
1818
############modelIdentifier and export version###########
1919

2020
set(modelIdentifier identity) # <-- CHANGE ME
21-
set(fmi_version "fmi2") # fmi2 and fmi3 is supported
21+
set(fmi_version "fmi2" "fmi3") # fmi2 and fmi3 is supported
2222

2323
########################################################
2424

cmake/generate_fmu.cmake

Lines changed: 22 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,24 @@ function(generateFMU modelIdentifier)
1818
# Expect the user to provide modelIdentifier as an OBJECT library.
1919
# We will build per-version shared libraries from those object files.
2020
set(COMMON_OBJECTS "$<TARGET_OBJECTS:fmu4cpp_base>")
21+
target_include_directories(${modelIdentifier} PUBLIC "${PROJECT_SOURCE_DIR}/export/include")
2122

2223

2324
foreach (fmiVersion IN LISTS FMU_FMI_VERSIONS)
2425

26+
# versioned shared library target built from object libraries
27+
set(versionTarget "${modelIdentifier}_${fmiVersion}")
28+
29+
set(FMU4CPP_MODEL_IDENTIFIER "${versionTarget}")
30+
set(model_identifier_src "${generatedSourcesDir}/fmu4cpp/model_identifier_${versionTarget}.cpp")
31+
configure_file(
32+
"${PROJECT_SOURCE_DIR}/export/src/fmu4cpp/model_identifier.cpp.in"
33+
"${model_identifier_src}"
34+
@ONLY
35+
)
36+
37+
set(VERSION_OBJECTS "${model_identifier_src}")
38+
2539
set(TARGET_PLATFORM)
2640
if (fmiVersion STREQUAL "fmi2")
2741

@@ -39,7 +53,7 @@ function(generateFMU modelIdentifier)
3953
set(TARGET_PLATFORM linux${BITNESS})
4054
endif ()
4155

42-
set(VERSION_OBJECTS "$<TARGET_OBJECTS:fmu4cpp_fmi2>")
56+
list(APPEND VERSION_OBJECTS "$<TARGET_OBJECTS:fmu4cpp_fmi2>")
4357
set(VERSION_DEFS FMI2)
4458

4559
elseif (fmiVersion STREQUAL "fmi3")
@@ -57,7 +71,7 @@ function(generateFMU modelIdentifier)
5771
set(TARGET_PLATFORM ${TARGET_PLATFORM}-linux)
5872
endif ()
5973

60-
set(VERSION_OBJECTS "$<TARGET_OBJECTS:fmu4cpp_fmi3>")
74+
list(APPEND VERSION_OBJECTS "$<TARGET_OBJECTS:fmu4cpp_fmi3>")
6175
set(VERSION_DEFS FMI3)
6276

6377
else ()
@@ -70,18 +84,13 @@ function(generateFMU modelIdentifier)
7084
set(binaryOutputDir "${modelOutputDir}/binaries/${TARGET_PLATFORM}")
7185

7286

73-
# versioned shared library target built from object libraries
74-
set(versionTarget "${modelIdentifier}_${fmiVersion}")
7587
add_library(${versionTarget} SHARED
7688
${COMMON_OBJECTS}
7789
"$<TARGET_OBJECTS:${modelIdentifier}>"
7890
${VERSION_OBJECTS}
7991
)
80-
81-
92+
target_include_directories(${versionTarget} PRIVATE "${PROJECT_SOURCE_DIR}/export/include")
8293
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")
8594

8695

8796
if (WIN32)
@@ -100,27 +109,24 @@ function(generateFMU modelIdentifier)
100109
# Generate modelDescription.xml
101110
add_custom_command(TARGET ${versionTarget} POST_BUILD
102111
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
106-
)
112+
COMMAND ${CMAKE_COMMAND} -E echo "[generateFMU-${fmiVersion}] Generating modelDescription.xml for model '${modelIdentifier}'"
113+
COMMAND descriptionGenerator ${modelIdentifier} "${binaryOutputDir}/$<TARGET_FILE_NAME:${versionTarget}>")
107114

108115
if (FMU_RESOURCE_FOLDER STREQUAL "")
109116
add_custom_command(TARGET ${versionTarget} POST_BUILD
110117
WORKING_DIRECTORY "${modelOutputDir}"
111118
COMMAND ${CMAKE_COMMAND} -E tar "c" "${modelIdentifier}.fmu" --format=zip
112119
"${modelOutputDir}/binaries"
113-
"${modelOutputDir}/modelDescription.xml"
114-
VERBATIM)
120+
"${modelOutputDir}/modelDescription.xml")
115121

116122
else ()
117-
message("[generateFMU-${fmiVersion}] Using resourceFolder=${FMU_RESOURCE_FOLDER} for model with identifier='${modelIdentifier}'")
123+
message("[generateFMU-${fmiVersion}] Using resourceFolder=${FMU_RESOURCE_FOLDER} for model '${modelIdentifier}'")
118124

119125
file(COPY "${FMU_RESOURCE_FOLDER}/" DESTINATION "${modelOutputDir}/resources")
120126

121127
add_custom_command(TARGET ${versionTarget} POST_BUILD
122128
WORKING_DIRECTORY "${modelOutputDir}"
123-
COMMAND ${CMAKE_COMMAND} -E echo "Packaging ${modelIdentifier}.fmu in ${modelOutputDir}"
129+
COMMAND ${CMAKE_COMMAND} -E echo "[generateFMU-${fmiVersion}] Packaging ${modelIdentifier}.fmu in ${modelOutputDir}"
124130
COMMAND ${CMAKE_COMMAND} -E tar "c" "${modelIdentifier}.fmu" --format=zip
125131
"resources"
126132
"${modelOutputDir}/binaries"

export/descriptionGenerator.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ int main(int argc, char **argv) {
6868
const auto handle = load_library(libName);
6969

7070
if (!handle) {
71-
const auto err = "Unable to load dynamic library '" + libName + "'! " + getLastError();
71+
const auto err = "[fmu4cpp modelDescription generator] Unable to load dynamic library '" + libName + "'! " + getLastError();
7272
std::cerr << err << std::endl;
7373
return 1;
7474
}

export/examples/BouncingBall/bouncing_ball.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ model_info fmu4cpp::get_model_info() {
8080
model_info info;
8181
info.modelName = "BouncingBall";
8282
info.description = "A bouncing ball model";
83-
info.modelIdentifier = FMU4CPP_MODEL_IDENTIFIER;
8483
return info;
8584
}
8685

export/examples/Resource/resource.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ model_info fmu4cpp::get_model_info() {
4343
model_info info;
4444
info.modelName = "Resource";
4545
info.description = "A model with resources";
46-
info.modelIdentifier = FMU4CPP_MODEL_IDENTIFIER;
4746
return info;
4847
}
4948

export/examples/SimplePendulum/simple_pendulum.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ model_info fmu4cpp::get_model_info() {
6363
model_info info;
6464
info.modelName = "SimplePendulum";
6565
info.description = "A simple pendulum model";
66-
info.modelIdentifier = FMU4CPP_MODEL_IDENTIFIER;
6766
info.vendorAnnotations = {"<Tool name=\"fmu4cpp\">\n\t<documentation>\"Example of tool specific annotation data\"</documentation>\n</Tool>"};
6867
return info;
6968
}

export/examples/VanDerPol/van_der_pol.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ model_info fmu4cpp::get_model_info() {
8080
model_info info;
8181
info.modelName = "VanDerPol";
8282
info.description = "VanDerPol oscillator";
83-
info.modelIdentifier = FMU4CPP_MODEL_IDENTIFIER;
8483
info.defaultExperiment = {0.0, 20};
8584
return info;
8685
}

export/include/fmu4cpp/model_info.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,13 @@
33
#define FMU4CPP_TEMPLATE_MODEL_INFO_HPP
44

55
#include <string>
6+
#include <optional>
7+
#include <vector>
68

79
namespace fmu4cpp {
810

11+
std::string model_identifier();
12+
913
struct default_experiment final {
1014
double startTime{0.0};
1115
std::optional<double> stopTime;
@@ -17,7 +21,6 @@ namespace fmu4cpp {
1721
std::string modelName;
1822
std::string author;
1923
std::string description;
20-
std::string modelIdentifier;
2124
std::string version;
2225
std::string variableNamingConvention{"structured"};
2326
std::vector<std::string> vendorAnnotations;

export/src/fmu4cpp/fmi2/fmi2.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ const char *fmi2GetVersion(void) {
7676
return "2.0";
7777
}
7878

79-
FMI2_Export void write_description(const char *location) {
79+
FMI2_Export void write_description(const char *location, const char* modelIdentifier) {
8080
const auto instance = fmu4cpp::createInstance({});
8181
const auto xml = instance->make_description();
8282
std::ofstream of(location);

export/src/fmu4cpp/fmi2/fmi2_description.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
using namespace fmu4cpp;
1010

11+
1112
std::string fmu_base::make_description() const {
1213

1314
const model_info m = get_model_info();
@@ -27,7 +28,7 @@ std::string fmu_base::make_description() const {
2728
ss << std::boolalpha
2829
<< "\t<CoSimulation\n"
2930
<< "\t\tneedsExecutionTool=\"" << m.needsExecutionTool << "\"\n"
30-
<< "\t\tmodelIdentifier=\"" << m.modelIdentifier << "\"\n"
31+
<< "\t\tmodelIdentifier=\"" << model_identifier() << "\"\n"
3132
<< "\t\tcanHandleVariableCommunicationStepSize=\"" << m.canHandleVariableCommunicationStepSize << "\"\n"
3233
<< "\t\tcanBeInstantiatedOnlyOncePerProcess=\"" << m.canBeInstantiatedOnlyOncePerProcess << "\"\n"
3334
<< "\t\tcanGetAndSetFMUstate=\"" << m.canGetAndSetFMUstate << "\"\n"

0 commit comments

Comments
 (0)