feat: add install target for cmake (#1269)

this adds an install target which will install binaries, libraries, pkg-config and headers, along with a simple link-test program to verify the installed library and headers work.

---------

Co-authored-by: Joey Parrish <joeyparrish@google.com>
This commit is contained in:
Cosmin Stejerean 2023-10-16 13:08:48 -07:00 committed by GitHub
parent 0295ef182b
commit b224fb6e57
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 108 additions and 149 deletions

View File

@ -24,3 +24,4 @@ enable_testing()
# Subdirectories with their own CMakeLists.txt
add_subdirectory(packager)
add_subdirectory(link-test)

31
link-test/CMakeLists.txt Normal file
View File

@ -0,0 +1,31 @@
# Copyright 2023 Google LLC. All rights reserved.
#
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file or at
# https://developers.google.com/open-source/licenses/bsd
# If we're building a shared library, make sure it works. We only do this for
# a shared library because the static library won't wrap the third-party
# dependencies like absl.
if(LIBPACKAGER_SHARED)
# Install the library and headers to a temporary location.
set(TEST_INSTALL_DIR ${CMAKE_BINARY_DIR}/test-install)
add_custom_target(test-install ALL
DEPENDS mpd_generator packager libpackager
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
COMMAND
${CMAKE_COMMAND} --install . --prefix ${TEST_INSTALL_DIR} --config "$<CONFIG>")
# Then try to build a very simplistic test app to prove that we can include
# the headers and link the library.
add_executable(packager_link_test test.cc)
add_dependencies(packager_link_test test-install)
target_link_directories(packager_link_test PRIVATE ${TEST_INSTALL_DIR}/lib)
target_include_directories(packager_link_test PRIVATE ${TEST_INSTALL_DIR}/include)
if(NOT MSVC)
target_link_libraries(packager_link_test -lpackager)
else()
target_link_libraries(packager_link_test ${TEST_INSTALL_DIR}/lib/libpackager.lib)
endif()
endif()

5
link-test/README.md Normal file
View File

@ -0,0 +1,5 @@
# Link test for libpackager
This is a dummy application to test linking libpackager. It gives us a build
target that validates our install target works and that our public headers (in
`../include/packager/...`) are complete and self-contained.

35
link-test/test.cc Normal file
View File

@ -0,0 +1,35 @@
// Copyright 2023 Google LLC. All rights reserved.
//
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file or at
// https://developers.google.com/open-source/licenses/bsd
// This is a simple app to test linking against a shared libpackager on all
// platforms. It's not meant to do anything useful at all.
#include <cstdio>
#include <vector>
#include <packager/packager.h>
int main(int argc, char** argv) {
// Unused. Silence warnings.
(void)argc;
(void)argv;
// Print the packager version.
std::cout << "Packager v" + shaka::Packager::GetLibraryVersion() + "\n";
// Don't bother filling these out. Just make sure it links.
shaka::PackagingParams packaging_params;
std::vector<shaka::StreamDescriptor> stream_descriptors;
// This will fail.
shaka::Packager packager;
shaka::Status status =
packager.Initialize(packaging_params, stream_descriptors);
// Just print the status to make sure we can do that in a custom app.
std::cout << status.ToString() + "\n";
return 0;
}

View File

@ -6,6 +6,9 @@
# Packager CMake build file.
# Include a module to define standard install directories.
include(GNUInstallDirs)
# Build static libs by default, or shared if LIBPACKAGER_SHARED is defined.
if(LIBPACKAGER_SHARED)
add_definitions(-DSHARED_LIBRARY_BUILD)
@ -114,6 +117,10 @@ target_link_libraries(libpackager
string_utils
version
)
# Avoid liblibpackager on Windows:
if(NOT MSVC)
set_property(TARGET libpackager PROPERTY OUTPUT_NAME packager)
endif()
add_executable(packager
app/ad_cue_generator_flags.cc
@ -183,3 +190,14 @@ target_link_libraries(packager_test
gmock
gtest
gtest_main)
configure_file(packager.pc.in packager.pc @ONLY)
install(TARGETS mpd_generator packager libpackager
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
install(DIRECTORY ../include/packager
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
install(FILES tools/pssh/pssh-box.py DESTINATION ${CMAKE_INSTALL_BINDIR})
install(FILES ${CMAKE_BINARY_DIR}/packager/packager.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)

View File

@ -1,149 +0,0 @@
# Copyright 2014 Google LLC. All rights reserved.
#
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file or at
# https://developers.google.com/open-source/licenses/bsd
#
# This file contains common settings for building packager components.
{
'variables': {
'variables': {
'shaka_code%': 0,
# musl is a lightweight C standard library used in Alpine Linux.
'musl%': 0,
# This is a flag from build/common.gypi to allow linker warnings.
# This may be necessary with static_link_binaries=1.
'disable_fatal_linker_warnings%': '0',
'libpackager_type%': 'static_library',
'static_link_binaries%': '0',
},
'shaka_code%': '<(shaka_code)',
'musl%': '<(musl)',
'disable_fatal_linker_warnings%': '<(disable_fatal_linker_warnings)',
'libpackager_type%': '<(libpackager_type)',
'static_link_binaries%': '<(static_link_binaries)',
'conditions': [
['shaka_code==1', {
# This enable warnings and warnings-as-errors.
'chromium_code': 1,
}],
# These are some Chromium build settings that are normally keyed off of
# component=="shared_library". We don't use component=="shared_library"
# because it would result in a shared lib for every single component, but
# we still need these settings for a shared library build of libpackager
# on Windows.
['libpackager_type=="shared_library"', {
# Make sure we use a dynamic CRT to avoid issues with std::string in
# the library API on Windows.
'win_release_RuntimeLibrary': '2', # 2 = /MD (nondebug DLL)
'win_debug_RuntimeLibrary': '3', # 3 = /MDd (debug DLL)
# Skip the Windows allocator shim on Windows. Using this with a shared
# library results in build errors.
'win_use_allocator_shim': 0,
}],
],
},
'target_defaults': {
'defines': [
# These defines make the contents of base/mac/foundation_util.h compile
# against the standard OSX SDK, by renaming Chrome's opaque type and
# using the real OSX type. This was not necessary before we switched
# away from using hermetic copies of clang and the sysroot to build.
'OpaqueSecTrustRef=__SecACL',
'OpaqueSecTrustedApplicationRef=__SecTrustedApplication',
],
'conditions': [
['shaka_code==1', {
'include_dirs': [
'.',
'..',
],
'cflags': [
# This is triggered by logging macros.
'-Wno-implicit-fallthrough',
# Triggered by unit tests, which override things in mocks. gmock
# doesn't mark them as override. An upgrade may help. TODO: try
# upgrading gmock.
'-Wno-inconsistent-missing-override',
# Triggered by base/time/time.h when using clang, but NOT on Mac.
'-Wno-implicit-const-int-float-conversion',
],
'xcode_settings': {
'WARNING_CFLAGS': [
# This is triggered by logging macros.
'-Wno-implicit-fallthrough',
# Triggered by unit tests, which override things in mocks. gmock
# doesn't mark them as override. An upgrade may help. TODO: try
# upgrading gmock.
'-Wno-inconsistent-missing-override',
],
},
# TODO(kqyang): Fix these msvs warnings.
'msvs_disabled_warnings': [
4125, # Decimal digit terminates octal escape sequence, e.g. "\709".
4819, # The file contains a character that cannot be represented in
# the current code page. It typically happens when compiling
# the code in CJK environment if there is non-ASCII characters
# in the file.
4251, # Warnings about private std::string in Status in a shared
# library config on Windows.
],
}, {
# We do not have control over non-shaka code. Disable some warnings to
# make build pass.
'cflags': [
'-Wno-error',
],
'variables': {
'clang_warning_flags': [
'-Wno-error',
],
},
'xcode_settings': {
'WARNING_CFLAGS': [
'-Wno-error',
],
},
'msvs_disabled_warnings': [
4819, # The file contains a character that cannot be represented in
# the current code page. It typically happens when compiling
# the code in CJK environment if there is non-ASCII characters
# in the file.
],
}],
['musl==1', {
'defines': [
# musl is not uClibc but is similar to uClibc that a minimal feature
# set is supported. One of Shaka Packager's dependencies, Chromium
# base uses __UCLIBC__ flag to disable some features, which needs to
# be disabled for musl too.
'__UCLIBC__',
],
'cflags!': [
# Do not treat warnings as errors on musl as there is a hard-coded
# warning in musl's sys/errno.h.
'-Werror',
],
}],
['static_link_binaries==1', {
'conditions': [
['OS=="linux"', {
'defines': [
# Even when we are not using musl or uClibc, pretending to use
# uClibc on Linux is the only way to disable certain Chromium
# base features, such as hooking into malloc. Hooking into
# malloc, in turn, fails when we are linking statically.
'__UCLIBC__',
],
}],
],
'ldflags': [
'-static',
],
}],
],
},
}

18
packager/packager.pc.in Normal file
View File

@ -0,0 +1,18 @@
# Copyright (c) 2021-present, Facebook, Inc.
# All rights reserved.
#
# This source code is licensed under the BSD3 license found in the
# LICENSE file in the root directory of this source tree.
prefix=@CMAKE_INSTALL_PREFIX@
exec_prefix=${prefix}
libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@
includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@
Name: @PROJECT_NAME@
Description: @PROJECT_DESCRIPTION@
Version: @PROJECT_VERSION@
Requires:
Libs: -L${libdir} -lpackager
Cflags: -I${includedir}