From 409eec1f80552bd05c876e8f2a0fd5bfc44c1b4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Filip=20Stenstr=C3=B6m?= Date: Fri, 14 Jul 2023 12:23:00 +0200 Subject: [PATCH] Change include_directories to target_include_directories and test installation (#73) --- .devcontainer/{ => centos}/devcontainer.json | 3 +- .devcontainer/ubuntu/devcontainer.json | 19 +++ .gitignore | 2 + .vscode/settings.json | 3 +- .vscode/tasks.json | 12 ++ CMakeLists.txt | 116 ++++++++++++------ Config.cmake/config_test.h.cmake | 2 - Config.cmake/fmicapi.cmake | 22 ++-- Config.cmake/fmiimport.cmake | 52 ++++---- Config.cmake/fmixml.cmake | 32 ++--- Config.cmake/fmizip.cmake | 41 ++++--- Config.cmake/jmutil.cmake | 36 +++--- Config.cmake/runtime_test.cmake | 62 +++++++--- Config.cmake/test_fmi1.cmake | 23 +++- Config.cmake/test_fmi2.cmake | 11 +- Config.cmake/test_fmi3.cmake | 12 +- Makefile | 24 +++- Test/FMI1/fmi1_capi_me_test.c | 5 +- Test/jm_locale_test.c | 12 -- Test/test_installation/CMakeLists.txt | 107 ++++++++++++++++ Test/test_installation/main.c | 27 ++++ build/config/centos64 | 9 +- build/config/documentation | 12 +- build/config/mingw_w64 | 6 +- build/config/ubuntu64 | 9 +- build/config/win64 | 6 +- build/config/win64_static_runtime | 6 +- build/docker/Makefile | 8 +- ...{Dockerfile_centos => centos64.Dockerfile} | 0 ...{Dockerfile_ubuntu => ubuntu64.Dockerfile} | 0 src/ZIP/include/FMI/fmi_zip_unzip.h | 15 ++- 31 files changed, 486 insertions(+), 208 deletions(-) rename .devcontainer/{ => centos}/devcontainer.json (82%) create mode 100644 .devcontainer/ubuntu/devcontainer.json create mode 100644 Test/test_installation/CMakeLists.txt create mode 100644 Test/test_installation/main.c rename build/docker/{Dockerfile_centos => centos64.Dockerfile} (100%) rename build/docker/{Dockerfile_ubuntu => ubuntu64.Dockerfile} (100%) diff --git a/.devcontainer/devcontainer.json b/.devcontainer/centos/devcontainer.json similarity index 82% rename from .devcontainer/devcontainer.json rename to .devcontainer/centos/devcontainer.json index a0c3b953..91983d5c 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/centos/devcontainer.json @@ -1,6 +1,7 @@ { + "name": "centos", "build": { - "dockerfile": "../build/docker/Dockerfile_ubuntu" + "dockerfile": "${localWorkspaceFolder}/build/docker/Dockerfile_centos" }, "workspaceFolder": "/mnt/fmi-library", "workspaceMount": "source=${localWorkspaceFolder},target=/mnt/fmi-library,type=bind", diff --git a/.devcontainer/ubuntu/devcontainer.json b/.devcontainer/ubuntu/devcontainer.json new file mode 100644 index 00000000..82a308cc --- /dev/null +++ b/.devcontainer/ubuntu/devcontainer.json @@ -0,0 +1,19 @@ +{ + "name": "ubuntu", + "build": { + "dockerfile": "${localWorkspaceFolder}/build/docker/Dockerfile_ubuntu" + }, + "workspaceFolder": "/mnt/fmi-library", + "workspaceMount": "source=${localWorkspaceFolder},target=/mnt/fmi-library,type=bind", + "customizations": { + "vscode": { + "extensions": [ + "vms-vscode.cpptools", + "ms-vscode.cmake-tools", + "ms-vscode.makefile-tools", + "ms-vscode.cpptools-extension-pack", + "matepek.vscode-catch2-test-adapter" + ] + } + } +} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 75884865..938d4516 100644 --- a/.gitignore +++ b/.gitignore @@ -15,4 +15,6 @@ /src/XML/src-gen/ +/Test/test_installation/build + /ThirdParty/winflexbison/ \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 48a15d72..0aa3f8ac 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,7 +2,8 @@ "cmake.buildDirectory": "${workspaceFolder}/build_cmake", // The default ('build') is already used "cmake.configureOnOpen": false, "cmake.preferredGenerators": [ - "Ninja" // NOTE: Jenkins still runs with "Unix Makefiles" since other downstream projects use that + "Ninja", // NOTE: Jenkins still runs with "Unix Makefiles" since other downstream projects use that + "Unix Makefiles", // For centos7 (This line needs to swapped with the one above to take effect) ], "testMate.cpp.test.executables": "{build_cmake}/**/*{test,Test,TEST}*", "testMate.cpp.log.logpanel": true, diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 0ac71ae0..80f73be3 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -6,8 +6,20 @@ { "label": "Memcheck", "type": "shell", + "command": "make install test_unit CONFIG_FILE=build/config/ubuntu64", + "problemMatcher": [] + }, + { + "label": "Test", + "type": "shell", "command": "make install test CONFIG_FILE=build/config/ubuntu64", "problemMatcher": [] + }, + { + "label": "Test installation", + "type": "shell", + "command": "make install test_installation CONFIG_FILE=build/config/ubuntu64", + "problemMatcher": [] } ] } \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 008b4348..a90c7f04 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,7 +14,7 @@ # CMake 3.1.3 or later is required to build Expat (as ExternalProject). However, # keeping 2.8.6 on the FMIL main project for now since updating causes issues # with CMP0026 (and more). -cmake_minimum_required (VERSION 2.8.6 FATAL_ERROR) +cmake_minimum_required(VERSION 2.8.6 FATAL_ERROR) # Prohibit in-source build if("${CMAKE_SOURCE_DIR}" STREQUAL "${CMAKE_BINARY_DIR}") @@ -46,6 +46,8 @@ set_property(GLOBAL PROPERTY PROPERTYPREDEFINED_TARGETS_FOLDER Global) set(FMILIBRARYHOME ${FMILibrary_SOURCE_DIR}) set(FMILIBRARYBUILD ${FMILibrary_BINARY_DIR}) +set(CMAKE_MODULE_PATH ${FMILIBRARYHOME}/Config.cmake) + # User configuration options and parameters set(FMILIB_INSTALL_PREFIX ${FMILibrary_BINARY_DIR}/../install CACHE PATH "Prefix prepended to install directories") set(FMILIB_THIRDPARTYLIBS ${FMILibrary_SOURCE_DIR}/ThirdParty CACHE PATH "Path to the ThirdParty library dir" ) @@ -160,9 +162,6 @@ if(CMAKE_COMPILER_IS_GNUCC) endif() endif() -# The config files will end up in the binary dir -include_directories("${FMILibrary_BINARY_DIR}") - if(FMILIB_BUILD_FOR_SHARED_LIBS) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_SHARED_LIBRARY_C_FLAGS}") set(WITH_PIC ON) # this is used in MERGE_LIBRARIES below @@ -197,7 +196,6 @@ if(MSVC AND (${CMAKE_GENERATOR} MATCHES "Visual Studio 10")) source_group("Private headers\\FMI3" REGULAR_EXPRESSION "fmi3_.*impl.h") endif() -set(FMILIBKIND STATIC) if(NOT FMILIB_STATIC_LIB_ONLY) add_definitions(-DFMILIB_BUILDING_LIBRARY) endif() @@ -226,22 +224,12 @@ if(MSVC AND (MSVC_VERSION LESS 1900)) set(HAVE_VSNPRINTF FALSE) endif() -add_subdirectory(ThirdParty/c99_snprintf) - -set(CMAKE_MODULE_PATH ${FMILIBRARYHOME}/Config.cmake) - -include(jmutil) -include(fmixml) -include(fmicapi) -include(fmizip) -include(fmiimport) - #Cmake variables set in config files. if(WIN32) set(FMI_FILE_SEP "\\\\") -else(WIN32) +else() set(FMI_FILE_SEP "/") -endif(WIN32) +endif() # Sets VARNAME to the user-configured platform name, or auto-detects it based on the # current platform and provided FMI version. @@ -260,13 +248,49 @@ set_fmi_platform(FMI1_PLATFORM 1) set_fmi_platform(FMI2_PLATFORM 2) set_fmi_platform(FMI3_PLATFORM 3) +# =============================================================================== +# Generate headers +# =============================================================================== + +# Put the headers in different directories to allow more fine-grained include flags, +# since we don't want to accidentally include more than we should. That could lead +# to issues not detected until testing the installation. +set(FMILIB_CONFIG_INCLUDE_DIR "${FMILibrary_BINARY_DIR}/fmilib_config_include") +set(FMILIB_TESTCONFIG_INCLUDE_DIR "${FMILibrary_BINARY_DIR}/fmilib_test_config_include") +set(FMILIB_INCLUDE_DIR "${FMILibrary_BINARY_DIR}/fmilib_include") + +file(MAKE_DIRECTORY "${FMILIB_CONFIG_INCLUDE_DIR}") +file(MAKE_DIRECTORY "${FMILIB_TESTCONFIG_INCLUDE_DIR}") +file(MAKE_DIRECTORY "${FMILIB_INCLUDE_DIR}") + configure_file ( "${FMILibrary_SOURCE_DIR}/Config.cmake/config_fmilib.h.cmake" - "${FMILibrary_BINARY_DIR}/fmilib_config.h" + "${FMILIB_CONFIG_INCLUDE_DIR}/fmilib_config.h" ) -set(FMILIB_SHARED_SUBLIBS ${FMIXML_LIBRARIES} ${FMIZIP_LIBRARIES} ${FMICAPI_LIBRARIES} expat minizip zlib c99snprintf) -set(FMILIB_SUBLIBS ${FMIIMPORT_LIBRARIES} ${JMUTIL_LIBRARIES} ${FMILIB_SHARED_SUBLIBS}) +file(COPY "${FMILIBRARYHOME}/Config.cmake/fmilib.h" DESTINATION "${FMILIB_INCLUDE_DIR}") + +# =============================================================================== + +add_subdirectory(ThirdParty/c99_snprintf) + +include(jmutil) +include(fmixml) +include(fmicapi) +include(fmizip) +include(fmiimport) +if(FMILIB_BUILD_TESTS) + include(runtime_test) + # Configuration depends on values set in all the different test*.cmake files, + # so can't be done until here. + configure_file ( + "${FMILibrary_SOURCE_DIR}/Config.cmake/config_test.h.cmake" + "${FMILIB_TESTCONFIG_INCLUDE_DIR}/config_test.h" + ) +endif() + +set(FMILIB_SHARED_SUBLIBS fmixml fmizip fmicapi expat minizip zlib c99snprintf) +set(FMILIB_SUBLIBS fmiimport jmutils ${FMILIB_SHARED_SUBLIBS}) # XXX: Unclear why we create intermediate sublibs instead of just giving everything as source. # Probably also wouldn't get problems with using PRIVATE/PUBLIC on linking sublibs on Windows. set(FMILIB_SHARED_SRC ${FMIIMPORTSOURCE} ${FMIIMPORTHEADERS} ${JMUTILSOURCE} ${JMUTIL_PUBHEADERS}) @@ -281,8 +305,8 @@ if(FMILIB_GENERATE_BUILD_STAMP) COMMAND ${CMAKE_COMMAND} -E touch ${FMILibrary_BINARY_DIR}/config_fmilib.c DEPENDS ${FMILIB_SUBLIBS} ) - add_library(fmilib_timestamp STATIC ${FMILibrary_BINARY_DIR}/config_fmilib.c "${FMILibrary_BINARY_DIR}/fmilib_config.h") -# add_dependencies(fmilib_timestamp ${FMILIB_SUBLIBS} expat minizip zlib ${FMILIBRARYHOME}/Config.cmake/config_stamp.cmake) + add_library(fmilib_timestamp STATIC ${FMILibrary_BINARY_DIR}/config_fmilib.c "${FMILIB_CONFIG_INCLUDE_DIR}/fmilib_config.h") + target_include_directories(fmilib_timestamp PRIVATE ${FMILIB_CONFIG_INCLUDE_DIR}) set(FMILIB_SUBLIBS ${FMILIB_SUBLIBS} fmilib_timestamp) set(FMILIB_SHARED_SRC ${FMILIB_SHARED_SRC} ${FMILibrary_BINARY_DIR}/config_fmilib.c) @@ -315,6 +339,15 @@ if(FMILIB_BUILD_STATIC_LIB) target_link_libraries(fmilib dl) endif() set(FMILIB_TARGETS ${FMILIB_TARGETS} fmilib) + # Set PUBLIC include_directories such that test targets that link with fmilib inherit + # the same include dirs as will exist for installation. + target_include_directories(fmilib + PUBLIC + ${JMUTIL_PUBLIC_INCLUDE_DIR} + ${FMIIMPORT_PUBLIC_INCLUDE_DIR} + ${FMILIB_INCLUDE_DIR} + ${FMILIB_CONFIG_INCLUDE_DIR} + ) endif() if(FMILIB_BUILD_SHARED_LIB) @@ -328,23 +361,28 @@ if(FMILIB_BUILD_SHARED_LIB) target_compile_definitions(fmilib_shared PRIVATE -D_GNU_SOURCE) endif() - # Must be PRIVATE or will cause both fmilib_shared and the sublibs to be linked - # with anything that links with fmilib_shared (i.e. tests). This otherwise causes - # link errors on Windows. - target_link_libraries(fmilib_shared PRIVATE ${FMILIB_SHARED_SUBLIBS}) - set(FMILIB_TARGETS ${FMILIB_TARGETS} fmilib_shared) -endif() - -if(FMILIB_BUILD_TESTS) - include(runtime_test) - configure_file ( - "${FMILibrary_SOURCE_DIR}/Config.cmake/config_test.h.cmake" - "${FMILibrary_BINARY_DIR}/config_test.h" + # Must be PRIVATE, or tests will later inherit compile/link properties from sublibs. + # That is incorrect, and may cause link issues. + # + # FIXME: + # Issue: We link static libraries (fmixml) that depend on other static libraries (jmutils), + # which are also compiled from source (jmutils) to a shared library. + # One solution is to also package jmutils as a shared lib and to fix proper packaging for + # find_package etc. (which would make it easier to get away from merge_static_libs as well). + target_link_libraries(fmilib_shared PRIVATE ${FMILIB_SHARED_SUBLIBS} ${JMUTILS_DEPENDENCY_LIBS}) + + target_include_directories(fmilib_shared + PRIVATE + ${FMIIMPORT_PRIVATE_INCLUDE_DIRS} + PUBLIC + ${JMUTILS_PUBLIC_INCLUDE_DIRS} + ${FMIIMPORT_PUBLIC_INCLUDE_DIRS} + ${FMILIB_INCLUDE_DIR} + ${FMILIB_CONFIG_INCLUDE_DIR} ) + set(FMILIB_TARGETS ${FMILIB_TARGETS} fmilib_shared) endif() -file(COPY "${FMILIBRARYHOME}/Config.cmake/fmilib.h" DESTINATION "${FMILibrary_BINARY_DIR}") - install(TARGETS ${FMILIB_TARGETS} ARCHIVE DESTINATION lib LIBRARY DESTINATION lib @@ -357,8 +395,8 @@ install(FILES DESTINATION doc) install(FILES - "${FMILibrary_BINARY_DIR}/fmilib_config.h" - "${FMILibrary_BINARY_DIR}/fmilib.h" + "${FMILIB_CONFIG_INCLUDE_DIR}/fmilib_config.h" + "${FMILIB_INCLUDE_DIR}/fmilib.h" DESTINATION include) install(DIRECTORY @@ -405,7 +443,7 @@ if(FMILIB_GENERATE_DOXYGEN_DOC) file(COPY "${FMILIBRARYHOME}/Config.cmake/fmilib.h" - "${FMILibrary_BINARY_DIR}/fmilib_config.h" + "${FMILIB_CONFIG_INCLUDE_DIR}/fmilib_config.h" DESTINATION ${FMILIBRARYBUILD}/doc) set(fmilib_mainpage_h "${FMILIBRARYBUILD}/doc/fmilib_mainpage.h") diff --git a/Config.cmake/config_test.h.cmake b/Config.cmake/config_test.h.cmake index b72e4be5..fbedd824 100644 --- a/Config.cmake/config_test.h.cmake +++ b/Config.cmake/config_test.h.cmake @@ -40,8 +40,6 @@ #define FMIL_TEST_DIR "@FMIL_TEST_DIR@" #define FMI3_TEST_XML_DIR "@FMI3_TEST_XML_DIR@" -#define ARRAY_TEST_MODEL_DESCRIPTION_DIR "@ARRAY_TEST_MODEL_DESCRIPTION_DIR@" - #define CTEST_RETURN_SUCCESS @CTEST_RETURN_SUCCESS@ #define CTEST_RETURN_FAIL @CTEST_RETURN_FAIL@ diff --git a/Config.cmake/fmicapi.cmake b/Config.cmake/fmicapi.cmake index 295ed942..c88391fe 100644 --- a/Config.cmake/fmicapi.cmake +++ b/Config.cmake/fmicapi.cmake @@ -18,9 +18,6 @@ set(FMICAPIDIR ${FMILIBRARYHOME}/src/CAPI) include(jmutil) -include_directories("${FMICAPIDIR}/include" "${FMICAPIDIR}/src") -set(FMICAPI_LIBRARIES fmicapi) - set(FMICAPISOURCE src/FMI1/fmi1_capi_cs.c src/FMI1/fmi1_capi_me.c @@ -42,17 +39,18 @@ set(FMICAPIHEADERS src/FMI3/fmi3_capi_impl.h ) -include_directories(${FMILIB_FMI_STANDARD_HEADERS}) - PREFIXLIST(FMICAPISOURCE ${FMICAPIDIR}/) PREFIXLIST(FMICAPIHEADERS ${FMICAPIDIR}/) -add_library(fmicapi ${FMILIBKIND} ${FMICAPISOURCE} ${FMICAPIHEADERS}) - -target_link_libraries(fmicapi ${JMUTIL_LIBRARIES}) - -# install(DIRECTORY ${FMIXMLDIR}/include DESTINATION .) -# install(DIRECTORY ${FMICAPIDIR}/include DESTINATION .) -#install(DIRECTORY ${JMRUNTIMEHOME}/FMI/ZIP/include DESTINATION include) +add_library(fmicapi STATIC ${FMICAPISOURCE} ${FMICAPIHEADERS}) +target_link_libraries(fmicapi PUBLIC jmutils) +target_include_directories(fmicapi + PRIVATE + ${FMICAPIDIR}/src + ${FMILIB_FMI_STANDARD_HEADERS} + PUBLIC + ${FMILIB_CONFIG_INCLUDE_DIR} + ${FMICAPIDIR}/include +) endif(NOT FMICAPIDIR) diff --git a/Config.cmake/fmiimport.cmake b/Config.cmake/fmiimport.cmake index 1eb44e45..f85d1d85 100644 --- a/Config.cmake/fmiimport.cmake +++ b/Config.cmake/fmiimport.cmake @@ -21,14 +21,6 @@ include(fmicapi) ################################################################################ set(DOXYFILE_EXTRA_SOURCES "${DOXYFILE_EXTRA_SOURCES} \"${FMIIMPORTDIR}/include\"") -include_directories( - "${FMIIMPORTDIR}" - "${FMIIMPORTDIR}/include" - "${FMILIB_THIRDPARTYLIBS}/FMI/" - "${CMAKE_BINARY_DIR}/src/Import" -) -set(FMIIMPORT_LIBRARIES fmiimport) - set(FMIIMPORT_PUBHEADERS include/FMI1/fmi1_import.h include/FMI1/fmi1_import_capi.h @@ -60,7 +52,7 @@ set(FMIIMPORT_PUBHEADERS include/FMI/fmi_import_context.h include/FMI/fmi_import_options.h include/FMI/fmi_import_util.h - ) +) set(FMIIMPORT_PRIVHEADERS src/FMI1/fmi1_import_impl.h @@ -75,11 +67,11 @@ set(FMIIMPORT_PRIVHEADERS ) PREFIXLIST(FMIIMPORT_PRIVHEADERS ${FMIIMPORTDIR}/) -PREFIXLIST(FMIIMPORT_PUBHEADERS ${FMIIMPORTDIR}/) +PREFIXLIST(FMIIMPORT_PUBHEADERS ${FMIIMPORTDIR}/) set(FMIIMPORTHEADERS ${FMIIMPORT_PUBHEADERS} ${FMIIMPORT_PRIVHEADERS} - ) +) set(FMIIMPORTSOURCE src/FMI/fmi_import_context.c @@ -113,19 +105,33 @@ set(FMIIMPORTSOURCE src/FMI3/fmi3_import.c src/FMI3/fmi3_import_priv.c src/FMI3/fmi3_import_convenience.c - ) +) PREFIXLIST(FMIIMPORTSOURCE ${FMIIMPORTDIR}/) -add_library(fmiimport ${FMILIBKIND} ${FMIIMPORTSOURCE} ${FMIIMPORTHEADERS}) -target_link_libraries(fmiimport ${JMUTIL_LIBRARIES} ${FMIXML_LIBRARIES} ${FMIZIP_LIBRARIES} ${FMICAPI_LIBRARIES}) -#target_link_libraries(fmiimportshared fmiimport) - -#add_library(fmiimport_shared SHARED ${FMIIMPORTSOURCE} ${FMIIMPORTHEADERS} ) -#target_link_libraries(fmiimport_shared fmiimport ${JMUTIL_LIBRARIES} ${FMIXML_LIBRARIES} ${FMIZIP_LIBRARIES} ${FMICAPI_LIBRARIES}) -#install(TARGETS fmiimport_shared -# ARCHIVE DESTINATION lib -# LIBRARY DESTINATION lib -# RUNTIME DESTINATION lib -#) +set(FMIIMPORT_PUBLIC_INCLUDE_DIR ${FMIIMPORTDIR}/include) + +# XXX: +# Since target fmilib_shared essentially is fmiimport + jmutils, we need +# to make all the properties of these sub-libraries available when building +# that target. +set(FMIIMPORT_PRIVATE_INCLUDE_DIRS + ${FMIIMPORTDIR}/src + ${FMILIB_THIRDPARTYLIBS}/FMI + ${EXPAT_INCLUDE_DIRS} # FIXME: XML_Parser is used in fmi_import_context_impl.h +) +set(FMIIMPORT_PUBLIC_INCLUDE_DIRS + ${FMILIB_CONFIG_INCLUDE_DIR} + ${FMIIMPORT_PUBLIC_INCLUDE_DIR} +) + +add_library(fmiimport STATIC ${FMIIMPORTSOURCE} ${FMIIMPORTHEADERS}) +target_link_libraries(fmiimport + PRIVATE jmutils fmixml fmizip fmicapi +) +target_include_directories(fmiimport + PRIVATE ${FMIIMPORT_PRIVATE_INCLUDE_DIRS} + PUBLIC ${FMIIMPORT_PUBLIC_INCLUDE_DIR} +) + endif(NOT FMIIMPORTDIR) diff --git a/Config.cmake/fmixml.cmake b/Config.cmake/fmixml.cmake index 389b2f5d..64d1c1d8 100644 --- a/Config.cmake/fmixml.cmake +++ b/Config.cmake/fmixml.cmake @@ -101,8 +101,6 @@ endif() # set(DOXYFILE_EXTRA_SOURCES "${DOXYFILE_EXTRA_SOURCES} \"${FMIXMLDIR}/include\"") -include_directories("${FMIXMLDIR}/include" "${FMILIB_THIRDPARTYLIBS}/FMI/") -set(FMIXML_LIBRARIES fmixml) set(FMIXML_EXPAT_DIR "${FMILIB_THIRDPARTYLIBS}/Expat/expat-2.4.8") set(FMIXMLHEADERS @@ -264,15 +262,6 @@ endif() set(EXPAT_INCLUDE_DIRS ${CMAKE_BINARY_DIR}/ExpatEx/install/include) -include_directories( - "${EXPAT_INCLUDE_DIRS}" - "${FMILIB_THIRDPARTYLIBS}/FMI/" - "${FMIXMLGENDIR}/FMI1" - "${FMIXMLGENDIR}/FMI2" - "${FMIXMLGENDIR}/FMI3" - ${CMAKE_BINARY_DIR}/src/XML -) - PREFIXLIST(FMIXMLSOURCE ${FMIXMLDIR}/) PREFIXLIST(FMIXMLHEADERS ${FMIXMLDIR}/) @@ -285,12 +274,25 @@ list(APPEND FMIXMLSOURCE ${FLEX_FMI1_OUT_SRC} ) -debug_message(STATUS "adding fmixml") - -add_library(fmixml ${FMILIBKIND} ${FMIXMLSOURCE} ${FMIXMLHEADERS}) +add_library(fmixml STATIC ${FMIXMLSOURCE} ${FMIXMLHEADERS}) if(MSVC) target_compile_definitions(fmixml PUBLIC XML_STATIC) endif() -target_link_libraries(fmixml ${JMUTIL_LIBRARIES} expat) +target_link_libraries(fmixml + PRIVATE expat + PUBLIC jmutils +) +target_include_directories(fmixml + PRIVATE + ${EXPAT_INCLUDE_DIRS} + ${FMILIB_THIRDPARTYLIBS}/FMI/ + ${FMIXMLGENDIR}/FMI1 + ${FMIXMLGENDIR}/FMI2 + ${FMIXMLGENDIR}/FMI3 + ${CMAKE_BINARY_DIR}/src/XML + PUBLIC + ${FMILIB_CONFIG_INCLUDE_DIR} + ${FMIXMLDIR}/include +) endif(NOT FMIXMLDIR) diff --git a/Config.cmake/fmizip.cmake b/Config.cmake/fmizip.cmake index e67912ec..38d85618 100644 --- a/Config.cmake/fmizip.cmake +++ b/Config.cmake/fmizip.cmake @@ -12,35 +12,40 @@ # along with this program. If not, contact Modelon AB . if(NOT FMIZIPDIR) - set(FMIZIPDIR ${FMILIBRARYHOME}/src/ZIP) +set(FMIZIPDIR ${FMILIBRARYHOME}/src/ZIP) - include(jmutil) +include(jmutil) - # set(DOXYFILE_EXTRA_SOURCES "${DOXYFILE_EXTRA_SOURCES} \"${FMIZIPDIR}/include\"") +# set(DOXYFILE_EXTRA_SOURCES "${DOXYFILE_EXTRA_SOURCES} \"${FMIZIPDIR}/include\"") - set(FMIZIP_LIBRARIES fmizip) - - add_subdirectory(Config.cmake/Minizip) - - include_directories("${FMIZIPDIR}/include" "${FMILIB_THIRDPARTYLIBS}/Minizip/minizip" "${FMILIB_THIRDPARTYLIBS}/FMI" "${FMILIB_THIRDPARTYLIBS}/Zlib/zlib-1.2.6" "${FMILibrary_BINARY_DIR}/zlib") +add_subdirectory(Config.cmake/Minizip) set(FMIZIPSOURCE - ${FMIZIPDIR}/src/fmi_zip_unzip.c - ${FMIZIPDIR}/src/fmi_zip_zip.c + ${FMIZIPDIR}/src/fmi_zip_unzip.c + ${FMIZIPDIR}/src/fmi_zip_zip.c ) set(FMIZIPHEADERS -# src/fmi_zip_unzip_impl.h - ${FMIZIPDIR}/include/FMI/fmi_zip_unzip.h - ${FMIZIPDIR}/include/FMI/fmi_zip_zip.h + ${FMIZIPDIR}/include/FMI/fmi_zip_unzip.h + ${FMIZIPDIR}/include/FMI/fmi_zip_zip.h ) -#include_directories("${FMILIB_THIRDPARTYLIBS}/zlib/lib/VS2005/win32") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DZLIB_STATIC") -add_library(fmizip ${FMILIBKIND} ${FMIZIPSOURCE} ${FMIZIPHEADERS}) - -target_link_libraries(fmizip minizip jmutils) +add_library(fmizip STATIC ${FMIZIPSOURCE} ${FMIZIPHEADERS}) +target_link_libraries(fmizip + PRIVATE minizip + PUBLIC jmutils +) +target_include_directories(fmizip + PRIVATE + ${FMILIB_THIRDPARTYLIBS}/Minizip/minizip + ${FMILIB_THIRDPARTYLIBS}/FMI + ${FMILIB_THIRDPARTYLIBS}/Zlib/zlib-1.2.6 + ${FMILibrary_BINARY_DIR}/zlib + PUBLIC + ${FMILIB_CONFIG_INCLUDE_DIR} + ${FMIZIPDIR}/include +) endif(NOT FMIZIPDIR) diff --git a/Config.cmake/jmutil.cmake b/Config.cmake/jmutil.cmake index 414d3094..3ab1285d 100644 --- a/Config.cmake/jmutil.cmake +++ b/Config.cmake/jmutil.cmake @@ -12,10 +12,9 @@ # along with this program. If not, contact Modelon AB . if(NOT JMUTILDIR) - set(JMUTILDIR ${FMILIBRARYHOME}/src/Util/) - set(JMUTIL_LIBRARIES jmutils) - include_directories ("${JMUTILDIR}/include" "${FMILIB_FMI_STANDARD_HEADERS}") - set(DOXYFILE_EXTRA_SOURCES "${DOXYFILE_EXTRA_SOURCES} \"${JMUTILDIR}/include\"") +set(JMUTILDIR ${FMILIBRARYHOME}/src/Util/) + +set(DOXYFILE_EXTRA_SOURCES "${DOXYFILE_EXTRA_SOURCES} \"${JMUTILDIR}/include\"") set(JMUTILSOURCE JM/jm_callbacks.c @@ -73,23 +72,28 @@ set(JMUTILHEADERS ${JMUTIL_PUBHEADERS} ${JMUTIL_PRIVHEADERS} ) -add_library(jmutils ${FMILIBKIND} ${JMUTILSOURCE} ${JMUTILHEADERS}) +set(JMUTIL_PUBLIC_INCLUDE_DIR ${JMUTILDIR}/include) + +set(JMUTILS_PUBLIC_INCLUDE_DIRS + ${FMILIB_FMI_STANDARD_HEADERS} + ${FMILIB_CONFIG_INCLUDE_DIR} + ${JMUTIL_PUBLIC_INCLUDE_DIR} +) -if(CYGWIN) -message("not tested") -endif(CYGWIN) +if(UNIX) + set(JMUTILS_DEPENDENCY_LIBS c99snprintf dl) +else() + set(JMUTILS_DEPENDENCY_LIBS c99snprintf Shlwapi) +endif() -target_link_libraries(jmutils c99snprintf) +add_library(jmutils STATIC ${JMUTILSOURCE} ${JMUTILHEADERS}) +target_link_libraries(jmutils PRIVATE ${JMUTILS_DEPENDENCY_LIBS}) +target_include_directories(jmutils + PUBLIC ${JMUTILS_PUBLIC_INCLUDE_DIRS} +) if(UNIX AND NOT APPLE) target_compile_definitions(jmutils PRIVATE -D_GNU_SOURCE) endif() -if(UNIX) - target_link_libraries(jmutils dl) -endif(UNIX) -if(WIN32) - target_link_libraries(jmutils Shlwapi) -endif(WIN32) - endif(NOT JMUTILDIR) diff --git a/Config.cmake/runtime_test.cmake b/Config.cmake/runtime_test.cmake index 9e5f7191..9ad01af9 100644 --- a/Config.cmake/runtime_test.cmake +++ b/Config.cmake/runtime_test.cmake @@ -12,17 +12,35 @@ # along with this program. If not, contact Modelon AB . set(FMIL_TEST_DIR ${FMILIBRARYHOME}/Test) -set(CATCH_INCLUDE_DIR ${FMILIB_THIRDPARTYLIBS}/Catch2/single_include/catch2) set(TEST_OUTPUT_FOLDER ${CMAKE_CURRENT_BINARY_DIR}/Testing) -include_directories( - ${FMIL_TEST_DIR} - ${CATCH_INCLUDE_DIR} +# Only the directories that are specific to tests. +set(FMIL_TEST_INCLUDE_DIRS + ${FMILIB_TESTCONFIG_INCLUDE_DIR} + ${FMIL_TEST_DIR} + ${FMIL_TEST_DIR}/FMI1 + ${FMIL_TEST_DIR}/FMI2 + ${FMIL_TEST_DIR}/FMI3 ) +# XXX: +# Workaround to allow testing with sublibs on MinGW (unclear why it works with MSVC). +# +# The problem is that in config_fmilib.h we define FMILIB_EXPORT as __declspec(import), +# when building the tests. This makes the test expect to link against an import +# library. This is no problem when testing against fmilib_shared because it's a shared +# library, but we never compile the sublibs to shared libraries - only static libraries. +# +# This workaround makes FMILIB_EXPORT expand to nothing. +SET(FMIL_LINK_WITH_SUBLIBS FMILIB_STATIC_LIB_ONLY) + +# =============================================================================== +# fmi_testutil +# =============================================================================== + add_library(fmi_testutil STATIC ${FMIL_TEST_DIR}/fmi_testutil.c) -target_link_libraries(fmi_testutil PRIVATE ${JMUTIL_LIBRARIES}) # Uses jm_vector -set(FMILIBFORTEST fmilib fmi_testutil) + +target_link_libraries(fmi_testutil PRIVATE jmutils) # Uses jm_vector if(FMILIB_BUILD_SHARED_LIB AND (FMILIB_LINK_TEST_TO_SHAREDLIB OR NOT FMILIB_BUILD_STATIC_LIB)) set(FMILIBFORTEST fmilib_shared fmi_testutil) target_link_libraries(fmi_testutil PRIVATE fmilib_shared) @@ -30,22 +48,30 @@ else() set(FMILIBFORTEST fmilib fmi_testutil) target_link_libraries(fmi_testutil PRIVATE fmilib) endif() -message(STATUS "Tests will be linked with ${FMILIBFORTEST}") + +# Convenience: By setting this to PUBLIC, all tests that link with fmi_testutil +# will inherit the include directories. +target_include_directories(fmi_testutil PUBLIC ${FMIL_TEST_INCLUDE_DIRS}) + +# =============================================================================== # Test: jm_vector add_executable(jm_vector_test ${FMIL_TEST_DIR}/jm_vector_test.c) -target_link_libraries(jm_vector_test ${JMUTIL_LIBRARIES}) +target_link_libraries(jm_vector_test PRIVATE jmutils) +target_include_directories(jm_vector_test PRIVATE ${FMIL_TEST_INCLUDE_DIRS}) # Test: jm locale add_executable(jm_locale_test ${FMIL_TEST_DIR}/jm_locale_test.c) -target_link_libraries(jm_locale_test ${JMUTIL_LIBRARIES}) +target_link_libraries(jm_locale_test jmutils) +target_include_directories(jm_locale_test PRIVATE ${FMIL_TEST_INCLUDE_DIRS}) if(FMILIB_TEST_LOCALE) - target_compile_definitions(jm_locale_test PRIVATE -DFMILIB_TEST_LOCALE) + target_compile_definitions(jm_locale_test PRIVATE -DFMILIB_TEST_LOCALE ${FMIL_LINK_WITH_SUBLIBS}) endif() #Create function that zips the dummy FMUs add_executable(compress_test_fmu_zip ${FMIL_TEST_DIR}/compress_test_fmu_zip.c) -target_link_libraries(compress_test_fmu_zip ${FMIZIP_LIBRARIES}) +target_link_libraries(compress_test_fmu_zip fmizip) +target_include_directories(compress_test_fmu_zip PRIVATE ${FMIL_TEST_INCLUDE_DIRS}) set_target_properties( jm_vector_test @@ -128,17 +154,20 @@ function(compress_fmu OUTPUT_FOLDER_T MODEL_IDENTIFIER_T FILE_NAME_CS_ME_EXT_T T endfunction(compress_fmu) add_executable(fmi_zip_zip_test ${FMIL_TEST_DIR}/fmi_zip_zip_test.c ) -target_link_libraries (fmi_zip_zip_test ${FMIZIP_LIBRARIES}) +target_link_libraries(fmi_zip_zip_test fmizip) +target_include_directories(fmi_zip_zip_test PRIVATE ${FMIL_TEST_INCLUDE_DIRS}) add_executable(fmi_zip_unzip_test ${FMIL_TEST_DIR}/fmi_zip_unzip_test.c ) -target_link_libraries(fmi_zip_unzip_test ${FMIZIP_LIBRARIES}) +target_link_libraries(fmi_zip_unzip_test fmizip) +target_include_directories(fmi_zip_unzip_test PRIVATE ${FMIL_TEST_INCLUDE_DIRS}) add_executable(fmi_import_test ${FMIL_TEST_DIR}/fmi_import_test.c ${FMIL_TEST_DIR}/FMI1/fmi1_import_test.c ${FMIL_TEST_DIR}/FMI2/fmi2_import_test.c ${FMIL_TEST_DIR}/FMI3/fmi3_import_test.c) -target_link_libraries (fmi_import_test ${FMILIBFORTEST}) +target_link_libraries(fmi_import_test ${FMILIBFORTEST}) +target_include_directories(fmi_import_test PRIVATE ${FMIL_TEST_INCLUDE_DIRS}) set_target_properties( fmi_zip_zip_test @@ -177,7 +206,8 @@ add_library(Catch INTERFACE) # Catch2 consists of only headers, but we still want to compile its main function # in a separate object file so we don't need to do it for each test. add_library(catch2_main STATIC ${FMIL_TEST_DIR}/catch2_main.cpp) -target_link_libraries(catch2_main Catch) +target_link_libraries(catch2_main PUBLIC Catch) +target_include_directories(catch2_main PUBLIC ${FMILIB_THIRDPARTYLIBS}/Catch2/single_include/catch2) # Creates a Catch2 test. # @@ -186,7 +216,7 @@ target_link_libraries(catch2_main Catch) function(add_catch2_test TEST_NAME TEST_DIR) add_executable(${TEST_NAME} ${FMIL_TEST_DIR}/${TEST_DIR}/${TEST_NAME}.cpp) set_source_files_properties(${FMIL_TEST_DIR}/${TEST_DIR}/${TEST_NAME}.cpp PROPERTIES LANGUAGE CXX) - target_link_libraries(${TEST_NAME} Catch catch2_main ${FMILIBFORTEST}) + target_link_libraries(${TEST_NAME} PRIVATE catch2_main ${FMILIBFORTEST}) add_test(ctest_${TEST_NAME} ${TEST_NAME}) set_target_properties(${TEST_NAME} PROPERTIES FOLDER "Test/${TEST_DIR}") if(FMILIB_BUILD_BEFORE_TESTS) diff --git a/Config.cmake/test_fmi1.cmake b/Config.cmake/test_fmi1.cmake index 6702de56..76b99af5 100644 --- a/Config.cmake/test_fmi1.cmake +++ b/Config.cmake/test_fmi1.cmake @@ -11,13 +11,15 @@ # You should have received a copy of the FMILIB_License.txt file # along with this program. If not, contact Modelon AB . -include_directories(${FMIL_TEST_DIR}/FMI1) - add_executable(fmi1_capi_cs_test ${FMIL_TEST_DIR}/FMI1/fmi1_capi_cs_test.c) -target_link_libraries(fmi1_capi_cs_test ${FMICAPI_LIBRARIES}) +target_link_libraries(fmi1_capi_cs_test fmicapi) +target_include_directories(fmi1_capi_cs_test PRIVATE ${FMIL_TEST_INCLUDE_DIRS}) +target_compile_definitions(fmi1_capi_cs_test PRIVATE ${FMIL_LINK_WITH_SUBLIBS}) -add_executable (fmi1_capi_me_test ${FMIL_TEST_DIR}/FMI1/fmi1_capi_me_test.c) -target_link_libraries (fmi1_capi_me_test ${FMICAPI_LIBRARIES}) +add_executable(fmi1_capi_me_test ${FMIL_TEST_DIR}/FMI1/fmi1_capi_me_test.c) +target_link_libraries (fmi1_capi_me_test fmicapi jmutils) +target_include_directories(fmi1_capi_me_test PRIVATE ${FMIL_TEST_INCLUDE_DIRS}) +target_compile_definitions(fmi1_capi_me_test PRIVATE ${FMIL_LINK_WITH_SUBLIBS}) #Defines for the test FMUs set(FMU_DUMMY_ME_MODEL_IDENTIFIER BouncingBall) #This must be the same as in the xml-file @@ -33,8 +35,17 @@ set(FMU_DUMMY_HEADERS ${FMU_DUMMY_FOLDER}/fmu1_model_defines.h ) +set(FMU_DUMMY_INCLUDE_DIRS + ${FMILIB_FMI_STANDARD_HEADERS} + ${FMILIB_CONFIG_INCLUDE_DIR} + ${FMIL_TEST_DIR}/FMI1 + ${FMILIB_TESTCONFIG_INCLUDE_DIR} +) + add_library(fmu1_dll_me SHARED ${FMU_DUMMY_ME_SOURCE} ${FMU_DUMMY_HEADERS}) add_library(fmu1_dll_cs SHARED ${FMU_DUMMY_CS_SOURCE} ${FMU_DUMMY_HEADERS}) +target_include_directories(fmu1_dll_me PRIVATE ${FMU_DUMMY_INCLUDE_DIRS}) +target_include_directories(fmu1_dll_cs PRIVATE ${FMU_DUMMY_INCLUDE_DIRS}) set(XML_ME_PATH ${FMU_DUMMY_FOLDER}/modelDescription_me.xml) set(XML_CS_PATH ${FMU_DUMMY_FOLDER}/modelDescription_cs.xml) @@ -67,6 +78,7 @@ target_link_libraries(fmi1_import_options_test ${FMILIBFORTEST}) add_executable(fmi1_import_default_experiment_test ${FMIL_TEST_DIR}/FMI1/fmi1_import_default_experiment_test.c) target_link_libraries(fmi1_import_default_experiment_test ${FMILIBFORTEST}) + add_executable(fmi1_type_definitions_test ${FMIL_TEST_DIR}/FMI1/fmi1_import_type_definitions_test.c) target_link_libraries(fmi1_type_definitions_test ${FMILIBFORTEST}) @@ -81,6 +93,7 @@ target_link_libraries(fmi_import_xml_test ${FMILIBFORTEST}) add_executable(fmi_import_me_test ${FMIL_TEST_DIR}/FMI1/fmi_import_me_test.c) target_link_libraries(fmi_import_me_test ${FMILIBFORTEST}) + add_executable(fmi_import_cs_test ${FMIL_TEST_DIR}/FMI1/fmi_import_cs_test.c) target_link_libraries(fmi_import_cs_test ${FMILIBFORTEST}) diff --git a/Config.cmake/test_fmi2.cmake b/Config.cmake/test_fmi2.cmake index dad7edfb..ca1da0f6 100644 --- a/Config.cmake/test_fmi2.cmake +++ b/Config.cmake/test_fmi2.cmake @@ -11,8 +11,6 @@ # You should have received a copy of the FMILIB_License.txt file # along with this program. If not, contact Modelon AB . -include_directories(${FMIL_TEST_DIR}/FMI2) - #Defines for the test FMUs set(FMU2_DUMMY_FOLDER ${FMIL_TEST_DIR}/FMI2/fmu_dummy) @@ -29,8 +27,17 @@ set(FMU2_DUMMY_HEADERS ${FMU2_DUMMY_FOLDER}/fmu2_model_defines.h ) +set(FMU2_DUMMY_INCLUDE_DIRS + ${FMILIB_FMI_STANDARD_HEADERS} + ${FMILIB_CONFIG_INCLUDE_DIR} + ${FMIL_TEST_DIR}/FMI2 + ${FMILIB_TESTCONFIG_INCLUDE_DIR} +) + add_library(fmu2_dll_me SHARED ${FMU2_DUMMY_ME_SOURCE} ${FMU2_DUMMY_HEADERS}) add_library(fmu2_dll_cs SHARED ${FMU2_DUMMY_CS_SOURCE} ${FMU2_DUMMY_HEADERS}) +target_include_directories(fmu2_dll_me PRIVATE ${FMU2_DUMMY_INCLUDE_DIRS}) +target_include_directories(fmu2_dll_cs PRIVATE ${FMU2_DUMMY_INCLUDE_DIRS}) set(XML_ME_PATH ${FMU2_DUMMY_FOLDER}/modelDescription_me.xml) set(XML_CS_PATH ${FMU2_DUMMY_FOLDER}/modelDescription_cs.xml) diff --git a/Config.cmake/test_fmi3.cmake b/Config.cmake/test_fmi3.cmake index cd5cc3cf..ad7746d5 100644 --- a/Config.cmake/test_fmi3.cmake +++ b/Config.cmake/test_fmi3.cmake @@ -11,7 +11,6 @@ # You should have received a copy of the FMILIB_License.txt file # along with this program. If not, contact Modelon AB . -include_directories(${FMIL_TEST_DIR}/FMI3) set(FMI3_TEST_XML_DIR ${FMIL_TEST_DIR}/FMI3/parser_test_xmls) set(FMU3_DUMMY_FOLDER ${FMIL_TEST_DIR}/FMI3/fmu_dummy) @@ -25,9 +24,20 @@ set(FMU3_DUMMY_HEADERS ${FMU3_DUMMY_FOLDER}/fmu3_model_defines.h ) +set(FMU3_DUMMY_INCLUDE_DIRS + ${FMILIB_FMI_STANDARD_HEADERS} + ${FMILIB_CONFIG_INCLUDE_DIR} + ${JMUTIL_PUBLIC_INCLUDE_DIR} + ${FMIL_TEST_DIR}/FMI3 + ${FMILIB_TESTCONFIG_INCLUDE_DIR} +) + add_library(fmu3_dll_me SHARED ${FMU3_DUMMY_ME_SOURCE} ${FMU3_DUMMY_HEADERS}) add_library(fmu3_dll_cs SHARED ${FMU3_DUMMY_CS_SOURCE} ${FMU3_DUMMY_HEADERS}) add_library(fmu3_dll_se SHARED ${FMU3_DUMMY_SE_SOURCE} ${FMU3_DUMMY_HEADERS}) +target_include_directories(fmu3_dll_me PRIVATE ${FMU3_DUMMY_INCLUDE_DIRS}) +target_include_directories(fmu3_dll_cs PRIVATE ${FMU3_DUMMY_INCLUDE_DIRS}) +target_include_directories(fmu3_dll_se PRIVATE ${FMU3_DUMMY_INCLUDE_DIRS}) set(XML_ME_PATH ${FMU3_DUMMY_FOLDER}/modelDescription_me.xml) set(XML_CS_PATH ${FMU3_DUMMY_FOLDER}/modelDescription_cs.xml) diff --git a/Makefile b/Makefile index a7642cc8..074cb772 100644 --- a/Makefile +++ b/Makefile @@ -5,18 +5,15 @@ # NOTE: 'nproc' doesn't exist on Windows, so just hardcoding "some" value for now. NPROC=8 +FMIL_REPO_DIR:=$(shell pwd) + include $(CONFIG_FILE) .PHONY: install test documentation generate clean install: generate cd $(BUILD_DIR) && \ - cmake --build . --parallel $(NPROC) --config $(BUILD_TYPE) --target '$@' - -# Note that this does not execute the test binaries that are using the test framework Catch2 -test: generate - cd $(BUILD_DIR) && \ - $(TEST_COMMAND) + cmake --build . --parallel $(NPROC) --config $(BUILD_TYPE) --target install documentation: generate cd $(BUILD_DIR) && \ @@ -34,6 +31,21 @@ generate: $(FMILIB_CMAKE_CUSTOM_FLAGS) \ -G $(GENERATOR) \ ../$(SRC_DIR) + +test: test_unit test_installation + +test_unit: generate + cd $(BUILD_DIR) && \ + $(TEST_COMMAND) + +test_installation: install + set -eu; \ + cd Test/test_installation; \ + rm -rf build && mkdir -p build; \ + cd build; \ + cmake -DFMIL_HOME=$(FMIL_REPO_DIR)/$(INSTALL_DIR) -G $(GENERATOR) ..; \ + cmake --build .; \ + ctest $(CTEST_FLAGS_COMMON) clean: rm -rf -v build_* install_* diff --git a/Test/FMI1/fmi1_capi_me_test.c b/Test/FMI1/fmi1_capi_me_test.c index 47bd0322..f7ecf948 100644 --- a/Test/FMI1/fmi1_capi_me_test.c +++ b/Test/FMI1/fmi1_capi_me_test.c @@ -19,14 +19,13 @@ #include #include -#include #include "config_test.h" -/*#include +#include #include #include #include #include -#include */ +#include #include #include diff --git a/Test/jm_locale_test.c b/Test/jm_locale_test.c index 1a4bbe59..b4d2fcf1 100644 --- a/Test/jm_locale_test.c +++ b/Test/jm_locale_test.c @@ -5,18 +5,6 @@ #include "config_test.h" -/* Windows: - * config_test.h undefines FMILIB_BUILDING_LIBRARY because it's expected that - * all tests will link with fmilib.dll. In this case we don't. - * As of writing, the FMILIB_BUILDING_LIBRARY controls whether we define the API - * as __declspec import or export (Windows at least). If we undef FMILIB_BUILDING_LIBRARY, - * it will be defined as import since we expect to link with the DLL, but since - * we don't in this case, linking will fail (it actually doesn't fail for MSVC - * for some reason, (maybe it has static linking fallback or similar?) but - * MinGW fails). - */ -#define FMILIB_BUILDING_LIBRARY - #include static void fail(const char* fmt, ...) { diff --git a/Test/test_installation/CMakeLists.txt b/Test/test_installation/CMakeLists.txt new file mode 100644 index 00000000..e937d9ce --- /dev/null +++ b/Test/test_installation/CMakeLists.txt @@ -0,0 +1,107 @@ +# Copyright (C) 2023 Modelon AB +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the BSD style license. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# FMILIB_License.txt file for more details. +# +# You should have received a copy of the FMILIB_License.txt file +# along with this program. If not, contact Modelon AB . + +cmake_minimum_required(VERSION 3.15 FATAL_ERROR) + +# Performs a smoke test on the install directory of FMIL. Verifies for example +# that: +# - All include files have been installed +# - No XML headers etc. are included in the import headers +# - That libraries are present and functions can be called +project(TestInstallation) + +set_property(GLOBAL PROPERTY C_STANDARD 99) +set_property(GLOBAL PROPERTY C_STANDARD_REQUIRED ON) + +set(FMIL_HOME "unset" CACHE FILEPATH "Path to FMIL installation") + +message(STATUS "FMIL_HOME: ${FMIL_HOME}") +if (FMIL_HOME STREQUAL "unset" OR FMIL_HOME STREQUAL "") + message(FATAL_ERROR "Unset config variable: FMIL_HOME") +endif() + +# Macro that sets MSVC RTL for the target to the same one as FMIL was compiled with. +macro(target_set_msvcrt TARGET_NAME) + if(FMILIB_BUILD_WITH_STATIC_RTLIB) + set_property(TARGET ${TARGET_NAME} PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreaded") + else() + set_property(TARGET ${TARGET_NAME} PROPERTY MSVC_RUNTIME_LIBRARY "MultiThreadedDLL") + endif() +endmacro() + +enable_testing() + +# ============================================================================== +# Test static installation +# ============================================================================== + +# Import FMIL +add_library(fmilib STATIC IMPORTED) +set_property(TARGET fmilib PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${FMIL_HOME}/include") +if(MSVC) + set_property(TARGET fmilib PROPERTY IMPORTED_LOCATION "${FMIL_HOME}/lib/fmilib.lib") +else() + set_property(TARGET fmilib PROPERTY IMPORTED_LOCATION "${FMIL_HOME}/lib/libfmilib.a") +endif() + +# Build the test +add_executable(main main.c) +if(WIN32) + target_link_libraries(main PRIVATE fmilib Shlwapi) +else() + target_link_libraries(main PRIVATE fmilib dl) +endif() +if(WIN32) + # Needed for compiling against static libs. FIXME: Should not be needed. + target_compile_definitions(main PRIVATE FMILIB_STATIC_LIB_ONLY) +endif() +if(MSVC) + target_set_msvcrt(main) +endif() + +add_test(test_installation main) + +# ============================================================================== +# Test shared installation +# ============================================================================== + +# Import FMIL +add_library(fmilib_shared SHARED IMPORTED) +set_property(TARGET fmilib_shared PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${FMIL_HOME}/include") +if(MSVC) + set_property(TARGET fmilib_shared PROPERTY IMPORTED_LOCATION "${FMIL_HOME}/lib/fmilib_shared.dll") + set_property(TARGET fmilib_shared PROPERTY IMPORTED_IMPLIB "${FMIL_HOME}/lib/fmilib_shared.lib") +elseif(MINGW) + set_property(TARGET fmilib_shared PROPERTY IMPORTED_LOCATION "${FMIL_HOME}/lib/libfmilib_shared.dll") + set_property(TARGET fmilib_shared PROPERTY IMPORTED_IMPLIB "${FMIL_HOME}/lib/libfmilib_shared.dll.a") +else() + set_property(TARGET fmilib_shared PROPERTY IMPORTED_LOCATION "${FMIL_HOME}/lib/libfmilib_shared.so") +endif() + +# Build the test +add_executable(main_shared main.c) +if(WIN32) + target_link_libraries(main_shared PRIVATE fmilib_shared Shlwapi) +else() + target_link_libraries(main_shared PRIVATE fmilib_shared dl) +endif() +if(MSVC) + target_set_msvcrt(main_shared) +endif() + +add_test(test_installation_shared main_shared) +if(WIN32) + # NOTE: Just replacing PATH instead of appending since that's troublesome + # due to escaping of ';' in Windows paths. + set_property(TEST test_installation_shared PROPERTY ENVIRONMENT "PATH=${FMIL_HOME}/lib") +endif() diff --git a/Test/test_installation/main.c b/Test/test_installation/main.c new file mode 100644 index 00000000..abb27e8a --- /dev/null +++ b/Test/test_installation/main.c @@ -0,0 +1,27 @@ +// Copyright (C) 2023 Modelon AB +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the BSD style license. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// FMILIB_License.txt file for more details. +// +// You should have received a copy of the FMILIB_License.txt file +// along with this program. If not, contact Modelon AB . + +#include + +#include "fmilib.h" + +int main() { + jm_callbacks* cb = jm_get_default_callbacks(); + fmi_import_context_t* ctx = fmi_import_allocate_context(cb); + if (!ctx) { + printf("main: Context was NULL\n"); + return 1; + } + fmi_import_free_context(ctx); + return 0; +} \ No newline at end of file diff --git a/build/config/centos64 b/build/config/centos64 index db258484..c7ffb2ff 100644 --- a/build/config/centos64 +++ b/build/config/centos64 @@ -1,9 +1,9 @@ -CONFIG=centos64 +CONFIG_NAME=centos64 # CMake SRC_DIR=. -BUILD_DIR=build_$(CONFIG) -INSTALL_DIR=install_$(CONFIG) +BUILD_DIR=build_$(CONFIG_NAME) +INSTALL_DIR=install_$(CONFIG_NAME) GENERATOR="Unix Makefiles" FMILIB_CMAKE_CUSTOM_FLAGS=-DCMAKE_C_FLAGS= # N/A BUILD_TYPE=Debug # We need debug symbols, otherwise memcheck will give limited information, and we don't distribute binaries regardless @@ -31,4 +31,5 @@ TEST_LOCALE=0 # Path used in container for the mounted directories when building via docker MOUNTED_DIR=/mnt/fmi-library -DOCKERFILE_NAME=Dockerfile_centos +DOCKERFILE_NAME=$(CONFIG_NAME).Dockerfile +DOCKER_IMAGE_TAG=fmil_$(CONFIG_NAME):test diff --git a/build/config/documentation b/build/config/documentation index ba8e4021..804deaad 100644 --- a/build/config/documentation +++ b/build/config/documentation @@ -1,9 +1,9 @@ -CONFIG=documentation +CONFIG_NAME=documentation # CMake SRC_DIR=. -BUILD_DIR=build_$(CONFIG) -INSTALL_DIR=install_$(CONFIG) +BUILD_DIR=build_$(CONFIG_NAME) +INSTALL_DIR=install_$(CONFIG_NAME) GENERATOR="Unix Makefiles" FMILIB_CMAKE_CUSTOM_FLAGS=-DCMAKE_C_FLAGS= # N/A BUILD_TYPE=Release @@ -15,8 +15,8 @@ BUILD_WITH_STATIC_RTLIB=0 BUILD_TESTS=0 TEST_LOCALE=0 -# path used in container for the mounted directories when building via docker -MOUNTED_DIR=/mnt/fmi-library +MOUNTED_DIR=/mnt/fmi-library # Either centos or ubuntu works -DOCKERFILE_NAME=Dockerfile_centos \ No newline at end of file +DOCKERFILE_NAME=centos64.Dockerfile +DOCKER_IMAGE_TAG=fmil_centos64:test \ No newline at end of file diff --git a/build/config/mingw_w64 b/build/config/mingw_w64 index fe1da19a..d1a20f92 100644 --- a/build/config/mingw_w64 +++ b/build/config/mingw_w64 @@ -1,12 +1,12 @@ -CONFIG=mingw_w64 +CONFIG_NAME=mingw_w64 # This config is for TDM-GCC, which is based on MinGW-w64. This is the MinGW # compiler used by OCT. # CMake SRC_DIR=. -BUILD_DIR=build_$(CONFIG) -INSTALL_DIR=install_$(CONFIG) +BUILD_DIR=build_$(CONFIG_NAME) +INSTALL_DIR=install_$(CONFIG_NAME) GENERATOR="MSYS Makefiles" # These flags should be the same as what OCT is using (-fPIC is removed though # since it's not applicable on Windows). diff --git a/build/config/ubuntu64 b/build/config/ubuntu64 index 6065397a..d9d89fcf 100644 --- a/build/config/ubuntu64 +++ b/build/config/ubuntu64 @@ -1,9 +1,9 @@ -CONFIG=ubuntu64 +CONFIG_NAME=ubuntu64 # CMake SRC_DIR=. -BUILD_DIR=build_$(CONFIG) -INSTALL_DIR=install_$(CONFIG) +BUILD_DIR=build_$(CONFIG_NAME) +INSTALL_DIR=install_$(CONFIG_NAME) GENERATOR="Unix Makefiles" FMILIB_CMAKE_CUSTOM_FLAGS=-DCMAKE_C_FLAGS= # N/A BUILD_TYPE=Debug # We need debug symbols, otherwise memcheck will give limited information, and we don't distribute binaries regardless @@ -31,4 +31,5 @@ TEST_LOCALE=1 # Path used in container for the mounted directories when building via docker MOUNTED_DIR=/mnt/fmi-library -DOCKERFILE_NAME=Dockerfile_ubuntu +DOCKERFILE_NAME=$(CONFIG_NAME).Dockerfile +DOCKER_IMAGE_TAG=fmil_$(CONFIG_NAME):test diff --git a/build/config/win64 b/build/config/win64 index 20f3807d..77405dbe 100644 --- a/build/config/win64 +++ b/build/config/win64 @@ -1,9 +1,9 @@ -CONFIG=win64 +CONFIG_NAME=win64 # CMake SRC_DIR=. -BUILD_DIR=build_$(CONFIG) -INSTALL_DIR=install_$(CONFIG) +BUILD_DIR=build_$(CONFIG_NAME) +INSTALL_DIR=install_$(CONFIG_NAME) GENERATOR="Visual Studio 15 2017 Win64" FMILIB_CMAKE_CUSTOM_FLAGS=-DCMAKE_C_FLAGS= # N/A diff --git a/build/config/win64_static_runtime b/build/config/win64_static_runtime index 419ef81c..4646f27a 100644 --- a/build/config/win64_static_runtime +++ b/build/config/win64_static_runtime @@ -1,9 +1,9 @@ -CONFIG=win64_static_runtime +CONFIG_NAME=win64_static_runtime # CMake SRC_DIR=. -BUILD_DIR=build_$(CONFIG) -INSTALL_DIR=install_$(CONFIG) +BUILD_DIR=build_$(CONFIG_NAME) +INSTALL_DIR=install_$(CONFIG_NAME) GENERATOR="Visual Studio 15 2017 Win64" FMILIB_CMAKE_CUSTOM_FLAGS=-DCMAKE_C_FLAGS= # N/A BUILD_TYPE=Release diff --git a/build/docker/Makefile b/build/docker/Makefile index 9c66987c..1ed6e33c 100644 --- a/build/docker/Makefile +++ b/build/docker/Makefile @@ -4,17 +4,15 @@ include $(CONFIG_FILE) # # NOTE: Working directory when calling this file must be project root. -IMG_TAG=fmil:test - .PHONY: docker_image install test documentation docker_run_debug docker_image: - docker build -f build/docker/$(DOCKERFILE_NAME) -t $(IMG_TAG) . + docker build -f build/docker/$(DOCKERFILE_NAME) -t $(DOCKER_IMAGE_TAG) . install test documentation: docker_image docker run \ -w $(MOUNTED_DIR) \ -u baseuser \ -v /$(CURDIR):$(MOUNTED_DIR) \ - $(IMG_TAG) \ - //bin/bash -c "make $@ CONFIG_FILE=./build/config/$(CONFIG)" \ No newline at end of file + $(DOCKER_IMAGE_TAG) \ + //bin/bash -c "make $@ CONFIG_FILE=./build/config/$(CONFIG_NAME)" \ No newline at end of file diff --git a/build/docker/Dockerfile_centos b/build/docker/centos64.Dockerfile similarity index 100% rename from build/docker/Dockerfile_centos rename to build/docker/centos64.Dockerfile diff --git a/build/docker/Dockerfile_ubuntu b/build/docker/ubuntu64.Dockerfile similarity index 100% rename from build/docker/Dockerfile_ubuntu rename to build/docker/ubuntu64.Dockerfile diff --git a/src/ZIP/include/FMI/fmi_zip_unzip.h b/src/ZIP/include/FMI/fmi_zip_unzip.h index aabb8f15..02eb19dd 100644 --- a/src/ZIP/include/FMI/fmi_zip_unzip.h +++ b/src/ZIP/include/FMI/fmi_zip_unzip.h @@ -23,7 +23,6 @@ extern "C" { #include #include -#include "miniunz.h" /** \file fmi_zip_unzip.h Declaration of fmi_zip_unzip() function. @@ -32,13 +31,13 @@ extern "C" { @{ */ -/** - * \brief Uncompress a zip file - * - * @param zip_file_path Full file path of the file to uncompress. - * @param output_folder Full file path of the directory where the uncompressed files are put. The folder must already exist. Files with the same name are overwritten. - * @param callbacks Callback functions - * @return Error status. +/** + * \brief Uncompress a zip file + * + * @param zip_file_path Full file path of the file to uncompress. + * @param output_folder Full file path of the directory where the uncompressed files are put. The folder must already exist. Files with the same name are overwritten. + * @param callbacks Callback functions + * @return Error status. */ jm_status_enu_t fmi_zip_unzip(const char* zip_file_path, const char* output_folder, jm_callbacks* callbacks);