Skip to content

Commit b248842

Browse files
committed
CMake instead of autotools; Windows fixes; Snip superfluous files, and rename README => .md
1 parent a2dbb18 commit b248842

32 files changed

+483
-3959
lines changed

.editorconfig

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# https://editorconfig.org/
2-
root = yes
2+
root = true
33

44
[*]
55
charset = utf-8

.github/workflows/build.yaml

+2-4
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,9 @@ jobs:
1010
- name: dependencies
1111
run: |
1212
sudo apt-get -qy update
13-
sudo apt-get -qfy install --no-install-recommends build-essential automake autotools-dev pkg-config libutfcpp-dev libxml2-dev libxml2-utils python3-dev python3-setuptools swig
14-
- name: autoreconf
15-
run: autoreconf -fvi
13+
sudo apt-get -qfy install --no-install-recommends build-essential cmake pkg-config libutfcpp-dev libxml2-dev libxml2-utils python3-dev python3-setuptools swig
1614
- name: configure
17-
run: ./configure --disable-static --enable-python-bindings
15+
run: cmake -DENABLE_PYTHON_BINDINGS=ON .
1816
- name: build
1917
run: make -j4 V=1 VERBOSE=1
2018
- name: tests

.gitignore

+8-24
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,13 @@
11
*.pyc
2-
**/*.deps/
3-
/build/
2+
/build*/
43
/.ccls-cache/
54
/*.pc
6-
/aclocal.m4
7-
/autom4te.cache
8-
/compile
9-
/config.guess
10-
/config.log
11-
/config.status
12-
/config.sub
13-
/configure
14-
/depcomp
15-
/INSTALL
16-
/install-sh
17-
/libtool
18-
/ltmain.sh
19-
/lttoolbox/.libs
20-
/m4/libtool.m4
21-
/m4/lt~obsolete.m4
22-
/m4/ltoptions.m4
23-
/m4/ltsugar.m4
24-
/m4/ltversion.m4
25-
/Makefile
26-
/Makefile.in
27-
/missing
5+
Makefile
6+
CMakeCache.txt
7+
CMakeFiles
8+
CTestTestfile.cmake
9+
cmake_install.cmake
10+
install_manifest.txt
2811

2912
# Prerequisites
3013
*.d
@@ -75,6 +58,7 @@
7558
/lttoolbox/lt-expand
7659
/lttoolbox/lt-append
7760
/lttoolbox/lsx-comp
61+
/lttoolbox/lsx-comp.1
7862
/lttoolbox/lt-paradigm
7963
/lttoolbox/lt-invert
8064
/lttoolbox/lt-restrict

.travis.yml

-30
This file was deleted.

CMakeLists.txt

+159
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,159 @@
1+
cmake_minimum_required(VERSION 3.12 FATAL_ERROR)
2+
cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION})
3+
project(lttoolbox
4+
VERSION 3.7.12
5+
LANGUAGES CXX C
6+
)
7+
set(VERSION ${PROJECT_VERSION})
8+
set(VERSION_ABI 3)
9+
set(PACKAGE_NAME ${PROJECT_NAME})
10+
set(PACKAGE_BUGREPORT "[email protected]")
11+
12+
add_definitions("-DPACKAGE_VERSION=\"${PROJECT_VERSION}\"")
13+
14+
set(MASTER_PROJECT OFF)
15+
if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR)
16+
set(MASTER_PROJECT ON)
17+
endif ()
18+
19+
# Release or Debug
20+
if(MASTER_PROJECT AND NOT CMAKE_BUILD_TYPE)
21+
set(CMAKE_BUILD_TYPE "Release")
22+
endif()
23+
24+
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
25+
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
26+
set(CMAKE_MACOSX_RPATH ON)
27+
28+
include(GNUInstallDirs)
29+
30+
option(BUILD_SHARED_LIBS "Set to OFF to use static library" ON)
31+
option(BUILD_TESTING "Set to OFF to disable tests" ON)
32+
option(ENABLE_PYTHON_BINDINGS "Set to ON to build the Python wrapper" OFF)
33+
34+
if(MSVC)
35+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8 /std:c++latest /Zc:__cplusplus /permissive- /W4 /MP")
36+
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /O2")
37+
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG")
38+
set(CMAKE_C_FLAGS ${CMAKE_CXX_FLAGS})
39+
set(CMAKE_C_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE})
40+
else()
41+
set(_FLAGS_COMMON "-Wall -Wextra -Wno-missing-field-initializers -Wno-deprecated -Wno-unused-parameter -fPIC")
42+
43+
include(CheckCCompilerFlag)
44+
include(CheckCXXCompilerFlag)
45+
46+
foreach(flag "-Wno-unused-result" "-flto")
47+
string(REGEX REPLACE "[^A-Za-z0-9]" "-" _flag ${flag})
48+
CHECK_CXX_COMPILER_FLAG(${flag} COMPILER_SUPPORTS_${_flag})
49+
if(COMPILER_SUPPORTS_${_flag})
50+
set(_FLAGS_COMMON "${_FLAGS_COMMON} ${flag}")
51+
endif()
52+
endforeach()
53+
if(COMPILER_SUPPORTS_flto)
54+
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} -flto")
55+
endif()
56+
57+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_FLAGS_COMMON} -fvisibility-inlines-hidden")
58+
59+
# Enable latest possible C standard
60+
foreach(flag "-std=c2x" "-std=c11" "-std=c1x" "-std=c99")
61+
string(REGEX REPLACE "[^a-z0-9]" "-" _flag ${flag})
62+
CHECK_C_COMPILER_FLAG(${flag} COMPILER_SUPPORTS_${_flag})
63+
if(COMPILER_SUPPORTS_${_flag})
64+
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}")
65+
break()
66+
endif()
67+
endforeach()
68+
69+
# Require latest possible C++ standard
70+
foreach(flag "-std=c++23" "-std=c++2b" "-std=c++20" "-std=c++2a" "-std=c++17")
71+
string(REGEX REPLACE "[^a-z0-9]" "-" _flag ${flag})
72+
CHECK_CXX_COMPILER_FLAG(${flag} COMPILER_SUPPORTS_${_flag})
73+
if(COMPILER_SUPPORTS_${_flag})
74+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}")
75+
set(_ENABLED_CXX ${flag})
76+
break()
77+
endif()
78+
endforeach()
79+
if(NOT _ENABLED_CXX)
80+
message(FATAL_ERROR "Could not enable at least C++17 - upgrade your compiler")
81+
endif()
82+
83+
# Generate pkg-config file
84+
set(prefix ${CMAKE_INSTALL_PREFIX})
85+
set(exec_prefix "\${prefix}")
86+
set(libdir "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}")
87+
set(includedir "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}")
88+
configure_file(lttoolbox.pc.in lttoolbox.pc @ONLY)
89+
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/lttoolbox.pc" DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig/")
90+
endif()
91+
92+
try_compile(SIZET_NOT_CSTDINT ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/lttoolbox/check-cstdint.cc)
93+
if(SIZET_NOT_CSTDINT)
94+
add_definitions(-DSIZET_NOT_CSTDINT)
95+
endif()
96+
97+
find_package(LibXml2 REQUIRED)
98+
include_directories(${LIBXML2_INCLUDE_DIR})
99+
100+
if(WIN32)
101+
add_definitions(-D_SECURE_SCL=0 -D_ITERATOR_DEBUG_LEVEL=0 -D_CRT_SECURE_NO_DEPRECATE -DWIN32_LEAN_AND_MEAN -DVC_EXTRALEAN -DNOMINMAX)
102+
add_definitions(-DSTDC_HEADERS -DREGEX_MALLOC)
103+
include_directories("lttoolbox/win32")
104+
else()
105+
add_definitions(-D_POSIX_C_SOURCE=200112 -D_GNU_SOURCE)
106+
endif()
107+
108+
if(NOT APPLE)
109+
find_package(Threads REQUIRED)
110+
endif()
111+
112+
# Unlocked I/O functions
113+
include(CheckSymbolExists)
114+
set(CMAKE_REQUIRED_DEFINITIONS -D_POSIX_C_SOURCE=200112 -D_GNU_SOURCE)
115+
foreach(func fread_unlocked fwrite_unlocked fgetc_unlocked fputc_unlocked fputs_unlocked fmemopen)
116+
string(TOUPPER ${func} _uc)
117+
CHECK_SYMBOL_EXISTS(${func} "stdio.h" HAVE_DECL_${_uc})
118+
if(HAVE_DECL_${_uc})
119+
add_definitions(-DHAVE_DECL_${_uc})
120+
endif()
121+
endforeach()
122+
unset(CMAKE_REQUIRED_DEFINITIONS)
123+
124+
# getopt
125+
find_path(GETOPT_INCLUDE getopt.h)
126+
include_directories(${GETOPT_INCLUDE})
127+
if(VCPKG_TOOLCHAIN)
128+
find_library(GETOPT_LIB NAMES getopt REQUIRED)
129+
add_definitions(-DHAVE_GETOPT_LONG)
130+
else()
131+
set(GETOPT_LIB)
132+
CHECK_SYMBOL_EXISTS(getopt_long "getopt.h" HAVE_DECL_GETOPT_LONG)
133+
if(HAVE_DECL_GETOPT_LONG)
134+
add_definitions(-DHAVE_GETOPT_LONG)
135+
endif()
136+
endif()
137+
138+
# ICU
139+
find_package(ICU COMPONENTS i18n io uc REQUIRED)
140+
141+
# utf8cpp / utfcpp
142+
find_path(UTFCPP_INCLUDE_DIRS utf8.h PATH_SUFFIXES utf8cpp utfcpp utf8 REQUIRED)
143+
include_directories(${UTFCPP_INCLUDE_DIRS})
144+
145+
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
146+
147+
if(BUILD_TESTING)
148+
enable_testing()
149+
find_package(Python 3.8 REQUIRED)
150+
set(PYTHON_EXECUTABLE ${Python_EXECUTABLE})
151+
set(ENV{CTEST_OUTPUT_ON_FAILURE} 1)
152+
set(CMAKE_CTEST_ARGUMENTS "-VV")
153+
endif()
154+
155+
add_subdirectory(lttoolbox)
156+
157+
if(ENABLE_PYTHON_BINDINGS)
158+
add_subdirectory(python)
159+
endif()

0 commit comments

Comments
 (0)