Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CMake build config #3

Merged
merged 10 commits into from
Jun 16, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,5 @@ install-sh
ltmain.sh
missing
test-driver

/build/
115 changes: 115 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
cmake_minimum_required(VERSION 3.10)
set(project_name noshell)

set(NOSHELL_MASTER_PROJECT OFF)
if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
set(NOSHELL_MASTER_PROJECT ON)
endif()

option(NOSHELL_BUILD_TESTS "Set to ON to build tests" ${NOSHELL_MASTER_PROJECT})
option(NOSHELL_ENABLE_INSTALL "Generate the install target" ${NOSHELL_MASTER_PROJECT})

# get version
file(READ "${CMAKE_CURRENT_SOURCE_DIR}/configure.ac" configure_ac)
string(REGEX MATCH "AC_INIT\\\(\\\[noshell\\\],\\\[(.*)\\\],\\\[[email protected]\\\]\\\)" _ "${configure_ac}")
if(NOT CMAKE_MATCH_COUNT EQUAL 1)
message(FATAL_ERROR "Could not extract major version number from configure.ac")
endif()
set(noshell_version ${CMAKE_MATCH_1})
message(STATUS "noshell version: ${noshell_version}")


project(${project_name} VERSION "${noshell_version}" LANGUAGES CXX)

include(GNUInstallDirs)

set(NOSHELL_SRCS lib/noshell.cc lib/setters.cc lib/utils.cc)

add_library(${project_name} SHARED ${NOSHELL_SRCS})
add_library(${project_name}-static STATIC ${NOSHELL_SRCS})
add_library(${project_name}::${project_name} ALIAS ${project_name})
add_library(${project_name}::${project_name}-static ALIAS ${project_name}-static)

target_include_directories(${project_name}
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/noshell-${noshell_version}>)
target_include_directories(${project_name}-static
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}/noshell-${noshell_version}>)
set_target_properties(${project_name}
PROPERTIES
CXX_STANDARD 11)
set_target_properties(${project_name}-static
PROPERTIES
CXX_STANDARD 11
POSITION_INDEPENDENT_CODE 1
OUTPUT_NAME ${project_name})

if(NOSHELL_ENABLE_INSTALL)
set(project_config_in "${CMAKE_CURRENT_LIST_DIR}/noshellConfig.cmake.in")
set(project_config_out "${CMAKE_CURRENT_BINARY_DIR}/noshellConfig.cmake")
set(config_targets_file "noshellConfigTargets.cmake")
set(version_config_file "${CMAKE_CURRENT_BINARY_DIR}/noshellConfigVersion.cmake")
set(export_dest_dir "${CMAKE_INSTALL_LIBDIR}/cmake/noshell")
set(pkgconfig_install_dir "${CMAKE_INSTALL_LIBDIR}/pkgconfig")
set(pkgconfig "${CMAKE_CURRENT_BINARY_DIR}/noshell.pc")

set(prefix "${CMAKE_INSTALL_PREFIX}")
set(exec_prefix "\${prefix}")
if (IS_ABSOLUTE "${CMAKE_INSTALL_LIBDIR}")
set(libdir "${CMAKE_INSTALL_LIBDIR}")
else()
set(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}")
endif()
if (IS_ABSOLUTE "${CMAKE_INSTALL_INCLUDEDIR}")
set(includedir "${CMAKE_INSTALL_INCLUDEDIR}")
else()
set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
endif()
set(PACKAGE_VERSION "${noshell_version}")
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/noshell.pc.in"
"${pkgconfig}"
@ONLY)

install(FILES "${pkgconfig}"
DESTINATION "${pkgconfig_install_dir}")

install(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include/"
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/noshell-${noshell_version}")

install(TARGETS ${project_name} ${project_name}-static
EXPORT ${project_name}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})

export(
TARGETS ${project_name}
NAMESPACE ${project_name}::
FILE "${CMAKE_CURRENT_BINARY_DIR}/${config_targets_file}")

install(EXPORT ${project_name}
DESTINATION ${export_dest_dir}
NAMESPACE ${project_name}::
FILE ${config_targets_file})

include(CMakePackageConfigHelpers)
configure_package_config_file("${project_config_in}" "${project_config_out}"
INSTALL_DESTINATION ${export_dest_dir})


write_basic_package_version_file("${version_config_file}"
VERSION "${noshell_version}"
COMPATIBILITY ExactVersion)

install(FILES "${project_config_out}" "${version_config_file}" DESTINATION "${export_dest_dir}")
endif()


if(NOSHELL_BUILD_TESTS)
enable_testing()
add_subdirectory(tests)
endif()
31 changes: 31 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,23 @@ sudo make install
At this point, this library has only been tested on Linux, with `g++`
version 4.7 or newer and `clang++` version 3.2.

### CMake

Alternatively, you can use CMake to build the library:

```sh
mkdir build
cmake -S . -B build
cmake --build build
sudo cmake --install build
```

Run the tests with:

```sh
cd build && ctest
```

## Using the library

Add the following to your make file:
Expand All @@ -86,3 +103,17 @@ Add the following to your make file:
CXXFLAGS = $(shell pkg-config --cflags noshell)
LDFLAGS = $(shell pkg-config --libs noshell)
```

### CMake

Add the following to your `CMakeLists.txt`:

```cmake
find_package(noshell REQUIRED)

# link shared library
target_link_libraries(mytarget noshell::noshell)

# link static library
target_link_libraries(mytarget noshell::noshell-static)
```
2 changes: 1 addition & 1 deletion include/noshell/handle.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ class Exit {
void wait() { for(auto& h : handles) h.wait(); }
};

std::ostream& operator<<(std::ostream& os, const Exit& exit) {
inline std::ostream& operator<<(std::ostream& os, const Exit& exit) {
auto it = exit.begin();
if(it != exit.end()) {
os << *it;
Expand Down
6 changes: 6 additions & 0 deletions noshellConfig.cmake.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
@PACKAGE_INIT@

set(config_targets_file @config_targets_file@)
include("${CMAKE_CURRENT_LIST_DIR}/${config_targets_file}")

check_required_components(noshell)
36 changes: 36 additions & 0 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
cmake_minimum_required(VERSION 3.10)
project(noshell_tests CXX)

if(NOT TARGET noshell)
# Stand-alone build
find_package(noshell REQUIRED)
endif()

list(APPEND NOSHELL_TESTS_HELPER
check_open_fd.cc
kill_self.cc
puts_to.cc)

list(APPEND NOSHELL_TESTS_LIST
libtest_misc.cc
test_cmd_redirection.cc
test_error.cc
test_extra_fds.cc
test_fd_type.cc
test_literal.cc
test_pipeline.cc
test_resources.cc
test_simple_command.cc)

find_package(GTest REQUIRED)
find_package(Threads REQUIRED)

foreach(src ${NOSHELL_TESTS_HELPER})
GET_FILENAME_COMPONENT(target_name ${src} NAME_WE)
add_executable(${target_name} ${src})
endforeach()

add_executable(noshell_tests ${NOSHELL_TESTS_LIST})
target_link_libraries(noshell_tests GTest::Main GTest::GTest Threads::Threads noshell::noshell)

add_test(noshell_tests noshell_tests)