当前位置: 首页 > news >正文

使用 Visual Studio 2022 编译 PortAudio 项目

About PortAudio

  • 官网地址,https://www.portaudio.com/

PortAudio 是一个免费的、跨平台的、开源的、 音频 I/O。它允许您用 “C”C++ 编写简单的音频程序 将在许多平台上编译和运行,包括 Windows、Macintosh OS X 和 Unix (OSS/ALSA)。它 旨在促进音频软件之间的交流 不同平台上的开发人员。许多应用程序使用 PortAudio 进行音频 I/O

PortAudio 官网介绍

PortAudio

PortAudio 提供了一个非常简单的 API 来录制和/或播放声音 使用简单的回调函数或阻塞读/写接口。包括示例程序 播放正弦波,处理音频输入(吉他模糊),录制和播放音频, 列出可用的音频设备等。

Portaudio WikiPortAudio 开发人员社区维护。它拥有最新的信息,建议作为探索 PortAudio 的起点。PortAudio 开发人员和用户在 PortAudio 邮件列表中保持联系。请随时加入。

PortAudio 项目和 API 是由 Ross 提出的 Bencinamusic-dsp 邮件列表。Ross 在他的 AudioMulch 合成应用程序中使用了 PortAudio。此后,许多人为 PortAudio 的发展做出了贡献。

本网站由 SoftSynth.com 的 Phil Burk 托管和维护。 Phil 还是 PortAudio 的联合设计师,并将其用于 JSyn 中的音频 I/O,一个 用于 Java“C” 的实时合成 API


portaudio 项目结构

首先下载 PortAudio 最新版文件。

  • pa_stable_v190700_20210406.tgz

目录结构详细:

portaudio 
├─.github
│  ├─ISSUE_TEMPLATE
│  └─workflows
├─bindings
│  ├─cpp
│  │  ├─bin
│  │  ├─build
│  │  │  ├─gnu
│  │  │  ├─vc6
│  │  │  ├─vc7
│  │  │  └─vc7_1
│  │  ├─doc
│  │  ├─example
│  │  ├─include
│  │  │  └─portaudiocpp
│  │  ├─lib
│  │  └─source
│  │      └─portaudiocpp
│  └─java
│      ├─c
│      │  ├─build
│      │  │  └─vs2010
│      │  │      └─PortAudioJNI
│      │  └─src
│      ├─jportaudio
│      │  ├─jtests
│      │  │  └─com
│      │  │      └─portaudio
│      │  └─src
│      │      └─com
│      │          └─portaudio
│      └─scripts
├─build
│  ├─msvc
│  └─scons
├─cmake_support
├─doc
│  ├─src
│  │  ├─images
│  │  └─tutorial
│  └─utils
├─examples
├─include
├─pablio
├─qa
│  └─loopback
│      └─src
├─src
│  ├─common
│  ├─hostapi
│  │  ├─alsa
│  │  ├─asihpi
│  │  ├─asio
│  │  ├─coreaudio
│  │  ├─dsound
│  │  ├─jack
│  │  ├─oss
│  │  ├─skeleton
│  │  ├─wasapi
│  │  │  └─mingw-include
│  │  ├─wdmks
│  │  └─wmme
│  └─os
│      ├─unix
│      └─win
└─test

其中在 build 文件下,提供两种默认的编译方式:

├─build
│  ├─msvc
│  └─scons

环境准备

需要安装的软件工具:

  • MSYS2 (是工具和库的集合,为您提供了 用于构建、安装和运行本机 Windows 的易于使用的环境 软件)
  • CMake (一个开源的、跨平台的构建系统生成器)
  • MinGW-w64(提供 Window 环境 GCC 编译器集合)

CMakeCross-platform Make)是一个开源的、跨平台的构建系统生成器。它不直接编译代码,而是生成标准构建工具(如 Make、Visual Studio、Ninja 等)可以使用的构建文件(比如:CMakeLists.txt)。

GCC 和 CMake 的关系 :

基本概念
GCC(GNU Compiler Collection)
  • 是一套编译器工具集,用于编译 C、C++、Fortran 等语言
  • 直接将源代码编译成可执行文件或库
  • 是实际执行编译工作的工具
CMake(Cross-platform Make)
  • 是一个构建系统生成器,不直接编译代码
  • 生成各种构建工具(包括 GCC)可以使用的构建文件
  • 负责管理项目的构建过程和依赖关系
两者关系
1. 协作关系
  • CMake 负责生成构建文件(如 Makefile
  • GCC 负责实际执行编译任务
  • CMake 可以调用 GCC 进行编译
2. 工作流程
  • CMakeLists.txt - 项目构建配置文件,定义项目结构和构建规则

  • 全工具链工作流程

传统构建系统
现代构建系统
生成标准构建文件
生成标准构建文件
执行
执行
执行
执行
生成
生成
生成
生成
CMakeLists.txt
CMake
Ninja
Makefile 文件
Ninja 文件
传统构建工具
现代构建工具
GCC
Make
Visual Studio
Ninja
可执行文件
  • 使用 cmake/vs 编译的工作流程(本文使用的)
CMakeLists.txt
CMake
Makefile 文件
Visual Studio
可执行文件

Windows 安装 mingw-w64

MSYS2 是工具和库的集合,为您提供了 用于构建、安装和运行本机 Windows 的易于使用的环境 软件。

MSYS2

MSYS2 的主要重点是提供 原生 Windows 软件的构建环境和使用 Cygwin 的部件 是保持在最低限度。MSYS2GCC 提供最新的原生版本,mingw-w64, CPython、CMake、Meson、OpenSSL、FFmpeg、Rust、Ruby,仅举几例。

说明:安装 MSYS2 需要 64Windows 10 或更高版本。

安装成功 MSYS2 后,系统会有三个终端,分别如下:

  • SMYS
  • CLANG64
  • UCRT64

在这里插入图片描述

这三个终端是 MSYS2 提供的不同编译环境,各有不同的用途和特点:

MSYS2 的三种编译环境

1. MSYS (MSYS2)
  • 用途:主要用于构建 POSIX 兼容的类 Unix 程序
  • 特点
    • 提供类 Unix 环境(模拟 POSIX
    • 主要用于构建在 MSYS2 环境内运行的程序
    • 不适合构建原生 Windows 应用程序
2. CLANG64
  • 用途:使用 Clang/LLVM 编译器工具链构建 64Windows 应用程序
  • 特点
    • 使用 Clang 编译器而非 GCC
    • 构建的程序使用 MSVCRT 运行时库
    • 生成原生 Windows 可执行文件
    • 启动后默认使用 clang64 工具链
3. UCRT64
  • 用途:使用 GCC 编译器工具链构建 64Windows 应用程序
  • 特点
    • 使用 GCC 编译器
    • 使用 Windows 10通用C运行时库 (Universal C Runtime)
    • 生成原生 Windows 可执行文件
    • 是目前推荐的用于构建现代 Windows 应用的环境
选择建议
  • 如果您需要使用 GCC 编译器,应该使用 UCRT64
  • 如果您偏好 Clang 编译器,应该使用 CLANG64
  • MSYS 主要用于构建在 MSYS2 环境内部运行的工具

如果启动的其他终端(CLANG64MSYS),切换到 UCRT64 环境执行命令

Jeffrey@Pods CLANG64 ~
$ /ucrt64.exe

通常使用 MSYS2mingw-w64 GCC/CMake 搭配使用:

mingw-w64

这里我们使用 MSYS2 安装工具 mingw-w64 GCC 来编译项目。


安装 mingw-w64 GCC

  • 启动 UCRT64 环境的终端,执行以下命令:
$ pacman -S mingw-w64-ucrt-x86_64-gcc
  • 终端输出信息,按 “Enter” 继续:
Jeffrey@Pods MSYS ~
$ pacman -S mingw-w64-ucrt-x86_64-gcc
resolving dependencies...
looking for conflicting packages...Packages (16) mingw-w64-ucrt-x86_64-binutils-2.44-4mingw-w64-ucrt-x86_64-crt-git-13.0.0.r21.gf5469ff36-1mingw-w64-ucrt-x86_64-gcc-libs-15.1.0-5  mingw-w64-ucrt-x86_64-gettext-runtime-0.25-1mingw-w64-ucrt-x86_64-gmp-6.3.0-2mingw-w64-ucrt-x86_64-headers-git-13.0.0.r21.gf5469ff36-1mingw-w64-ucrt-x86_64-isl-0.27-1  mingw-w64-ucrt-x86_64-libiconv-1.18-1mingw-w64-ucrt-x86_64-libwinpthread-13.0.0.r21.gf5469ff36-1mingw-w64-ucrt-x86_64-mpc-1.3.1-2  mingw-w64-ucrt-x86_64-mpfr-4.2.2-1mingw-w64-ucrt-x86_64-windows-default-manifest-6.4-4mingw-w64-ucrt-x86_64-winpthreads-13.0.0.r21.gf5469ff36-1mingw-w64-ucrt-x86_64-zlib-1.3.1-1  mingw-w64-ucrt-x86_64-zstd-1.5.7-1mingw-w64-ucrt-x86_64-gcc-15.1.0-5Total Download Size:    69.02 MiB
Total Installed Size:  540.65 MiB:: Proceed with installation? [Y/n]
[... downloading and installation continues ...]
  • 切换 UCRT64 终端,查看 gcc 版本信息:
Jeffrey@Pods UCRT64 ~
$ gcc --version
gcc.exe (Rev5, Built by MSYS2 project) 15.1.0
Copyright (C) 2025 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

现在,我们就可以使用 gcc 调用为 Windows 构建软件。

安装 mingw-w64 CMake

  • 启动 UCRT64 环境的终端,执行以下命令:
$ pacman -S mingw-w64-ucrt-x86_64-cmake

输出信息:

Jeffrey@Pods UCRT64 ~
$ pacman -S mingw-w64-ucrt-x86_64-cmake
resolving dependencies...
looking for conflicting packages...Packages (32) mingw-w64-ucrt-x86_64-brotli-1.1.0-5  mingw-w64-ucrt-x86_64-bzip2-1.0.8-3mingw-w64-ucrt-x86_64-c-ares-1.34.5-1mingw-w64-ucrt-x86_64-ca-certificates-20241223-1  mingw-w64-ucrt-x86_64-cppdap-1.65-1mingw-w64-ucrt-x86_64-curl-8.14.1-1  mingw-w64-ucrt-x86_64-expat-2.7.1-2mingw-w64-ucrt-x86_64-gnutls-3.8.9-4  mingw-w64-ucrt-x86_64-jsoncpp-1.9.6-3mingw-w64-ucrt-x86_64-libarchive-3.8.1-2  mingw-w64-ucrt-x86_64-libb2-0.98.1-2mingw-w64-ucrt-x86_64-libffi-3.5.0-1  mingw-w64-ucrt-x86_64-libidn2-2.3.8-2mingw-w64-ucrt-x86_64-libpsl-0.21.5-3  mingw-w64-ucrt-x86_64-libssh2-1.11.1-1mingw-w64-ucrt-x86_64-libsystre-1.0.2-1  mingw-w64-ucrt-x86_64-libtasn1-4.20.0-1mingw-w64-ucrt-x86_64-libtre-0.9.0-1  mingw-w64-ucrt-x86_64-libunistring-1.3-1mingw-w64-ucrt-x86_64-libuv-1.51.0-1  mingw-w64-ucrt-x86_64-lz4-1.10.0-1mingw-w64-ucrt-x86_64-nettle-3.10.1-1  mingw-w64-ucrt-x86_64-nghttp2-1.66.0-1mingw-w64-ucrt-x86_64-nghttp3-1.10.1-1  mingw-w64-ucrt-x86_64-ngtcp2-1.13.0-2mingw-w64-ucrt-x86_64-ninja-1.12.1-2  mingw-w64-ucrt-x86_64-openssl-3.5.0-1mingw-w64-ucrt-x86_64-p11-kit-0.25.5-1  mingw-w64-ucrt-x86_64-pkgconf-1~2.5.0-1mingw-w64-ucrt-x86_64-rhash-1.4.5-1  mingw-w64-ucrt-x86_64-xz-5.8.1-2mingw-w64-ucrt-x86_64-cmake-4.0.2-1Total Download Size:    28.52 MiB
Total Installed Size:  170.62 MiB:: Proceed with installation? [Y/n]
  • 输入 YEnter 继续:

在这里插入图片描述

  • 查看 cmake 版本信息:
Jeffrey@Pods UCRT64 /c/Users/Jeffrey/Downloads/portaudio/build/msvs_vs2022
$ cmake --version
cmake version 4.0.2CMake suite maintained and supported by Kitware (kitware.com/cmake).

在 UCRT64 终端环境连接到 portaudio 项目

依据项目在 Windows 的路径,您可以在 UCRT64 终端中使用以下命令切换到 portaudio 目录:

# 切换到下载目录中的 portaudio 文件夹
cd /c/Users/Jeffrey/Downloads/portaudio
# 或者使用波浪号(~)表示用户主目录(如果 Jeffrey 是当前用户)
cd ~/Downloads/portaudio

输出如下信息:

进入portaudio目录

  • 切换到目录后,您可以执行以下命令:
# 查看当前目录
pwd
# 列出目录内容,确认有 Makefile
ls -la
# 如果有 Makefile,直接编译
make
# 如果需要清理之前的构建
make clean
# 然后重新编译
make

相关文章推荐:

  • Windows 环境安装 MinGW 工具链详细介绍
  • MSYS2 安装文档
  • MinGW-w64 的下载与安装

vs2022 编译 PortAudio 项目

下面是使用 Visual Studio 2022 (VS2022) 编译 PortAudio 的详细步骤:

1. 安装依赖

确保已安装 Visual Studio 2022,并勾选了 “使用C++的桌面开发” 工作负载。
推荐安装 CMake(可从 https://cmake.org/download/ 获取)。

  • 勾选工作负荷安装

vs-cpp

  • 安装完成后重启系统

重启win

2. 生成 Visual Studio 工程文件

PortAudio 项目根目录下打开命令提示符(可用 VS2022 “x64 本机工具命令提示符”),执行:

# 项目默认已经有 build 目录,无需创建
# mkdir build
# 进入 build 目录
cd build
# 单独新建目录,区分默认的 msvs 目录
mkdir msvs_vs2022
cd msvs_vs2022
# 生成 vs 项目文件
cmake .. -G "Visual Studio 17 2022"# 如果需要生成 64 位工程,可加参数:
cmake .. -G "Visual Studio 17 2022" -A x64
  • CMake 命令参数说明:
1. **`cmake`** - CMake 构建系统命令行工具2. **`..`** - 指定源代码目录路径- 表示上一级目录(当前目录的父目录)- CMake 将在此目录中查找 `CMakeLists.txt` 文件3. **`-G "Visual Studio 17 2022"`** - 指定生成器(Generator)- `-G` 参数用于指定要使用的构建系统生成器- `"Visual Studio 17 2022"` 表示使用 Visual Studio 2022 生成器- Visual Studio 17 2022 对应 Visual Studio 2022 版本4. **`-A x64`** - 指定目标架构- `-A` 参数用于指定目标平台架构- `x64` 表示生成 64 位应用程序- 其他可选值包括 `Win32`(32 位)、`ARM``ARM64`
  • 执行效果

该命令将在当前目录生成 Visual Studio 202264 位项目文件,源代码位于上一级目录。

  • 使用场景

通常在以下目录结构中使用:

ProjectRoot/
├── src/           # 源代码目录
│   └── CMakeLists.txt
└── build/         # 构建目录(当前所在目录)└── cmake .. -G "Visual Studio 17 2022" -A x64
  • 其他常用生成器选项
- "Visual Studio 17 2022" - Visual Studio 2022
- "Visual Studio 16 2019" - Visual Studio 2019
- "Visual Studio 15 2017" - Visual Studio 2017
- "Ninja" - Ninja 构建系统
- "MinGW Makefiles" - MinGW Makefiles
- "Unix Makefiles" - Unix Makefiles

3. 打开 Visual Studio 工程

  • build 目录下找到 portaudio.sln 文件。
  • Visual Studio 2022 打开该解决方案。

4. Visual Studio 编译

  • VS2022 中选择 “Release”“Debug” 配置。
  • 右键解决方案,选择 “生成解决方案”
  • 编译完成后,库文件(如 portaudio.lib、portaudio.dll)会在 build/Releasebuild/Debug 目录下生成。

5. 可选:编译示例和测试

如果需要编译示例或测试项目,重新生成工程文件时加参数:

cmake .. -G "Visual Studio 17 2022" -DPA_BUILD_EXAMPLES=ON -DPA_BUILD_TESTS=ON

6. 使用编译好的库

  • 头文件在 h portaudio.h
  • 静态库在 build/Release/portaudio_static.lib
  • 动态库在 build/Release/portaudio.dllbuild/Release/portaudio.lib

其他方式编译 PortAudio 项目

根据 PortAudio 项目结构和文档,PortAudio 支持多种编译方式,包括使用 CMake、Autotools(configure)、SCons 以及 Visual Studio 工程。下面是推荐的编译流程:

1. 使用 CMake 编译(推荐,跨平台)

  • Linux/macOS:
mkdir build
cd build
cmake ..
make
sudo make install
  • Windows(生成 Visual Studio 工程):
mkdir build
cd build
cmake .. -G "Visual Studio 16 2019"
cmake --build . --config Release
  • MinGW 交叉编译:
mkdir build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../i686-w64-mingw32.cmake ..
make

详细说明见 compile_cmake.dox

2. 使用 Autotools(configure)

  • Linux/macOS:
./configure
make
sudo make install

相关内容见 c-cpp.yml

3. 使用 SCons

scons

4. 其他说明

  • 编译后头文件在 h portaudio.h,库文件在 lib/
  • 示例和测试程序在 examplestest 目录。
  • 更多 API 说明见 src/hostapi
├─src
│  ├─common
│  ├─hostapi
│  │  ├─alsa
│  │  ├─asihpi
│  │  ├─asio
│  │  ├─coreaudio
│  │  ├─dsound
│  │  ├─jack
│  │  ├─oss
│  │  ├─skeleton
│  │  ├─wasapi
│  │  │  └─mingw-include
│  │  ├─wdmks
│  │  └─wmme
│  └─os
│      ├─unix
│      └─win

常见问题

如需 ASIO 支持,需提前准备 ASIO SDK 并按 CMakeLists.txt 指定路径。
如遇找不到依赖,可在 CMake 配置时指定相关路径。


项目文件详情

  • portaudio.sln (默认)文件信息:

Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "portaudio", "portaudio.vcproj", "{0A18A071-125E-442F-AFF7-A3F68ABECF99}"
EndProject
GlobalGlobalSection(SolutionConfigurationPlatforms) = preSolutionDebug|Win32 = Debug|Win32Debug|x64 = Debug|x64Release|Win32 = Release|Win32Release|x64 = Release|x64ReleaseMinDependency|Win32 = ReleaseMinDependency|Win32ReleaseMinDependency|x64 = ReleaseMinDependency|x64EndGlobalSectionGlobalSection(ProjectConfigurationPlatforms) = postSolution{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|Win32.ActiveCfg = Debug|Win32{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|Win32.Build.0 = Debug|Win32{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|x64.ActiveCfg = Debug|x64{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Debug|x64.Build.0 = Debug|x64{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|Win32.ActiveCfg = Release|Win32{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|Win32.Build.0 = Release|Win32{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|x64.ActiveCfg = Release|x64{0A18A071-125E-442F-AFF7-A3F68ABECF99}.Release|x64.Build.0 = Release|x64{0A18A071-125E-442F-AFF7-A3F68ABECF99}.ReleaseMinDependency|Win32.ActiveCfg = ReleaseMinDependency|Win32{0A18A071-125E-442F-AFF7-A3F68ABECF99}.ReleaseMinDependency|Win32.Build.0 = ReleaseMinDependency|Win32{0A18A071-125E-442F-AFF7-A3F68ABECF99}.ReleaseMinDependency|x64.ActiveCfg = ReleaseMinDependency|x64{0A18A071-125E-442F-AFF7-A3F68ABECF99}.ReleaseMinDependency|x64.Build.0 = ReleaseMinDependency|x64EndGlobalSectionGlobalSection(SolutionProperties) = preSolutionHideSolutionNode = FALSEEndGlobalSection
EndGlobal
  • portaudio.slnx (新生成)文件信息:
<Solution><Configurations><BuildType Name="Debug" /><BuildType Name="Release" /><BuildType Name="ReleaseMinDependency" /><Platform Name="Win32" /><Platform Name="x64" /></Configurations><Project Path="portaudio.vcproj" Type="VC" />
</Solution>
  • i686-w64-mingw32.cmake 文件信息:
# CMake Toolchain file for cross-compiling PortAudio to i686-w64-mingw32
# Inspired from: https://gitlab.kitware.com/cmake/community/-/wikis/doc/cmake/cross_compiling/Mingw
# Example usage: $ cmake -DCMAKE_TOOLCHAIN_FILE=i686-w64-mingw32.cmake .
# i686-w64-mingw32 needs to be installed for this to work. On Debian-based
# distributions the package is typically named `mingw-w64`.SET(CMAKE_SYSTEM_NAME Windows)SET(CMAKE_C_COMPILER i686-w64-mingw32-gcc)
SET(CMAKE_CXX_COMPILER i686-w64-mingw32-g++)
SET(CMAKE_RC_COMPILER i686-w64-mingw32-windres)SET(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32)set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
  • CMakeLists.txt 文件信息:
# $Id: $
#
# For a "How-To" please refer to the Portaudio documentation at:
# http://www.portaudio.com/trac/wiki/TutorialDir/Compile/CMake
#CMAKE_MINIMUM_REQUIRED(VERSION 2.8)# Check if the user is building PortAudio stand-alone or as part of a larger
# project. If this is part of a larger project (i.e. the CMakeLists.txt has
# been imported by some other CMakeLists.txt), we don't want to trump over
# the top of that project's global settings.
IF(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_CURRENT_LIST_DIR})PROJECT(portaudio)# CMAKE_CONFIGURATION_TYPES only exists for multi-config generators (like# Visual Studio or Xcode). For these projects, we won't define# CMAKE_BUILD_TYPE as it does not make sense.IF(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)MESSAGE(STATUS "Setting CMAKE_BUILD_TYPE type to 'Debug' as none was specified.")SET(CMAKE_BUILD_TYPE Debug CACHE STRING "Choose the type of build." FORCE)SET_PROPERTY(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release")ENDIF()SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON)IF(WIN32 AND MSVC)OPTION(PA_DLL_LINK_WITH_STATIC_RUNTIME "Link with static runtime libraries (minimizes runtime dependencies)" ON)IF(PA_DLL_LINK_WITH_STATIC_RUNTIME)FOREACH(flag_varCMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASECMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFOCMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASECMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)IF(${flag_var} MATCHES "/MD")STRING(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")ENDIF()ENDFOREACH()ENDIF()ENDIF()
ENDIF()SET(PA_VERSION 19)
SET(PA_PKGCONFIG_VERSION ${PA_VERSION})
SET(PA_SOVERSION "${PA_VERSION}.0")# Most of the code from this point onwards is related to populating the
# following variables:
#   PA_PUBLIC_INCLUDES - This contains the list of public PortAudio header
#       files. These files will be copied into /include paths on Unix'y
#       systems when "make install" is invoked.
#   PA_PRIVATE_INCLUDES - This contains the list of header files which
#       are not part of PortAudio, but are required by the various hostapis.
#       It is only used by CMake IDE generators (like Visual Studio) to
#       provide quick-links to useful headers. It has no impact on build
#       output.
#   PA_PRIVATE_INCLUDE_PATHS - This contains the list of include paths which
#       will be passed to the compiler while PortAudio is being built which
#       are not required by applications using the PortAudio API.
#   PA_PRIVATE_COMPILE_DEFINITIONS - This contains a list of preprocessor
#       macro definitions which will be set when compiling PortAudio source
#       files.
#   PA_SOURCES - This contains the list of source files which will be built
#       into the static and shared PortAudio libraries.
#   PA_NON_UNICODE_SOURCES - This also contains a list of source files which
#       will be build into the static and shared PortAudio libraries. However,
#       these sources will not have any unicode compiler definitions added
#       to them. This list should only contain external source dependencies.
#   PA_EXTRA_SHARED_SOURCES - Contains a list of extra files which will be
#       associated only with the shared PortAudio library. This only seems
#       relevant for Windows shared libraries which require a list of export
#       symbols.
# Where other PA_* variables are set, these are almost always only used to
# preserve the historic SOURCE_GROUP behavior (which again only has an impact
# on IDE-style generators for visual appearance) or store the output of
# find_library() calls.SET(PA_COMMON_INCLUDESsrc/common/pa_allocation.hsrc/common/pa_converters.hsrc/common/pa_cpuload.hsrc/common/pa_debugprint.hsrc/common/pa_dither.hsrc/common/pa_endianness.hsrc/common/pa_hostapi.hsrc/common/pa_memorybarrier.hsrc/common/pa_process.hsrc/common/pa_ringbuffer.hsrc/common/pa_stream.hsrc/common/pa_trace.hsrc/common/pa_types.hsrc/common/pa_util.h
)SET(PA_COMMON_SOURCESsrc/common/pa_allocation.csrc/common/pa_converters.csrc/common/pa_cpuload.csrc/common/pa_debugprint.csrc/common/pa_dither.csrc/common/pa_front.csrc/common/pa_process.csrc/common/pa_ringbuffer.csrc/common/pa_stream.csrc/common/pa_trace.c
)SOURCE_GROUP("common" FILES ${PA_COMMON_INCLUDES} ${PA_COMMON_SOURCES})SET(PA_PUBLIC_INCLUDES include/portaudio.h)SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/cmake_support)SET(PA_SKELETON_SOURCES src/hostapi/skeleton/pa_hostapi_skeleton.c)
SOURCE_GROUP("hostapi\\skeleton" ${PA_SKELETON_SOURCES})
SET(PA_SOURCES ${PA_COMMON_SOURCES} ${PA_SKELETON_SOURCES})
SET(PA_PRIVATE_INCLUDE_PATHS src/common ${CMAKE_CURRENT_BINARY_DIR})IF(WIN32)SET(PA_PRIVATE_COMPILE_DEFINITIONS ${PA_PRIVATE_COMPILE_DEFINITIONS} _CRT_SECURE_NO_WARNINGS)SET(PA_PLATFORM_SOURCESsrc/os/win/pa_win_hostapis.csrc/os/win/pa_win_util.csrc/os/win/pa_win_waveformat.csrc/os/win/pa_win_wdmks_utils.csrc/os/win/pa_win_coinitialize.c)SET(PA_PLATFORM_INCLUDESsrc/os/win/pa_win_coinitialize.hsrc/os/win/pa_win_wdmks_utils.h)IF(MSVC)SET(PA_PLATFORM_SOURCES ${PA_PLATFORM_SOURCES} src/os/win/pa_x86_plain_converters.c)SET(PA_PLATFORM_INCLUDES ${PA_PLATFORM_INCLUDES} src/os/win/pa_x86_plain_converters.h)ELSE()SET(PA_PRIVATE_COMPILE_DEFINITIONS ${PA_PRIVATE_COMPILE_DEFINITIONS} _WIN32_WINNT=0x0501 WINVER=0x0501)SET(DEF_EXCLUDE_X86_PLAIN_CONVERTERS ";")ENDIF()SOURCE_GROUP("os\\win" FILES ${PA_PLATFORM_SOURCES} ${PA_PLATFORM_INCLUDES})SET(PA_SOURCES ${PA_SOURCES} ${PA_PLATFORM_SOURCES})SET(PA_PRIVATE_INCLUDES ${PA_PRIVATE_INCLUDES} ${PA_PLATFORM_INCLUDES})SET(PA_PRIVATE_INCLUDE_PATHS ${PA_PRIVATE_INCLUDE_PATHS} src/os/win)SET(PA_LIBRARY_DEPENDENCIES ${PA_LIBRARY_DEPENDENCIES} winmm)# Try to find ASIO SDK (assumes that portaudio and asiosdk folders are side-by-side, see# http://www.portaudio.com/trac/wiki/TutorialDir/Compile/WindowsASIOMSVC)FIND_PACKAGE(ASIOSDK)IF(ASIOSDK_FOUND)OPTION(PA_USE_ASIO "Enable support for ASIO" ON)ELSE()OPTION(PA_USE_ASIO "Enable support for ASIO" OFF)ENDIF()IF(PA_USE_ASIO)SET(PA_PRIVATE_INCLUDE_PATHS ${PA_PRIVATE_INCLUDE_PATHS} ${ASIOSDK_ROOT_DIR}/common)SET(PA_PRIVATE_INCLUDE_PATHS ${PA_PRIVATE_INCLUDE_PATHS} ${ASIOSDK_ROOT_DIR}/host)SET(PA_PRIVATE_INCLUDE_PATHS ${PA_PRIVATE_INCLUDE_PATHS} ${ASIOSDK_ROOT_DIR}/host/pc)SET(PA_ASIO_SOURCES src/hostapi/asio/pa_asio.cpp src/hostapi/asio/iasiothiscallresolver.cpp)SET(PA_ASIOSDK_SOURCES ${ASIOSDK_ROOT_DIR}/common/asio.cpp ${ASIOSDK_ROOT_DIR}/host/pc/asiolist.cpp ${ASIOSDK_ROOT_DIR}/host/asiodrivers.cpp)SOURCE_GROUP("hostapi\\ASIO" FILES ${PA_ASIO_SOURCES})SOURCE_GROUP("hostapi\\ASIO\\ASIOSDK" FILES ${PA_ASIOSDK_SOURCES})SET(PA_PUBLIC_INCLUDES ${PA_PUBLIC_INCLUDES} include/pa_asio.h)SET(PA_SOURCES ${PA_SOURCES} ${PA_ASIO_SOURCES})SET(PA_NON_UNICODE_SOURCES ${PA_NON_UNICODE_SOURCES} ${PA_ASIOSDK_SOURCES})SET(PA_LIBRARY_DEPENDENCIES ${PA_LIBRARY_DEPENDENCIES} ole32 uuid)ELSE()# Set variables for DEF file expansionSET(DEF_EXCLUDE_ASIO_SYMBOLS ";")ENDIF()OPTION(PA_USE_DS "Enable support for DirectSound" ON)IF(PA_USE_DS)IF(MINGW)MESSAGE(STATUS "DirectSound support will be built with DSound provided by MinGW.")OPTION(PA_USE_DIRECTSOUNDFULLDUPLEXCREATE "Use DirectSound full duplex create" OFF)ELSE(MINGW)OPTION(PA_USE_DIRECTSOUNDFULLDUPLEXCREATE "Use DirectSound full duplex create" ON)ENDIF(MINGW)MARK_AS_ADVANCED(PA_USE_DIRECTSOUNDFULLDUPLEXCREATE)IF(PA_USE_DIRECTSOUNDFULLDUPLEXCREATE)SET(PA_PRIVATE_COMPILE_DEFINITIONS ${PA_PRIVATE_COMPILE_DEFINITIONS} PAWIN_USE_DIRECTSOUNDFULLDUPLEXCREATE)ENDIF()SET(PA_DS_INCLUDES src/hostapi/dsound/pa_win_ds_dynlink.h)SET(PA_DS_SOURCES src/hostapi/dsound/pa_win_ds.c src/hostapi/dsound/pa_win_ds_dynlink.c)SOURCE_GROUP("hostapi\\dsound" FILES ${PA_DS_INCLUDES} ${PA_DS_SOURCES})SET(PA_PUBLIC_INCLUDES ${PA_PUBLIC_INCLUDES} include/pa_win_ds.h include/pa_win_waveformat.h)SET(PA_PRIVATE_INCLUDES ${PA_PRIVATE_INCLUDES} ${PA_DS_INCLUDES})SET(PA_SOURCES ${PA_SOURCES} ${PA_DS_SOURCES})SET(PA_LIBRARY_DEPENDENCIES ${PA_LIBRARY_DEPENDENCIES} dsound)ENDIF(PA_USE_DS)OPTION(PA_USE_WMME "Enable support for MME" ON)IF(PA_USE_WMME)SET(PA_WMME_SOURCES src/hostapi/wmme/pa_win_wmme.c)SOURCE_GROUP("hostapi\\wmme" FILES ${PA_WMME_SOURCES})SET(PA_PUBLIC_INCLUDES ${PA_PUBLIC_INCLUDES} include/pa_win_wmme.h include/pa_win_waveformat.h)SET(PA_SOURCES ${PA_SOURCES} ${PA_WMME_SOURCES})SET(PA_LIBRARY_DEPENDENCIES ${PA_LIBRARY_DEPENDENCIES} ole32 uuid)ENDIF()# MinGW versions below 4.93, especially non MinGW-w64 distributions may# break in the wasapi build. If an older MinGW version is required, WASAPI-# support needs to be disabled.OPTION(PA_USE_WASAPI "Enable support for WASAPI" ON)IF(PA_USE_WASAPI)SET(PA_WASAPI_SOURCES src/hostapi/wasapi/pa_win_wasapi.c)SOURCE_GROUP("hostapi\\wasapi" FILES ${PA_WASAPI_SOURCES})SET(PA_PUBLIC_INCLUDES ${PA_PUBLIC_INCLUDES} include/pa_win_wasapi.h include/pa_win_waveformat.h)SET(PA_SOURCES ${PA_SOURCES} ${PA_WASAPI_SOURCES})SET(PA_LIBRARY_DEPENDENCIES ${PA_LIBRARY_DEPENDENCIES} ole32 uuid)ELSE()SET(DEF_EXCLUDE_WASAPI_SYMBOLS ";")ENDIF()OPTION(PA_USE_WDMKS "Enable support for WDMKS" ON)IF(PA_USE_WDMKS)SET(PA_WDMKS_SOURCES src/hostapi/wdmks/pa_win_wdmks.c)SOURCE_GROUP("hostapi\\wdmks" FILES ${PA_WDMKS_SOURCES})SET(PA_PUBLIC_INCLUDES ${PA_PUBLIC_INCLUDES} include/pa_win_wdmks.h)SET(PA_SOURCES ${PA_SOURCES} ${PA_WDMKS_SOURCES})SET(PA_LIBRARY_DEPENDENCIES ${PA_LIBRARY_DEPENDENCIES} setupapi ole32 uuid)ENDIF()OPTION(PA_USE_WDMKS_DEVICE_INFO "Use WDM/KS API for device info" ON)MARK_AS_ADVANCED(PA_USE_WDMKS_DEVICE_INFO)IF(PA_USE_WDMKS_DEVICE_INFO)SET(PA_PRIVATE_COMPILE_DEFINITIONS ${PA_PRIVATE_COMPILE_DEFINITIONS} PAWIN_USE_WDMKS_DEVICE_INFO)ENDIF()SET(GENERATED_MESSAGE "CMake generated file, do NOT edit! Use CMake-GUI to change configuration instead.")CONFIGURE_FILE(cmake_support/template_portaudio.def ${CMAKE_CURRENT_BINARY_DIR}/portaudio_cmake.def @ONLY)CONFIGURE_FILE(cmake_support/options_cmake.h.in ${CMAKE_CURRENT_BINARY_DIR}/options_cmake.h @ONLY)SET(PA_PRIVATE_INCLUDES ${PA_PRIVATE_INCLUDES} ${CMAKE_CURRENT_BINARY_DIR}/options_cmake.h)SET(PA_PRIVATE_COMPILE_DEFINITIONS ${PA_PRIVATE_COMPILE_DEFINITIONS} PORTAUDIO_CMAKE_GENERATED)SOURCE_GROUP("cmake_generated" FILES ${CMAKE_CURRENT_BINARY_DIR}/portaudio_cmake.def ${CMAKE_CURRENT_BINARY_DIR}/options_cmake.h)SET(PA_EXTRA_SHARED_SOURCES ${CMAKE_CURRENT_BINARY_DIR}/portaudio_cmake.def)ELSE()SET(PA_PRIVATE_INCLUDE_PATHS ${PA_PRIVATE_INCLUDE_PATHS} src/os/unix)SET(PA_PLATFORM_SOURCES src/os/unix/pa_unix_hostapis.c src/os/unix/pa_unix_util.c)SOURCE_GROUP("os\\unix" FILES ${PA_PLATFORM_SOURCES})SET(PA_SOURCES ${PA_SOURCES} ${PA_PLATFORM_SOURCES})IF(APPLE)SET(CMAKE_MACOSX_RPATH 1)OPTION(PA_USE_COREAUDIO "Enable support for CoreAudio" ON)IF(PA_USE_COREAUDIO)SET(PA_COREAUDIO_SOURCESsrc/hostapi/coreaudio/pa_mac_core.csrc/hostapi/coreaudio/pa_mac_core_blocking.csrc/hostapi/coreaudio/pa_mac_core_utilities.c)SET(PA_COREAUDIO_INCLUDESsrc/hostapi/coreaudio/pa_mac_core_blocking.hsrc/hostapi/coreaudio/pa_mac_core_utilities.h)SOURCE_GROUP("hostapi\\coreaudio" FILES ${PA_COREAUDIO_SOURCES} ${PA_COREAUDIO_INCLUDES})SET(PA_PUBLIC_INCLUDES ${PA_PUBLIC_INCLUDES} include/pa_mac_core.h)SET(PA_PRIVATE_INCLUDES ${PA_PRIVATE_INCLUDES} ${PA_COREAUDIO_INCLUDES})SET(PA_SOURCES ${PA_SOURCES} ${PA_COREAUDIO_SOURCES})FIND_LIBRARY(COREAUDIO_LIBRARY CoreAudio REQUIRED)FIND_LIBRARY(AUDIOTOOLBOX_LIBRARY AudioToolbox REQUIRED)FIND_LIBRARY(AUDIOUNIT_LIBRARY AudioUnit REQUIRED)FIND_LIBRARY(COREFOUNDATION_LIBRARY CoreFoundation REQUIRED)FIND_LIBRARY(CORESERVICES_LIBRARY CoreServices REQUIRED)MARK_AS_ADVANCED(COREAUDIO_LIBRARY AUDIOTOOLBOX_LIBRARY AUDIOUNIT_LIBRARY COREFOUNDATION_LIBRARY CORESERVICES_LIBRARY)SET(PA_LIBRARY_DEPENDENCIES ${PA_LIBRARY_DEPENDENCIES} ${COREAUDIO_LIBRARY} ${AUDIOTOOLBOX_LIBRARY} ${AUDIOUNIT_LIBRARY} ${COREFOUNDATION_LIBRARY} ${CORESERVICES_LIBRARY})SET(PA_PRIVATE_COMPILE_DEFINITIONS ${PA_PRIVATE_COMPILE_DEFINITIONS} PA_USE_COREAUDIO)SET(PA_PKGCONFIG_LDFLAGS "${PA_PKGCONFIG_LDFLAGS} -framework CoreAudio -framework AudioToolbox -framework AudioUnit -framework CoreFoundation -framework CoreServices")ENDIF()ELSEIF(UNIX)FIND_PACKAGE(Jack)IF(JACK_FOUND)OPTION(PA_USE_JACK "Enable support for Jack" ON)ELSE()OPTION(PA_USE_JACK "Enable support for Jack" OFF)ENDIF()IF(PA_USE_JACK)SET(PA_PRIVATE_INCLUDE_PATHS ${PA_PRIVATE_INCLUDE_PATHS} ${JACK_INCLUDE_DIRS})SET(PA_JACK_SOURCES src/hostapi/jack/pa_jack.c)SOURCE_GROUP("hostapi\\JACK" FILES ${PA_JACK_SOURCES})SET(PA_PUBLIC_INCLUDES ${PA_PUBLIC_INCLUDES} include/pa_jack.h)SET(PA_SOURCES ${PA_SOURCES} ${PA_JACK_SOURCES})SET(PA_PRIVATE_COMPILE_DEFINITIONS ${PA_PRIVATE_COMPILE_DEFINITIONS} PA_USE_JACK)SET(PA_LIBRARY_DEPENDENCIES ${PA_LIBRARY_DEPENDENCIES} ${JACK_LIBRARIES})SET(PA_PKGCONFIG_LDFLAGS "${PA_PKGCONFIG_LDFLAGS} -ljack")ENDIF()FIND_PACKAGE(ALSA)IF(ALSA_FOUND)OPTION(PA_USE_ALSA "Enable support for ALSA" ON)OPTION(PA_ALSA_DYNAMIC "Enable loading ALSA through dlopen" OFF)ELSE()OPTION(PA_USE_ALSA "Enable support for ALSA" OFF)ENDIF()IF(PA_USE_ALSA)SET(PA_PRIVATE_INCLUDE_PATHS ${PA_PRIVATE_INCLUDE_PATHS} ${ALSA_INCLUDE_DIRS})SET(PA_ALSA_SOURCES src/hostapi/alsa/pa_linux_alsa.c)SOURCE_GROUP("hostapi\\ALSA" FILES ${PA_ALSA_SOURCES})SET(PA_PUBLIC_INCLUDES ${PA_PUBLIC_INCLUDES} include/pa_linux_alsa.h)SET(PA_SOURCES ${PA_SOURCES} ${PA_ALSA_SOURCES})SET(PA_PRIVATE_COMPILE_DEFINITIONS ${PA_PRIVATE_COMPILE_DEFINITIONS} PA_USE_ALSA)IF(PA_ALSA_DYNAMIC)SET(PA_PRIVATE_COMPILE_DEFINITIONS ${PA_PRIVATE_COMPILE_DEFINITIONS} PA_ALSA_DYNAMIC)SET(PA_LIBRARY_DEPENDENCIES ${PA_LIBRARY_DEPENDENCIES} ${CMAKE_DL_LIBS})SET(PA_PKGCONFIG_LDFLAGS "${PA_PKGCONFIG_LDFLAGS} -l${CMAKE_DL_LIBS}")ELSE()SET(PA_LIBRARY_DEPENDENCIES ${PA_LIBRARY_DEPENDENCIES} ${ALSA_LIBRARIES})SET(PA_PKGCONFIG_LDFLAGS "${PA_PKGCONFIG_LDFLAGS} -lasound")ENDIF()ENDIF()ENDIF()SET(PA_PKGCONFIG_LDFLAGS "${PA_PKGCONFIG_LDFLAGS} -lm -lpthread")SET(PA_LIBRARY_DEPENDENCIES ${PA_LIBRARY_DEPENDENCIES} m pthread)ENDIF()SOURCE_GROUP("include" FILES ${PA_PUBLIC_INCLUDES})SET(PA_INCLUDES ${PA_PRIVATE_INCLUDES} ${PA_PUBLIC_INCLUDES})IF(WIN32)OPTION(PA_UNICODE_BUILD "Enable Portaudio Unicode build" ON)IF(PA_UNICODE_BUILD)SET_SOURCE_FILES_PROPERTIES(${PA_SOURCES} PROPERTIES COMPILE_DEFINITIONS "UNICODE;_UNICODE")ENDIF()
ENDIF()OPTION(PA_ENABLE_DEBUG_OUTPUT "Enable debug output for Portaudio" OFF)
IF(PA_ENABLE_DEBUG_OUTPUT)SET(PA_PRIVATE_COMPILE_DEFINITIONS ${PA_PRIVATE_COMPILE_DEFINITIONS} PA_ENABLE_DEBUG_OUTPUT)
ENDIF()INCLUDE(TestBigEndian)
TEST_BIG_ENDIAN(IS_BIG_ENDIAN)
IF(IS_BIG_ENDIAN)SET(PA_PRIVATE_COMPILE_DEFINITIONS ${PA_PRIVATE_COMPILE_DEFINITIONS} PA_BIG_ENDIAN)
ELSE()SET(PA_PRIVATE_COMPILE_DEFINITIONS ${PA_PRIVATE_COMPILE_DEFINITIONS} PA_LITTLE_ENDIAN)
ENDIF()OPTION(PA_BUILD_STATIC "Build static library" ON)
OPTION(PA_BUILD_SHARED "Build shared/dynamic library" ON)IF(MSVC)OPTION(PA_LIBNAME_ADD_SUFFIX "Add suffix _static to static library name" ON)
ELSE()OPTION(PA_LIBNAME_ADD_SUFFIX "Add suffix _static to static library name" OFF)
ENDIF()# MSVC: if PA_LIBNAME_ADD_SUFFIX is not used, and both static and shared libraries are
# built, one, of import- and static libraries, will overwrite the other. In
# embedded builds this is not an issue as they will only build the configuration
# used in the host application.
MARK_AS_ADVANCED(PA_LIBNAME_ADD_SUFFIX)
IF(MSVC AND PA_BUILD_STATIC AND PA_BUILD_SHARED AND NOT PA_LIBNAME_ADD_SUFFIX)MESSAGE(WARNING "Building both shared and static libraries, and avoiding the suffix _static will lead to a name conflict")SET(PA_LIBNAME_ADD_SUFFIX ON CACHE BOOL "Forcing use of suffix _static to avoid name conflict between static and import library" FORCE)MESSAGE(WARNING "PA_LIBNAME_ADD_SUFFIX was set to ON")
ENDIF()SET(PA_TARGETS "")IF(PA_BUILD_SHARED)LIST(APPEND PA_TARGETS portaudio)ADD_LIBRARY(portaudio SHARED ${PA_INCLUDES} ${PA_COMMON_INCLUDES} ${PA_SOURCES} ${PA_NON_UNICODE_SOURCES} ${PA_EXTRA_SHARED_SOURCES})SET_PROPERTY(TARGET portaudio APPEND_STRING PROPERTY COMPILE_DEFINITIONS ${PA_PRIVATE_COMPILE_DEFINITIONS})TARGET_INCLUDE_DIRECTORIES(portaudio PRIVATE ${PA_PRIVATE_INCLUDE_PATHS})TARGET_INCLUDE_DIRECTORIES(portaudio PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>" "$<INSTALL_INTERFACE:include>")TARGET_LINK_LIBRARIES(portaudio ${PA_LIBRARY_DEPENDENCIES})
ENDIF()IF(PA_BUILD_STATIC)LIST(APPEND PA_TARGETS portaudio_static)ADD_LIBRARY(portaudio_static STATIC ${PA_INCLUDES} ${PA_COMMON_INCLUDES} ${PA_SOURCES} ${PA_NON_UNICODE_SOURCES})SET_PROPERTY(TARGET portaudio_static APPEND_STRING PROPERTY COMPILE_DEFINITIONS ${PA_PRIVATE_COMPILE_DEFINITIONS})TARGET_INCLUDE_DIRECTORIES(portaudio_static PRIVATE ${PA_PRIVATE_INCLUDE_PATHS})TARGET_INCLUDE_DIRECTORIES(portaudio_static PUBLIC "$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>" "$<INSTALL_INTERFACE:include>")TARGET_LINK_LIBRARIES(portaudio_static ${PA_LIBRARY_DEPENDENCIES})IF(NOT PA_LIBNAME_ADD_SUFFIX)SET_PROPERTY(TARGET portaudio_static PROPERTY OUTPUT_NAME portaudio)ENDIF()
ENDIF()IF(WIN32 AND MSVC)OPTION(PA_CONFIG_LIB_OUTPUT_PATH "Make sure that output paths are kept neat" OFF)IF(CMAKE_CL_64)SET(TARGET_POSTFIX x64)IF(PA_CONFIG_LIB_OUTPUT_PATH)SET(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/bin/x64)ENDIF()ELSE()SET(TARGET_POSTFIX x86)IF(PA_CONFIG_LIB_OUTPUT_PATH)SET(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/bin/Win32)ENDIF()ENDIF()IF(PA_BUILD_SHARED)IF(PA_LIBNAME_ADD_SUFFIX)SET_TARGET_PROPERTIES(portaudio PROPERTIES OUTPUT_NAME portaudio_${TARGET_POSTFIX})ELSE()SET_TARGET_PROPERTIES(portaudio PROPERTIES OUTPUT_NAME portaudio)ENDIF()ENDIF()IF(PA_BUILD_STATIC)IF(PA_LIBNAME_ADD_SUFFIX)SET_TARGET_PROPERTIES(portaudio_static PROPERTIES OUTPUT_NAME portaudio_static_${TARGET_POSTFIX})ELSE()SET_TARGET_PROPERTIES(portaudio_static PROPERTIES OUTPUT_NAME portaudio)ENDIF()ENDIF()
ELSE()IF(APPLE AND CMAKE_VERSION VERSION_GREATER 3.4.2)OPTION(PA_OUTPUT_OSX_FRAMEWORK "Generate an OS X framework instead of the simple library" OFF)IF(PA_OUTPUT_OSX_FRAMEWORK)SET_TARGET_PROPERTIES(portaudio PROPERTIESFRAMEWORK TRUEMACOSX_FRAMEWORK_IDENTIFIER com.portaudioFRAMEWORK_VERSION APUBLIC_HEADER "${PA_PUBLIC_INCLUDES}"VERSION ${PA_SOVERSION}SOVERSION ${PA_SOVERSION})ENDIF()ENDIF()
ENDIF()# At least on Windows in embedded builds, portaudio's install target should likely
# not be executed, as the library would usually already be installed as part of, and
# by means of the host application.
# The option below offers the option to avoid executing the portaudio install target
# for cases in which the host-application executes install, but no independent install
# of portaudio is wished.
OPTION(PA_DISABLE_INSTALL "Disable targets install and uninstall (for embedded builds)" OFF)IF(NOT PA_OUTPUT_OSX_FRAMEWORK AND NOT PA_DISABLE_INSTALL)INCLUDE(CMakePackageConfigHelpers)CONFIGURE_PACKAGE_CONFIG_FILE(cmake_support/portaudioConfig.cmake.in ${CMAKE_BINARY_DIR}/cmake/portaudio/portaudioConfig.cmakeINSTALL_DESTINATION "lib/cmake/portaudio"NO_CHECK_REQUIRED_COMPONENTS_MACRO)WRITE_BASIC_PACKAGE_VERSION_FILE(${CMAKE_BINARY_DIR}/cmake/portaudio/portaudioConfigVersion.cmakeVERSION ${PA_VERSION}COMPATIBILITY SameMajorVersion)CONFIGURE_FILE(cmake_support/portaudio-2.0.pc.in ${CMAKE_CURRENT_BINARY_DIR}/portaudio-2.0.pc @ONLY)INSTALL(FILES README.md DESTINATION share/doc/portaudio)INSTALL(FILES LICENSE.txt DESTINATION share/doc/portaudio)INSTALL(FILES ${CMAKE_CURRENT_BINARY_DIR}/portaudio-2.0.pc DESTINATION lib/pkgconfig)INSTALL(FILES ${PA_PUBLIC_INCLUDES} DESTINATION include)INSTALL(TARGETS ${PA_TARGETS}EXPORT portaudio-targetsRUNTIME DESTINATION binLIBRARY DESTINATION libARCHIVE DESTINATION lib)INSTALL(EXPORT portaudio-targets FILE "portaudioTargets.cmake" DESTINATION "lib/cmake/portaudio")EXPORT(TARGETS ${PA_TARGETS} FILE "${PROJECT_BINARY_DIR}/cmake/portaudio/portaudioTargets.cmake")INSTALL(FILES "${CMAKE_BINARY_DIR}/cmake/portaudio/portaudioConfig.cmake""${CMAKE_BINARY_DIR}/cmake/portaudio/portaudioConfigVersion.cmake"DESTINATION "lib/cmake/portaudio")IF (NOT TARGET uninstall)CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/cmake_support/cmake_uninstall.cmake.in""${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake"IMMEDIATE @ONLY)ADD_CUSTOM_TARGET(uninstallCOMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)ENDIF()
ENDIF()# Prepared for inclusion of test files
OPTION(PA_BUILD_TESTS "Include test projects" OFF)
IF(PA_BUILD_TESTS)SUBDIRS(test)
ENDIF()# Prepared for inclusion of test files
OPTION(PA_BUILD_EXAMPLES "Include example projects" OFF)
IF(PA_BUILD_EXAMPLES)SUBDIRS(examples)
ENDIF()
  • compile_cmake.dox 文件信息:
/** @page compile_cmake PortAudio on Windows, OS X or Linux via. CMake
@ingroup tutorial@section cmake_building Building PortAudio stand-alone on Windows, OS X or LinuxCMake can be used to generate Visual Studio solutions on Windows, Makefiles (on Linux and OS X) and build metadata for other build systems for PortAudio. You should obtain a recent version of CMake from [http://www.cmake.org] if you do not have one already. If you are unfamiliar with CMake, this section will provide some information on using CMake to build PortAudio.On Linux, CMake serves a very similar purpose to an autotools "configure" script - except it can generate build metadata apart from Makefiles. The equivalent of the following on POSIX'y systems:build_path> {portaudio path}/configure --prefix=/install_locationbuild_path> makebuild_path> make installWould be:build_path> cmake {portaudio path} -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=/install_locationbuild_path> makebuild_path> make installThe "-G" option specifies the type of build metadata which will be generated. You can obtain a list of supported build metadata formats by invoking (on any platform):cmake -G"make install" should install the same set of files that are installed using the usual configure script included with PortAudio along with a few extra files (similar to pkg-config metadata files) which make it easier for other CMake projects to use the installed libraries.On Windows, you can use CMake to generate Visual Studio project files which can be used to create the PortAudio libraries. The following serves as an example (and should be done from a directory outside the PortAudio tree) which will create Visual Studio 2015 project files targeting a 64-bit build:C:\PABUILD> cmake {portaudio path} -G "Visual Studio 14 2015 Win64"After executing the above, you can either open the generated solution with Visual Studio or use CMake to invoke the build process. The following shows an example of how to build a release configuration (assuming the above command was executed previously in the same directory):C:\PABUILD> cmake --build . --config ReleaseIf you want ASIO support you need to obtain the ASIO2 SDK from Steinberg and place it according to \ref compile_windows_asio_msvc. Both ASIO and the DirectX SDK are automatically searched for by the CMake script - if they are found, they will be enabled by default.@section cmake_using Using PortAudio in your CMake projectPortAudio defines the following CMake targets:- "portaudio_static" for a static library and- "portaudio" for a dynamic libraryIf you installed PortAudio as described above in \ref cmake_building and the install prefix you used (CMAKE_INSTALL_PREFIX) is in your system PATH or CMAKE_MODULE_PATH CMake variable, you should be able to use:find_package(portaudio)To define the "portaudio_static" and "portaudio" targets in your CMake project.If you do not want to install portaudio into your system but would rather just have it get built as part of your own project (which may be particularly convenient on Windows), you may also use:add_subdirectory("path to PortAudio location" "some binary directory" EXCLUDE_FROM_ALL)EXCLUDE_FROM_ALL is not strictly necessary, but will ensure that targets which you don't use in your project won't get built.Back to \ref tutorial_start*/
  • c-cpp.yml 文件信息:
name: C/C++ CIon:push:branches: [ master ]pull_request:branches: [ master ]jobs:build:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: configurerun: ./configure- name: makerun: makebuild-cmake:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: cmakerun: cmake .- name: makerun: makebuild-cmake-msvc:runs-on: windows-lateststeps:- uses: actions/checkout@v1- name: cmakerun: cmake .- name: buildrun: cmake --build .build-cmake-mingw:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: aptrun: sudo apt-get install mingw-w64- name: cmakerun: cmake -DCMAKE_TOOLCHAIN_FILE=i686-w64-mingw32.cmake .- name: makerun: make
http://www.lryc.cn/news/615194.html

相关文章:

  • occworld(1):论文解读
  • Ghost备份分区设置分包大小方法
  • 任务发布悬赏查询管理地推抖音快手微信任务赚佣金网站源码功能详解二开
  • 谷歌警告云存储桶劫持攻击
  • 让大模型 “睡觉”:把版本迭代当作人类睡眠来设计(附可直接改造的训练作息表与代码)
  • n沟道增强型mos管
  • B.10.01.6-DDD领域驱动设计:从理论到落地的完整指南
  • Typora上传图片保存到assets目录下
  • 第十四届蓝桥杯青少年组省赛 编程题真题题解
  • stm32项目(24)——基于STM32的汽车CAN通信系统
  • WinForm 复合控件(用户控件):创建与使用指南
  • 深入 FastMCP 源码:认识 tool()、resource() 和 prompt() 装饰器
  • sqli-labs通关笔记-第39关 GET数值型堆叠注入(手工注入+脚本注入两种方法)
  • 数据分析框架从 “工具堆砌” 转向 “智能协同”
  • 大语言模型提示工程与应用:提示工程-提升模型准确性与减少偏见的方法
  • node.js 零基础入门
  • 学习嵌入式第二十四天
  • Kotlin 协程线程切换机制详解
  • M8-11 RFID模块通过RS485转Profinet网关与PLC通信的配置指南
  • 安装NodeJS和TypeScript简要指南
  • 虚拟机远程连接报错解决办法
  • 「iOS」————分类与扩展
  • 书生浦语第五期-L1G4-InternLM 论文分类微调实践(XTuner 版)
  • 代码随想录day60图论10
  • 快速使用selenium+java案例
  • Nginx 性能优化与动态内容处理
  • TOMCAT笔记
  • 七、《Serverless架构:按毫秒计费的成本革命》--从新浪AI推理平台50%效能提升看无服务器本质
  • 前端如何安全存储 API 密钥 —— 两种实用方案
  • CosyVoice 语音合成模型性能优化实战:从 CPU 瓶颈到 GPU 加速的完整解决方案