使用 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
提供了一个非常简单的 API
来录制和/或播放声音 使用简单的回调函数或阻塞读/写接口。包括示例程序 播放正弦波,处理音频输入(吉他模糊),录制和播放音频, 列出可用的音频设备等。
Portaudio Wiki
由 PortAudio
开发人员社区维护。它拥有最新的信息,建议作为探索 PortAudio
的起点。PortAudio
开发人员和用户在 PortAudio
邮件列表中保持联系。请随时加入。
PortAudio
项目和 API
是由 Ross
提出的 Bencina
到 music-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
编译器集合)
CMake
(Cross-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
- 项目构建配置文件,定义项目结构和构建规则 -
全工具链工作流程
- 使用
cmake/vs
编译的工作流程(本文使用的)
Windows 安装 mingw-w64
MSYS2
是工具和库的集合,为您提供了 用于构建、安装和运行本机 Windows
的易于使用的环境 软件。
MSYS2
的主要重点是提供 原生 Windows 软件的构建环境和使用 Cygwin 的部件 是保持在最低限度。MSYS2
为 GCC
提供最新的原生版本,mingw-w64, CPython、CMake、Meson、OpenSSL、FFmpeg、Rust、Ruby
,仅举几例。
说明:安装
MSYS2
需要64
位Windows 10
或更高版本。
安装成功 MSYS2
后,系统会有三个终端,分别如下:
- SMYS
- CLANG64
- UCRT64
这三个终端是 MSYS2
提供的不同编译环境,各有不同的用途和特点:
MSYS2 的三种编译环境
1. MSYS (MSYS2)
- 用途:主要用于构建
POSIX
兼容的类Unix
程序 - 特点:
- 提供类
Unix
环境(模拟POSIX
) - 主要用于构建在
MSYS2
环境内运行的程序 - 不适合构建原生
Windows
应用程序
- 提供类
2. CLANG64
- 用途:使用
Clang/LLVM
编译器工具链构建64
位Windows
应用程序 - 特点:
- 使用
Clang
编译器而非GCC
- 构建的程序使用
MSVCRT
运行时库 - 生成原生
Windows
可执行文件 - 启动后默认使用
clang64
工具链
- 使用
3. UCRT64
- 用途:使用
GCC
编译器工具链构建64
位Windows
应用程序 - 特点:
- 使用
GCC
编译器 - 使用
Windows 10
的通用C运行时库
(Universal C Runtime
) - 生成原生
Windows
可执行文件 - 是目前推荐的用于构建现代
Windows
应用的环境
- 使用
选择建议
- 如果您需要使用
GCC
编译器,应该使用 UCRT64 - 如果您偏好
Clang
编译器,应该使用 CLANG64 - MSYS 主要用于构建在
MSYS2
环境内部运行的工具
如果启动的其他终端(CLANG64
或 MSYS
),切换到 UCRT64
环境执行命令
Jeffrey@Pods CLANG64 ~
$ /ucrt64.exe
通常使用 MSYS2
和 mingw-w64 GCC/CMake
搭配使用:
这里我们使用 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]
- 输入
Y
按Enter
继续:
- 查看
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
输出如下信息:
- 切换到目录后,您可以执行以下命令:
# 查看当前目录
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/
获取)。
- 勾选工作负荷安装
- 安装完成后重启系统
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 2022
的 64
位项目文件,源代码位于上一级目录。
- 使用场景
通常在以下目录结构中使用:
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/Release
或build/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.dll
和build/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/
。 - 示例和测试程序在
examples
和test
目录。 - 更多
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