From 081de818075573263bacd1962143e25bad41e3e0 Mon Sep 17 00:00:00 2001 From: Alexander Nitsch Date: Tue, 19 Dec 2017 09:30:24 +0100 Subject: [PATCH 1/4] Fix copying of .java files on Windows The cp command was not understood by the Windows CMD, so this only worked on Linux and OSX. CMake's -E copy command does not support wildcards in filenames either, so the most robust way is to simply call a script for copying on Windows. --- bindings/CMakeLists.txt | 32 ++++++++++++++++++++++++-------- bindings/copy_java.bat | 8 ++++++++ 2 files changed, 32 insertions(+), 8 deletions(-) create mode 100644 bindings/copy_java.bat diff --git a/bindings/CMakeLists.txt b/bindings/CMakeLists.txt index 38e75a60..4cf530d7 100644 --- a/bindings/CMakeLists.txt +++ b/bindings/CMakeLists.txt @@ -52,14 +52,30 @@ if(SWIG_FOUND) endif() set(INFO_BUILD_JAVA_BINDINGS "Yes") - add_custom_target(psmoveapi.jar ALL - COMMAND ${CMAKE_COMMAND} -E make_directory ${PSMOVEAPI_JAVA_PKG_DIR} - COMMAND cp *.java ${PSMOVEAPI_JAVA_PKG_DIR}/ - COMMAND javac ${PSMOVEAPI_JAVA_PKG_DIR}/*.java - COMMAND jar cf psmoveapi.jar ${PSMOVEAPI_JAVA_PKG_DIR}/*.class - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} - COMMENT "Java bindings JAR archive" - ) + # NOTE: We need a platform-independent copy command for the .java files, but neither the COMMAND + # nor CMake's "-E copy" support wildcards on Windows. We could probably whip up something + # more elegant which only makes the relevant line platform-dependent without copying all + # the other lines. But this simple branching is pretty robust and also works with older + # versions of CMake. + if(${CMAKE_SYSTEM_NAME} MATCHES "Windows") + add_custom_target(psmoveapi.jar ALL + COMMAND ${CMAKE_COMMAND} -E make_directory ${PSMOVEAPI_JAVA_PKG_DIR} + COMMAND ${CMAKE_CURRENT_LIST_DIR}/copy_java.bat ${PSMOVEAPI_JAVA_PKG_DIR}/ + COMMAND javac ${PSMOVEAPI_JAVA_PKG_DIR}/*.java + COMMAND jar cf psmoveapi.jar ${PSMOVEAPI_JAVA_PKG_DIR}/*.class + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Java bindings JAR archive" + ) + else() + add_custom_target(psmoveapi.jar ALL + COMMAND ${CMAKE_COMMAND} -E make_directory ${PSMOVEAPI_JAVA_PKG_DIR} + COMMAND cp *.java ${PSMOVEAPI_JAVA_PKG_DIR}/ + COMMAND javac ${PSMOVEAPI_JAVA_PKG_DIR}/*.java + COMMAND jar cf psmoveapi.jar ${PSMOVEAPI_JAVA_PKG_DIR}/*.class + WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} + COMMENT "Java bindings JAR archive" + ) + endif() set(PSMOVEAPI_PROCESSING_DIR "${CMAKE_CURRENT_LIST_DIR}/processing/libraries/psmove") diff --git a/bindings/copy_java.bat b/bindings/copy_java.bat new file mode 100644 index 00000000..631cfc35 --- /dev/null +++ b/bindings/copy_java.bat @@ -0,0 +1,8 @@ +if "%~1"=="" ( + echo Destination directory missing + exit /b 1 +) + +copy *.java "%~1" + +exit /b 0 From 37079d93c48ccde62f768d4e6ca499ddd3411444 Mon Sep 17 00:00:00 2001 From: Alexander Nitsch Date: Tue, 19 Dec 2017 09:49:21 +0100 Subject: [PATCH 2/4] Fix Java project build order The .jar file needs to be created only after SWIG generated the .java files. This was not working properly. --- bindings/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bindings/CMakeLists.txt b/bindings/CMakeLists.txt index 4cf530d7..3f39b6ff 100644 --- a/bindings/CMakeLists.txt +++ b/bindings/CMakeLists.txt @@ -58,7 +58,7 @@ if(SWIG_FOUND) # the other lines. But this simple branching is pretty robust and also works with older # versions of CMake. if(${CMAKE_SYSTEM_NAME} MATCHES "Windows") - add_custom_target(psmoveapi.jar ALL + add_custom_target(psmoveapi.jar COMMAND ${CMAKE_COMMAND} -E make_directory ${PSMOVEAPI_JAVA_PKG_DIR} COMMAND ${CMAKE_CURRENT_LIST_DIR}/copy_java.bat ${PSMOVEAPI_JAVA_PKG_DIR}/ COMMAND javac ${PSMOVEAPI_JAVA_PKG_DIR}/*.java @@ -67,7 +67,7 @@ if(SWIG_FOUND) COMMENT "Java bindings JAR archive" ) else() - add_custom_target(psmoveapi.jar ALL + add_custom_target(psmoveapi.jar COMMAND ${CMAKE_COMMAND} -E make_directory ${PSMOVEAPI_JAVA_PKG_DIR} COMMAND cp *.java ${PSMOVEAPI_JAVA_PKG_DIR}/ COMMAND javac ${PSMOVEAPI_JAVA_PKG_DIR}/*.java From 39519694b7ea97b8d747931e00d71a41b4071aad Mon Sep 17 00:00:00 2001 From: Alexander Nitsch Date: Wed, 27 Dec 2017 14:10:09 +0100 Subject: [PATCH 3/4] Fix output directories on Windows --- CMakeLists.txt | 11 +++++++++++ scripts/build_package.sh | 12 ++++++------ 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ecb759cf..a9d046a7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,6 +2,17 @@ cmake_minimum_required(VERSION 2.8.12) project(PSMoveAPI) +# get rid of Visual Studio's default "Debug" and "Release" output directories +if(${CMAKE_SYSTEM_NAME} MATCHES "Windows") + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}) + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_BINARY_DIR}) + + set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}) + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}) +endif() + # Step into the subdirectories include("src/CMakeLists.txt") include("examples/CMakeLists.txt") diff --git a/scripts/build_package.sh b/scripts/build_package.sh index ceffcf20..458f61fd 100644 --- a/scripts/build_package.sh +++ b/scripts/build_package.sh @@ -103,14 +103,14 @@ case "$BUILD_TYPE" in WIN_ARCH=${BUILD_TYPE#windows-native-msvc-} BUILDDIR="build-${WIN_ARCH}" PLATFORM_BIN=" - $BUILDDIR/Release/psmove.exe - $BUILDDIR/Release/test_tracker.exe + $BUILDDIR/psmove.exe + $BUILDDIR/test_tracker.exe " PLATFORM_LIB=" - $BUILDDIR/Release/psmoveapi.dll - $BUILDDIR/Release/psmoveapi.lib - $BUILDDIR/Release/psmoveapi_tracker.dll - $BUILDDIR/Release/psmoveapi_tracker.lib + $BUILDDIR/psmoveapi.dll + $BUILDDIR/psmoveapi.lib + $BUILDDIR/psmoveapi_tracker.dll + $BUILDDIR/psmoveapi_tracker.lib " pkg_zipfile_7z From 7037bbc31c3385d67dc528e52e6f3586d5e32a46 Mon Sep 17 00:00:00 2001 From: Alexander Nitsch Date: Wed, 27 Dec 2017 14:29:08 +0100 Subject: [PATCH 4/4] Fix Java library name on Windows Windows does not use the "lib" prefix for its libraries by default. Only MinGW does that. --- bindings/CMakeLists.txt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/bindings/CMakeLists.txt b/bindings/CMakeLists.txt index 3f39b6ff..b6ceeaf7 100644 --- a/bindings/CMakeLists.txt +++ b/bindings/CMakeLists.txt @@ -85,8 +85,12 @@ if(SWIG_FOUND) set(PSMOVEAPI_PAIRING_TOOL_NAME "psmove") ELSEIF(${CMAKE_SYSTEM_NAME} MATCHES "Windows") set(PSMOVEAPI_LIB_PLATFORM "windows") - set(PSMOVEAPI_NATIVE_LIB "libpsmove_java.dll") + set(PSMOVEAPI_NATIVE_LIB "psmove_java.dll") set(PSMOVEAPI_PAIRING_TOOL_NAME "psmove.exe") + + if(MINGW) + set(PSMOVEAPI_NATIVE_LIB "libpsmove_java.dll") + endif() ELSE() # Linux set(PSMOVEAPI_LIB_PLATFORM "linux") set(PSMOVEAPI_NATIVE_LIB "libpsmove_java.so")