Skip to content

Commit 9a106db

Browse files
authored
Merge pull request #1 from jjerphan/chore/cmake-setup
chore: Add a minimal `cmake(1)` setup
2 parents 3e2175d + ff87256 commit 9a106db

File tree

3 files changed

+128
-7
lines changed

3 files changed

+128
-7
lines changed

CMakeLists.txt

Lines changed: 109 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,113 @@
1-
cmake_minimum_required (VERSION 3.26)
1+
cmake_minimum_required (VERSION 3.16)
22

3-
project (semimap VERSION 1.0.0)
3+
project (semimap)
44

5-
set(CMAKE_CXX_FLAGS_RELEASE -Ofast -march=native)
5+
set(SEMIMAP_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include)
66

7-
add_executable(semimap_test test.cpp)
7+
# By default, we build in Release mode.
8+
if(NOT CMAKE_BUILD_TYPE)
9+
set(CMAKE_BUILD_TYPE "Release" CACHE STRING "" FORCE)
10+
endif()
811

9-
# Set C++ standard for all targets
10-
set_property(TARGET semimap_test PROPERTY CXX_STANDARD 17)
12+
# Versioning
13+
# ==========
14+
15+
file(
16+
STRINGS "${SEMIMAP_INCLUDE_DIR}/semimap/semimap.h" semimap_version_defines
17+
REGEX "#define SEMIMAP_VERSION_(MAJOR|MINOR|PATCH)"
18+
)
19+
20+
foreach(ver ${semimap_version_defines})
21+
if(ver MATCHES "#define SEMIMAP_VERSION_(MAJOR|MINOR|PATCH) +([^ ]+)$")
22+
set(SEMIMAP_VERSION_${CMAKE_MATCH_1} "${CMAKE_MATCH_2}" CACHE INTERNAL "")
23+
endif()
24+
endforeach()
25+
26+
set(
27+
${PROJECT_NAME}_VERSION
28+
${SEMIMAP_VERSION_MAJOR}.${SEMIMAP_VERSION_MINOR}.${SEMIMAP_VERSION_PATCH}
29+
)
30+
31+
message(STATUS "semimap v${${PROJECT_NAME}_VERSION}")
32+
33+
34+
# Build
35+
# =====
36+
37+
set(
38+
SEMIMAP_HEADERS
39+
${SEMIMAP_INCLUDE_DIR}/semimap/semimap.h
40+
)
41+
42+
add_library(semimap INTERFACE)
43+
44+
target_include_directories(
45+
semimap INTERFACE
46+
$<BUILD_INTERFACE:${SEMIMAP_INCLUDE_DIR}>
47+
$<INSTALL_INTERFACE:include>
48+
)
49+
50+
set_target_properties(
51+
semimap PROPERTIES
52+
PUBLIC_HEADER "${SEMIMAP_HEADERS}"
53+
)
54+
55+
target_compile_features(semimap INTERFACE cxx_std_17)
56+
57+
# TODO: add test suite
58+
59+
60+
# Installation
61+
# ============
62+
63+
include(GNUInstallDirs)
64+
include(CMakePackageConfigHelpers)
65+
66+
install(
67+
TARGETS semimap
68+
EXPORT ${PROJECT_NAME}-targets
69+
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME}
70+
)
71+
72+
# Makes the project importable from the build directory
73+
export(
74+
EXPORT ${PROJECT_NAME}-targets
75+
FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-Targets.cmake"
76+
)
77+
78+
set(
79+
SEMIMAP_CMAKECONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}"
80+
CACHE STRING "install path for semimapConfig.cmake"
81+
)
82+
83+
configure_package_config_file(
84+
${PROJECT_NAME}Config.cmake.in
85+
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
86+
INSTALL_DESTINATION ${SEMIMAP_CMAKECONFIG_INSTALL_DIR}
87+
)
88+
89+
# semimap is header-only and does not depend on the architecture.
90+
# Remove CMAKE_SIZEOF_VOID_P from semimapConfigVersion.cmake so that an
91+
# architecture-independent semimapConfig.cmake is generated.
92+
set(_SEMIMAP_CMAKE_SIZEOF_VOID_P ${CMAKE_SIZEOF_VOID_P})
93+
unset(CMAKE_SIZEOF_VOID_P)
94+
95+
write_basic_package_version_file(
96+
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
97+
VERSION ${${PROJECT_NAME}_VERSION}
98+
COMPATIBILITY AnyNewerVersion
99+
ARCH_INDEPENDENT
100+
)
101+
102+
set(CMAKE_SIZEOF_VOID_P ${_SEMIMAP_CMAKE_SIZEOF_VOID_P})
103+
install(
104+
FILES
105+
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake
106+
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake
107+
DESTINATION ${SEMIMAP_CMAKECONFIG_INSTALL_DIR}
108+
)
109+
install(
110+
EXPORT ${PROJECT_NAME}-targets
111+
FILE ${PROJECT_NAME}Targets.cmake
112+
DESTINATION ${SEMIMAP_CMAKECONFIG_INSTALL_DIR}
113+
)

semimap.h renamed to include/semimap/semimap.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@
7272
Twitter: @hogliux
7373
*/
7474

75+
#define SEMIMAP_VERSION_MAJOR 1
76+
#define SEMIMAP_VERSION_MINOR 0
77+
#define SEMIMAP_VERSION_PATCH 0
78+
7579
#include <cstring>
7680
#include <memory>
7781
#include <new>
@@ -386,4 +390,4 @@ class map {
386390

387391
#undef semi_branch_expect
388392

389-
} // namespace semi
393+
} // namespace semi

semimapConfig.cmake.in

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# semimap cmake module
2+
#
3+
# This module defines the following variables in your project::
4+
#
5+
# SEMIMAP_FOUND - set to true if semimap is found
6+
# SEMIMAP_INCLUDE_DIRS - include directories for semimap
7+
# SEMIMAP_LIBRARY - empty
8+
9+
@PACKAGE_INIT@
10+
11+
if(NOT TARGET @PROJECT_NAME@)
12+
include("${CMAKE_CURRENT_LIST_DIR}/@[email protected]")
13+
get_target_property(@PROJECT_NAME@_INCLUDE_DIRS @PROJECT_NAME@ INTERFACE_INCLUDE_DIRECTORIES)
14+
endif()

0 commit comments

Comments
 (0)