Skip to content

Commit 9afe6e9

Browse files
authored
Add initial support for build system generation with CMake (#4494)
1 parent bf41e86 commit 9afe6e9

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+5728
-8
lines changed

CMakeLists.txt

Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
cmake_minimum_required(VERSION 3.28...4.0)
2+
3+
project(pjproject
4+
VERSION 2.15
5+
DESCRIPTION "Multimedia communication library"
6+
HOMEPAGE_URL "http://www.pjsip.org"
7+
LANGUAGES C CXX
8+
)
9+
10+
# project modules
11+
list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
12+
13+
# experimental warning notice
14+
option(PJ_SKIP_EXPERIMENTAL_NOTICE OFF)
15+
if (NOT PJ_SKIP_EXPERIMENTAL_NOTICE)
16+
message(WARNING
17+
" ****************************************************\n"
18+
" * Building `pjproject` with CMake is experimental *\n"
19+
" *--------------------------------------------------*\n"
20+
" * Tested platforms: *\n"
21+
" * - Linux x86_64 *\n"
22+
" ****************************************************\n"
23+
"Set `PJ_SKIP_EXPERIMENTAL_NOTICE=ON` to disable this warning"
24+
)
25+
endif()
26+
27+
# ##############################################################################
28+
# Testing support
29+
30+
if(CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME)
31+
include(CTest)
32+
endif()
33+
34+
if(BUILD_TESTING)
35+
if(CMAKE_SYSTEM_NAME MATCHES "rtems")
36+
set(PJ_TEST_MAIN "main_rtems.c")
37+
else()
38+
set(PJ_TEST_MAIN "main.c")
39+
endif()
40+
endif()
41+
42+
# ##############################################################################
43+
# Installation preparation
44+
45+
include(GNUInstallDirs)
46+
47+
# add `$ORIGIN` to targets' RPATH
48+
if(BUILD_SHARED_LIBS)
49+
if(APPLE)
50+
list(APPEND CMAKE_INSTALL_RPATH
51+
"@loader_path"
52+
"@executable_path/../${CMAKE_INSTALL_LIBDIR}"
53+
)
54+
elseif(UNIX)
55+
list(APPEND CMAKE_INSTALL_RPATH
56+
"$ORIGIN"
57+
"$ORIGIN/../${CMAKE_INSTALL_LIBDIR}"
58+
)
59+
endif()
60+
endif()
61+
62+
# ##############################################################################
63+
# Sub-directories
64+
65+
# base library
66+
add_subdirectory(pjlib)
67+
68+
# third-party libraries
69+
add_subdirectory(third_party)
70+
71+
# remaning libraries
72+
add_subdirectory(pjlib-util)
73+
add_subdirectory(pjnath)
74+
add_subdirectory(pjmedia)
75+
add_subdirectory(pjsip)
76+
add_subdirectory(pjsip-apps)
77+
78+
# ##############################################################################
79+
# Installation
80+
81+
set(install_targets
82+
pjlib
83+
pjlib-ssl
84+
pjlib++
85+
pjlib-util
86+
pjnath
87+
pjmedia
88+
pjmedia-codec
89+
pjmedia-audiodev
90+
pjmedia-videodev
91+
pjsip
92+
pjsip-simple
93+
pjsip-ua
94+
pjsua-lib
95+
pjsua2
96+
pjsua
97+
)
98+
99+
# set `VERSION` and `SO_VERSION`
100+
foreach(target IN LISTS install_targets)
101+
set_target_properties(${target} PROPERTIES
102+
VERSION ${PROJECT_VERSION}
103+
SOVERSION ${PROJECT_VERSION_MAJOR}
104+
)
105+
endforeach()
106+
107+
# install targets
108+
install(
109+
TARGETS ${install_targets}
110+
EXPORT PjTargets
111+
112+
FILE_SET HEADERS
113+
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
114+
COMPONENT PjDevelopment
115+
FILE_SET config_headers
116+
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}"
117+
COMPONENT PjDevelopment
118+
RUNTIME
119+
DESTINATION "${CMAKE_INSTALL_BINDIR}"
120+
COMPONENT PjRuntime
121+
LIBRARY
122+
DESTINATION "${CMAKE_INSTALL_LIBDIR}"
123+
COMPONENT PjRuntime
124+
NAMELINK_COMPONENT PjDevelopment
125+
ARCHIVE
126+
DESTINATION "${CMAKE_INSTALL_BINDIR}"
127+
COMPONENT PjDevelopment
128+
)
129+
130+
# ##############################################################################
131+
# CMAKe Package config
132+
133+
include(CMakePackageConfigHelpers)
134+
135+
set(PJ_CMAKE_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/Pj")
136+
set(PJ_CMAKE_TARGETS_FILE "PjTargets.cmake")
137+
set(PJ_CMAKE_CONFIG_FILE "PjConfig.cmake")
138+
set(PJ_CMAKE_CONFIG_VERSION_FILE "jConfigVersion.cmake")
139+
140+
# install exports
141+
install(
142+
EXPORT PjTargets
143+
NAMESPACE Pj::
144+
FILE "${PJ_CMAKE_TARGETS_FILE}"
145+
DESTINATION "${PJ_CMAKE_INSTALL_DIR}"
146+
COMPONENT PjDevelopment
147+
)
148+
149+
# write package config
150+
configure_package_config_file(
151+
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/Pj/${PJ_CMAKE_CONFIG_FILE}.in"
152+
"${CMAKE_CURRENT_BINARY_DIR}/${PJ_CMAKE_CONFIG_FILE}"
153+
154+
INSTALL_DESTINATION "${PJ_CMAKE_INSTALL_DIR}"
155+
)
156+
157+
# write package config version
158+
write_basic_package_version_file(
159+
"${PJ_CMAKE_CONFIG_VERSION_FILE}"
160+
161+
COMPATIBILITY SameMajorVersion
162+
)
163+
164+
install(FILES
165+
"${CMAKE_CURRENT_BINARY_DIR}/${PJ_CMAKE_CONFIG_FILE}"
166+
"${CMAKE_CURRENT_BINARY_DIR}/${PJ_CMAKE_CONFIG_VERSION_FILE}"
167+
168+
DESTINATION "${PJ_CMAKE_INSTALL_DIR}"
169+
COMPONENT PjDevelopment
170+
)
171+
172+
# ##############################################################################
173+
# pkg-config file
174+
175+
set(PREFIX "${CMAKE_INSTALL_PREFIX}") # this should be done at install time
176+
set(LIBDIR "${PREFIX}/${CMAKE_INSTALL_LIBDIR}")
177+
set(INCLUDEDIR "${PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}")
178+
set(PJ_VERSION "${PROJECT_VERSION}")
179+
set(PJ_INSTALL_LDFLAGS "")
180+
set(PJ_INSTALL_LDFLAGS "")
181+
182+
configure_file(
183+
"${CMAKE_CURRENT_SOURCE_DIR}/libpjproject.pc.in"
184+
"${CMAKE_CURRENT_BINARY_DIR}/libpjproject.pc"
185+
)
186+
187+
install(
188+
FILES "${CMAKE_CURRENT_BINARY_DIR}/libpjproject.pc"
189+
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig"
190+
)

cmake/DetectWebRTCParameters.cmake

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
include(Pj/DetectArch)
2+
pj_detect_arch(arch)
3+
pj_detect_arch_simd_ext(simd_inst simd_flags)
4+
5+
set(WEBRTC_ARCH "${arch}")
6+
set(WEBRTC_ARCH_SIMD "${simd_inst}")
7+
set(WEBRTC_COMPILE_OPTIONS ${simd_flags})
8+
set(WEBRTC_COMPILE_DEFINITIONS WEBRTC_APM_DEBUG_DUMP=0)
9+
10+
# operating system definitions
11+
if(IOS)
12+
list(APPEND WEBRTC_COMPILE_DEFINITIONS WEBRTC_IOS=1 WEBRTC_POSIX=1)
13+
elseif(DARWIN)
14+
list(APPEND WEBRTC_COMPILE_DEFINITIONS WEBRTC_MAC=1 WEBRTC_POSIX=1)
15+
elseif(ANDROID)
16+
list(APPEND WEBRTC_COMPILE_DEFINITIONS WEBRTC_ANDROID=1 WEBRTC_POSIX=1)
17+
elseif(LINUX)
18+
list(APPEND WEBRTC_COMPILE_DEFINITIONS WEBRTC_LINUX=1 WEBRTC_POSIX=1)
19+
elseif(WIN32)
20+
list(APPEND WEBRTC_COMPILE_DEFINITIONS WEBRTC_WIN=1)
21+
endif()
22+
23+
if (MSVC)
24+
list(APPEND WEBRTC_COMPILE_DEFINITIONS NOMINMAX)
25+
endif()
26+
27+
# architecture definitions
28+
if(arch STREQUAL "arm64")
29+
list(APPEND WEBRTC_COMPILE_DEFINITIONS WEBRTC_ARCH_ARM64=1)
30+
elseif(arch STREQUAL "mips")
31+
list(APPEND WEBRTC_COMPILE_DEFINITIONS MIPS_FPU_LE=1)
32+
endif()
33+
34+
if(simd_inst STREQUAL "neon")
35+
list(APPEND WEBRTC_COMPILE_DEFINITIONS WEBRTC_HAS_NEON=1)
36+
endif()

cmake/FindBCG729.cmake

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
find_package(PkgConfig QUIET)
2+
if(PKG_CONFIG_FOUND)
3+
pkg_search_module(PC_BCG729 bcg729 libbcg729)
4+
set(BCG729_VERSION ${PC_BCG729_VERSION})
5+
endif()
6+
7+
find_path(BCG729_INCLUDE_DIR
8+
NAMES
9+
"bcg729/encoder.h"
10+
HINTS
11+
${PC_BCG729_INCLUDEDIR}
12+
${PC_BCG729_INCLUDE_DIRS}
13+
)
14+
mark_as_advanced(BCG729_INCLUDE_DIR)
15+
16+
find_library(BCG729_LIBRARY
17+
NAMES
18+
bcg729
19+
libbcg729
20+
HINTS
21+
${PC_BCG729_LIBDIR}
22+
${PC_BCG729_LIBRARY_DIRS}
23+
)
24+
mark_as_advanced(BCG729_LIBRARY)
25+
26+
include(FindPackageHandleStandardArgs)
27+
find_package_handle_standard_args(BCG729
28+
REQUIRED_VARS
29+
BCG729_LIBRARY
30+
BCG729_INCLUDE_DIR
31+
VERSION_VAR
32+
BCG729_VERSION
33+
)
34+
35+
if(BCG729_FOUND)
36+
set(BCG729_LIBRARIES ${BCG729_LIBRARY})
37+
set(BCG729_INCLUDE_DIRS ${BCG729_INCLUDE_DIR})
38+
set(BCG729_DEFINITIONS ${PC_BCG729_CFLAGS_OTHER})
39+
40+
if(NOT TARGET BCG729::BCG729)
41+
add_library(BCG729::BCG729 UNKNOWN IMPORTED)
42+
set_target_properties(BCG729::BCG729 PROPERTIES
43+
IMPORTED_LOCATION "${BCG729_LIBRARIES}"
44+
INTERFACE_INCLUDE_DIRECTORIES "${BCG729_INCLUDE_DIRS}"
45+
INTERFACE_COMPILE_OPTIONS "${BCG729_DEFINITIONS}"
46+
)
47+
endif()
48+
endif()

cmake/FindCoreAudio.cmake

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
set(_coreaudio_libs)
2+
foreach(_coreaudio_lib IN ITEMS CoreAudio AudioToolbox Foundation AppKit)
3+
string(TOUPPER "CoreAudio_LIBRARY_${_coreaudio_lib}" _coreaudio_lib_var)
4+
list(APPEND _coreaudio_required_vars ${_coreaudio_lib_var})
5+
6+
find_library(${_coreaudio_lib_var} "${_coreaudio_lib}")
7+
mark_as_advanced(${_coreaudio_lib_var})
8+
if(${_coreaudio_lib_var})
9+
list(APPEND _coreaudio_libs "${${_coreaudio_lib_var}}")
10+
endif()
11+
endforeach()
12+
unset(_coreaudio_lib)
13+
unset(_coreaudio_lib_var)
14+
15+
include(FindPackageHandleStandardArgs)
16+
find_package_handle_standard_args(CoreAudio
17+
REQUIRED_VARS
18+
${_coreaudio_required_vars}
19+
)
20+
21+
if(CoreAudio_FOUND)
22+
set(CoreAudio_LIBRARIES ${_coreaudio_libs})
23+
24+
if(NOT TARGET CoreAudio::CoreAudio)
25+
add_library(coreaudio INTERFACE)
26+
set_target_properties(coreaudio PROPERTIES
27+
INTERFACE_LINK_LIBRARIES "${CoreAudio_LIBRARIES}"
28+
)
29+
add_library(CoreAudio::CoreAudio ALIAS coreaudio)
30+
endif()
31+
endif()
32+
33+
unset(_coreaudio_libs)
34+
unset(_coreaudio_required_vars)

0 commit comments

Comments
 (0)