Skip to content

Integrate external project zlib, libxml2 and sundials build into main cmake build #640

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 11 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions .github/workflows/build-fmusim-gui.yml
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,6 @@ jobs:
arch: 'win64_msvc2019_64'
modules: 'qtpositioning qtwebchannel qtwebengine'
- run: python -m pip install fmpy requests
- run: python fmusim-gui/build/build_cvode.py
- run: python fmusim-gui/build/build_libxml2.py
- run: python fmusim-gui/build/build_zlib.py
- run: cmake -D CMAKE_PREFIX_PATH=${{env.QT_ROOT_DIR}} -S fmusim-gui -B fmusim-gui/build/fmusim-gui
- run: cmake --build fmusim-gui/build/fmusim-gui --config Release
- run: ${{env.QT_ROOT_DIR}}\bin\windeployqt.exe fmusim-gui\build\fmusim-gui\Release\fmusim-gui.exe
Expand Down
3 changes: 0 additions & 3 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,6 @@ jobs:
sudo apt-get update
sudo apt-get install gcc-aarch64-linux-gnu qemu-user
- run: cmake --version
- run: python build/build_cvode.py ${{ matrix.name }}
- run: python build/build_libxml2.py ${{ matrix.name }}
- run: python build/build_zlib.py ${{ matrix.name }}
- run: python build/build.py ${{ matrix.name }}
- if: matrix.name != 'aarch64-darwin'
run: pytest tests --platform ${{ matrix.name }}
Expand Down
17 changes: 13 additions & 4 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
cmake_minimum_required (VERSION 3.17)
cmake_minimum_required (VERSION 3.18)

set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")

Expand All @@ -25,14 +25,15 @@ set_property(CACHE FMI_ARCHITECTURE PROPERTY STRINGS "" "aarch64" "x86" "x86_64"
if (NOT FMI_ARCHITECTURE)
if (${CMAKE_HOST_SYSTEM_PROCESSOR} MATCHES "AMD64|x86_64")
set(FMI_ARCHITECTURE "x86_64")
elseif (${CMAKE_HOST_SYSTEM_PROCESSOR} MATCHES "aarch64")
elseif (${CMAKE_HOST_SYSTEM_PROCESSOR} MATCHES "aarch64|arm64")
set(FMI_ARCHITECTURE "aarch64")
else ()
message(FATAL_ERROR "Unknown System Architecture: ${CMAKE_SYSTEM_PROCESSOR}")
endif ()
endif ()

set(WITH_FMUSIM OFF CACHE BOOL "Add fmusim project")
set(WITH_FMUSIM_GUI OFF CACHE BOOL "Add fmusim Gui project")

if (MSVC)
add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
Expand Down Expand Up @@ -277,6 +278,14 @@ endforeach(MODEL_NAME)
# Examples
include(examples/Examples.cmake)

if (WITH_FMUSIM)
add_subdirectory(fmusim)
if(WITH_FMUSIM OR WITH_FMUSIM_GUI)
include(build/fmusim.cmake)

if (WITH_FMUSIM)
add_subdirectory(fmusim)
endif ()

if (WITH_FMUSIM_GUI)
add_subdirectory(fmusim-gui)
endif ()
endif ()
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ The FMUs will be in the `dist` folder inside the selected build folder.

## Building fmusim

To build the `fmusim` executable, run the `build/build_*.py <platform>` Python scripts (where `<platform>` is the platform to build for, e.g. `x86_64-windows`) and enable `WITH_FMUSIM` before generating the CMake project.
To build the `fmusim` executable, enable `WITH_FMUSIM` before generating the CMake project.

## License and attribution

Expand Down
157 changes: 157 additions & 0 deletions build/fmusim.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
cmake_host_system_information(RESULT TARGET_64_BITS QUERY IS_64BIT)

include(ExternalProject)
set(EXTERNAL_BASE_DIR ${CMAKE_BINARY_DIR}/_deps CACHE STRING "External base directory")
file(MAKE_DIRECTORY ${EXTERNAL_BASE_DIR}/lib)
if(UNIX AND TARGET_64_BITS GREATER_EQUAL 1)
file(CREATE_LINK lib ${EXTERNAL_BASE_DIR}/lib64 SYMBOLIC)
endif()

ExternalProject_Add(
zlib_src
PREFIX ${EXTERNAL_BASE_DIR}
GIT_REPOSITORY https://github.com/madler/zlib.git
GIT_TAG 51b7f2abdade71cd9bb0e7a373ef2610ec6f9daf # v1.3.1
GIT_SHALLOW True
UPDATE_DISCONNECTED True
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_BASE_DIR} -DCMAKE_BUILD_TYPE=Release -DCMAKE_MSVC_RUNTIME_LIBRARY=${CMAKE_MSVC_RUNTIME_LIBRARY}
# for zlib version v1.3.2+ add "-DZLIB_BUILD_MINIZIP=1"
BUILD_COMMAND ${CMAKE_COMMAND} --build . --config Release
BUILD_BYPRODUCTS ${EXTERNAL_BASE_DIR}/lib/libz.a
INSTALL_COMMAND ${CMAKE_COMMAND} --install . --config Release
)
add_library(zlib STATIC IMPORTED)
set_target_properties(zlib PROPERTIES IMPORTED_LOCATION ${EXTERNAL_BASE_DIR}/lib/libz.a)
add_dependencies(zlib zlib_src)

set(ZLIB_SRC_DIR ${EXTERNAL_BASE_DIR}/src/zlib_src)

ExternalProject_Add(
xml2_src
DEPENDS zlib
PREFIX ${EXTERNAL_BASE_DIR}
GIT_REPOSITORY https://github.com/GNOME/libxml2.git
GIT_TAG 60d3056c97067e6cb2125284878ed7c99c90ed81 # v2.13.4
GIT_SHALLOW True
UPDATE_DISCONNECTED True
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_BASE_DIR} -DCMAKE_BUILD_TYPE=Release -DCMAKE_MSVC_RUNTIME_LIBRARY=${CMAKE_MSVC_RUNTIME_LIBRARY} -DBUILD_SHARED_LIBS=OFF -DLIBXML2_WITH_ICONV=OFF -DLIBXML2_WITH_LZMA=OFF -DLIBXML2_WITH_PYTHON=OFF -DLIBXML2_WITH_ZLIB=OFF -DLIBXML2_WITH_TESTS=OFF
BUILD_COMMAND ${CMAKE_COMMAND} --build . --config Release
BUILD_BYPRODUCTS ${EXTERNAL_BASE_DIR}/lib/libxml2.a
INSTALL_COMMAND ${CMAKE_COMMAND} --install . --config Release
)
add_library(xml2 STATIC IMPORTED)
set_target_properties(xml2 PROPERTIES IMPORTED_LOCATION ${EXTERNAL_BASE_DIR}/lib/libxml2.a)
add_dependencies(xml2 xml2_src)

ExternalProject_Add(
cvode_src
PREFIX ${EXTERNAL_BASE_DIR}
GIT_REPOSITORY https://github.com/LLNL/sundials.git
GIT_TAG c28eaa3764a03705d61decb6025b409360e9d53f # v7.1.1
GIT_SHALLOW True
UPDATE_DISCONNECTED True
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${EXTERNAL_BASE_DIR} -DCMAKE_BUILD_TYPE=Release -DCMAKE_MSVC_RUNTIME_LIBRARY=${CMAKE_MSVC_RUNTIME_LIBRARY} -DBUILD_SHARED_LIBS=OFF -DBUILD_TESTING=OFF -DEXAMPLES_INSTALL=OFF -DSUNDIALS_ENABLE_ERROR_CHECKS=OFF
BUILD_COMMAND ${CMAKE_COMMAND} --build . --config Release
BUILD_BYPRODUCTS ${EXTERNAL_BASE_DIR}/lib/libsundials_cvode.a ${EXTERNAL_BASE_DIR}/lib/libsundials_core.a
INSTALL_COMMAND ${CMAKE_COMMAND} --install . --config Release
)
add_library(cvode STATIC IMPORTED)
set_target_properties(cvode PROPERTIES IMPORTED_LOCATION ${EXTERNAL_BASE_DIR}/lib/libsundials_core.a)
add_dependencies(cvode cvode_src)

set(CMAKE_MSVC_RUNTIME_LIBRARY MultiThreaded)

if(WIN32)
set(FMI_PLATFORM "${FMI_ARCHITECTURE}-windows")
elseif(APPLE)
set(FMI_PLATFORM "${FMI_ARCHITECTURE}-darwin")
else()
set(FMI_PLATFORM "${FMI_ARCHITECTURE}-linux")
endif()

set(FMUSIM_SOURCES
../include/FMI.h
../src/FMI.c
../include/FMI1.h
../src/FMI1.c
../include/FMI2.h
../src/FMI2.c
../include/FMI3.h
../src/FMI3.c
../fmusim/FMIUtil.h
../fmusim/FMIUtil.c
../fmusim/FMIStaticInput.h
../fmusim/FMIStaticInput.c
../fmusim/FMISimulation.h
../fmusim/FMISimulation.c
../fmusim/FMI1CSSimulation.h
../fmusim/FMI1CSSimulation.c
../fmusim/FMI1MESimulation.h
../fmusim/FMI1MESimulation.c
../fmusim/FMI2CSSimulation.h
../fmusim/FMI2CSSimulation.c
../fmusim/FMI2MESimulation.h
../fmusim/FMI2MESimulation.c
../fmusim/FMI3CSSimulation.h
../fmusim/FMI3CSSimulation.c
../fmusim/FMI3MESimulation.h
../fmusim/FMI3MESimulation.c
../fmusim/FMIRecorder.h
../fmusim/FMIRecorder.c
../fmusim/FMIEuler.h
../fmusim/FMIEuler.c
../fmusim/FMICVode.h
../fmusim/FMICVode.c
../fmusim/csv.h
../fmusim/csv.c
../fmusim/FMIZip.h
../fmusim/FMIZip.c
../fmusim/miniunzip.c
../fmusim/FMIModelDescription.c
../fmusim/FMIModelDescription.h
../fmusim/FMIBuildDescription.c
../fmusim/FMIBuildDescription.h
../include/structured_variable_name.tab.h
../src/structured_variable_name.tab.c
../src/structured_variable_name.yy.c
${ZLIB_SRC_DIR}/contrib/minizip/unzip.c
${ZLIB_SRC_DIR}/contrib/minizip/ioapi.c
)
if(WIN32)
set(FMUSIM_SOURCES ${FMUSIM_SOURCES} ${ZLIB_SRC_DIR}/contrib/minizip/iowin32.c)
endif()

set(FMUSIM_INCLUDES
../fmusim
../include
${EXTERNAL_BASE_DIR}/include
${EXTERNAL_BASE_DIR}/include/libxml2
${ZLIB_SRC_DIR}/contrib/minizip
)

if(WIN32)
set(FMUSIM_LIBS
${EXTERNAL_BASE_DIR}/lib/libxml2s.lib
${EXTERNAL_BASE_DIR}/lib/zlibstatic.lib
${EXTERNAL_BASE_DIR}/lib/sundials_cvode_static.lib
${EXTERNAL_BASE_DIR}/lib/sundials_core_static.lib
)
elseif(UNIX AND NOT APPLE)
set(FMUSIM_LIBS
${EXTERNAL_BASE_DIR}/lib/libxml2.a
${EXTERNAL_BASE_DIR}/lib/libz.a
${EXTERNAL_BASE_DIR}/lib/libsundials_cvode.a
${EXTERNAL_BASE_DIR}/lib/libsundials_core.a
${CMAKE_DL_LIBS}
m
)
else()
set(FMUSIM_LIBS
${EXTERNAL_BASE_DIR}/lib/libxml2.a
${EXTERNAL_BASE_DIR}/lib/libz.a
${EXTERNAL_BASE_DIR}/lib/libsundials_cvode.a
${EXTERNAL_BASE_DIR}/lib/libsundials_core.a
)
endif()

set(FMUSIM_DEPENDS zlib xml2 cvode)
Loading