From 86d3972ad9e81da2098425fad8e29855a0f4014c Mon Sep 17 00:00:00 2001 From: Jeroen Koekkoek Date: Sun, 17 Feb 2019 23:05:11 +0100 Subject: [PATCH 1/3] Fix FindMaven.cmake on Windows Signed-off-by: Jeroen Koekkoek --- src/cmake/modules/FindMaven.cmake | 33 +++++++++++++++---------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/src/cmake/modules/FindMaven.cmake b/src/cmake/modules/FindMaven.cmake index 1f95cd68c2..ebde1df5d5 100644 --- a/src/cmake/modules/FindMaven.cmake +++ b/src/cmake/modules/FindMaven.cmake @@ -18,20 +18,13 @@ if(DEFINED ENV{M2_HOME}) endif() # Maven documentation mentions intalling maven under C:\Program Files on -# Windows and under /opt on *NIX platforms +# Windows and under /opt on *NIX platforms. if(WIN32) - set(_program_files_env "ProgramFiles") - set(_program_files $ENV{${_program_files_env}}) - set(_program_files_x86_env "ProgramFiles(x86)") - set(_program_files_x86 $ENV{${_program_files_x86_env}}) - - if(_program_files) - list(APPEND _dirs "${_program_files}") - endif() - - if(_program_files_x86) - list(APPEND _dirs "${_program_files_x86}") - endif() + foreach(_env "ProgramFiles" "ProgramFiles(x86)") + if(ENV{${_env}} AND IS_DIRECTORY "$ENV{${_env}}") + list(APPEND _dirs "$ENV{${_env}}") + endif() + endforeach() else() list(APPEND _dirs "/opt") endif() @@ -45,14 +38,20 @@ foreach(_dir ${_dirs}) endforeach() endforeach() +if(WIN32) + set(_mvn_names "mvn.cmd" "mvn.exe") +else() + set(_mvn_names "mvn") +endif() + find_program(Maven_EXECUTABLE - NAMES mvn + NAMES ${_mvn_names} HINTS ${_mvn_hints} PATHS ${_mvn_paths}) if(Maven_EXECUTABLE) execute_process(COMMAND ${Maven_EXECUTABLE} -version - RESULT_VARIABLE result + RESULT_VARIABLE res OUTPUT_VARIABLE var ERROR_VARIABLE var OUTPUT_STRIP_TRAILING_WHITESPACE @@ -67,8 +66,8 @@ endif() include(FindPackageHandleStandardArgs) find_package_handle_standard_args(Maven FOUND_VAR Maven_FOUND - REQUIRED_VARS Maven_EXECUTABLE - VERSION_VAR Maven_VERSION) + VERSION_VAR Maven_VERSION + REQUIRED_VARS Maven_EXECUTABLE Maven_VERSION) mark_as_advanced(Maven_FOUND Maven_EXECUTABLE Maven_VERSION) From 1d923764e1c708bfabb2f302203efc86fe6ddcf9 Mon Sep 17 00:00:00 2001 From: Jeroen Koekkoek Date: Mon, 18 Feb 2019 12:55:54 +0100 Subject: [PATCH 2/3] Fix IDL Compiler invocation on Windows Signed-off-by: Jeroen Koekkoek --- src/idlc/cmake/IdlcGenerate.cmake | 17 ++++++----------- src/idlc/cmake/dds_idlc.bat.in | 2 +- src/idlc/cmake/dds_idlcpp.bat.in | 19 ------------------- src/idlc/cmake/dds_idlcpp.in | 13 ------------- 4 files changed, 7 insertions(+), 44 deletions(-) delete mode 100644 src/idlc/cmake/dds_idlcpp.bat.in delete mode 100644 src/idlc/cmake/dds_idlcpp.in diff --git a/src/idlc/cmake/IdlcGenerate.cmake b/src/idlc/cmake/IdlcGenerate.cmake index 64f5f324ae..083bfb438e 100644 --- a/src/idlc/cmake/IdlcGenerate.cmake +++ b/src/idlc/cmake/IdlcGenerate.cmake @@ -9,14 +9,16 @@ # # SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause # +find_package(Java 1.8 REQUIRED) + if(NOT IDLC_JAR) - set(IDLC_JAR "${CMAKE_CURRENT_LIST_DIR}/idlc-jar-with-dependencies.jar") + set(IDLC_JAR "${CMAKE_CURRENT_LIST_DIR}/idlc-jar-with-dependencies.jar") endif() set(LINE_ENDINGS "UNIX") -if("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") - set(EXTENSION ".bat") - set(LINE_ENDINGS "WIN32") +if(WIN32) + set(EXTENSION ".bat") + set(LINE_ENDINGS "WIN32") endif() set(IDLC_DIR "${CMAKE_CURRENT_BINARY_DIR}" CACHE STRING "") @@ -30,13 +32,6 @@ configure_file( @ONLY NEWLINE_STYLE ${LINE_ENDINGS}) -# FIXME: C++ IDL compiler depends idlpp. Leave it disabled for now. -#configure_file( -# "cmake/dds_idlcpp${EXTENSION}.in" -# "dds_idlcpp${EXTENSION}" -# @ONLY -# NEWLINE_STYLE ${LINE_ENDINGS}) - if(NOT ("${CMAKE_SYSTEM_NAME}" STREQUAL "Windows")) execute_process(COMMAND chmod +x "${IDLC_DIR}/${IDLC}") endif() diff --git a/src/idlc/cmake/dds_idlc.bat.in b/src/idlc/cmake/dds_idlc.bat.in index 21e985710f..7b7f1749e1 100644 --- a/src/idlc/cmake/dds_idlc.bat.in +++ b/src/idlc/cmake/dds_idlc.bat.in @@ -15,5 +15,5 @@ if "%CLASSPATH%"=="" ( set "CLASSPATH=@IDLC_JAR@;%CLASSPATH%" ) -java org.eclipse.cyclonedds.compilers.Idlc %* +"@Java_JAVA_EXECUTABLE@" org.eclipse.cyclonedds.compilers.Idlc %* diff --git a/src/idlc/cmake/dds_idlcpp.bat.in b/src/idlc/cmake/dds_idlcpp.bat.in deleted file mode 100644 index c5aa460026..0000000000 --- a/src/idlc/cmake/dds_idlcpp.bat.in +++ /dev/null @@ -1,19 +0,0 @@ -@echo off -REM Copyright(c) 2006 to 2018 ADLINK Technology Limited and others -REM -REM This program and the accompanying materials are made available under the -REM terms of the Eclipse Public License v. 2.0 which is available at -REM http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License -REM v. 1.0 which is available at -REM http://www.eclipse.org/org/documents/edl-v10.php. -REM -REM SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause - -if "%CLASSPATH%"=="" ( - set "CLASSPATH=@IDLC_JAR@" -) else ( - set "CLASSPATH=@IDLC_JAR@;%CLASSPATH%" -) - -java org.eclipse.cyclonedds.compilers.Idlcpp %* - diff --git a/src/idlc/cmake/dds_idlcpp.in b/src/idlc/cmake/dds_idlcpp.in deleted file mode 100644 index 065bff922c..0000000000 --- a/src/idlc/cmake/dds_idlcpp.in +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/sh -# -# Copyright(c) 2006 to 2018 ADLINK Technology Limited and others -# -# This program and the accompanying materials are made available under the -# terms of the Eclipse Public License v. 2.0 which is available at -# http://www.eclipse.org/legal/epl-2.0, or the Eclipse Distribution License -# v. 1.0 which is available at -# http://www.eclipse.org/org/documents/edl-v10.php. -# -# SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause -# -java -classpath "@IDLC_JAR@" org.eclipse.cyclonedds.compilers.Idlcpp "$@" From 58a8dfd5c5682cc4d21664baebf8531259613373 Mon Sep 17 00:00:00 2001 From: Jeroen Koekkoek Date: Sun, 17 Feb 2019 23:41:37 +0100 Subject: [PATCH 3/3] Add support for Travis CI Windows builds Signed-off-by: Jeroen Koekkoek --- .travis.yml | 95 +++++++++++++++++++++++++------ src/cmake/modules/FindMaven.cmake | 5 ++ 2 files changed, 82 insertions(+), 18 deletions(-) diff --git a/.travis.yml b/.travis.yml index f757bfc205..8143be44bd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,6 @@ linux_gcc8: &linux_gcc8 apt: update: true sources: [ ubuntu-toolchain-r-test ] - #packages: [ gcc-8 g++-8 maven cmake ] packages: [ gcc-8 g++-8 ] linux_clang: &linux_clang @@ -21,8 +20,6 @@ linux_clang: &linux_clang addons: apt: update: true - #sources: [ ubuntu-toolchain-r-test ] - #packages: [ maven clang ] osx_xcode10_1: &osx_xcode10_1 os: osx @@ -33,6 +30,9 @@ osx_xcode10_1: &osx_xcode10_1 packages: - pyenv-virtualenv +windows_vs2017: &windows_vs2017 + os: windows + matrix: include: - <<: *linux_gcc8 @@ -42,19 +42,56 @@ matrix: - <<: *linux_clang env: [ BUILD_TYPE=Debug, C_COMPILER=clang, CXX_COMPILER=clang++, USE_SANITIZER=address ] - <<: *linux_clang - env: [ BUILT_TYPE=Release, C_COMPILER=clang, CXX_COMPILER=clang++, USE_SANITIZER=none ] + env: [ BUILD_TYPE=Release, C_COMPILER=clang, CXX_COMPILER=clang++, USE_SANITIZER=none ] - <<: *osx_xcode10_1 env: [ BUILD_TYPE=Debug, C_COMPILER=clang, CXX_COMPILER=clang++, USE_SANITIZER=address ] - <<: *osx_xcode10_1 env: [ BUILD_TYPE=Release, C_COMPILER=clang, CXX_COMPILER=clang++, USE_SANITIZER=none ] + - <<: *windows_vs2017 + env: [ ARCH=x86, BUILD_TYPE=Debug, GENERATOR="Visual Studio 15 2017" ] + - <<: *windows_vs2017 + env: [ ARCH=x86_64, BUILD_TYPE=Debug, GENERATOR="Visual Studio 15 2017" ] + - <<: *windows_vs2017 + env: [ ARCH=x86_64, BUILD_TYPE=Release, GENERATOR="Visual Studio 15 2017" ] - +# Conan will automatically determine the best compiler for a given platform +# based on educated guesses. The first check is based on the CC and CXX +# environment variables, the second (on Windows) is to check if Microsoft +# Visual Studio is installed. On Travis CC and CXX are set to gcc on Microsoft +# Windows targets as well, this has the undesired effect that MSVC is not +# detected, unsetting CC and CXX solves that problem. before_install: - - eval "export CC=${C_COMPILER}"; - - eval "export CXX=${CXX_COMPILER}"; + - if [ "${TRAVIS_OS_NAME}" = "windows" ]; then + eval "unset CC"; + eval "unset CXX"; + else + eval "export CC=${C_COMPILER}"; + eval "export CXX=${CXX_COMPILER}"; + fi +# Windows targets in Travis are still very much in beta and Python is not yet +# available and installation of Python through Chocolaty does not work well. +# The real fix is to wait until Python and pip are both available on the +# target. Until then download Conan from the official website and simply add +# the extracted folder to the path. +# +# Maven requires JAVA_HOME to be set (at least on Windows), but Windows targets +# do not come with Java installed. For now it is installed through Chocolatey +# as a dependency of Maven, hence JAVA_HOME is only available after the +# package is installed. The problem is that the shell cannot be restarted and +# the path is not fixed as it contains the version number. To workaround this +# issue, JAVA_HOME is read from the registry and exported by this script. install: - - if [ "${TRAVIS_OS_NAME}" = "osx" ]; then + - if [ "${TRAVIS_OS_NAME}" = "windows" ]; then + choco install innoextract maven; + wget -q https://dl.bintray.com/conan/installers/conan-win-64_1_10_0.exe; + innoextract conan-win-64_1_10_0.exe; + KEY='HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment'; + VALUE='JAVA_HOME'; + JAVA_HOME=$(REG QUERY "${KEY}" -v "${VALUE}" | sed -n 's/^.*JAVA_HOME \+[_A-Z]\+ \+//ip'); + eval "export JAVA_HOME=\"${JAVA_HOME}\""; + eval "export PATH=\"$(pwd)/app/conan:${PATH}\""; + elif [ "${TRAVIS_OS_NAME}" = "osx" ]; then eval "$(pyenv init -)"; pyenv virtualenv conan; pyenv rehash; @@ -63,21 +100,43 @@ install: else pip install conan --upgrade --user; fi - - conan user + - conan profile new default --detect before_script: - conan remote add bincrafters https://api.bintray.com/conan/bincrafters/public-conan + - conan profile get settings.arch default + - if [ -z "${ARCH}" ]; then + eval "export ARCH=\"$(conan profile get settings.arch default)\""; + fi + - if [ "${TRAVIS_OS_NAME}" = "windows" ]; then + GENERATOR_ARCH=$(if [ "${ARCH}" = "x86_64" ]; then echo " Win64"; fi); + eval "export GENERATOR=\"${GENERATOR}${GENERATOR_ARCH}\""; + eval "export USE_SANITIZER=none"; + else + eval "export GENERATOR=\"Unix Makefiles\""; + fi + - export script: - mkdir build - cd build - - conan install .. --build missing - - cmake -DBUILD_TESTING=on -DCMAKE_BUILD_TYPE=${BUILD_TYPE} -DUSE_SANITIZER=${USE_SANITIZER} -DCMAKE_INSTALL_PREFIX=${PWD}/install ../src - - cmake --build . --target install - - mkdir install/share/CycloneDDS/examples/helloworld/build - - if [ "$USE_SANITIZER" = "none" ]; then - (cd install/share/CycloneDDS/examples/helloworld/build && cmake -DCMAKE_BUILD_TYPE=${BUILD_TYPE} .. && cmake --build .) ; - else - (cd install/share/CycloneDDS/examples/helloworld/build && cmake -DCMAKE_C_FLAGS=-fsanitize=address -DCMAKE_LINKER_FLAGS=-fsanitize=address -DCMAKE_BUILD_TYPE=${BUILD_TYPE} .. && cmake --build .) ; + - conan install -b missing -s arch=${ARCH} -s build_type=${BUILD_TYPE} .. + - cmake -DCMAKE_BUILD_TYPE=${BUILD_TYPE} + -DCMAKE_INSTALL_PREFIX=$(pwd)/install + -DUSE_SANITIZER=${USE_SANITIZER} + -DBUILD_TESTING=on + -G "${GENERATOR}" ../src + - cmake --build . --config ${BUILD_TYPE} --target install + - ctest -T test -C ${BUILD_TYPE} + - if [ "${USE_SANITIZER}" != "none" ]; then + CMAKE_LINKER_FLAGS="-DCMAKE_LINKER_FLAGS=-fsanitize=${USE_SANITIZER}"; + CMAKE_C_FLAGS="-DCMAKE_C_FLAGS=-fsanitize=${USE_SANITIZER}"; fi - - ctest -T test + - mkdir install/share/CycloneDDS/examples/helloworld/build + - cd install/share/CycloneDDS/examples/helloworld/build + - cmake -DCMAKE_BUILD_TYPE=${BUILD_TYPE} + ${CMAKE_C_FLAGS} + ${CMAKE_LINKER_FLAGS} + -G "${GENERATOR}" .. + - cmake --build . --config ${BUILD_TYPE} + diff --git a/src/cmake/modules/FindMaven.cmake b/src/cmake/modules/FindMaven.cmake index ebde1df5d5..5a2e3c3269 100644 --- a/src/cmake/modules/FindMaven.cmake +++ b/src/cmake/modules/FindMaven.cmake @@ -17,6 +17,11 @@ if(DEFINED ENV{M2_HOME}) list(APPEND _mvn_hints "$ENV{M2_HOME}/bin") endif() +# Chocolatey installs packages under C:\ProgramData\chocolatey. +if(ENV{ProgramData} AND IS_DIRECTORY "$ENV{ProgramData}/chocolatey/bin") + list(APPEND _mvn_paths "$ENV{ProgramData}/chocolatey/bin") +endif() + # Maven documentation mentions intalling maven under C:\Program Files on # Windows and under /opt on *NIX platforms. if(WIN32)