Skip to content

Commit

Permalink
Merge pull request #118 from Picovoice/windows-arm64
Browse files Browse the repository at this point in the history
  • Loading branch information
matt200-ok authored Jan 9, 2025
2 parents ea7a5c1 + 1796da8 commit 9c99557
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 69 deletions.
4 changes: 2 additions & 2 deletions .github/actions/c-template/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,10 @@ runs:
shell: ${{ inputs.shell }}

- name: Upload build artifacts
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: ${{ inputs.pv_recorder_platform }}
path: |
lib/${{ inputs.output_dir }}/libpv_recorder.*
lib/node/${{ inputs.output_dir }}/pv_recorder.node
retention-days: 3
retention-days: 3
85 changes: 47 additions & 38 deletions .github/workflows/c.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ on:
- '.github/actions/c-template/action.yml'

jobs:
build-github-hosted:
build-linux:
runs-on: ${{ matrix.os }}

strategy:
Expand All @@ -33,7 +33,7 @@ jobs:
pv_recorder_platform: linux
output_dir: linux/x86_64
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
submodules: recursive

Expand All @@ -43,33 +43,44 @@ jobs:
pv_recorder_platform: ${{ matrix.pv_recorder_platform }}
output_dir: ${{ matrix.output_dir }}

build-self-hosted:
build-rpis:
runs-on: ${{ matrix.machine }}
strategy:
matrix:
machine: [rpi3-32, rpi3-64, rpi4-32, rpi4-64, rpi5-32, rpi5-64]
pv_recorder_platform: [
raspberry-pi,
raspberry-pi3,
raspberry-pi3-64,
raspberry-pi4,
raspberry-pi4-64,
raspberry-pi5,
raspberry-pi5-64
]
include:
- machine: rpi3-32
pv_recorder_platform: raspberry-pi3
- pv_recorder_platform: raspberry-pi
machine: rpi3-32
output_dir: raspberry-pi/arm11
- pv_recorder_platform: raspberry-pi3
machine: rpi3-32
output_dir: raspberry-pi/cortex-a53
- machine: rpi3-64
pv_recorder_platform: raspberry-pi3-64
- pv_recorder_platform: raspberry-pi3-64
machine: rpi3-64
output_dir: raspberry-pi/cortex-a53-aarch64
- machine: rpi4-32
pv_recorder_platform: raspberry-pi4
- pv_recorder_platform: raspberry-pi4
machine: rpi4-32
output_dir: raspberry-pi/cortex-a72
- machine: rpi4-64
pv_recorder_platform: raspberry-pi4-64
- pv_recorder_platform: raspberry-pi4-64
machine: rpi4-64
output_dir: raspberry-pi/cortex-a72-aarch64
- machine: rpi5-32
pv_recorder_platform: raspberry-pi5
- pv_recorder_platform: raspberry-pi5
machine: rpi5-32
output_dir: raspberry-pi/cortex-a76
- machine: rpi5-64
pv_recorder_platform: raspberry-pi5-64
- pv_recorder_platform: raspberry-pi5-64
machine: rpi5-64
output_dir: raspberry-pi/cortex-a76-aarch64

steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
submodules: recursive

Expand All @@ -90,7 +101,7 @@ jobs:
- pv_recorder_platform: mac-x86_64
output_dir: mac/x86_64
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
submodules: recursive

Expand All @@ -100,40 +111,38 @@ jobs:
pv_recorder_platform: ${{ matrix.pv_recorder_platform }}
output_dir: ${{ matrix.output_dir }}

build-rpi0:
runs-on: rpi3-32
steps:
- uses: actions/checkout@v3
with:
submodules: recursive

- uses: ./.github/actions/c-template
name: Build and test
with:
pv_recorder_platform: raspberry-pi
output_dir: raspberry-pi/arm11

build-windows:
runs-on: pv-windows
runs-on: ${{ matrix.machine }}
strategy:
matrix:
pv_recorder_platform: [windows-amd64, windows-arm64]
include:
- pv_recorder_platform: windows-amd64
machine: pv-windows
output_dir: windows/amd64
- pv_recorder_platform: windows-arm64
machine: pv-windows-arm64
output_dir: windows/arm64

steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
with:
submodules: recursive

- uses: ./.github/actions/c-template
name: Build and test
with:
pv_recorder_platform: windows
output_dir: windows/amd64
pv_recorder_platform: ${{ matrix.pv_recorder_platform }}
output_dir: ${{ matrix.output_dir }}
shell: pwsh

collect-artifacts:
runs-on: ubuntu-latest
needs: [build-github-hosted, build-self-hosted, build-mac, build-rpi0, build-windows]
needs: [build-linux, build-rpis, build-mac, build-windows]

steps:
- name: Download artifacts
uses: actions/download-artifact@v3
uses: actions/download-artifact@v4
with:
path: artifacts

Expand All @@ -146,7 +155,7 @@ jobs:
for DIR in artifacts/*; do cp -a $DIR/* all-libs/lib/; done
- name: Upload all artifacts
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: all-libs
path: all-libs
Expand Down
46 changes: 25 additions & 21 deletions project/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,55 +11,65 @@ option(PV_BUILD_NODE "Build Node.js libraries" ON)

if(NOT PV_RECORDER_PLATFORM)
message(FATAL_ERROR "No `PV_RECORDER_PLATFORM` value was given. Valid platforms are: \n"
"linux, mac-arm64, mac-x86_64, windows, raspberry-pi, raspberry-pi3-32, "
"raspberry-pi3-64, raspberry-pi4-32, raspberry-pi4-64, ")
"linux, mac-arm64, mac-x86_64, windows-amd64, windows-arm64, "
"raspberry-pi, raspberry-pi3-32, raspberry-pi3-64, raspberry-pi4-32, raspberry-pi4-64, ")
endif()

if (${PV_RECORDER_PLATFORM} STREQUAL "mac-arm64")
set(UNIX_DEPENDENCIES pthread dl m)
set(pv_recorder_dependencies "")

if (${PV_RECORDER_PLATFORM} STREQUAL "linux")
add_definitions(-D__PV_RECORDER_PLATFORM_LINUX__)
list(APPEND pv_recorder_dependencies ${UNIX_DEPENDENCIES})
elseif (${PV_RECORDER_PLATFORM} STREQUAL "mac-arm64")
add_definitions(-D__PV_RECORDER_PLATFORM_DARWIN__)
set(CMAKE_OSX_ARCHITECTURES "arm64")
list(APPEND pv_recorder_dependencies ${UNIX_DEPENDENCIES})
elseif (${PV_RECORDER_PLATFORM} STREQUAL "mac-x86_64")
add_definitions(-D__PV_RECORDER_PLATFORM_DARWIN__)
set(CMAKE_OSX_ARCHITECTURES "x86_64")
elseif (${PV_RECORDER_PLATFORM} STREQUAL "linux")
add_definitions(-D__PV_RECORDER_PLATFORM_LINUX__)
list(APPEND pv_recorder_dependencies ${UNIX_DEPENDENCIES})
elseif (${PV_RECORDER_PLATFORM} STREQUAL "windows-amd64")
add_definitions(-D__PV_RECORDER_PLATFORM_WINDOWS__)
set(PV_WINDOWS_NODE_ARCH "win-x64")
elseif (${PV_RECORDER_PLATFORM} STREQUAL "windows-arm64")
add_definitions(-D__PV_RECORDER_PLATFORM_WINDOWS__)
set(PV_WINDOWS_NODE_ARCH "win-arm64")
elseif (${PV_RECORDER_PLATFORM} STREQUAL "raspberry-pi")
set(PV_LINK_ATOMIC ON)
add_definitions(-D__PV_RECORDER_PLATFORM_RASPBERRYPI__)
add_compile_options(-mcpu=arm1176jzf-s -mtune=arm1176jzf-s -mfloat-abi=hard -mfpu=vfp)
add_link_options(-mcpu=arm1176jzf-s -mtune=arm1176jzf-s -mfloat-abi=hard -mfpu=vfp)
list(APPEND pv_recorder_dependencies ${UNIX_DEPENDENCIES} atomic)
elseif (${PV_RECORDER_PLATFORM} STREQUAL "raspberry-pi3")
set(PV_LINK_ATOMIC ON)
add_definitions(-D__PV_RECORDER_PLATFORM_RASPBERRYPI__)
add_compile_options(-mcpu=cortex-a53 -mtune=cortex-a53 -mfloat-abi=hard -mfpu=neon-fp-armv8)
add_link_options(-mcpu=cortex-a53 -mtune=cortex-a53 -mfloat-abi=hard -mfpu=neon-fp-armv8)
list(APPEND pv_recorder_dependencies ${UNIX_DEPENDENCIES} atomic)
elseif (${PV_RECORDER_PLATFORM} STREQUAL "raspberry-pi3-64")
set(PV_LINK_ATOMIC ON)
add_definitions(-D__PV_RECORDER_PLATFORM_RASPBERRYPI__)
add_compile_options(-mcpu=cortex-a53 -mtune=cortex-a53)
add_link_options(-mcpu=cortex-a53 -mtune=cortex-a53)
list(APPEND pv_recorder_dependencies ${UNIX_DEPENDENCIES} atomic)
elseif (${PV_RECORDER_PLATFORM} STREQUAL "raspberry-pi4")
set(PV_LINK_ATOMIC ON)
add_definitions(-D__PV_RECORDER_PLATFORM_RASPBERRYPI__)
add_compile_options(-mcpu=cortex-a72 -mtune=cortex-a72 -mfloat-abi=hard -mfpu=neon-fp-armv8)
add_link_options(-mcpu=cortex-a72 -mtune=cortex-a72 -mfloat-abi=hard -mfpu=neon-fp-armv8)
list(APPEND pv_recorder_dependencies ${UNIX_DEPENDENCIES} atomic)
elseif (${PV_RECORDER_PLATFORM} STREQUAL "raspberry-pi4-64")
set(PV_LINK_ATOMIC ON)
add_definitions(-D__PV_RECORDER_PLATFORM_RASPBERRYPI__)
add_compile_options(-mcpu=cortex-a72 -mtune=cortex-a72)
add_link_options(-mcpu=cortex-a72 -mtune=cortex-a72)
list(APPEND pv_recorder_dependencies ${UNIX_DEPENDENCIES} atomic)
elseif (${PV_RECORDER_PLATFORM} STREQUAL "raspberry-pi5")
set(PV_LINK_ATOMIC ON)
add_definitions(-D__PV_RECORDER_PLATFORM_RASPBERRYPI__)
add_compile_options(-mcpu=cortex-a76 -mtune=cortex-a76 -mfloat-abi=hard -mfpu=neon-fp-armv8)
add_link_options(-mcpu=cortex-a76 -mtune=cortex-a76 -mfloat-abi=hard -mfpu=neon-fp-armv8)
list(APPEND pv_recorder_dependencies ${UNIX_DEPENDENCIES} atomic)
elseif (${PV_RECORDER_PLATFORM} STREQUAL "raspberry-pi5-64")
set(PV_LINK_ATOMIC ON)
add_definitions(-D__PV_RECORDER_PLATFORM_RASPBERRYPI__)
add_compile_options(-mcpu=cortex-a76 -mtune=cortex-a76)
add_link_options(-mcpu=cortex-a76 -mtune=cortex-a76)
elseif (${PV_RECORDER_PLATFORM} STREQUAL "windows")
add_definitions(-D__PV_RECORDER_PLATFORM_WINDOWS__)
list(APPEND pv_recorder_dependencies ${UNIX_DEPENDENCIES} atomic)
else ()
message(FATAL_ERROR "Unknown platform `${PV_RECORDER_PLATFORM}`.")
endif ()
Expand All @@ -71,13 +81,7 @@ target_include_directories(pv_recorder_object PRIVATE src/miniaudio)
add_library(pv_recorder SHARED $<TARGET_OBJECTS:pv_recorder_object>)
set_target_properties(pv_recorder PROPERTIES PUBLIC_HEADER include/pv_recorder.h)
target_include_directories(pv_recorder PUBLIC include)

if (NOT ${PV_RECORDER_PLATFORM} STREQUAL "windows")
target_link_libraries(pv_recorder PRIVATE pthread dl m)
if(PV_LINK_ATOMIC)
target_link_libraries(pv_recorder PRIVATE atomic)
endif()
endif()
target_link_libraries(pv_recorder PRIVATE ${pv_recorder_dependencies})

if(DEFINED OUTPUT_DIR)
add_custom_command(TARGET pv_recorder POST_BUILD
Expand Down
33 changes: 25 additions & 8 deletions project/node/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,19 @@ project(pv_recorder_napi)

include(ExternalProject)

if (${PV_RECORDER_PLATFORM} STREQUAL "windows-amd64" OR ${PV_RECORDER_PLATFORM} STREQUAL "windows-arm64")
if (NOT PV_WINDOWS_NODE_ARCH)
message(FATAL_ERROR "`PV_WINDOWS_NODE_ARCH` is a required value")
endif ()
endif ()

set(NODE_VERSION 18.16.1)
if (PV_WINDOWS_NODE_ARCH STREQUAL "win-arm64")
set(NODE_VERSION 22.11.0)
endif ()

ExternalProject_Add(node_headers
ExternalProject_Add(
node_headers
URL https://nodejs.org/dist/v${NODE_VERSION}/node-v${NODE_VERSION}-headers.tar.xz
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
Expand All @@ -14,15 +24,22 @@ ExternalProject_Add(node_headers
ExternalProject_Get_Property(node_headers SOURCE_DIR)
set(NODE_INCLUDE_DIR ${SOURCE_DIR}/include/node/)

if (${PV_RECORDER_PLATFORM} STREQUAL "windows")
set(NODE_WIN_LIB_DIR ${CMAKE_CURRENT_BINARY_DIR}/node_win_lib )
ExternalProject_Add(node_win_lib
URL https://nodejs.org/dist/v${NODE_VERSION}/win-x64/node.exe
if (${PV_RECORDER_PLATFORM} STREQUAL "windows-amd64" OR ${PV_RECORDER_PLATFORM} STREQUAL "windows-arm64")
set(NODE_WIN_LIB_DIR ${CMAKE_CURRENT_BINARY_DIR}/node_win_lib)

set(dlltool_param "-y")
if (CMAKE_C_COMPILER_ID STREQUAL "Clang")
set(dlltool_param "-l")
endif ()

ExternalProject_Add(
node_win_lib
URL https://nodejs.org/dist/v${NODE_VERSION}/${PV_WINDOWS_NODE_ARCH}/node.exe
DOWNLOAD_NO_EXTRACT on
DOWNLOAD_DIR ${NODE_WIN_LIB_DIR}
CONFIGURE_COMMAND ""
BUILD_COMMAND gendef.exe ${NODE_WIN_LIB_DIR}/node.exe
COMMAND dlltool.exe -d node.def -y ${NODE_WIN_LIB_DIR}/node.a
BUILD_COMMAND gendef.exe ${NODE_WIN_LIB_DIR}/node.exe
COMMAND dlltool.exe -d node.def ${dlltool_param} ${NODE_WIN_LIB_DIR}/node.a
INSTALL_COMMAND ""
)
set(NODE_LIB ${NODE_WIN_LIB_DIR}/node.a)
Expand All @@ -36,7 +53,7 @@ set_target_properties(pv_recorder_napi PROPERTIES
)
add_dependencies(pv_recorder_napi node_headers)

if (${PV_RECORDER_PLATFORM} STREQUAL "windows")
if (${PV_RECORDER_PLATFORM} STREQUAL "windows-amd64" OR ${PV_RECORDER_PLATFORM} STREQUAL "windows-arm64")
add_dependencies(pv_recorder_napi node_win_lib)
target_sources(pv_recorder_napi PRIVATE delayhook.c)
endif()
Expand Down

0 comments on commit 9c99557

Please sign in to comment.