From 2e4d354aee3e3f1d6af489ce52102c76d128f717 Mon Sep 17 00:00:00 2001 From: Gold856 <117957790+Gold856@users.noreply.github.com> Date: Mon, 24 Jun 2024 17:47:02 -0400 Subject: [PATCH] [build] CMake: add Maven build functionality Add Python script to package libraries Shortened if statement (thanks Tyler!) Remove scrapped CMake archiver Package up headers Install source files Add BUILD_MAVEN option to README-CMAKE.md [ci] Build maven artifacts in CI Fix cmake build with BUILD_MAVEN=ON Fix wpigui install Split CMake Maven build matrix to separate job Package up source files Fix up RIO compiler detection Test RIO build Build protobuf into wpiutil for CMake Maven builds Install JNI headers Manually set Java include dirs Put platform variables in their own module Add OpenCV finder Fix protobuf Use build config RelWithDebInfo Fix protobuf Grab JNI headers Downloaded from GitHub on suggestion of Thad Remove Release config Add NI Libraries finder Update CI Link NI Libraries to the HAL and build Athena HAL Fix CI Grab NI runtime library Disable tests on the RIO build Don't use vcpkg for CMake Maven and unify Maven builds Disable examples and sim modules for the RIO build Disable use-after-free warning for EigenJNI Grab protoc for Windows Fix protoc on Mac Fix compiler warnings Properly download protoc and fix Windows build Move flags around and upload artifacts Allow specifying source directories Unify protoc and Java setup and setup Python Fix up packager script Fetch all tags Make Windows tests work Add artifact option to control location Using the project name is a bad assumption, and breaks on the Glass libs Install JNI headers without extra native-headers directory Add full Debug/RelWithDebInfo matrix and Windows ARM64 build Build universal Mac binaries Add full Linux matrix Update toolchain files Suppress warning Install and package apps Add workspace as safe dir and print git result Sign macOS apps and refactor packaging script Refactor find modules to use FetchContent Use Artifactory for sccache Fetch libssh artifacts Sign dylibs on Mac Install everything to artifact dirs, make less assumptions in Python script Also add more info to CMake build Setup Maven build for sim extensions and fieldImages Match native-utils flags for MSVC --- .github/workflows/cmake.yml | 166 ++++++++++++++++++ CMakeLists.txt | 65 +++++-- CMakePresets.json | 34 +++- README-CMAKE.md | 2 + apriltag/CMakeLists.txt | 49 ++++-- cameraserver/CMakeLists.txt | 38 ++-- cmake/modules/BuildMaven.cmake | 50 ++++++ cmake/modules/FindLIBSSH.cmake | 46 +++++ cmake/modules/FindNILibraries.cmake | 51 ++++++ cmake/modules/FindOpenCV.cmake | 95 ++++++++++ cmake/modules/PlatformVars.cmake | 26 +++ .../aarch64-bullseye-gnu.toolchain.cmake | 5 + .../arm-frc-gnueabi.toolchain.cmake | 3 +- .../arm-pi-gnueabihf.toolchain.cmake | 7 +- cscore/CMakeLists.txt | 52 ++++-- datalogtool/CMakeLists.txt | 8 + fieldImages/CMakeLists.txt | 30 +++- glass/CMakeLists.txt | 49 ++++-- hal/CMakeLists.txt | 59 +++++-- library_packager.py | 127 ++++++++++++++ ntcore/CMakeLists.txt | 56 ++++-- outlineviewer/CMakeLists.txt | 7 + roborioteamnumbersetter/CMakeLists.txt | 12 ++ romiVendordep/CMakeLists.txt | 31 +++- simulation/halsim_ds_socket/CMakeLists.txt | 9 +- simulation/halsim_gui/CMakeLists.txt | 9 +- simulation/halsim_ws_client/CMakeLists.txt | 9 +- simulation/halsim_ws_core/CMakeLists.txt | 9 +- simulation/halsim_ws_server/CMakeLists.txt | 9 +- simulation/halsim_xrp/CMakeLists.txt | 9 +- sysid/CMakeLists.txt | 7 + wpigui/CMakeLists.txt | 27 ++- wpilibNewCommands/CMakeLists.txt | 48 +++-- wpilibc/CMakeLists.txt | 43 +++-- wpilibc/src/main/native/cpp/Encoder.cpp | 4 + wpimath/CMakeLists.txt | 50 ++++-- wpimath/src/main/native/cpp/jni/EigenJNI.cpp | 4 + wpinet/CMakeLists.txt | 48 +++-- wpiutil/CMakeLists.txt | 66 +++++-- xrpVendordep/CMakeLists.txt | 30 +++- 40 files changed, 1223 insertions(+), 226 deletions(-) create mode 100644 cmake/modules/BuildMaven.cmake create mode 100644 cmake/modules/FindNILibraries.cmake create mode 100644 cmake/modules/FindOpenCV.cmake create mode 100644 cmake/modules/PlatformVars.cmake create mode 100644 cmake/toolchains/aarch64-bullseye-gnu.toolchain.cmake create mode 100644 library_packager.py diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 1b217a64ed4..bf25eedad30 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -87,3 +87,169 @@ jobs: working-directory: build-cmake # UnitTest_test segfaults on exit occasionally run: ctest --output-on-failure -E 'UnitTest' + + build-maven: + strategy: + fail-fast: false + matrix: + config: [Debug, RelWithDebInfo] + name: [RIO, Linux Arm32, Linux Arm64, Linux x86-64, macOS, Windows x86-64, Windows ARM64] + include: + - os: ubuntu-22.04 + name: RIO + container: wpilib/roborio-cross-ubuntu:2024-22.04 + flags: "--preset ci-maven-linux-cross --toolchain ./cmake/toolchains/arm-frc-gnueabi.toolchain.cmake -DWITH_SIMULATION_MODULES=OFF -DWITH_GUI=OFF" + protoc-archive: protoc-21.12-linux-x86_64.zip + install-location: /tmp/install + - os: ubuntu-22.04 + name: Linux Arm32 + container: wpilib/raspbian-cross-ubuntu:bullseye-22.04 + flags: "--preset ci-maven-linux-cross --toolchain ./cmake/toolchains/arm-pi-gnueabihf.toolchain.cmake" + protoc-archive: protoc-21.12-linux-x86_64.zip + install-location: /tmp/install + - os: ubuntu-22.04 + name: Linux Arm64 + container: wpilib/aarch64-cross-ubuntu:bullseye-22.04 + flags: "--preset ci-maven-linux-cross --toolchain ./cmake/toolchains/aarch64-bullseye-gnu.toolchain.cmake" + protoc-archive: protoc-21.12-linux-x86_64.zip + install-location: /tmp/install + - os: ubuntu-22.04 + name: Linux x86-64 + container: wpilib/ubuntu-base:22.04 + flags: "--preset ci-maven-unix" + protoc-archive: protoc-21.12-linux-x86_64.zip + install-location: /tmp/install + - os: macOS-14 + name: macOS + container: "" + env: "PATH=\"/opt/homebrew/opt/protobuf@3/bin:$PATH\"" + flags: "--preset ci-maven-unix '-DCMAKE_OSX_ARCHITECTURES=arm64;x86_64' -DCMAKE_LIBRARY_PATH=/opt/homebrew/opt/protobuf@3/lib" + protoc-archive: protoc-21.12-osx-universal_binary.zip + install-location: /tmp/install + - os: windows-2022 + name: Windows x86-64 + container: "" + msvc: amd64 + flags: "--preset ci-maven '-DProtobuf_PROTOC_EXECUTABLE=bin/protoc.exe' '-DPROTOC_COMPILER=bin/protoc.exe'" + protoc-archive: protoc-21.12-win64.zip + install-location: D:/install + - os: windows-2022 + name: Windows ARM64 + container: "" + msvc: amd64_arm64 + flags: "--preset ci-maven -DWITH_TESTS=OFF '-DProtobuf_PROTOC_EXECUTABLE=bin/protoc.exe' '-DPROTOC_COMPILER=bin/protoc.exe'" + protoc-archive: protoc-21.12-win64.zip + install-location: D:/install + + name: "Build Maven - ${{ matrix.name }} ${{ matrix.config }}" + runs-on: ${{ matrix.os }} + container: ${{ matrix.container }} + steps: + - name: Install dependencies (Linux) + if: runner.os == 'Linux' + run: sudo apt-get update && sudo apt-get install -y libprotobuf-dev ninja-build + + - name: Install dependencies (macOS) + run: brew install protobuf@3 ninja + if: runner.os == 'macOS' + + - name: Setup Java + uses: actions/setup-java@v4 + with: + distribution: 'temurin' + java-version: 17 + + - name: Set up Python 3.10 + uses: actions/setup-python@v5 + with: + python-version: '3.10' + + - uses: ilammy/msvc-dev-cmd@v1.13.0 + with: + arch: ${{ matrix.msvc }} + if: runner.os == 'Windows' + + - name: Download JNI headers (Linux) + if: runner.os == 'Linux' && matrix.name != 'Linux x86-64' + run: | + mkdir /tmp/jni/ + wget https://raw.githubusercontent.com/openjdk/jdk21/master/src/java.base/unix/native/include/jni_md.h -O /tmp/jni/jni_md.h + wget https://raw.githubusercontent.com/openjdk/jdk21/master/src/java.base/share/native/include/jni.h -O /tmp/jni/jni.h + + - name: Install CMake + if: runner.os == 'Windows' + uses: lukka/get-cmake@v3.29.3 + + - name: Run sccache-cache + uses: mozilla-actions/sccache-action@v0.0.5 + + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + fetch-tags: true + + - name: Add workspace as safe directory (Container) + if: matrix.container != '' + run: git config --global --add safe.directory /__w/allwpilib/allwpilib + + - name: Download protoc + run: curl -LO https://github.com/protocolbuffers/protobuf/releases/download/v21.12/${{ matrix.protoc-archive }} + + - name: Unpack protoc + if: runner.os != 'Windows' + run: unzip ${{ matrix.protoc-archive }} + + - name: Unpack protoc (Windows) + if: runner.os == 'Windows' + run: tar -xf ${{ matrix.protoc-archive }} + + - name: configure + run: cmake -DCMAKE_INSTALL_PREFIX=${{ matrix.install-location }} -DCMAKE_BUILD_TYPE=${{ matrix.config }} ${{ matrix.flags }} + + - name: build + working-directory: build-cmake + run: cmake --build . --parallel $(nproc) --target install + env: + SCCACHE_WEBDAV_ENDPOINT: https://frcmaven.wpi.edu/artifactory/wpilib-generic-gradle-cache-local + SCCACHE_WEBDAV_USERNAME: ${{ secrets.ARTIFACTORY_USERNAME }} + SCCACHE_WEBDAV_PASSWORD: ${{ secrets.ARTIFACTORY_PASSWORD }} + + - name: test + if: runner.os != 'Windows' + working-directory: build-cmake + run: ctest --output-on-failure + + - name: test (Windows) + if: runner.os == 'Windows' + working-directory: build + # UnitTest_test segfaults on exit occasionally + run: ctest --output-on-failure -E 'UnitTest' + + - name: Import Developer ID Certificate + uses: wpilibsuite/import-signing-certificate@v2 + with: + certificate-data: ${{ secrets.APPLE_CERTIFICATE_DATA }} + certificate-passphrase: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} + keychain-password: ${{ secrets.APPLE_KEYCHAIN_PASSWORD }} + if: | + matrix.artifact-name == 'macOS' && (github.repository_owner == 'wpilibsuite' && + (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v'))) + - name: Set Keychain Lock Timeout + run: security set-keychain-settings -lut 3600 + if: | + matrix.artifact-name == 'macOS' && (github.repository_owner == 'wpilibsuite' && + (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v'))) + + - name: Sign macOS apps + run: python library_packager.py --install_directory ${{ matrix.install-location }} sign --developer_id ${{ secrets.APPLE_DEVELOPER_ID }} + if: | + matrix.artifact-name == 'macOS' && (github.repository_owner == 'wpilibsuite' && + (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v'))) + + - name: Package artifacts + run: python library_packager.py --install_directory ${{ matrix.install-location }} package + + - uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.name }} ${{ matrix.config }} + path: ${{ matrix.install-location }}/*.zip diff --git a/CMakeLists.txt b/CMakeLists.txt index dab6b3c7e83..90a523cf24f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,6 +58,7 @@ set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) # Options for building certain parts of the repo. Everything is built by default. option(BUILD_SHARED_LIBS "Build with shared libs (needed for JNI)" ON) +option(BUILD_MAVEN "Build Maven artifacts") option(WITH_JAVA "Include Java and JNI in the build" OFF) option(WITH_JAVA_SOURCE "Build Java source jars" ${WITH_JAVA}) option(WITH_CSCORE "Build cscore (needs OpenCV)" ON) @@ -132,32 +133,50 @@ find_package(LIBSSH 0.7.1) set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON) set(protobuf_MODULE_COMPATIBLE ON CACHE BOOL "" FORCE) -find_package(Protobuf REQUIRED) +if(BUILD_MAVEN) + find_package(Protobuf MODULE REQUIRED) + if(MSVC) + set_target_properties( + protobuf::protoc + PROPERTIES + IMPORTED_LOCATION_DEBUG ${Protobuf_PROTOC_EXECUTABLE} + IMPORTED_LOCATION_RELWITHDEBINFO ${Protobuf_PROTOC_EXECUTABLE} + ) + endif() +else() + find_package(Protobuf REQUIRED) +endif() find_program(PROTOC_COMPILER protoc REQUIRED) set(CMAKE_FIND_PACKAGE_PREFER_CONFIG OFF) get_property(isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) if(isMultiConfig) - if(NOT "Asan" IN_LIST CMAKE_CONFIGURATION_TYPES) - list(APPEND CMAKE_CONFIGURATION_TYPES Asan) - endif() - if(NOT "Tsan" IN_LIST CMAKE_CONFIGURATION_TYPES) - list(APPEND CMAKE_CONFIGURATION_TYPES Tsan) - endif() - if(NOT "Ubsan" IN_LIST CMAKE_CONFIGURATION_TYPES) - list(APPEND CMAKE_CONFIGURATION_TYPES Ubsan) + if(BUILD_MAVEN) + list(REMOVE_ITEM CMAKE_CONFIGURATION_TYPES MinSizeRel Release) + else() + if(NOT "Asan" IN_LIST CMAKE_CONFIGURATION_TYPES) + list(APPEND CMAKE_CONFIGURATION_TYPES Asan) + endif() + if(NOT "Tsan" IN_LIST CMAKE_CONFIGURATION_TYPES) + list(APPEND CMAKE_CONFIGURATION_TYPES Tsan) + endif() + if(NOT "Ubsan" IN_LIST CMAKE_CONFIGURATION_TYPES) + list(APPEND CMAKE_CONFIGURATION_TYPES Ubsan) + endif() endif() else() - set(allowedBuildTypes + set(allowedBuildTypes Debug RelWithDebInfo) + set(cmake_only_build_types Asan Tsan Ubsan - Debug Release - RelWithDebInfo MinSizeRel ) + if(NOT BUILD_MAVEN) + set(allowedBuildTypes ${allowedBuildTypes} ${cmake_only_build_types}) + endif() set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "${allowedBuildTypes}") if(CMAKE_BUILD_TYPE AND NOT CMAKE_BUILD_TYPE IN_LIST allowedBuildTypes) @@ -165,6 +184,28 @@ else() endif() endif() +if(BUILD_MAVEN AND MSVC) + string( + REGEX REPLACE + "/INCREMENTAL( |$)" + "/INCREMENTAL:NO " + CMAKE_SHARED_LINKER_FLAGS_DEBUG + ${CMAKE_SHARED_LINKER_FLAGS_DEBUG} + ) + string( + REGEX REPLACE + "/INCREMENTAL( |$)" + "/INCREMENTAL:NO " + CMAKE_EXE_LINKER_FLAGS_DEBUG + ${CMAKE_EXE_LINKER_FLAGS_DEBUG} + ) + + string(APPEND CMAKE_SHARED_LINKER_FLAGS_RELWITHDEBINFO " /OPT:REF,ICF") + string(APPEND CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO " /OPT:REF,ICF") + + string(APPEND CMAKE_SHARED_LINKER_FLAGS "/PDBALTPATH:%_PDB% /DEPENDENTLOADFLAG:0x1100") + string(APPEND CMAKE_EXE_LINKER_FLAGS "/PDBALTPATH:%_PDB% /DEPENDENTLOADFLAG:0x1100") +endif() set(CMAKE_C_FLAGS_ASAN "${CMAKE_C_FLAGS_DEBUG} -fsanitize=address -fno-omit-frame-pointer" CACHE STRING diff --git a/CMakePresets.json b/CMakePresets.json index ab39d90fecf..c8d4b3baa1b 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -45,6 +45,38 @@ "cacheVariables": { "WITH_JAVA": "ON" } + }, + { + "name": "ci-maven", + "description": "Maven config", + "inherits": "with-java", + "cacheVariables": { + "BUILD_MAVEN": true, + "Protobuf_INCLUDE_DIR": "wpiutil/src/main/native/thirdparty/protobuf/include", + "WITH_EXAMPLES": true + } + }, + { + "name": "ci-maven-unix", + "description": "Maven config for compiling on *nix platforms", + "inherits": ["ci-maven", "sccache"], + "cacheVariables": { + "Protobuf_INCLUDE_DIR": "wpiutil/src/main/native/thirdparty/protobuf/include", + "Protobuf_PROTOC_EXECUTABLE": "bin/protoc", + "PROTOC_COMPILER": "bin/protoc" + } + }, + { + "name": "ci-maven-linux-cross", + "description": "Maven config for cross-compiling Linux", + "inherits": "ci-maven-unix", + "cacheVariables": { + "Protobuf_LIBRARIES": "/usr/lib/x86_64-linux-gnu", + "JAVA_INCLUDE_PATH": "/tmp/jni/", + "JAVA_INCLUDE_PATH2": "/tmp/jni/", + "JAVA_JVM_LIBRARY": "$JAVA_HOME/lib/libjvm.so", + "WITH_TESTS": false + } } ] -} +} \ No newline at end of file diff --git a/README-CMAKE.md b/README-CMAKE.md index dd3770b1ab9..46f3c95cecc 100644 --- a/README-CMAKE.md +++ b/README-CMAKE.md @@ -46,6 +46,8 @@ The following build options are available: * `BUILD_SHARED_LIBS` (ON Default) * This option will cause CMake to build static libraries instead of shared libraries. If this is off, `WITH_JAVA` must be off. Otherwise CMake will error. +* `BUILD_MAVEN` (OFF Default) + * This option will build wpilib with maven artifacts. * `WITH_CSCORE` (ON Default) * This option will cause cscore to be built. Turning this off will implicitly disable cameraserver. If this is off, the OpenCV build requirement is removed. * `WITH_EXAMPLES` (OFF Default) diff --git a/apriltag/CMakeLists.txt b/apriltag/CMakeLists.txt index f2ea5dff008..b7c4e018058 100644 --- a/apriltag/CMakeLists.txt +++ b/apriltag/CMakeLists.txt @@ -2,6 +2,9 @@ project(apriltag) include(CompileWarnings) include(GenResources) +if(BUILD_MAVEN) + include(BuildMaven) +endif() file( GLOB_RECURSE apriltaglib_src @@ -88,8 +91,16 @@ if(WITH_JAVA) target_link_libraries(apriltagjni PRIVATE apriltag_jni_headers) add_dependencies(apriltagjni apriltag_jar) - install(TARGETS apriltagjni EXPORT apriltagjni) - export(TARGETS apriltagjni FILE apriltagjni.cmake NAMESPACE apriltagjni::) + if(BUILD_MAVEN) + config_maven_build(apriltagjni GROUP edu.wpi.first.apriltag ARTIFACT apriltag-cpp) + install( + DIRECTORY $/ + DESTINATION apriltag-cpp/sources/jni + ) + else() + install(TARGETS apriltagjni EXPORT apriltagjni) + export(TARGETS apriltagjni FILE apriltagjni.cmake NAMESPACE apriltagjni::) + endif() endif() if(WITH_JAVA_SOURCE) @@ -125,17 +136,34 @@ wpilib_target_warnings(apriltag) target_link_libraries(apriltag wpimath) +configure_file(apriltag-config.cmake.in ${WPILIB_BINARY_DIR}/apriltag-config.cmake) +if(BUILD_MAVEN) + config_maven_build( + apriltag + GROUP edu.wpi.first.apriltag + ARTIFACT apriltag-cpp + CONFIG_FILE apriltag-config.cmake + ) + set(header_dest apriltag-cpp/include) +else() + install(TARGETS apriltag EXPORT apriltag) + export(TARGETS apriltag FILE apriltag.cmake NAMESPACE apriltag::) + install(FILES ${WPILIB_BINARY_DIR}/apriltag-config.cmake DESTINATION share/apriltag) + install(EXPORT apriltag DESTINATION share/apriltag) + set(header_dest ${include_dest}/apriltag) +endif() + +install( + DIRECTORY src/main/native/include/ src/main/native/thirdparty/apriltag/include/ + DESTINATION ${header_dest} +) target_include_directories( apriltag PUBLIC $ - $ + $ ) -install( - DIRECTORY src/main/native/include/ src/main/native/thirdparty/apriltag/include/ - DESTINATION "${include_dest}/apriltag" -) target_include_directories( apriltag SYSTEM @@ -144,13 +172,6 @@ target_include_directories( $ ) -install(TARGETS apriltag EXPORT apriltag) -export(TARGETS apriltag FILE apriltag.cmake NAMESPACE apriltag::) - -configure_file(apriltag-config.cmake.in ${WPILIB_BINARY_DIR}/apriltag-config.cmake) -install(FILES ${WPILIB_BINARY_DIR}/apriltag-config.cmake DESTINATION share/apriltag) -install(EXPORT apriltag DESTINATION share/apriltag) - if(WITH_TESTS) wpilib_add_test(apriltag src/test/native/cpp) target_include_directories(apriltag_test PRIVATE src/test/native/include) diff --git a/cameraserver/CMakeLists.txt b/cameraserver/CMakeLists.txt index ba664eb2df2..b571766b0fe 100644 --- a/cameraserver/CMakeLists.txt +++ b/cameraserver/CMakeLists.txt @@ -2,6 +2,9 @@ project(cameraserver) include(CompileWarnings) include(AddTest) +if(BUILD_MAVEN) + include(BuildMaven) +endif() # Java bindings if(WITH_JAVA) @@ -57,24 +60,35 @@ endif() file(GLOB_RECURSE cameraserver_native_src src/main/native/cpp/*.cpp) add_library(cameraserver ${cameraserver_native_src}) set_target_properties(cameraserver PROPERTIES DEBUG_POSTFIX "d") -target_include_directories( - cameraserver - PUBLIC - $ - $ -) wpilib_target_warnings(cameraserver) target_link_libraries(cameraserver PUBLIC ntcore cscore wpiutil ${OpenCV_LIBS}) set_property(TARGET cameraserver PROPERTY FOLDER "libraries") -install(TARGETS cameraserver EXPORT cameraserver) -export(TARGETS cameraserver FILE cameraserver.cmake NAMESPACE cameraserver::) -install(DIRECTORY src/main/native/include/ DESTINATION "${include_dest}/cameraserver") - configure_file(cameraserver-config.cmake.in ${WPILIB_BINARY_DIR}/cameraserver-config.cmake) -install(FILES ${WPILIB_BINARY_DIR}/cameraserver-config.cmake DESTINATION share/cameraserver) -install(EXPORT cameraserver DESTINATION share/cameraserver) +if(BUILD_MAVEN) + config_maven_build( + cameraserver + GROUP edu.wpi.first.cameraserver + ARTIFACT cameraserver-cpp + CONFIG_FILE cameraserver-config.cmake + ) + set(header_dest cameraserver-cpp/include) +else() + install(TARGETS cameraserver EXPORT cameraserver) + export(TARGETS cameraserver FILE cameraserver.cmake NAMESPACE cameraserver::) + install(FILES ${WPILIB_BINARY_DIR}/cameraserver-config.cmake DESTINATION share/cameraserver) + install(EXPORT cameraserver DESTINATION share/cameraserver) + set(header_dest ${include_dest}/cameraserver) +endif() + +install(DIRECTORY src/main/native/include/ DESTINATION ${header_dest}) +target_include_directories( + cameraserver + PUBLIC + $ + $ +) file(GLOB multiCameraServer_src multiCameraServer/src/main/native/cpp/*.cpp) add_executable(multiCameraServer ${multiCameraServer_src}) diff --git a/cmake/modules/BuildMaven.cmake b/cmake/modules/BuildMaven.cmake new file mode 100644 index 00000000000..34ced645412 --- /dev/null +++ b/cmake/modules/BuildMaven.cmake @@ -0,0 +1,50 @@ +include(PlatformVars) +function(config_maven_build target) + cmake_parse_arguments(artifact "" "CONFIG_FILE;SOURCE_DIR;ARTIFACT;GROUP" "" ${ARGN}) + string(REPLACE "." "_" group ${artifact_GROUP}) + file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/${artifact_ARTIFACT}_group_info.txt ${group}) + install( + FILES ${CMAKE_CURRENT_BINARY_DIR}/${artifact_ARTIFACT}_group_info.txt + RENAME group_info.txt + DESTINATION ${artifact_ARTIFACT} + ) + get_target_property(library_type ${target} TYPE) + if(library_type STREQUAL SHARED_LIBRARY) + set(lib_type shared) + elseif(library_type STREQUAL EXECUTABLE) + set(lib_type "") + else() + set(lib_type static) + endif() + set(library_dest ${artifact_ARTIFACT}/${platform}/${arch}/${lib_type}) + + install(TARGETS ${target} EXPORT ${target} DESTINATION ${library_dest}) + if(library_type STREQUAL EXECUTABLE) + return() + # Nothing below applies to executables + endif() + + # Exported targets always have a config file + if(artifact_CONFIG_FILE) + install(FILES ${WPILIB_BINARY_DIR}/${artifact_CONFIG_FILE} DESTINATION ${artifact_ARTIFACT}) + install(EXPORT ${target} DESTINATION ${artifact_ARTIFACT}) + endif() + + if(artifact_SOURCE_DIR) + install(DIRECTORY ${artifact_SOURCE_DIR} DESTINATION ${artifact_ARTIFACT}/sources) + else() + install(DIRECTORY src/main/native/cpp/ DESTINATION ${artifact_ARTIFACT}/sources) + endif() + + # If there are generated source files, install them + if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/src/generated/main/native/cpp/) + install(DIRECTORY src/generated/main/native/cpp/ DESTINATION ${artifact_ARTIFACT}/sources) + endif() + + if(EXISTS ${CMAKE_CURRENT_BINARY_DIR}/generated/main/cpp/) + install( + DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/generated/main/cpp/ + DESTINATION ${artifact_ARTIFACT}/sources + ) + endif() +endfunction() diff --git a/cmake/modules/FindLIBSSH.cmake b/cmake/modules/FindLIBSSH.cmake index 6578aa99761..23f9e536aea 100644 --- a/cmake/modules/FindLIBSSH.cmake +++ b/cmake/modules/FindLIBSSH.cmake @@ -37,6 +37,52 @@ include(FindPackageHandleStandardArgs) if(LIBSSH_LIBRARIES AND LIBSSH_INCLUDE_DIRS) # in cache already set(LIBSSH_FOUND TRUE) +elseif(BUILD_MAVEN) + include(FetchContent) + include(PlatformVars) + set(base_url + https://frcmaven.wpi.edu/artifactory/release/edu/wpi/first/thirdparty/frc2024/libssh/0.105-1 + ) + set(base_artifact_name libssh-0.105-1) + set(library_artifact ${base_artifact_name}-${platform}${arch}static) + message(STATUS "Downloading and unpacking libssh artifacts.") + fetchcontent_declare(libssh_debug URL ${base_url}/${library_artifact}debug.zip) + fetchcontent_declare(libssh_release URL ${base_url}/${library_artifact}.zip) + fetchcontent_declare(libssh_headers URL ${base_url}/${base_artifact_name}-headers.zip) + fetchcontent_makeavailable(libssh_debug libssh_release libssh_headers) + message(STATUS "Done.") + file( + GLOB debug_lib_location + ${libssh_debug_SOURCE_DIR}/${platform}/${arch}/static/*${CMAKE_STATIC_LIBRARY_SUFFIX} + ) + file( + GLOB release_lib_location + ${libssh_release_SOURCE_DIR}/${platform}/${arch}/static/*${CMAKE_STATIC_LIBRARY_SUFFIX} + ) + add_library(libssh STATIC IMPORTED) + set_target_properties( + libssh + PROPERTIES + IMPORTED_LOCATION_DEBUG ${debug_lib_location} + IMPORTED_LOCATION_RELWITHDEBINFO ${release_lib_location} + ) + target_include_directories(libssh INTERFACE ${libssh_headers_SOURCE_DIR}) + if(MSVC) + target_link_libraries(libssh INTERFACE ws2_32.lib crypt32.lib) + elseif(APPLE) + target_link_options(libssh INTERFACE "SHELL:-framework Kerberos") + endif() + set(LIBSSH_LIBRARIES libssh) + set(LIBSSH_INCLUDE_DIRS ${libssh_headers_SOURCE_DIR}) + set(LIBSSH_VERSION 0.105.1) + mark_as_advanced(LIBSSH_INCLUDE_DIRS LIBSSH_LIBRARIES) + + find_package_handle_standard_args( + LIBSSH + FOUND_VAR LIBSSH_FOUND + REQUIRED_VARS LIBSSH_INCLUDE_DIRS LIBSSH_LIBRARIES + VERSION_VAR LIBSSH_VERSION + ) else() find_path( LIBSSH_INCLUDE_DIR diff --git a/cmake/modules/FindNILibraries.cmake b/cmake/modules/FindNILibraries.cmake new file mode 100644 index 00000000000..fe6071ce639 --- /dev/null +++ b/cmake/modules/FindNILibraries.cmake @@ -0,0 +1,51 @@ +include(FetchContent) +include(PlatformVars) +set(base_url https://frcmaven.wpi.edu/artifactory/release/edu/wpi/first/ni-libraries) +set(version 2024.2.1) +set(libs chipobject netcomm runtime visa) +set(dest ${WPILIB_BINARY_DIR}/ni-libraries) +message(STATUS "Downloading and unpacking NI libraries.") +foreach(lib ${libs}) + set(base_artifact_name ${lib}-${version}) + set(dest ${WPILIB_BINARY_DIR}/ni-libraries/${lib}) + fetchcontent_declare( + ${lib} + URL ${base_url}/${lib}/${version}/${base_artifact_name}-linuxathena.zip + DOWNLOAD_NO_EXTRACT true + ) + if(NOT ${lib} STREQUAL runtime) + fetchcontent_declare( + ${lib}_headers + URL ${base_url}/${lib}/${version}/${base_artifact_name}-headers.zip + DOWNLOAD_NO_EXTRACT true + ) + fetchcontent_makeavailable(${lib}_headers) + file( + ARCHIVE_EXTRACT + INPUT ${${lib}_headers_SOURCE_DIR}/${base_artifact_name}-headers.zip + DESTINATION ${dest}/include + ) + endif() + fetchcontent_makeavailable(${lib}) + file( + ARCHIVE_EXTRACT + INPUT ${${lib}_SOURCE_DIR}/${base_artifact_name}-linuxathena.zip + DESTINATION ${dest} + ) + + file(GLOB ni_libs ${dest}/linux/athena/shared/*) + foreach(ni_lib ${ni_libs}) + cmake_path(GET ni_lib STEM lib_name) + add_library(${lib_name} SHARED IMPORTED) + if(NOT ${lib} STREQUAL runtime) + target_include_directories(${lib_name} INTERFACE ${dest}/include) + endif() + set_target_properties( + ${lib_name} + PROPERTIES IMPORTED_LOCATION_DEBUG ${ni_lib} IMPORTED_LOCATION_RELWITHDEBINFO ${ni_lib} + ) + list(APPEND NI_LIBRARIES ${lib_name}) + endforeach() +endforeach() +message(STATUS "Done.") +set(NILibraries_FOUND true PARENT_SCOPE) diff --git a/cmake/modules/FindOpenCV.cmake b/cmake/modules/FindOpenCV.cmake new file mode 100644 index 00000000000..8a8c632b25d --- /dev/null +++ b/cmake/modules/FindOpenCV.cmake @@ -0,0 +1,95 @@ +if(BUILD_MAVEN) + include(FetchContent) + include(PlatformVars) + set(base_url + https://frcmaven.wpi.edu/artifactory/release/edu/wpi/first/thirdparty/frc2024/opencv + ) + set(base_native_url ${base_url}/opencv-cpp/4.8.0-4) + set(base_artifact_name opencv-cpp-4.8.0-4) + set(library_artifact ${base_artifact_name}-${platform}${arch}) + message(STATUS "Downloading and unpacking OpenCV artifacts.") + + fetchcontent_declare(opencv_debug URL ${base_native_url}/${library_artifact}debug.zip) + fetchcontent_declare(opencv_release URL ${base_native_url}/${library_artifact}.zip) + fetchcontent_declare(opencv_headers URL ${base_native_url}/${base_artifact_name}-headers.zip) + fetchcontent_makeavailable(opencv_debug opencv_release opencv_headers) + + if(MSVC) + file(GLOB_RECURSE opencv_release_libs ${opencv_release_SOURCE_DIR}/*.dll) + file(GLOB_RECURSE opencv_debug_libs ${opencv_debug_SOURCE_DIR}/*.dll) + get_property(isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) + if(isMultiConfig) + file( + COPY ${opencv_release_libs} + DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/RelWithDebInfo + ) + file(COPY ${opencv_debug_libs} DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/Debug) + else() + file(COPY ${opencv_release_libs} DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) + file(COPY ${opencv_debug_libs} DESTINATION ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) + endif() + endif() + message(STATUS "Done.") + set(libs + aruco + calib3d + core + dnn + features2d + flann + gapi + highgui + imgcodecs + imgproc + ml + objdetect + photo + stitching + video + videoio + ) + foreach(lib ${libs}) + add_library(opencv_${lib} SHARED IMPORTED GLOBAL) + set(debug_lib_location ${opencv_debug_SOURCE_DIR}/${platform}/${arch}/shared) + set(release_lib_location ${opencv_release_SOURCE_DIR}/${platform}/${arch}/shared) + target_include_directories(opencv_${lib} INTERFACE ${opencv_headers_SOURCE_DIR}) + if(MSVC) + set_target_properties( + opencv_${lib} + PROPERTIES + IMPORTED_IMPLIB_DEBUG ${debug_lib_location}/opencv_${lib}480d.lib + IMPORTED_IMPLIB_RELWITHDEBINFO ${release_lib_location}/opencv_${lib}480.lib + IMPORTED_LOCATION_DEBUG ${debug_lib_location}/opencv_${lib}480d.dll + IMPORTED_LOCATION_RELWITHDEBINFO ${release_lib_location}/opencv_${lib}480.dll + ) + elseif(APPLE) + set_target_properties( + opencv_${lib} + PROPERTIES + IMPORTED_LOCATION_DEBUG ${debug_lib_location}/libopencv_${lib}d.4.8.dylib + IMPORTED_LOCATION_RELWITHDEBINFO + ${release_lib_location}/libopencv_${lib}.4.8.dylib + ) + else() + set_target_properties( + opencv_${lib} + PROPERTIES + IMPORTED_LOCATION_DEBUG ${debug_lib_location}/libopencv_${lib}d.so.4.8 + IMPORTED_LOCATION_RELWITHDEBINFO ${release_lib_location}/libopencv_${lib}.so.4.8 + ) + endif() + list(APPEND OpenCV_LIBS opencv_${lib}) + endforeach() + if(WITH_JAVA) + fetchcontent_declare( + opencv_jar + URL ${base_url}/opencv-java/4.8.0-4/opencv-java-4.8.0-4.jar + DOWNLOAD_NO_EXTRACT ON + ) + fetchcontent_makeavailable(opencv_jar) + set(OPENCV_JAR_FILE ${opencv_jar_SOURCE_DIR}/opencv-java-4.8.0-4.jar) + endif() + set(OpenCV_FOUND true) +else() + find_package(OpenCV CONFIG REQUIRED) +endif() diff --git a/cmake/modules/PlatformVars.cmake b/cmake/modules/PlatformVars.cmake new file mode 100644 index 00000000000..f625c1bad9e --- /dev/null +++ b/cmake/modules/PlatformVars.cmake @@ -0,0 +1,26 @@ +# This determines the platform paths needed for Maven artifacts +if(MSVC) + set(platform windows) + string(FIND ${CMAKE_CXX_COMPILER} arm64 is_arm64) + if(NOT is_arm64 EQUAL -1) + set(arch arm64) + elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "AMD64") + set(arch x86-64) + else() + set(arch x86) + endif() +elseif(APPLE) + set(platform osx) + set(arch universal) +elseif(LINUX) + set(platform linux) + if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") + set(arch x86-64) + elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64") + set(arch arm64) + elseif(SOFTFP) + set(arch athena) + else() + set(arch arm32) + endif() +endif() diff --git a/cmake/toolchains/aarch64-bullseye-gnu.toolchain.cmake b/cmake/toolchains/aarch64-bullseye-gnu.toolchain.cmake new file mode 100644 index 00000000000..e02acfd79e2 --- /dev/null +++ b/cmake/toolchains/aarch64-bullseye-gnu.toolchain.cmake @@ -0,0 +1,5 @@ +set(CMAKE_SYSTEM_PROCESSOR aarch64) +set(GCC_COMPILER_VERSION "" CACHE STRING "GCC Compiler version") +set(GNU_MACHINE "aarch64-bullseye-linux-gnu" CACHE STRING "GNU compiler triple") +set(ARM_LINUX_SYSROOT /usr/local/aarch64-linux-gnu/sysroot) +include("${CMAKE_CURRENT_LIST_DIR}/arm.toolchain.cmake") diff --git a/cmake/toolchains/arm-frc-gnueabi.toolchain.cmake b/cmake/toolchains/arm-frc-gnueabi.toolchain.cmake index 7e344ad9d30..fe6defd180a 100644 --- a/cmake/toolchains/arm-frc-gnueabi.toolchain.cmake +++ b/cmake/toolchains/arm-frc-gnueabi.toolchain.cmake @@ -1,4 +1,5 @@ set(GCC_COMPILER_VERSION "" CACHE STRING "GCC Compiler version") -set(GNU_MACHINE "arm-frc2022-linux-gnueabi" CACHE STRING "GNU compiler triple") +set(GNU_MACHINE "arm-frc2024-linux-gnueabi" CACHE STRING "GNU compiler triple") set(SOFTFP yes) +set(ARM_LINUX_SYSROOT /usr/local/arm-nilrt-linux-gnueabi/sysroot) include("${CMAKE_CURRENT_LIST_DIR}/arm.toolchain.cmake") diff --git a/cmake/toolchains/arm-pi-gnueabihf.toolchain.cmake b/cmake/toolchains/arm-pi-gnueabihf.toolchain.cmake index abb8027ebb0..d002151b349 100644 --- a/cmake/toolchains/arm-pi-gnueabihf.toolchain.cmake +++ b/cmake/toolchains/arm-pi-gnueabihf.toolchain.cmake @@ -1,5 +1,6 @@ set(GCC_COMPILER_VERSION "" CACHE STRING "GCC Compiler version") -set(GNU_MACHINE "arm-raspbian10-linux-gnueabi" CACHE STRING "GNU compiler triple") +set(GNU_MACHINE "armv6-bullseye-linux-gnueabi" CACHE STRING "GNU compiler triple") +set(ARM_LINUX_SYSROOT /usr/local/arm-linux-gnueabihf/sysroot) if(COMMAND toolchain_save_config) return() # prevent recursive call @@ -13,7 +14,7 @@ else() #message("CMAKE_SYSTEM_PROCESSOR=${CMAKE_SYSTEM_PROCESSOR}") endif() -include("${CMAKE_CURRENT_LIST_DIR}/opencv/platforms/linux/gnu.toolchain.cmake") +include("${CMAKE_CURRENT_LIST_DIR}/gnu.toolchain.cmake") if(CMAKE_SYSTEM_PROCESSOR STREQUAL arm AND NOT ARM_IGNORE_FP) set(FLOAT_ABI_SUFFIX "") @@ -48,7 +49,7 @@ else() endif() if(NOT DEFINED ARM_LINUX_SYSROOT AND DEFINED GNU_MACHINE) - set(ARM_LINUX_SYSROOT /usr/${GNU_MACHINE}${FLOAT_ABI_SUFFIX}) + set(ARM_LINUX_SYSROOT /usr/local/sys-root) endif() if(NOT DEFINED CMAKE_CXX_FLAGS) diff --git a/cscore/CMakeLists.txt b/cscore/CMakeLists.txt index 3e96d427190..152e2001e18 100644 --- a/cscore/CMakeLists.txt +++ b/cscore/CMakeLists.txt @@ -4,6 +4,9 @@ include(SubDirList) include(CompileWarnings) include(AddTest) include(LinkMacOSGUI) +if(BUILD_MAVEN) + include(BuildMaven) +endif() file(GLOB cscore_native_src src/main/native/cpp/*.cpp) file(GLOB cscore_linux_src src/main/native/linux/*.cpp) @@ -31,25 +34,36 @@ else() target_sources(cscore PRIVATE ${cscore_linux_src}) endif() -target_include_directories( - cscore - PUBLIC - $ - $ - PRIVATE src/main/native/cpp -) wpilib_target_warnings(cscore) target_link_libraries(cscore PUBLIC wpinet wpiutil ${OpenCV_LIBS}) set_property(TARGET cscore PROPERTY FOLDER "libraries") -install(TARGETS cscore EXPORT cscore) -export(TARGETS cscore FILE cscore.cmake NAMESPACE cscore::) -install(DIRECTORY src/main/native/include/ DESTINATION "${include_dest}/cscore") - configure_file(cscore-config.cmake.in ${WPILIB_BINARY_DIR}/cscore-config.cmake) -install(FILES ${WPILIB_BINARY_DIR}/cscore-config.cmake DESTINATION share/cscore) -install(EXPORT cscore DESTINATION share/cscore) +if(BUILD_MAVEN) + config_maven_build( + cscore + GROUP edu.wpi.first.cscore + ARTIFACT cscore-cpp + CONFIG_FILE cscore-config.cmake + ) + set(header_dest cscore-cpp/include) +else() + install(TARGETS cscore EXPORT cscore) + export(TARGETS cscore FILE cscore.cmake NAMESPACE cscore::) + install(FILES ${WPILIB_BINARY_DIR}/cscore-config.cmake DESTINATION share/cscore) + install(EXPORT cscore DESTINATION share/cscore) + set(header_dest ${include_dest}/cscore) +endif() + +install(DIRECTORY src/main/native/include/ DESTINATION ${header_dest}) +target_include_directories( + cscore + PUBLIC + $ + $ + PRIVATE src/main/native/cpp +) subdir_list(cscore_examples "${CMAKE_CURRENT_SOURCE_DIR}/examples") foreach(example ${cscore_examples}) @@ -123,8 +137,16 @@ if(WITH_JAVA) target_link_libraries(cscorejni PRIVATE cscore_jni_headers) add_dependencies(cscorejni cscore_jar) - install(TARGETS cscorejni EXPORT cscorejni) - export(TARGETS cscorejni FILE cscorejni.cmake NAMESPACE cscorejni::) + if(BUILD_MAVEN) + config_maven_build(cscorejni GROUP edu.wpi.first.cscore ARTIFACT cscore-cpp) + install( + DIRECTORY $/ + DESTINATION cscore-cpp/sources/jni + ) + else() + install(TARGETS cscorejni EXPORT cscorejni) + export(TARGETS cscorejni FILE cscorejni.cmake NAMESPACE cscorejni::) + endif() endif() if(WITH_JAVA_SOURCE) diff --git a/datalogtool/CMakeLists.txt b/datalogtool/CMakeLists.txt index 00b760e14a9..fa4f8203c06 100644 --- a/datalogtool/CMakeLists.txt +++ b/datalogtool/CMakeLists.txt @@ -3,6 +3,9 @@ project(datalogtool) include(CompileWarnings) include(GenResources) include(LinkMacOSGUI) +if(BUILD_MAVEN) + include(BuildMaven) +endif() configure_file(src/main/generate/WPILibVersion.cpp.in WPILibVersion.cpp) generate_resources(src/main/native/resources generated/main/cpp DLT dlt datalogtool_resources_src) @@ -33,3 +36,8 @@ if(WIN32) elseif(APPLE) set_target_properties(datalogtool PROPERTIES MACOSX_BUNDLE YES OUTPUT_NAME "datalogTool") endif() + +if(BUILD_MAVEN) + target_compile_definitions(datalogtool PRIVATE LIBSSH_STATIC) + config_maven_build(datalogtool GROUP edu.wpi.first.tools ARTIFACT DataLogTool) +endif() diff --git a/fieldImages/CMakeLists.txt b/fieldImages/CMakeLists.txt index 93f8e13695f..c2e3ddae058 100644 --- a/fieldImages/CMakeLists.txt +++ b/fieldImages/CMakeLists.txt @@ -2,6 +2,9 @@ project(fieldImages) include(CompileWarnings) include(GenResources) +if(BUILD_MAVEN) + include(BuildMaven) +endif() if(WITH_JAVA) include(UseJava) @@ -52,17 +55,26 @@ if(MSVC) endif() wpilib_target_warnings(fieldImages) -install(DIRECTORY src/main/native/include/ DESTINATION "${include_dest}/fieldImages") +configure_file(fieldimages-config.cmake.in ${WPILIB_BINARY_DIR}/fieldimages-config.cmake) +if(BUILD_MAVEN) + config_maven_build( + fieldImages + GROUP edu.wpi.first.fieldImages + ARTIFACT fieldImages-cpp + CONFIG_FILE fieldimages-config.cmake + ) + set(header_dest fieldImages-cpp/include) +else() + install(TARGETS fieldImages EXPORT fieldimages) + export(TARGETS fieldImages FILE fieldimages.cmake NAMESPACE fieldimages::) + install(FILES ${WPILIB_BINARY_DIR}/fieldimages-config.cmake DESTINATION share/fieldImages) + install(EXPORT fieldimages DESTINATION share/fieldImages) + set(header_dest ${include_dest}/fieldImages) +endif() +install(DIRECTORY src/main/native/include/ DESTINATION ${header_dest}) target_include_directories( fieldImages PUBLIC $ - $ + $ ) - -install(TARGETS fieldImages EXPORT fieldimages) -export(TARGETS fieldImages FILE fieldimages.cmake NAMESPACE fieldimages::) - -configure_file(fieldimages-config.cmake.in ${WPILIB_BINARY_DIR}/fieldimages-config.cmake) -install(FILES ${WPILIB_BINARY_DIR}/fieldimages-config.cmake DESTINATION share/fieldImages) -install(EXPORT fieldimages DESTINATION share/fieldImages) diff --git a/glass/CMakeLists.txt b/glass/CMakeLists.txt index 1fe76a4ce14..42b69926b6b 100644 --- a/glass/CMakeLists.txt +++ b/glass/CMakeLists.txt @@ -3,6 +3,9 @@ project(glass) include(CompileWarnings) include(GenResources) include(LinkMacOSGUI) +if(BUILD_MAVEN) + include(BuildMaven) +endif() # # libglass @@ -21,17 +24,28 @@ set_property(TARGET libglass PROPERTY FOLDER "libraries") wpilib_target_warnings(libglass) target_link_libraries(libglass PUBLIC wpigui wpimath wpiutil fieldImages) +if(BUILD_MAVEN) + config_maven_build( + libglass + GROUP edu.wpi.first.glass + ARTIFACT libglass + SOURCE_DIR src/lib/native/cpp + ) + set(header_dest libglass/include) +else() + install(TARGETS libglass EXPORT libglass) + export(TARGETS libglass FILE libglass.cmake NAMESPACE libglass::) + set(header_dest ${include_dest}/glass) +endif() + +install(DIRECTORY src/lib/native/include/ DESTINATION ${header_dest}) target_include_directories( libglass PUBLIC $ - $ + $ ) -install(TARGETS libglass EXPORT libglass) -export(TARGETS libglass FILE libglass.cmake NAMESPACE libglass::) -install(DIRECTORY src/lib/native/include/ DESTINATION "${include_dest}/glass") - # # libglassnt # @@ -48,17 +62,28 @@ set_property(TARGET libglassnt PROPERTY FOLDER "libraries") wpilib_target_warnings(libglassnt) target_link_libraries(libglassnt PUBLIC ntcore libglass) +if(BUILD_MAVEN) + config_maven_build( + libglassnt + GROUP edu.wpi.first.glass + ARTIFACT libglassnt + SOURCE_DIR src/libnt/native/cpp + ) + set(header_dest libglassnt/include) +else() + install(TARGETS libglassnt EXPORT libglassnt) + export(TARGETS libglassnt FILE libglassnt.cmake NAMESPACE libglassnt::) + set(header_dest ${include_dest}/glass) +endif() + +install(DIRECTORY src/libnt/native/include/ DESTINATION ${header_dest}) target_include_directories( libglassnt PUBLIC $ - $ + $ ) -install(TARGETS libglassnt EXPORT libglassnt) -export(TARGETS libglassnt FILE libglassnt.cmake NAMESPACE libglassnt::) -install(DIRECTORY src/libnt/native/include/ DESTINATION "${include_dest}/glass") - # # glass application # @@ -86,3 +111,7 @@ if(WIN32) elseif(APPLE) set_target_properties(glass PROPERTIES MACOSX_BUNDLE YES OUTPUT_NAME "Glass") endif() + +if(BUILD_MAVEN) + config_maven_build(glass GROUP edu.wpi.first.tools ARTIFACT Glass) +endif() diff --git a/hal/CMakeLists.txt b/hal/CMakeLists.txt index ebcd1d6e480..14caff6abad 100644 --- a/hal/CMakeLists.txt +++ b/hal/CMakeLists.txt @@ -2,6 +2,9 @@ project(hal) include(CompileWarnings) include(AddTest) +if(BUILD_MAVEN) + include(BuildMaven) +endif() file( GLOB hal_shared_native_src @@ -10,30 +13,46 @@ file( src/main/native/cpp/handles/*.cpp ) file(GLOB_RECURSE hal_sim_native_src src/main/native/sim/*.cpp) -add_library(hal ${hal_shared_native_src} ${hal_sim_native_src}) +file(GLOB_RECURSE hal_athena_native_src src/main/native/athena/*.cpp) +add_library(hal ${hal_shared_native_src}) wpilib_target_warnings(hal) set_target_properties(hal PROPERTIES DEBUG_POSTFIX "d") set_target_properties(hal PROPERTIES OUTPUT_NAME "wpiHal") +target_link_libraries(hal PUBLIC wpiutil) + +set_property(TARGET hal PROPERTY FOLDER "libraries") + +configure_file(hal-config.cmake.in ${WPILIB_BINARY_DIR}/hal-config.cmake) + +if(BUILD_MAVEN) + if(${arch} STREQUAL athena) + find_package(NILibraries REQUIRED) + target_sources(hal PRIVATE ${hal_athena_native_src}) + target_link_libraries(hal PUBLIC ${NI_LIBRARIES}) + else() + target_sources(hal PRIVATE ${hal_sim_native_src}) + endif() + config_maven_build(hal GROUP edu.wpi.first.hal ARTIFACT hal-cpp CONFIG_FILE hal-config.cmake) + set(header_dest hal-cpp/include) +else() + target_sources(hal PRIVATE ${hal_sim_native_src}) + install(TARGETS hal EXPORT hal) + export(TARGETS hal FILE hal.cmake NAMESPACE hal::) + install(FILES ${WPILIB_BINARY_DIR}/hal-config.cmake DESTINATION share/hal) + install(EXPORT hal DESTINATION share/hal) + set(header_dest ${include_dest}/hal) +endif() + +install(DIRECTORY src/main/native/include/ DESTINATION ${header_dest}) +install(DIRECTORY src/generated/main/native/include/ DESTINATION ${header_dest}) target_include_directories( hal PUBLIC $ $ - $ + $ ) -target_link_libraries(hal PUBLIC wpiutil) - -set_property(TARGET hal PROPERTY FOLDER "libraries") - -install(TARGETS hal EXPORT hal) -export(TARGETS hal FILE hal.cmake NAMESPACE hal::) -install(DIRECTORY src/main/native/include/ DESTINATION "${include_dest}/hal") -install(DIRECTORY src/generated/main/native/include/ DESTINATION "${include_dest}/hal") - -configure_file(hal-config.cmake.in ${WPILIB_BINARY_DIR}/hal-config.cmake) -install(FILES ${WPILIB_BINARY_DIR}/hal-config.cmake DESTINATION share/hal) -install(EXPORT hal DESTINATION share/hal) # Java bindings if(WITH_JAVA) @@ -68,8 +87,16 @@ if(WITH_JAVA) target_link_libraries(haljni PRIVATE hal_jni_headers) add_dependencies(haljni hal_jar) - install(TARGETS haljni EXPORT haljni) - export(TARGETS haljni FILE haljni.cmake NAMESPACE haljni::) + if(BUILD_MAVEN) + config_maven_build(haljni GROUP edu.wpi.first.hal ARTIFACT hal-cpp) + install( + DIRECTORY $/ + DESTINATION hal-cpp/sources/jni + ) + else() + install(TARGETS haljni EXPORT haljni) + export(TARGETS haljni FILE haljni.cmake NAMESPACE haljni::) + endif() endif() if(WITH_JAVA_SOURCE) diff --git a/library_packager.py b/library_packager.py new file mode 100644 index 00000000000..a410bf58417 --- /dev/null +++ b/library_packager.py @@ -0,0 +1,127 @@ +import argparse +import glob +import os +import subprocess +import sys +import zipfile +from pathlib import Path + + +def main(argv): + repo_root = Path(__file__).resolve().parent + parser = argparse.ArgumentParser() + parser.add_argument( + "--install_directory", + help="Required.", + required=True, + type=Path, + ) + subparsers = parser.add_subparsers(dest="subcommand", required=True) + subparsers.add_parser( + "package", help="Packages all the files in the install directory." + ) + sign_parser = subparsers.add_parser("sign", help="Signs macOS apps.") + sign_parser.add_argument( + "--developer_id", + help="The Apple Developer ID used to sign macOS apps.", + required=True, + type=str, + ) + + args = parser.parse_args(argv) + install_dir: Path = args.install_directory + if args.subcommand == "package": + package_artifacts(install_dir, repo_root) + elif args.subcommand == "sign": + sign_apps(args.developer_id) + + +def sign_apps(developer_id: str): + apps = glob.glob("**/*.app", recursive=True) + glob.glob( + "**/*.dylib", recursive=True + ) + for app in apps: + subprocess.run( + [ + "codesign", + "--force", + "--strict", + "--timestamp", + "--options=runtime", + "--verbose", + "-s", + developer_id, + app, + ] + ) + + +def package_artifacts(install_dir: Path, repo_root: Path): + out = subprocess.run(["git", "describe"], capture_output=True, text=True) + print("git:") + print(out.stdout) + version = out.stdout[1:].strip() + + directories = glob.glob("*", root_dir=install_dir) + for dir in directories: + if dir in ["java", "bin", "lib", "share"] or "zip" in dir: + continue + os.chdir(install_dir / dir) + with open("group_info.txt") as f: + group = f.read() + files = glob.glob("**", recursive=True) + + # Identify how these libraries were built + debug_or_not = "" + static_or_not = "" + platform = "" + arch = "" + for file in files: + if "include" in file or "sources" in file: + continue + if "debug" in file: + debug_or_not = "debug" + if "static" in file: + static_or_not = "static" + # We need a complete platform path to calculate OS and arch + if len(platform_parts := file.replace("\\", "/").split("/")) >= 3: + platform = platform_parts[0] + arch = platform_parts[1] + artifact_name = ( + f"_GROUP_{group}_ID_{dir}_CLS_{platform}{arch}{static_or_not}{debug_or_not}" + ) + + with zipfile.ZipFile(install_dir / f"{artifact_name}.zip", "w") as archive: + for file in files: + if file == "group_info.txt" or "include" in file or "sources" in file: + continue + archive.write(file) + archive.write(repo_root / "ThirdPartyNotices.txt", "ThirdPartyNotices.txt") + archive.write(repo_root / "LICENSE.md", "LICENSE.md") + + if os.path.exists(install_dir / dir / "include"): + create_archive(repo_root, install_dir, "include", dir, "headers", group) + if os.path.exists(install_dir / dir / "sources"): + create_archive(repo_root, install_dir, "sources", dir, "sources", group) + + +def create_archive( + repo_root: Path, + install_dir: Path, + directory: str, + artifact_id: str, + classifier: str, + group: str, +): + os.chdir(install_dir / artifact_id / directory) + files = glob.glob("**", recursive=True) + artifact_name = f"_GROUP_{group}_ID_{artifact_id}_CLS_{classifier}" + with zipfile.ZipFile(install_dir / f"{artifact_name}.zip", "w") as archive: + for file in files: + archive.write(file) + archive.write(repo_root / "ThirdPartyNotices.txt", "ThirdPartyNotices.txt") + archive.write(repo_root / "LICENSE.md", "LICENSE.md") + + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/ntcore/CMakeLists.txt b/ntcore/CMakeLists.txt index 94bfbe95b8f..b51767648e6 100644 --- a/ntcore/CMakeLists.txt +++ b/ntcore/CMakeLists.txt @@ -2,6 +2,9 @@ project(ntcore) include(CompileWarnings) include(AddTest) +if(BUILD_MAVEN) + include(BuildMaven) +endif() file( GLOB ntcore_native_src @@ -14,28 +17,39 @@ file( ) add_library(ntcore ${ntcore_native_src}) set_target_properties(ntcore PROPERTIES DEBUG_POSTFIX "d") -target_include_directories( - ntcore - PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/main/native/cpp - PUBLIC - $ - $ - $ -) wpilib_target_warnings(ntcore) target_compile_features(ntcore PUBLIC cxx_std_20) target_link_libraries(ntcore PUBLIC wpinet wpiutil) set_property(TARGET ntcore PROPERTY FOLDER "libraries") -install(TARGETS ntcore EXPORT ntcore) -export(TARGETS ntcore FILE ntcore.cmake NAMESPACE ntcore::) -install(DIRECTORY src/main/native/include/ DESTINATION "${include_dest}/ntcore") -install(DIRECTORY src/generated/main/native/include/ DESTINATION "${include_dest}/ntcore") - configure_file(ntcore-config.cmake.in ${WPILIB_BINARY_DIR}/ntcore-config.cmake) -install(FILES ${WPILIB_BINARY_DIR}/ntcore-config.cmake DESTINATION share/ntcore) -install(EXPORT ntcore DESTINATION share/ntcore) +if(BUILD_MAVEN) + config_maven_build( + ntcore + GROUP edu.wpi.first.ntcore + ARTIFACT ntcore-cpp + CONFIG_FILE ntcore-config.cmake + ) + set(header_dest ntcore-cpp/include) +else() + install(TARGETS ntcore EXPORT ntcore) + export(TARGETS ntcore FILE ntcore.cmake NAMESPACE ntcore::) + install(FILES ${WPILIB_BINARY_DIR}/ntcore-config.cmake DESTINATION share/ntcore) + install(EXPORT ntcore DESTINATION share/ntcore) + set(header_dest ${include_dest}/ntcore) +endif() + +install(DIRECTORY src/main/native/include/ DESTINATION ${header_dest}) +install(DIRECTORY src/generated/main/native/include/ DESTINATION ${header_dest}) +target_include_directories( + ntcore + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/src/main/native/cpp + PUBLIC + $ + $ + $ +) # Java bindings if(WITH_JAVA) @@ -70,8 +84,16 @@ if(WITH_JAVA) target_link_libraries(ntcorejni PRIVATE ntcore_jni_headers) add_dependencies(ntcorejni ntcore_jar) - install(TARGETS ntcorejni EXPORT ntcorejni) - export(TARGETS ntcorejni FILE ntcorejni.cmake NAMESPACE ntcorejni::) + if(BUILD_MAVEN) + config_maven_build(ntcorejni GROUP edu.wpi.first.ntcore ARTIFACT ntcore-cpp) + install( + DIRECTORY $/ + DESTINATION ntcore-cpp/sources/jni + ) + else() + install(TARGETS ntcorejni EXPORT ntcorejni) + export(TARGETS ntcorejni FILE ntcorejni.cmake NAMESPACE ntcorejni::) + endif() endif() if(WITH_JAVA_SOURCE) diff --git a/outlineviewer/CMakeLists.txt b/outlineviewer/CMakeLists.txt index eb22df8597e..700c93a8f90 100644 --- a/outlineviewer/CMakeLists.txt +++ b/outlineviewer/CMakeLists.txt @@ -3,6 +3,9 @@ project(outlineviewer) include(CompileWarnings) include(GenResources) include(LinkMacOSGUI) +if(BUILD_MAVEN) + include(BuildMaven) +endif() configure_file(src/main/generate/WPILibVersion.cpp.in WPILibVersion.cpp) generate_resources(src/main/native/resources generated/main/cpp OV ov outlineviewer_resources_src) @@ -33,3 +36,7 @@ if(WIN32) elseif(APPLE) set_target_properties(outlineviewer PROPERTIES MACOSX_BUNDLE YES OUTPUT_NAME "OutlineViewer") endif() + +if(BUILD_MAVEN) + config_maven_build(outlineviewer GROUP edu.wpi.first.tools ARTIFACT OutlineViewer) +endif() diff --git a/roborioteamnumbersetter/CMakeLists.txt b/roborioteamnumbersetter/CMakeLists.txt index 7a43baaed9d..273df5344f3 100644 --- a/roborioteamnumbersetter/CMakeLists.txt +++ b/roborioteamnumbersetter/CMakeLists.txt @@ -3,6 +3,9 @@ project(roborioteamnumbersetter) include(CompileWarnings) include(GenResources) include(LinkMacOSGUI) +if(BUILD_MAVEN) + include(BuildMaven) +endif() configure_file(src/main/generate/WPILibVersion.cpp.in WPILibVersion.cpp) generate_resources(src/main/native/resources generated/main/cpp RTNS rtns rtns_resources_src) @@ -36,3 +39,12 @@ elseif(APPLE) PROPERTIES MACOSX_BUNDLE YES OUTPUT_NAME "roborioTeamNumberSetter" ) endif() + +if(BUILD_MAVEN) + target_compile_definitions(roborioteamnumbersetter PRIVATE LIBSSH_STATIC) + config_maven_build( + roborioteamnumbersetter + GROUP edu.wpi.first.tools + ARTIFACT roboRIOTeamNumberSetter + ) +endif() diff --git a/romiVendordep/CMakeLists.txt b/romiVendordep/CMakeLists.txt index 600a0e44840..a95865bfaaf 100644 --- a/romiVendordep/CMakeLists.txt +++ b/romiVendordep/CMakeLists.txt @@ -3,6 +3,9 @@ project(romiVendordep) include(SubDirList) include(CompileWarnings) include(AddTest) +if(BUILD_MAVEN) + include(BuildMaven) +endif() if(WITH_JAVA) include(UseJava) @@ -56,21 +59,31 @@ target_compile_features(romiVendordep PUBLIC cxx_std_20) wpilib_target_warnings(romiVendordep) target_link_libraries(romiVendordep wpilibc) +configure_file(romivendordep-config.cmake.in ${WPILIB_BINARY_DIR}/romivendordep-config.cmake) +if(BUILD_MAVEN) + config_maven_build( + romiVendordep + GROUP edu.wpi.first.romiVendordep + ARTIFACT romiVendordep-cpp + CONFIG_FILE romivendordep-config.cmake + ) + set(header_dest romiVendordep-cpp/include) +else() + install(TARGETS romiVendordep EXPORT romivendordep) + export(TARGETS romiVendordep FILE romivendordep.cmake NAMESPACE romivendordep::) + install(FILES ${WPILIB_BINARY_DIR}/romivendordep-config.cmake DESTINATION share/romiVendordep) + install(EXPORT romivendordep DESTINATION share/romiVendordep) + set(header_dest ${include_dest}/romiVendordep) +endif() + +install(DIRECTORY src/main/native/include/ DESTINATION ${header_dest}) target_include_directories( romiVendordep PUBLIC $ - $ + $ ) -install(TARGETS romiVendordep EXPORT romivendordep) -export(TARGETS romiVendordep FILE romivendordep.cmake NAMESPACE romivendordep::) -install(DIRECTORY src/main/native/include/ DESTINATION "${include_dest}/romiVendordep") - -configure_file(romivendordep-config.cmake.in ${WPILIB_BINARY_DIR}/romivendordep-config.cmake) -install(FILES ${WPILIB_BINARY_DIR}/romivendordep-config.cmake DESTINATION share/romiVendordep) -install(EXPORT romivendordep DESTINATION share/romiVendordep) - if(WITH_TESTS) wpilib_add_test(romiVendordep src/test/native/cpp) target_include_directories(romiVendordep_test PRIVATE src/test/native/include) diff --git a/simulation/halsim_ds_socket/CMakeLists.txt b/simulation/halsim_ds_socket/CMakeLists.txt index c549bd3195e..c142142de5c 100644 --- a/simulation/halsim_ds_socket/CMakeLists.txt +++ b/simulation/halsim_ds_socket/CMakeLists.txt @@ -13,5 +13,10 @@ target_include_directories(halsim_ds_socket PRIVATE src/main/native/include) set_property(TARGET halsim_ds_socket PROPERTY FOLDER "libraries") -install(TARGETS halsim_ds_socket EXPORT halsim_ds_socket) -export(TARGETS halsim_ds_socket FILE halsim_ds_socket.cmake NAMESPACE halsim_ds_socket::) +if(BUILD_MAVEN) + config_maven_build(halsim_ds_socket GROUP edu.wpi.first.halsim ARTIFACT halsim_ds_socket) + install(DIRECTORY src/main/native/include/ DESTINATION halsim_ds_socket/include) +else() + install(TARGETS halsim_ds_socket EXPORT halsim_ds_socket) + export(TARGETS halsim_ds_socket FILE halsim_ds_socket.cmake NAMESPACE halsim_ds_socket::) +endif() diff --git a/simulation/halsim_gui/CMakeLists.txt b/simulation/halsim_gui/CMakeLists.txt index 81d57d200f8..c376cd74cd7 100644 --- a/simulation/halsim_gui/CMakeLists.txt +++ b/simulation/halsim_gui/CMakeLists.txt @@ -16,5 +16,10 @@ target_include_directories(halsim_gui PRIVATE src/main/native/include) set_property(TARGET halsim_gui PROPERTY FOLDER "libraries") -install(TARGETS halsim_gui EXPORT halsim_gui) -export(TARGETS halsim_gui FILE halsim_gui.cmake NAMESPACE halsim_gui::) +if(BUILD_MAVEN) + config_maven_build(halsim_gui GROUP edu.wpi.first.halsim ARTIFACT halsim_gui) + install(DIRECTORY src/main/native/include/ DESTINATION halsim_gui/include) +else() + install(TARGETS halsim_gui EXPORT halsim_gui) + export(TARGETS halsim_gui FILE halsim_gui.cmake NAMESPACE halsim_gui::) +endif() diff --git a/simulation/halsim_ws_client/CMakeLists.txt b/simulation/halsim_ws_client/CMakeLists.txt index 90de8110ea1..0c4aa7f3622 100644 --- a/simulation/halsim_ws_client/CMakeLists.txt +++ b/simulation/halsim_ws_client/CMakeLists.txt @@ -13,5 +13,10 @@ target_include_directories(halsim_ws_client PRIVATE src/main/native/include) set_property(TARGET halsim_ws_client PROPERTY FOLDER "libraries") -install(TARGETS halsim_ws_client EXPORT halsim_ws_client) -export(TARGETS halsim_ws_client FILE halsim_ws_client.cmake NAMESPACE halsim_ws_client::) +if(BUILD_MAVEN) + config_maven_build(halsim_ws_client GROUP edu.wpi.first.halsim ARTIFACT halsim_ws_client) + install(DIRECTORY src/main/native/include/ DESTINATION halsim_ws_client/include) +else() + install(TARGETS halsim_ws_client EXPORT halsim_ws_client) + export(TARGETS halsim_ws_client FILE halsim_ws_client.cmake NAMESPACE halsim_ws_client::) +endif() diff --git a/simulation/halsim_ws_core/CMakeLists.txt b/simulation/halsim_ws_core/CMakeLists.txt index 5dbcae2671e..e8810705987 100644 --- a/simulation/halsim_ws_core/CMakeLists.txt +++ b/simulation/halsim_ws_core/CMakeLists.txt @@ -13,5 +13,10 @@ target_include_directories(halsim_ws_core PUBLIC src/main/native/include) set_property(TARGET halsim_ws_core PROPERTY FOLDER "libraries") -install(TARGETS halsim_ws_core EXPORT halsim_ws_core) -export(TARGETS halsim_ws_core FILE halsim_ws_core.cmake NAMESPACE halsim_ws_core::) +if(BUILD_MAVEN) + config_maven_build(halsim_ws_core GROUP edu.wpi.first.halsim ARTIFACT halsim_ws_core) + install(DIRECTORY src/main/native/include/ DESTINATION halsim_ws_core/include) +else() + install(TARGETS halsim_ws_core EXPORT halsim_ws_core) + export(TARGETS halsim_ws_core FILE halsim_ws_core.cmake NAMESPACE halsim_ws_core::) +endif() diff --git a/simulation/halsim_ws_server/CMakeLists.txt b/simulation/halsim_ws_server/CMakeLists.txt index 8c275599d42..24bb80260f4 100644 --- a/simulation/halsim_ws_server/CMakeLists.txt +++ b/simulation/halsim_ws_server/CMakeLists.txt @@ -13,5 +13,10 @@ target_include_directories(halsim_ws_server PRIVATE src/main/native/include) set_property(TARGET halsim_ws_server PROPERTY FOLDER "libraries") -install(TARGETS halsim_ws_server EXPORT halsim_ws_server) -export(TARGETS halsim_ws_server FILE halsim_ws_server.cmake NAMESPACE halsim_ws_server::) +if(BUILD_MAVEN) + config_maven_build(halsim_ws_server GROUP edu.wpi.first.halsim ARTIFACT halsim_ws_server) + install(DIRECTORY src/main/native/include/ DESTINATION halsim_ws_server/include) +else() + install(TARGETS halsim_ws_server EXPORT halsim_ws_server) + export(TARGETS halsim_ws_server FILE halsim_ws_server.cmake NAMESPACE halsim_ws_server::) +endif() diff --git a/simulation/halsim_xrp/CMakeLists.txt b/simulation/halsim_xrp/CMakeLists.txt index 71f8c53ecfe..3301adaaca8 100644 --- a/simulation/halsim_xrp/CMakeLists.txt +++ b/simulation/halsim_xrp/CMakeLists.txt @@ -13,5 +13,10 @@ target_include_directories(halsim_xrp PRIVATE src/main/native/include) set_property(TARGET halsim_xrp PROPERTY FOLDER "libraries") -install(TARGETS halsim_xrp EXPORT halsim_xrp) -export(TARGETS halsim_xrp FILE halsim_xrp.cmake NAMESPACE halsim_xrp::) +if(BUILD_MAVEN) + config_maven_build(halsim_xrp GROUP edu.wpi.first.halsim ARTIFACT halsim_xrp) + install(DIRECTORY src/main/native/include/ DESTINATION halsim_xrp/include) +else() + install(TARGETS halsim_xrp EXPORT halsim_xrp) + export(TARGETS halsim_xrp FILE halsim_xrp.cmake NAMESPACE halsim_xrp::) +endif() diff --git a/sysid/CMakeLists.txt b/sysid/CMakeLists.txt index cb748071f60..ab572e2f11c 100644 --- a/sysid/CMakeLists.txt +++ b/sysid/CMakeLists.txt @@ -4,6 +4,9 @@ include(CompileWarnings) include(GenResources) include(LinkMacOSGUI) include(AddTest) +if(BUILD_MAVEN) + include(BuildMaven) +endif() configure_file(src/main/generate/WPILibVersion.cpp.in WPILibVersion.cpp) generate_resources(src/main/native/resources generated/main/cpp SYSID sysid sysid_resources_src) @@ -44,3 +47,7 @@ if(WITH_TESTS) target_include_directories(sysid_test PRIVATE src/main/native/cpp src/main/native/include) target_link_libraries(sysid_test wpimath libglassnt libglass googletest) endif() + +if(BUILD_MAVEN) + config_maven_build(sysid GROUP edu.wpi.first.tools ARTIFACT SysId) +endif() diff --git a/wpigui/CMakeLists.txt b/wpigui/CMakeLists.txt index 3dfc71dae5f..fd766d73b5c 100644 --- a/wpigui/CMakeLists.txt +++ b/wpigui/CMakeLists.txt @@ -2,6 +2,9 @@ project(wpigui) include(CompileWarnings) include(LinkMacOSGUI) +if(BUILD_MAVEN) + include(BuildMaven) +endif() file(GLOB wpigui_src src/main/native/cpp/*.cpp) file(GLOB wpigui_windows_src src/main/native/directx11/*.cpp) @@ -16,11 +19,29 @@ set_property(TARGET wpigui PROPERTY FOLDER "libraries") wpilib_target_warnings(wpigui) target_link_libraries(wpigui PUBLIC imgui) +if(BUILD_MAVEN) + config_maven_build( + wpigui + GROUP edu.wpi.first.wpigui + ARTIFACT wpigui-cpp + SOURCE_DIR src/main/native/cpp/ + src/main/native/directx11 + src/main/native/metal/ + src/main/native/opengl3/ + ) + set(header_dest wpigui-cpp/include) +else() + install(TARGETS wpigui EXPORT wpigui) + export(TARGETS wpigui FILE wpigui.cmake NAMESPACE wpigui::) + set(header_dest ${include_dest}/wpigui) +endif() + +install(DIRECTORY src/main/native/include/ DESTINATION ${header_dest}) target_include_directories( wpigui PUBLIC $ - $ + $ ) if(MSVC) @@ -37,7 +58,3 @@ add_executable(wpiguidev src/dev/native/cpp/main.cpp) wpilib_link_macos_gui(wpiguidev) wpilib_target_warnings(wpiguidev) target_link_libraries(wpiguidev wpigui) - -install(TARGETS wpigui EXPORT wpigui) -export(TARGETS wpigui FILE wpigui.cmake NAMESPACE wpigui::) -install(DIRECTORY src/main/native/include/ DESTINATION "${include_dest}/wpigui") diff --git a/wpilibNewCommands/CMakeLists.txt b/wpilibNewCommands/CMakeLists.txt index f7c664802e6..7ae3f6ef81c 100644 --- a/wpilibNewCommands/CMakeLists.txt +++ b/wpilibNewCommands/CMakeLists.txt @@ -3,6 +3,9 @@ project(wpilibNewCommands) include(SubDirList) include(CompileWarnings) include(AddTest) +if(BUILD_MAVEN) + include(BuildMaven) +endif() if(WITH_JAVA) include(UseJava) @@ -64,31 +67,38 @@ target_compile_features(wpilibNewCommands PUBLIC cxx_std_20) wpilib_target_warnings(wpilibNewCommands) target_link_libraries(wpilibNewCommands wpilibc) +configure_file( + wpilibnewcommands-config.cmake.in + ${WPILIB_BINARY_DIR}/wpilibnewcommands-config.cmake +) +if(BUILD_MAVEN) + config_maven_build( + wpilibNewCommands + GROUP edu.wpi.first.wpilibNewCommands + ARTIFACT wpilibNewCommands-cpp + CONFIG_FILE wpilibnewcommands-config.cmake + ) + set(header_dest wpilibNewCommands-cpp/include) +else() + install(TARGETS wpilibNewCommands EXPORT wpilibnewcommands) + export(TARGETS wpilibNewCommands FILE wpilibnewcommands.cmake NAMESPACE wpilibnewcommands::) + install( + FILES ${WPILIB_BINARY_DIR}/wpilibnewcommands-config.cmake + DESTINATION share/wpilibNewCommands + ) + install(EXPORT wpilibnewcommands DESTINATION share/wpilibNewCommands) + set(header_dest ${include_dest}/wpilibNewCommands) +endif() + +install(DIRECTORY src/main/native/include/ DESTINATION ${header_dest}) +install(DIRECTORY src/generated/main/native/include/ DESTINATION ${header_dest}) target_include_directories( wpilibNewCommands PUBLIC $ $ - $ -) - -install(TARGETS wpilibNewCommands EXPORT wpilibnewcommands) -export(TARGETS wpilibNewCommands FILE wpilibnewcommands.cmake NAMESPACE wpilibnewcommands::) -install(DIRECTORY src/main/native/include/ DESTINATION "${include_dest}/wpilibNewCommands") -install( - DIRECTORY src/generated/main/native/include/ - DESTINATION "${include_dest}/wpilibNewCommands" -) - -configure_file( - wpilibnewcommands-config.cmake.in - ${WPILIB_BINARY_DIR}/wpilibnewcommands-config.cmake -) -install( - FILES ${WPILIB_BINARY_DIR}/wpilibnewcommands-config.cmake - DESTINATION share/wpilibNewCommands + $ ) -install(EXPORT wpilibnewcommands DESTINATION share/wpilibNewCommands) if(WITH_TESTS) wpilib_add_test(wpilibNewCommands src/test/native/cpp) diff --git a/wpilibc/CMakeLists.txt b/wpilibc/CMakeLists.txt index ec1016244d4..613fb2c7d3b 100644 --- a/wpilibc/CMakeLists.txt +++ b/wpilibc/CMakeLists.txt @@ -2,6 +2,9 @@ project(wpilibc) include(CompileWarnings) include(AddTest) +if(BUILD_MAVEN) + include(BuildMaven) +endif() configure_file(src/generate/WPILibVersion.cpp.in WPILibVersion.cpp) @@ -14,14 +17,6 @@ file( add_library(wpilibc ${wpilibc_native_src} ${CMAKE_CURRENT_BINARY_DIR}/WPILibVersion.cpp) set_target_properties(wpilibc PROPERTIES DEBUG_POSTFIX "d") - -target_include_directories( - wpilibc - PUBLIC - $ - $ - $ -) wpilib_target_warnings(wpilibc) if(WITH_CSCORE) @@ -39,14 +34,32 @@ target_link_libraries(wpilibc PUBLIC hal ntcore wpimath wpiutil) set_property(TARGET wpilibc PROPERTY FOLDER "libraries") -install(TARGETS wpilibc EXPORT wpilibc) -export(TARGETS wpilibc FILE wpilibc.cmake NAMESPACE wpilibc::) -install(DIRECTORY src/main/native/include/ DESTINATION "${include_dest}/wpilibc") -install(DIRECTORY src/generated/main/native/include/ DESTINATION "${include_dest}/wpilibc") - configure_file(wpilibc-config.cmake.in ${WPILIB_BINARY_DIR}/wpilibc-config.cmake) -install(FILES ${WPILIB_BINARY_DIR}/wpilibc-config.cmake DESTINATION share/wpilibc) -install(EXPORT wpilibc DESTINATION share/wpilibc) +if(BUILD_MAVEN) + config_maven_build( + wpilibc + GROUP edu.wpi.first.wpilibc + ARTIFACT wpilibc-cpp + CONFIG_FILE wpilibc-config.cmake + ) + set(header_dest wpilibc-cpp/include) +else() + install(TARGETS wpilibc EXPORT wpilibc) + export(TARGETS wpilibc FILE wpilibc.cmake NAMESPACE wpilibc::) + install(FILES ${WPILIB_BINARY_DIR}/wpilibc-config.cmake DESTINATION share/wpilibc) + install(EXPORT wpilibc DESTINATION share/wpilibc) + set(header_dest ${include_dest}/wpilibc) +endif() + +install(DIRECTORY src/main/native/include/ DESTINATION ${header_dest}) +install(DIRECTORY src/generated/main/native/include/ DESTINATION ${header_dest}) +target_include_directories( + wpilibc + PUBLIC + $ + $ + $ +) if(WITH_TESTS) wpilib_add_test(wpilibc src/test/native/cpp) diff --git a/wpilibc/src/main/native/cpp/Encoder.cpp b/wpilibc/src/main/native/cpp/Encoder.cpp index 1e15ed87bb6..3d5f86e661a 100644 --- a/wpilibc/src/main/native/cpp/Encoder.cpp +++ b/wpilibc/src/main/native/cpp/Encoder.cpp @@ -15,6 +15,10 @@ #include "frc/DigitalInput.h" #include "frc/Errors.h" +#ifdef __GNUC__ +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif + using namespace frc; Encoder::Encoder(int aChannel, int bChannel, bool reverseDirection, diff --git a/wpimath/CMakeLists.txt b/wpimath/CMakeLists.txt index de2dc48ea7c..fa57bd6810f 100644 --- a/wpimath/CMakeLists.txt +++ b/wpimath/CMakeLists.txt @@ -5,6 +5,9 @@ include(CompileWarnings) include(AddTest) include(DownloadAndCheck) include(WpiProtobuf) +if(BUILD_MAVEN) + include(BuildMaven) +endif() # workaround for makefiles - for some reason parent directories aren't created. file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/protobuf") @@ -94,8 +97,16 @@ if(WITH_JAVA) target_link_libraries(wpimathjni PRIVATE wpimath_jni_headers) add_dependencies(wpimathjni wpimath_jar) - install(TARGETS wpimathjni EXPORT wpimathjni) - export(TARGETS wpimathjni FILE wpimathjni.cmake NAMESPACE wpimathjni::) + if(BUILD_MAVEN) + config_maven_build(wpimathjni GROUP edu.wpi.first.wpimath ARTIFACT wpimath-cpp) + install( + DIRECTORY $/ + DESTINATION wpimath-cpp/sources/jni + ) + else() + install(TARGETS wpimathjni EXPORT wpimathjni) + export(TARGETS wpimathjni FILE wpimathjni.cmake NAMESPACE wpimathjni::) + endif() endif() if(WITH_JAVA_SOURCE) @@ -170,11 +181,25 @@ endif() wpilib_target_warnings(wpimath) target_link_libraries(wpimath wpiutil) -if(NOT USE_SYSTEM_EIGEN) - install( - DIRECTORY src/main/native/thirdparty/eigen/include/ - DESTINATION "${include_dest}/wpimath" +configure_file(wpimath-config.cmake.in ${WPILIB_BINARY_DIR}/wpimath-config.cmake) +if(BUILD_MAVEN) + config_maven_build( + wpimath + GROUP edu.wpi.first.wpimath + ARTIFACT wpimath-cpp + CONFIG_FILE wpimath-config.cmake ) + set(header_dest wpimath-cpp/include) +else() + install(TARGETS wpimath EXPORT wpimath) + export(TARGETS wpimath FILE wpimath.cmake NAMESPACE wpimath::) + install(FILES ${WPILIB_BINARY_DIR}/wpimath-config.cmake DESTINATION share/wpimath) + install(EXPORT wpimath DESTINATION share/wpimath) + set(header_dest ${include_dest}/wpimath) +endif() + +if(NOT USE_SYSTEM_EIGEN) + install(DIRECTORY src/main/native/thirdparty/eigen/include/ DESTINATION ${header_dest}) target_include_directories( wpimath SYSTEM @@ -188,7 +213,7 @@ endif() install( DIRECTORY src/main/native/thirdparty/gcem/include/ src/main/native/thirdparty/sleipnir/include/ - DESTINATION "${include_dest}/wpimath" + DESTINATION ${header_dest} ) target_include_directories( wpimath @@ -199,22 +224,15 @@ target_include_directories( $ ) -install(DIRECTORY src/main/native/include/ DESTINATION "${include_dest}/wpimath") +install(DIRECTORY src/main/native/include/ DESTINATION ${header_dest}) target_include_directories( wpimath PUBLIC $ $ - $ + $ ) -install(TARGETS wpimath EXPORT wpimath) -export(TARGETS wpimath FILE wpimath.cmake NAMESPACE wpimath::) - -configure_file(wpimath-config.cmake.in ${WPILIB_BINARY_DIR}/wpimath-config.cmake) -install(FILES ${WPILIB_BINARY_DIR}/wpimath-config.cmake DESTINATION share/wpimath) -install(EXPORT wpimath DESTINATION share/wpimath) - if(WITH_TESTS) wpilib_add_test(wpimath src/test/native/cpp) target_include_directories(wpimath_test PRIVATE src/test/native/include) diff --git a/wpimath/src/main/native/cpp/jni/EigenJNI.cpp b/wpimath/src/main/native/cpp/jni/EigenJNI.cpp index e024f994e7a..b3b3f22c587 100644 --- a/wpimath/src/main/native/cpp/jni/EigenJNI.cpp +++ b/wpimath/src/main/native/cpp/jni/EigenJNI.cpp @@ -4,6 +4,10 @@ #include +#if __GNUC__ >= 12 +#pragma GCC diagnostic ignored "-Wuse-after-free" +#endif + #include #include #include diff --git a/wpinet/CMakeLists.txt b/wpinet/CMakeLists.txt index 5d5509d239e..f2ab15b2e1b 100644 --- a/wpinet/CMakeLists.txt +++ b/wpinet/CMakeLists.txt @@ -4,6 +4,9 @@ include(SubDirList) include(GenResources) include(CompileWarnings) include(AddTest) +if(BUILD_MAVEN) + include(BuildMaven) +endif() file(GLOB wpinet_jni_src src/main/native/cpp/jni/WPINetJNI.cpp) @@ -37,8 +40,16 @@ if(WITH_JAVA) target_link_libraries(wpinetjni PRIVATE wpinet_jni_headers) add_dependencies(wpinetjni wpinet_jar) - install(TARGETS wpinetjni EXPORT wpinetjni) - export(TARGETS wpinetjni FILE wpinetjni.cmake NAMESPACE wpinetjni::) + if(BUILD_MAVEN) + config_maven_build(wpinetjni GROUP edu.wpi.first.wpinet ARTIFACT wpinet-cpp) + install( + DIRECTORY $/ + DESTINATION wpinet-cpp/sources/jni + ) + else() + install(TARGETS wpinetjni EXPORT wpinetjni) + export(TARGETS wpinetjni FILE wpinetjni.cmake NAMESPACE wpinetjni::) + endif() endif() if(WITH_JAVA_SOURCE) @@ -130,12 +141,26 @@ target_compile_features(wpinet PUBLIC cxx_std_20) wpilib_target_warnings(wpinet) target_link_libraries(wpinet PUBLIC wpiutil) +configure_file(wpinet-config.cmake.in ${WPILIB_BINARY_DIR}/wpinet-config.cmake) +if(BUILD_MAVEN) + config_maven_build( + wpinet + GROUP edu.wpi.first.wpimath + ARTIFACT wpinet-cpp + CONFIG_FILE wpinet-config.cmake + ) + set(header_dest wpinet-cpp/include) +else() + install(TARGETS wpinet EXPORT wpinet) + export(TARGETS wpinet FILE wpinet.cmake NAMESPACE wpinet::) + install(FILES ${WPILIB_BINARY_DIR}/wpinet-config.cmake DESTINATION share/wpinet) + install(EXPORT wpinet DESTINATION share/wpinet) + set(header_dest ${include_dest}/wpinet) +endif() + if(NOT USE_SYSTEM_LIBUV) target_sources(wpinet PRIVATE ${uv_native_src}) - install( - DIRECTORY src/main/native/thirdparty/libuv/include/ - DESTINATION "${include_dest}/wpinet" - ) + install(DIRECTORY src/main/native/thirdparty/libuv/include/ DESTINATION ${header_dest}) target_include_directories(wpinet PRIVATE src/main/native/thirdparty/libuv/src) target_include_directories( wpinet @@ -174,23 +199,16 @@ endif() install( DIRECTORY src/main/native/include/ src/main/native/thirdparty/tcpsockets/include/ - DESTINATION "${include_dest}/wpinet" + DESTINATION ${header_dest} ) target_include_directories( wpinet PUBLIC $ $ - $ + $ ) -install(TARGETS wpinet EXPORT wpinet) -export(TARGETS wpinet FILE wpinet.cmake NAMESPACE wpinet::) - -configure_file(wpinet-config.cmake.in ${WPILIB_BINARY_DIR}/wpinet-config.cmake) -install(FILES ${WPILIB_BINARY_DIR}/wpinet-config.cmake DESTINATION share/wpinet) -install(EXPORT wpinet DESTINATION share/wpinet) - subdir_list(wpinet_examples "${CMAKE_CURRENT_SOURCE_DIR}/examples") foreach(example ${wpinet_examples}) file(GLOB wpinet_example_src examples/${example}/*.cpp) diff --git a/wpiutil/CMakeLists.txt b/wpiutil/CMakeLists.txt index 7ef5ceae6a6..1c2e010e6fe 100644 --- a/wpiutil/CMakeLists.txt +++ b/wpiutil/CMakeLists.txt @@ -5,6 +5,9 @@ include(GenResources) include(CompileWarnings) include(AddTest) include(DownloadAndCheck) +if(BUILD_MAVEN) + include(BuildMaven) +endif() file( GLOB wpiutil_jni_src @@ -81,8 +84,16 @@ if(WITH_JAVA) target_link_libraries(wpiutiljni PRIVATE wpiutil_jni_headers) add_dependencies(wpiutiljni wpiutil_jar) - install(TARGETS wpiutiljni EXPORT wpiutiljni) - export(TARGETS wpiutiljni FILE wpiutiljni.cmake NAMESPACE wpiutiljni::) + if(BUILD_MAVEN) + config_maven_build(wpiutiljni GROUP edu.wpi.first.wpiutil ARTIFACT wpiutil-cpp) + install( + DIRECTORY $/ + DESTINATION wpiutil-cpp/sources/jni + ) + else() + install(TARGETS wpiutiljni EXPORT wpiutiljni) + export(TARGETS wpiutiljni FILE wpiutiljni.cmake NAMESPACE wpiutiljni::) + endif() endif() if(WITH_JAVA_SOURCE) @@ -128,6 +139,7 @@ file(GLOB_RECURSE wpiutil_windows_src src/main/native/windows/*.cpp) file(GLOB fmtlib_native_src src/main/native/thirdparty/fmtlib/src/*.cpp) file(GLOB_RECURSE memory_native_src src/main/native/thirdparty/memory/src/*.cpp) +file(GLOB_RECURSE protobuf_native_src src/main/native/thirdparty/protobuf/src/*.cpp) add_library(wpiutil ${wpiutil_native_src} ${memory_native_src} ${wpiutil_resources_src}) set_target_properties(wpiutil PROPERTIES DEBUG_POSTFIX "d") @@ -143,18 +155,47 @@ if(MSVC) target_compile_definitions(wpiutil PRIVATE -D_CRT_SECURE_NO_WARNINGS) endif() wpilib_target_warnings(wpiutil) -target_link_libraries(wpiutil protobuf::libprotobuf Threads::Threads ${CMAKE_DL_LIBS}) +target_link_libraries(wpiutil Threads::Threads ${CMAKE_DL_LIBS}) if(ATOMIC) target_link_libraries(wpiutil ${ATOMIC}) endif() +configure_file(wpiutil-config.cmake.in ${WPILIB_BINARY_DIR}/wpiutil-config.cmake) +if(BUILD_MAVEN) + if(${arch} STREQUAL athena) + find_package(NILibraries REQUIRED) + target_link_libraries(wpiutil ${NI_LIBRARIES}) + endif() + target_sources(wpiutil PRIVATE ${protobuf_native_src}) + if(APPLE) + target_compile_options(wpiutil PRIVATE -Wno-format-nonliteral) + endif() + config_maven_build( + wpiutil + GROUP edu.wpi.first.wpiutil + ARTIFACT wpiutil-cpp + CONFIG_FILE wpiutil-config.cmake + ) + set(header_dest wpiutil-cpp/include) + install(DIRECTORY src/main/native/thirdparty/protobuf/include/ DESTINATION ${header_dest}) + target_include_directories( + wpiutil + PUBLIC + $ + ) +else() + target_link_libraries(wpiutil protobuf::libprotobuf) + install(TARGETS wpiutil EXPORT wpiutil) + export(TARGETS wpiutil FILE wpiutil.cmake NAMESPACE wpiutil::) + install(FILES ${WPILIB_BINARY_DIR}/wpiutil-config.cmake DESTINATION share/wpiutil) + install(EXPORT wpiutil DESTINATION share/wpiutil) + set(header_dest ${include_dest}/wpiutil) +endif() + if(NOT USE_SYSTEM_FMTLIB) target_sources(wpiutil PRIVATE ${fmtlib_native_src}) - install( - DIRECTORY src/main/native/thirdparty/fmtlib/include/ - DESTINATION "${include_dest}/wpiutil" - ) + install(DIRECTORY src/main/native/thirdparty/fmtlib/include/ DESTINATION ${header_dest}) target_include_directories( wpiutil PUBLIC @@ -192,7 +233,7 @@ install( src/main/native/thirdparty/memory/include/ src/main/native/thirdparty/mpack/include/ src/main/native/thirdparty/sigslot/include/ - DESTINATION "${include_dest}/wpiutil" + DESTINATION ${header_dest} ) target_include_directories( wpiutil @@ -204,16 +245,9 @@ target_include_directories( $ $ $ - $ + $ ) -install(TARGETS wpiutil EXPORT wpiutil) -export(TARGETS wpiutil FILE wpiutil.cmake NAMESPACE wpiutil::) - -configure_file(wpiutil-config.cmake.in ${WPILIB_BINARY_DIR}/wpiutil-config.cmake) -install(FILES ${WPILIB_BINARY_DIR}/wpiutil-config.cmake DESTINATION share/wpiutil) -install(EXPORT wpiutil DESTINATION share/wpiutil) - subdir_list(wpiutil_examples "${CMAKE_CURRENT_SOURCE_DIR}/examples") foreach(example ${wpiutil_examples}) file(GLOB wpiutil_example_src examples/${example}/*.cpp) diff --git a/xrpVendordep/CMakeLists.txt b/xrpVendordep/CMakeLists.txt index b4bf64d9953..3ed5d69c6d4 100644 --- a/xrpVendordep/CMakeLists.txt +++ b/xrpVendordep/CMakeLists.txt @@ -3,6 +3,9 @@ project(xrpVendordep) include(SubDirList) include(CompileWarnings) include(AddTest) +if(BUILD_MAVEN) + include(BuildMaven) +endif() if(WITH_JAVA) include(UseJava) @@ -56,21 +59,30 @@ target_compile_features(xrpVendordep PUBLIC cxx_std_20) wpilib_target_warnings(xrpVendordep) target_link_libraries(xrpVendordep wpilibc) +configure_file(xrpvendordep-config.cmake.in ${WPILIB_BINARY_DIR}/xrpvendordep-config.cmake) +if(BUILD_MAVEN) + config_maven_build( + xrpVendordep + GROUP edu.wpi.first.xrpVendordep + ARTIFACT xrpVendordep-cpp + CONFIG_FILE xrpvendordep-config.cmake + ) + set(header_dest xrpVendordep-cpp/include) +else() + install(TARGETS xrpVendordep EXPORT xrpvendordep) + export(TARGETS xrpVendordep FILE xrpvendordep.cmake NAMESPACE xrpvendordep::) + install(FILES ${WPILIB_BINARY_DIR}/xrpvendordep-config.cmake DESTINATION share/xrpVendordep) + install(EXPORT xrpvendordep DESTINATION share/xrpVendordep) + set(header_dest ${include_dest}/xrpVendordep) +endif() +install(DIRECTORY src/main/native/include/ DESTINATION ${header_dest}) target_include_directories( xrpVendordep PUBLIC $ - $ + $ ) -install(TARGETS xrpVendordep EXPORT xrpvendordep) -export(TARGETS xrpVendordep FILE xrpvendordep.cmake NAMESPACE xrpvendordep::) -install(DIRECTORY src/main/native/include/ DESTINATION "${include_dest}/xrpVendordep") - -configure_file(xrpvendordep-config.cmake.in ${WPILIB_BINARY_DIR}/xrpvendordep-config.cmake) -install(FILES ${WPILIB_BINARY_DIR}/xrpvendordep-config.cmake DESTINATION share/xrpVendordep) -install(EXPORT xrpvendordep DESTINATION share/xrpVendordep) - if(WITH_TESTS) wpilib_add_test(xrpVendordep src/test/native/cpp) target_include_directories(xrpVendordep_test PRIVATE src/test/native/include)