Skip to content
Snippets Groups Projects
Commit 0e743b98 authored by Florian Spreckelsen's avatar Florian Spreckelsen
Browse files

Merge branch '90-windows-linker-errors-with-protobuf-generated-code' into 'dev'

Resolve "Windows: Linker errors with protobuf-generated code"

See merge request !54
parents 64a41b25 d55dad69
Branches
Tags
2 merge requests!61Release 0.3.0,!54Resolve "Windows: Linker errors with protobuf-generated code"
Pipeline #55575 passed with warnings
Pipeline: caosdb-cppinttest

#55579

    ...@@ -136,9 +136,6 @@ add_custom_command( ...@@ -136,9 +136,6 @@ add_custom_command(
    # add generated files to include path # add generated files to include path
    include_directories(${CMAKE_CURRENT_BINARY_DIR}/include) include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
    # show generated files
    message(DEBUG "GRPC_GENERATED: ${GRPC_GENERATED}")
    ############################################################################### ###############################################################################
    ### Set up main targets ### Set up main targets
    ### * linkahead - The main library including the protobuf and grpc generated files. ### * linkahead - The main library including the protobuf and grpc generated files.
    ...@@ -165,13 +162,19 @@ message(DEBUG "CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}") ...@@ -165,13 +162,19 @@ message(DEBUG "CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")
    message(DEBUG "liblinkahead_SOURCE_DIR: ${liblinkahead_SOURCE_DIR}") message(DEBUG "liblinkahead_SOURCE_DIR: ${liblinkahead_SOURCE_DIR}")
    message(DEBUG "liblinkahead_BINARY_DIR: ${liblinkahead_BINARY_DIR}") message(DEBUG "liblinkahead_BINARY_DIR: ${liblinkahead_BINARY_DIR}")
    # libcaosdb_grpc
    # --------------
    add_library(caosdb_grpc STATIC ${GRPC_GENERATED})
    target_link_libraries(caosdb_grpc
    gRPC::grpc gRPC::grpc++ protobuf::libprotobuf
    )
    # liblinkahead # liblinkahead
    # --------- # ---------
    add_library(linkahead SHARED add_library(linkahead SHARED
    ${liblinkahead_INCL} ${liblinkahead_SRC} ${GRPC_GENERATED}) ${liblinkahead_INCL} ${liblinkahead_SRC})
    target_link_libraries(linkahead PUBLIC target_link_libraries(linkahead PUBLIC
    gRPC::grpc gRPC::grpc++ protobuf::libprotobuf ${Boost_LIBRARIES} caosdb_grpc gRPC::grpc gRPC::grpc++ protobuf::libprotobuf ${Boost_LIBRARIES}
    ) )
    set(liblinkahead linkahead) set(liblinkahead linkahead)
    ...@@ -184,10 +187,9 @@ target_include_directories(linkahead PUBLIC ...@@ -184,10 +187,9 @@ target_include_directories(linkahead PUBLIC
    # libclinkahead # libclinkahead
    # ---------- # ----------
    add_library(clinkahead SHARED src/clinkahead.cpp ${GRPC_GENERATED}) add_library(clinkahead SHARED src/clinkahead.cpp)
    target_link_libraries(clinkahead PUBLIC target_link_libraries(clinkahead PUBLIC
    linkahead linkahead caosdb_grpc gRPC::grpc gRPC::grpc++ protobuf::libprotobuf ${Boost_LIBRARIES}
    gRPC::grpc gRPC::grpc++ protobuf::libprotobuf ${Boost_LIBRARIES}
    ) )
    target_include_directories(clinkahead PUBLIC target_include_directories(clinkahead PUBLIC
    $<BUILD_INTERFACE:${liblinkahead_SOURCE_DIR}/include> $<BUILD_INTERFACE:${liblinkahead_SOURCE_DIR}/include>
    ...@@ -204,10 +206,9 @@ target_include_directories(clinkaheadcli PUBLIC ...@@ -204,10 +206,9 @@ target_include_directories(clinkaheadcli PUBLIC
    $<BUILD_INTERFACE:${liblinkahead_BINARY_DIR}/include> $<BUILD_INTERFACE:${liblinkahead_BINARY_DIR}/include>
    $<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include>
    ) )
    target_link_libraries(clinkaheadcli PRIVATE target_link_libraries(clinkaheadcli PRIVATE
    caosdb_grpc clinkahead
    gRPC::grpc protobuf::libprotobuf ${Boost_LIBRARIES} gRPC::grpc protobuf::libprotobuf ${Boost_LIBRARIES}
    clinkahead
    ) )
    # cxxlinkaheadcli # cxxlinkaheadcli
    ...@@ -219,7 +220,7 @@ target_include_directories(cxxlinkaheadcli PUBLIC ...@@ -219,7 +220,7 @@ target_include_directories(cxxlinkaheadcli PUBLIC
    $<INSTALL_INTERFACE:include> $<INSTALL_INTERFACE:include>
    ) )
    target_link_libraries(cxxlinkaheadcli PRIVATE target_link_libraries(cxxlinkaheadcli PRIVATE
    linkahead gRPC::grpc++ protobuf::libprotobuf ${Boost_LIBRARIES} linkahead caosdb_grpc gRPC::grpc++ protobuf::libprotobuf ${Boost_LIBRARIES}
    ) )
    ...@@ -346,10 +347,10 @@ endif() ...@@ -346,10 +347,10 @@ endif()
    ### UNIT TEST ### UNIT TEST
    ####################################################### #######################################################
    if("${CMAKE_BUILD_TYPE}" MATCHES "Debug") #if("${CMAKE_BUILD_TYPE}" MATCHES "Debug")
    enable_testing() enable_testing()
    add_subdirectory(test) add_subdirectory(test)
    endif() #endif()
    # ############################################### # ###############################################
    # ############ INSTALLATION ##################### # ############ INSTALLATION #####################
    ...@@ -361,7 +362,7 @@ set(liblinkahead_LIB_DEST "lib") ...@@ -361,7 +362,7 @@ set(liblinkahead_LIB_DEST "lib")
    set(CMAKE_INSTALL_PREFIX "$ENV{HOME}/.local/") set(CMAKE_INSTALL_PREFIX "$ENV{HOME}/.local/")
    install( install(
    # targets to install # targets to install
    TARGETS ${liblinkahead} clinkahead TARGETS linkahead clinkahead caosdb_grpc
    # name of the CMake "export group" containing the targets we want to install # name of the CMake "export group" containing the targets we want to install
    EXPORT linkaheadTargets EXPORT linkaheadTargets
    # Dynamic, static library and include destination locations after running # Dynamic, static library and include destination locations after running
    ......
    ...@@ -108,22 +108,19 @@ How to build on Windows ...@@ -108,22 +108,19 @@ How to build on Windows
    We use `Visual Studio We use `Visual Studio
    2022 <https://visualstudio.microsoft.com/de/vs/features/cplusplus/>`__ 2022 <https://visualstudio.microsoft.com/de/vs/features/cplusplus/>`__
    as compiler. We use `cmake <https://cmake.org/download/>`__ as build as compiler. We use `cmake <https://cmake.org/download/>`__ as build
    tool. tool, which can be installed together with Visual Studio.
    1. Install Python and create a virtual environment with the dependencies in `requirements.txt`. 1. Install Python and create a virtual environment with the dependencies in
    2. Activate the environment run in the repository folder: ``conan install . --build=missing -s build_type=Release`` `requirements.txt`.
    3. ``cmake --preset conan-default`` 2. In a PowerShell, activate the environment and run the following commands from the
    4. Open ``build/liblinkahead.sln`` with Visual Studio, change the repository root:
    buildtype to ``Release`` and build the project (ALL_BUILD). (You 3. ``conan profile detect --force`` (and check the output)
    can open Tools/Command Line/Developer Command Prompt and execute 3. ``make.ps1 conan-install``
    ``msbuild liblinkahead.sln /property:Configuration=Release``) 4. ``make.ps1 build``
    5. Try running the cli clients in ``.\build\Release\``.
    You'll find the shared libraries and cli clients in ``.\build\Release\``. To run the tests,
    Known problems use ``make.ps1 test``. As a shortcut to run all steps, use ``make.ps1 all``.
    ^^^^^^^^^^^^^^
    - Building the unit tests on Windows currently fails with linker errors. See
    `#90 <https://gitlab.indiscale.com/caosdb/src/caosdb-cpplib/-/issues/90>`__
    Troubleshooting Troubleshooting
    ~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~
    ......
    make.ps1 0 → 100644
    param (
    [string]$target
    )
    function Install-Conan {
    Write-Output "Installing Release dependencies with Conan..."
    # check if conan is available
    if (-not (Get-Command conan -ErrorAction SilentlyContinue)) {
    Write-Output "Conan is not available. Please install Conan or activate the Conan environment venv"
    exit 1
    }
    conan install . --build=missing -s build_type=Release -s compiler.cppstd=17
    cmake --preset conan-default
    }
    function Build-Project {
    Write-Output "Building the project..."
    # check if msbuild is available
    if (-not (Get-Command msbuild -ErrorAction SilentlyContinue)) {
    Write-Output "msbuild is not available. Please install Visual Studio or open the Developer PowerShell."
    exit 1
    }
    # check if conan install was run
    if (-not (Test-Path .\build\liblinkahead.sln)) {
    Write-Output "Please run conan-install first."
    exit 1
    }
    msbuild .\build\liblinkahead.sln /property:Configuration=Release
    }
    function Invoke-Tests {
    Write-Output "Running tests..."
    # check if build was run before
    if (-not (Test-Path .\build\Release\linkahead.dll)) {
    Write-Output "Please build the project first."
    exit 1
    }
    Set-Location .\build\
    ctest
    }
    # check if vswhere is available
    if (-not (Test-Path "C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe")) {
    Write-Output "vswhere is not available. Please install Visual Studio"
    exit 1
    }
    # locate the latest Visual Studio installation
    $currentPath = Get-Location
    $installPath = &"C:\Program Files (x86)\Microsoft Visual Studio\Installer\vswhere.exe" -latest -products * -requires Microsoft.Component.MSBuild -property installationPath
    Import-Module (Join-Path $installPath "Common7\Tools\Microsoft.VisualStudio.DevShell.dll")
    Enter-VsDevShell -VsInstallPath $installPath
    Set-Location $currentPath
    # Windows is with Release only for now
    switch ($target) {
    "build" {
    Build-Project
    }
    "test" {
    Invoke-Tests
    }
    "conan-install" {
    Install-Conan
    }
    "clean"{
    Write-Output "Cleaning the project..."
    Remove-Item -Recurse -Force .\build\*
    }
    "all" {
    Install-Conan
    Build-Project
    Invoke-Tests
    }
    default {
    Write-Output "Usage: .\make.ps1 [all|conan-install|build|test|clean]"
    }
    }
    ...@@ -65,9 +65,10 @@ foreach (i RANGE "${len_test_cases}") ...@@ -65,9 +65,10 @@ foreach (i RANGE "${len_test_cases}")
    set(liblinkahead_TEST_SRC "${CMAKE_CURRENT_SOURCE_DIR}/${test_case_name}.cpp set(liblinkahead_TEST_SRC "${CMAKE_CURRENT_SOURCE_DIR}/${test_case_name}.cpp
    ${liblinkahead_TEST_SRC}") ${liblinkahead_TEST_SRC}")
    target_link_libraries(${test_case_name} target_link_libraries(${test_case_name}
    PRIVATE GTest::gtest_main linkahead clinkahead gtest::gtest) PRIVATE GTest::gtest_main linkahead clinkahead gtest::gtest caosdb_grpc)
    target_include_directories(${test_case_name} target_include_directories(${test_case_name}
    PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) PUBLIC ${CMAKE_CURRENT_BINARY_DIR}/include ${CMAKE_CURRENT_BINARY_DIR})
    set_target_properties(${test_case_name} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}")
    if(_LINTING) if(_LINTING)
    message(STATUS "linting for tests: ${_CMAKE_CXX_INCLUDE_WHAT_YOU_USE}") message(STATUS "linting for tests: ${_CMAKE_CXX_INCLUDE_WHAT_YOU_USE}")
    set_target_properties(${test_case_name} set_target_properties(${test_case_name}
    ...@@ -76,12 +77,15 @@ foreach (i RANGE "${len_test_cases}") ...@@ -76,12 +77,15 @@ foreach (i RANGE "${len_test_cases}")
    CXX_INCLUDE_WHAT_YOU_USE "${_CMAKE_CXX_INCLUDE_WHAT_YOU_USE}") CXX_INCLUDE_WHAT_YOU_USE "${_CMAKE_CXX_INCLUDE_WHAT_YOU_USE}")
    endif() endif()
    gtest_discover_tests(${test_case_name} gtest_discover_tests(${test_case_name}
    WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
    PROPERTIES PROPERTIES
    LABELS "linkahead-cpplib-unit-tests" LABELS "linkahead-cpplib-unit-tests"
    ) )
    endforeach () endforeach ()
    message(STATUS "CMAKE_BINARY_DIR ${CMAKE_BINARY_DIR}")
    message(STATUS "CMAKE_CURRENT_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}")
    # copy test data to build dir # copy test data to build dir
    set(TEST_DATA_DIR "${CMAKE_CURRENT_SOURCE_DIR}/test_data") set(TEST_DATA_DIR "${CMAKE_CURRENT_SOURCE_DIR}/test_data")
    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/linkahead_test_utility.h.in configure_file(${CMAKE_CURRENT_SOURCE_DIR}/linkahead_test_utility.h.in
    ......
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Please register or to comment