initial commit
Some checks failed
sgraves/cpp-build-system_mac/pipeline/head There was a failure building this commit
sgraves/cpp-build-system/pipeline/head There was a failure building this commit

This commit is contained in:
2025-10-17 07:44:16 -05:00
parent 933c973c79
commit 92e3e495ce
1099 changed files with 102722 additions and 0 deletions

127
.clang-format Normal file
View File

@@ -0,0 +1,127 @@
---
Language: Cpp
# BasedOnStyle: LLVM
AccessModifierOffset: -2
AlignAfterOpenBracket: Align
AlignConsecutiveMacros: false
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignEscapedNewlines: Right
AlignOperands: true
AlignTrailingComments: true
AllowAllArgumentsOnNextLine: true
AllowAllConstructorInitializersOnNextLine: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: All
AllowShortLambdasOnASingleLine: All
AllowShortIfStatementsOnASingleLine: Never
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: MultiLine
BinPackArguments: true
BinPackParameters: true
BraceWrapping:
AfterCaseLabel: false
AfterClass: false
AfterControlStatement: false
AfterEnum: false
AfterFunction: false
AfterNamespace: false
AfterObjCDeclaration: false
AfterStruct: false
AfterUnion: false
AfterExternBlock: false
BeforeCatch: false
BeforeElse: false
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace: true
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Attach
BreakBeforeInheritanceComma: false
BreakInheritanceList: BeforeColon
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: false
BreakConstructorInitializers: BeforeColon
BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true
ColumnLimit: 80
CommentPragmas: '^ IWYU pragma:'
CompactNamespaces: false
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DerivePointerAlignment: false
DisableFormat: false
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
ForEachMacros:
- foreach
- Q_FOREACH
- BOOST_FOREACH
IncludeBlocks: Preserve
IncludeCategories:
- Regex: '^"(llvm|llvm-c|clang|clang-c)/'
Priority: 2
- Regex: '^(<|"(gtest|gmock|isl|json)/)'
Priority: 3
- Regex: '.*'
Priority: 1
IncludeIsMainRegex: '(Test)?$'
IndentCaseLabels: false
IndentPPDirectives: None
IndentWidth: 2
IndentWrappedFunctionNames: false
JavaScriptQuotes: Leave
JavaScriptWrapImports: true
KeepEmptyLinesAtTheStartOfBlocks: true
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
ObjCBinPackProtocolList: Auto
ObjCBlockIndentWidth: 2
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PenaltyBreakAssignment: 2
PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyBreakTemplateDeclaration: 10
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 60
PointerAlignment: Right
ReflowComments: true
SortIncludes: true
SortUsingDeclarations: true
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: true
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: Auto
StatementMacros:
- Q_UNUSED
- QT_REQUIRE_VERSION
TabWidth: 8
UseTab: Never
...

30
.clang-tidy Normal file
View File

@@ -0,0 +1,30 @@
---
Checks: [
'-*',
'clang-diagnostic-*',
'clang-analyzer-*',
'bugprone-*',
'concurrency-*',
'cppcoreguidelines-*',
'modernize-*',
'readability-*',
'-readability-redundant-access-specifiers',
'-readability-function-cognitive-complexity'
]
ExtraArgs: ['-Wno-unknown-warning-option']
FormatStyle: none
HeaderFileExtensions: ['', 'h','hh','hpp','hxx']
HeaderFilterRegex: ''
ImplementationFileExtensions: ['c','cc','cpp','cxx']
CheckOptions:
- key: MinimumExceptionNameLength
value: 1
- key: MinimumLoopCounterNameLength
value: 3
- key: MinimumParameterNameLength
value: 3
- key: MinimumVariableNameLength
value: 3
User: 'scott.e.graves@protonmail.com'
WarningsAsErrors: ''
...

5
.clangd Normal file
View File

@@ -0,0 +1,5 @@
{
"CompileFlags": {
"Remove": ["-flarge-source-files", "-fext-numeric-literals"]
}
}

236
.cspell/words.txt Normal file
View File

@@ -0,0 +1,236 @@
aarch64
advapi32
armv8
autogen
backwardcpp_project
bcrypt
binutils_version
bitcoinsystem
boost_asio_has_std_string_view
bugprone
cflags
chrono
clsctx_inproc_server
clsid_shelllink
cmake_current_source_dir
cmake_host_win32
comdlg32
cpp_httplib_hash
cppcoreguidelines
cppdbg
cppflags
cpphttplib
cppvsdbg
crypto_aead_xchacha20poly1305_ietf_npubbytes
cspan
cstdint
cxxflags
cxxopts_project
cxxstd
d_largefile64_source
d_largefile_source
d_ndebug
dbackward_has_dwarf
dbackward_shared
dbghelp
dbinaries
dboost_root
dbuild_shared_libs
dc_link_args
dcli11_warnings_as_errors
dcmake_cxx_flags
dcpp_args
dcpphttplib_openssl_support
dcpphttplib_tcp_nodelay
dcurl_ca_bundle
dcurl_ca_fallback
dcurl_disable_ldap
dcurl_staticlib
dcurl_use_libpsl
dcurl_use_libssh2
dcurl_zlib
dcxxopts_build_examples
dcxxopts_build_tests
dcxxopts_enable_install
dcxxopts_enable_warnings
dcxxopts_use_unicode_help
ddebug
ddefault_library
decmult_gen_prec_bits
decmult_window_size
default_handler_is_spdlog
defl_ctx
degl
denable_threaded_resolver
deps
devent__disable_openssl
devent__disable_tests
devent__library_type
dfail_on_warnings
dfmt_test
dfuse_use_version
dgles1
dgles2
dhas_setxattr
dhttplib_require_brotli
dhttplib_require_openssl
dhttplib_require_zlib
dinstall_manpages
djson_buildtests
dnana_cmake_enable_audio
dnana_cmake_enable_jpeg
dnana_cmake_enable_png
dnana_cmake_install
dndebug
dopengl
dopenssl_root_dir
dopenssl_use_static_libs
dpng_shared
dpng_static
dpng_tests
dpng_tools
dportable
dproject_enable_backward_cpp
dproject_static_link
drocksdb_install_on_windows
dshared
dspdlog_fmt_external
dthreads_prefer_pthread_flag
duse_libidn2
duuid_build_tests
dwith_benchmark
dwith_gflags
dwith_iostats_context
dwxuse_opengl
dzlib_use_static_libs
ecdh
endforeach
endfunction
eventlib
expect_streq
fext
fifthgrid
flac_version
flarge
fontconfig_version
freetype2_version
glapi
gmock
googletest
gpath
gtest_version
has_setxattr
hresult
httpapi
httplib
icns
icudata
icui18n
icuuc
iostreams
iphlpapi
istream_reader
libbitcoin
libbitcoinsystem
libcurl
libevent
libexample
libfuse3
libgmock
libgtest
libiconv_version
libjpeg
libpcre2_version
libpng_project
librocksdb
libsecp256k1
libsfml
libsodium_type
libspdlog
libuuid
libuuid_include_dirs
libvlc_include_dirs
libvlc_libraries
libvlccore
libvorbis
linkflags
mbig
msvc
msvcr120
msvcr90
mswsock
mtune
mwindows
nana
ncrypt
nlohmann_json
nmakeprg
nominmax
nuspell_version
oleaut32
openal_version
openssldir
ostream_writer
pkgconfig
project_enable_cxxopts
project_enable_fontconfig
project_enable_gtkmm
project_enable_libdsm
project_enable_libiconv
project_enable_libtasn1
project_enable_winfsp
propgrid
pugi
pugixml_project
pwhash
richtext
rocksdb_library
rpcrt4
sdl2_no_mwindows
secp256k1
secur32
sfml_project
shlwapi
smb_stat_wtime
source_subdir
spdlog
spdlog_project
st_ctim
static-libgcc
static-libstdc++
stduuid_project
stod
streq
strequal
tolower
uring
userenv
vorbis_version
wall
wcast-align
wconversion
wdouble-promotion
wduplicated-branches
wduplicated-cond
wextra
wformat=2
win32_find_dataa
winfsp
winhttp
wininet
winspool
wlogical-op
wmisleading-indentation
wno-useless-cast
wnon-virtual-dtor
wnull-dereference
wold-style-cast
woverloaded-virtual
wpedantic
wserialization
wshadow
wsign-conversion
wunused
wxwidgets_version
xattr
xcursor

13
.gitignore vendored Normal file
View File

@@ -0,0 +1,13 @@
.cache/
.vs/
build*/
compile_commands.json
cspell.json
deps/
dist/
override.sh
scripts/cleanup.cmd
scripts/cleanup.sh
support/Dockerfile
version.cpp
version.rc

181
.jenkins_builds Normal file
View File

@@ -0,0 +1,181 @@
#!groovy
pipeline {
agent none
environment {
PROJECT_TEST_CONFIG_DIR = "/.ci/cpp_build_system/test"
}
options {
disableConcurrentBuilds()
skipDefaultCheckout()
timestamps()
}
stages {
stage('Windows') {
agent any
stages {
stage('Checkout') {
steps {
script {
int maxAttempts = 6
int baseDelay = 10
for (int attempt = 1; attempt <= maxAttempts; attempt++) {
try {
checkout scm
break
} catch (err) {
if (attempt == maxAttempts) { throw err }
int waitSec = baseDelay * (1 << (attempt - 1))
echo "Checkout failed (attempt ${attempt}/${maxAttempts}). Waiting ${waitSec}s before retry..."
sleep time: waitSec, unit: 'SECONDS'
}
}
}
}
}
stage('win32_shared') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_win32.sh shared' } } }
}
stage('win32_shared_crypto') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_win32.sh shared 1' } } }
}
stage('win32_shared_crypto_no_boost') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_win32.sh shared 7' } } }
}
stage('win32_shared_dsm') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_win32.sh shared 2' } } }
}
stage('win32_shared_sqlite') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_win32.sh shared 3' } } }
}
stage('win32_shared_errors_v1') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_win32.sh shared 4' } } }
}
stage('win32_shared_fmt') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_win32.sh shared 5' } } }
}
stage('win32_shared_libevent') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_win32.sh shared 6' } } }
}
stage('win32_static') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_win32.sh static' } } }
}
stage('win32_static_crypto') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_win32.sh static 1' } } }
}
stage('win32_static_crypto_no_boost') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_win32.sh static 7' } } }
}
stage('win32_static_dsm') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_win32.sh static 2' } } }
}
stage('win32_static_sqlite') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_win32.sh static 3' } } }
}
stage('win32_static_errors_v1') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_win32.sh static 4' } } }
}
stage('win32_static_fmt') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_win32.sh static 5' } } }
}
stage('win32_static_libevent') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_win32.sh static 6' } } }
}
}
}
stage('Linux') {
agent any
stages {
stage('Checkout') {
steps {
script {
int maxAttempts = 6
int baseDelay = 10
for (int attempt = 1; attempt <= maxAttempts; attempt++) {
try {
checkout scm
break
} catch (err) {
if (attempt == maxAttempts) { throw err }
int waitSec = baseDelay * (1 << (attempt - 1))
echo "Checkout failed (attempt ${attempt}/${maxAttempts}). Waiting ${waitSec}s before retry..."
sleep time: waitSec, unit: 'SECONDS'
}
}
}
}
}
stage('linux_shared') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh shared' } } }
}
stage('linux_shared_crypto') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh shared 1' } } }
}
stage('linux_shared_crypto_no_boost') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh shared 7' } } }
}
stage('linux_shared_dsm') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh shared 2' } } }
}
stage('linux_shared_sqlite') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh shared 3' } } }
}
stage('linux_shared_errors_v1') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh shared 4' } } }
}
stage('linux_shared_fmt') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh shared 5' } } }
}
stage('linux_shared_libevent') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh shared 6' } } }
}
stage('linux_static') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh static' } } }
}
stage('linux_static_crypto') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh static 1' } } }
}
stage('linux_static_crypto_no_boost') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh static 7' } } }
}
stage('linux_static_dsm') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh static 2' } } }
}
stage('linux_static_sqlite') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh static 3' } } }
}
stage('linux_static_errors_v1') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh static 4' } } }
}
stage('linux_static_fmt') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh static 5' } } }
}
stage('linux_static_libevent') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh static 6' } } }
}
}
}
}
}
def retryWithBackoff(int maxAttempts, int baseDelaySeconds, Closure body) {
for (int attempt = 1; attempt <= maxAttempts; attempt++) {
try {
body()
return
} catch (err) {
if (attempt == maxAttempts) { throw err }
int waitSec = baseDelaySeconds * (1 << (attempt - 1))
echo "Step failed (attempt ${attempt}/${maxAttempts}). Waiting ${waitSec}s before retry..."
sleep time: waitSec, unit: 'SECONDS'
}
}
}

243
.jenkins_macos Normal file
View File

@@ -0,0 +1,243 @@
#!groovy
pipeline {
agent none
environment {
PROJECT_TEST_CONFIG_DIR = "${env.HOME}/.ci/cpp_build_system/test"
}
options {
disableConcurrentBuilds()
skipDefaultCheckout()
timestamps()
}
stages {
stage('macOS arm64') {
agent any
stages {
stage('Checkout') {
steps {
script {
int maxAttempts = 6
int baseDelay = 10
for (int attempt = 1; attempt <= maxAttempts; attempt++) {
try {
checkout scm
break
} catch (err) {
if (attempt == maxAttempts) { throw err }
int waitSec = baseDelay * (1 << (attempt - 1))
echo "Checkout failed (attempt ${attempt}/${maxAttempts}). Waiting ${waitSec}s before retry..."
sleep time: waitSec, unit: 'SECONDS'
}
}
}
}
}
stage('macos_aarch64_shared') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh shared' } }
}
}
stage('macos_aarch64_shared_crypto') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh shared 1' } }
}
}
stage('macos_aarch64_shared_crypto_no_boost') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh shared 7' } }
}
}
stage('macos_aarch64_shared_dsm') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh shared 2' } }
}
}
stage('macos_aarch64_shared_sqlite') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh shared 3' } }
}
}
stage('macos_aarch64_shared_errors_v1') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh shared 4' } }
}
}
stage('macos_aarch64_shared_fmt') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh shared 5' } }
}
}
stage('macos_aarch64_shared_libevent') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh shared 6' } }
}
}
stage('macos_aarch64_static') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh static' } }
}
}
stage('macos_aarch64_static_crypto') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh static 1' } }
}
}
stage('macos_aarch64_static_crypto_no_boost') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh static 7' } }
}
}
stage('macos_aarch64_static_dsm') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh static 2' } }
}
}
stage('macos_aarch64_static_sqlite') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh static 3' } }
}
}
stage('macos_aarch64_static_errors_v1') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh static 4' } }
}
}
stage('macos_aarch64_static_fmt') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh static 5' } }
}
}
stage('macos_aarch64_static_libevent') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh static 6' } }
}
}
}
}
stage('macOS x86_64') {
agent any
stages {
stage('Checkout') {
steps {
script {
int maxAttempts = 6
int baseDelay = 10
for (int attempt = 1; attempt <= maxAttempts; attempt++) {
try {
checkout scm
break
} catch (err) {
if (attempt == maxAttempts) { throw err }
int waitSec = baseDelay * (1 << (attempt - 1))
echo "Checkout failed (attempt ${attempt}/${maxAttempts}). Waiting ${waitSec}s before retry..."
sleep time: waitSec, unit: 'SECONDS'
}
}
}
}
}
stage('macos_x86_64_shared') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh shared "" x86_64' } }
}
}
stage('macos_x86_64_shared_crypto') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh shared 1 x86_64' } }
}
}
stage('macos_x86_64_shared_crypto_no_boost') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh shared 7 x86_64' } }
}
}
stage('macos_x86_64_shared_dsm') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh shared 2 x86_64' } }
}
}
stage('macos_x86_64_shared_sqlite') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh shared 3 x86_64' } }
}
}
stage('macos_x86_64_shared_errors_v1') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh shared 4 x86_64' } }
}
}
stage('macos_x86_64_shared_fmt') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh shared 5 x86_64' } }
}
}
stage('macos_x86_64_shared_libevent') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh shared 6 x86_64' } }
}
}
stage('macos_x86_64_static') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh static "" x86_64' } }
}
}
stage('macos_x86_64_static_crypto') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh static 1 x86_64' } }
}
}
stage('macos_x86_64_static_crypto_no_boost') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh static 7 x86_64' } }
}
}
stage('macos_x86_64_static_dsm') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh static 2 x86_64' } }
}
}
stage('macos_x86_64_static_sqlite') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh static 3 x86_64' } }
}
}
stage('macos_x86_64_static_errors_v1') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh static 4 x86_64' } }
}
}
stage('macos_x86_64_static_fmt') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh static 5 x86_64' } }
}
}
stage('macos_x86_64_static_libevent') {
steps {
script { retryWithBackoff(2, 5) { sh 'scripts/test_unix.sh static 6 x86_64' } }
}
}
}
}
}
}
def retryWithBackoff(int maxAttempts, int baseDelaySeconds, Closure body) {
for (int attempt = 1; attempt <= maxAttempts; attempt++) {
try {
body()
return
} catch (err) {
if (attempt == maxAttempts) { throw err }
int waitSec = baseDelaySeconds * (1 << (attempt - 1))
echo "Step failed (attempt ${attempt}/${maxAttempts}). Waiting ${waitSec}s before retry..."
sleep time: waitSec, unit: 'SECONDS'
}
}
}

9
LICENSE Normal file
View File

@@ -0,0 +1,9 @@
MIT License
Copyright (c) 2024 sgraves
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

2
README.md Normal file
View File

@@ -0,0 +1,2 @@
# cpp-build-system

33
all_update.sh Normal file
View File

@@ -0,0 +1,33 @@
#!/usr/bin/env bash
CURRENT_DIR=$(realpath "$0")
CURRENT_DIR=$(dirname "${CURRENT_DIR}")
function do_update() {
pushd "../$1"
git pull
popd
./update_project.sh $1 ..
pushd "../$1"
scripts/cleanup.sh
git add .
git commit -a -m 'updated build system'
git push
popd
}
pushd "${CURRENT_DIR}"
git add .
git commit -a -m "updates"
git push
do_update dxmedia3
do_update fifthgrid
do_update gamepadx
do_update joule
do_update med
do_update repertory
do_update monitarr
popd

16
cmake/arch.cmake Normal file
View File

@@ -0,0 +1,16 @@
if("${CMAKE_SIZEOF_VOID_P}" EQUAL "4")
message(FATAL_ERROR "32-bit compilation is not supported")
endif()
if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64.*|AARCH64.*|arm64.*|ARM64.*)")
set(IS_ARM_SYSTEM 1)
endif()
if(PROJECT_IS_ARM64 AND NOT IS_ARM_SYSTEM AND NOT PROJECT_REQUIRE_ALPINE)
message(FATAL_ERROR "aarch64 cross-compile is not supported")
endif()
string(REPLACE "_" "-" PROJECT_MARCH ${PROJECT_BUILD_ARCH})
if("${PROJECT_BUILD_ARCH}" STREQUAL "aarch64")
set(PROJECT_MARCH armv8-a)
endif()

123
cmake/flags.cmake Normal file
View File

@@ -0,0 +1,123 @@
list(APPEND PROJECT_COMMON_FLAG_LIST
-D_FILE_OFFSET_BITS=64
-D_GNU_SOURCE
-D_LARGEFILE64_SOURCE
-D_LARGEFILE_SOURCE
-D_TIME_BITS=64
-march=${PROJECT_MARCH}
-mtune=generic
)
if(PROJECT_IS_MINGW)
list(APPEND PROJECT_COMMON_FLAG_LIST
${PROJECT_COMMON_FLAG_LIST}
-Wa,-mbig-obj
-flarge-source-files
)
endif()
list(APPEND PROJECT_DEBUG_FLAG_LIST
-DDEBUG
-D_DEBUG
-Og
-fno-omit-frame-pointer
-g
)
list(APPEND PROJECT_RELEASE_FLAG_LIST
-DNDEBUG
-D_NDEBUG
-O3
)
list(APPEND PROJECT_CXXFLAGS_LIST
-Wall
-Wcast-align
-Wconversion
-Wdouble-promotion
-Wextra
-Wformat=2
-Wmisleading-indentation
-Wnon-virtual-dtor
-Wnull-dereference
-Wold-style-cast
-Woverloaded-virtual
-Wpedantic
-Wshadow
-Wsign-conversion
-Wunused
)
if (NOT PROJECT_IS_DARWIN)
list(APPEND PROJECT_CXXFLAGS_LIST
-Wduplicated-branches
-Wduplicated-cond
-Wlogical-op
-Wno-useless-cast
)
endif()
list(APPEND PROJECT_CFLAGS_LIST
${PROJECT_COMMON_FLAG_LIST}
-std=c${CMAKE_C_STANDARD}
)
list(APPEND PROJECT_CXXFLAGS_LIST
${PROJECT_COMMON_FLAG_LIST}
-std=gnu++${CMAKE_CXX_STANDARD}
)
if(NOT PROJECT_IS_DARWIN AND PROJECT_STATIC_LINK)
list(APPEND PROJECT_CMAKE_EXE_LINKER_FLAGS
-static-libgcc
-static-libstdc++
-static
)
endif()
list(JOIN PROJECT_COMMON_FLAG_LIST " " PROJECT_COMMON_FLAG_LIST)
list(JOIN PROJECT_DEBUG_FLAG_LIST " " PROJECT_DEBUG_FLAG_LIST)
list(JOIN PROJECT_RELEASE_FLAG_LIST " " PROJECT_RELEASE_FLAG_LIST)
list(JOIN PROJECT_CFLAGS_LIST " " PROJECT_CFLAGS_LIST)
list(JOIN PROJECT_CXXFLAGS_LIST " " PROJECT_CXXFLAGS_LIST)
list(JOIN PROJECT_CMAKE_EXE_LINKER_FLAGS " " PROJECT_CMAKE_EXE_LINKER_FLAGS)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${PROJECT_CFLAGS_LIST}")
set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${PROJECT_DEBUG_FLAG_LIST}")
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} ${PROJECT_RELEASE_FLAG_LIST}")
set(CMAKE_CXX_FLAGS "-include cstdint -include utility ${CMAKE_CXX_FLAGS} ${PROJECT_CXXFLAGS_LIST}")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${PROJECT_DEBUG_FLAG_LIST}")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} ${PROJECT_RELEASE_FLAG_LIST}")
set(CMAKE_EXE_LINKER_FLAGS "${PROJECT_CMAKE_EXE_LINKER_FLAGS}")
set(EXTERNAL_CMAKE_CXX_FLAGS "-include cstdint -include utility ${PROJECT_COMMON_FLAG_LIST}")
if (NOT PROJECT_IS_DARWIN)
set(EXTERNAL_CMAKE_CXX_FLAGS "-fext-numeric-literals ${EXTERNAL_CMAKE_CXX_FLAGS}")
endif()
list(APPEND PROJECT_EXTERNAL_CMAKE_FLAGS
-DCMAKE_BUILD_TYPE=${PROJECT_CMAKE_BUILD_TYPE}
-DCMAKE_COLOR_MAKEFILE=${CMAKE_COLOR_MAKEFILE}
-DCMAKE_CXX_FLAGS=${EXTERNAL_CMAKE_CXX_FLAGS}
-DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}
-DCMAKE_C_FLAGS=${PROJECT_COMMON_FLAG_LIST}
-DCMAKE_C_STANDARD=${CMAKE_C_STANDARD}
-DCMAKE_GENERATOR=${CMAKE_GENERATOR}
-DCMAKE_INSTALL_PREFIX=${PROJECT_EXTERNAL_BUILD_ROOT}
-DCMAKE_POSITION_INDEPENDENT_CODE=${CMAKE_POSITION_INDEPENDENT_CODE}
)
if(CMAKE_TOOLCHAIN_FILE)
list(APPEND PROJECT_EXTERNAL_CMAKE_FLAGS
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
)
endif()
string(REPLACE ";" "|" CMAKE_PREFIX_PATH_ALT_SEP "${CMAKE_PREFIX_PATH}")
list(APPEND PROJECT_EXTERNAL_CMAKE_FLAGS
-DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH_ALT_SEP}
)

188
cmake/functions.cmake Normal file
View File

@@ -0,0 +1,188 @@
if (PROJECT_MACOS_ICNS_NAME)
set(PROJECT_MACOS_ICNS_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/assets/${PROJECT_MACOS_ICNS_NAME}")
endif()
function(set_common_target_options name)
target_compile_definitions(${name} PUBLIC
${PROJECT_DEFINITIONS}
${${name}_DEFINITIONS}
)
target_include_directories(${name} BEFORE PUBLIC
${PROJECT_EXTERNAL_BUILD_ROOT}/include
)
target_link_directories(${name} BEFORE PUBLIC
${PROJECT_EXTERNAL_BUILD_ROOT}/lib
)
if (PROJECT_STATIC_LINK)
target_compile_definitions(${name} PRIVATE U_STATIC_IMPLEMENTATION)
endif()
target_link_libraries(${name} PRIVATE
ICU::io
ICU::i18n
ICU::uc
ICU::data
)
target_include_directories(${name} AFTER PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/include
${name}_INCLUDES
)
if(PROJECT_DEPENDENCIES)
add_dependencies(${name} ${PROJECT_DEPENDENCIES})
endif()
if(PROJECT_STATIC_LINK)
set_property(TARGET ${name} PROPERTY LINK_SEARCH_START_STATIC 1)
endif()
endfunction(set_common_target_options)
function(add_project_executable2 name dependencies libraries headers sources is_win32)
if (PROJECT_WINDOWS_VERSION_RC)
list(APPEND sources ${PROJECT_WINDOWS_VERSION_RC})
endif()
if (PROJECT_IS_DARWIN AND PROJECT_MACOS_ICNS_SOURCE AND "${name}" STREQUAL "${PROJECT_NAME}")
set_source_files_properties(${PROJECT_MACOS_ICNS_SOURCE} PROPERTIES
MACOSX_PACKAGE_LOCATION "Resources"
)
add_executable(${name}
MACOSX_BUNDLE
${headers}
${sources}
${PROJECT_MACOS_ICNS_SOURCE}
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/main.cpp
)
set_target_properties(${name} PROPERTIES
MACOSX_BUNDLE TRUE
MACOSX_BUNDLE_ICON_FILE "${PROJECT_MACOS_ICNS_NAME}"
RESOURCE "${PROJECT_MACOS_ICNS_SOURCE}"
)
else()
add_executable(${name}
${headers}
${sources}
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/main.cpp
)
endif()
foreach(dependency ${dependencies})
set_common_target_options(${dependency})
endforeach()
set_common_target_options(${name})
if(dependencies)
add_dependencies(${name} ${dependencies})
endif()
target_link_libraries(${name} PRIVATE ${libraries})
if(PROJECT_ENABLE_SDL AND PROJECT_IS_MINGW)
target_link_libraries(${name} PRIVATE SDL2::SDL2main)
endif ()
if (is_win32 AND PROJECT_IS_MINGW)
target_link_options(${name} PRIVATE -mwindows)
endif()
endfunction(add_project_executable2)
function(add_project_executable name dependencies libraries)
file(GLOB_RECURSE headers
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/include/*.h
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/include/*.hh
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/include/*.hpp
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/include/*.hxx
)
file(GLOB_RECURSE sources
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/src/*.c
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/src/*.cc
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/src/*.cpp
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/src/*.cxx
)
if(PROJECT_ENABLE_WXWIDGETS OR PROJECT_ENABLE_SDL OR PROJECT_ENABLE_SFML OR PROJECT_ENABLE_NANA)
set(IS_WIN32 ON)
endif()
add_project_executable2(${name} "${dependencies}" "${libraries}" "${headers}" "${sources}" "${IS_WIN32}")
if(PROJECT_ENABLE_WXWIDGETS)
target_link_libraries(${name} PRIVATE ${wxWidgets_LIBRARIES})
endif()
endfunction(add_project_executable)
function(add_project_library name dependencies libraries additional_sources)
file(GLOB_RECURSE headers
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/include/*.h
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/include/*.hh
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/include/${name}/include/*.hpp
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/include/${name}/include/${name}/include/*.hxx
)
file(GLOB_RECURSE sources
${additional_sources}
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/src/*.c
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/src/*.cc
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/src/*.cpp
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/src/*.cxx
)
add_library(${name} STATIC
${headers}
${sources}
)
set_common_target_options(${name})
set_target_properties(${name} PROPERTIES PREFIX "")
target_link_libraries(${name} PRIVATE ${libraries})
endfunction(add_project_library)
function(add_project_test_executable name dependencies libraries)
if(PROJECT_ENABLE_TESTING)
find_package(GTest ${GTEST_VERSION} REQUIRED)
enable_testing()
file(GLOB_RECURSE headers
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/include/${name}/include/${name}/include/*.hxx
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/include/${name}/include/*.hpp
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/include/*.h
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/include/*.hh
${PROJECT_SUPPORT_DIR}/test/include/*.hpp
)
file(GLOB_RECURSE sources
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/src/*.c
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/src/*.cc
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/src/*.cpp
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${name}/src/*.cxx
${PROJECT_SUPPORT_DIR}/test/src/*.cpp
${additional_sources}
)
add_project_executable2(${name} "${dependencies}" "${libraries}" "${headers}" "${sources}" OFF)
target_compile_definitions(${name} PRIVATE -DPROJECT_TESTING)
target_include_directories(${name} SYSTEM BEFORE
${GTEST_INCLUDE_DIRS}
)
target_include_directories(${name} AFTER PRIVATE
${PROJECT_SUPPORT_DIR}/test/include
)
target_link_libraries(${name} PRIVATE
GTest::gtest
GTest::gmock
)
endif()
endfunction()

43
cmake/hashes.cmake Normal file
View File

@@ -0,0 +1,43 @@
set(BINUTILS_HASH ce2017e059d63e67ddb9240e9d4ec49c2893605035cd60e92ad53177f4377237)
set(BOOST2_HASH 7bd7ddceec1a1dfdcbdb3e609b60d01739c38390a5f956385a12f3122049f0ca)
set(BOOST_HASH 9de758db755e8330a01d995b0a24d09798048400ac25c03fc5ea9be364b13c93)
set(CLI11_HASH 17e02b4cddc2fa348e5dbdbb582c59a3486fa2b2433e70a0c3bacb871334fd55)
set(CPP_HTTPLIB_HASH a66f908f50ccb119769adce44fe1eac75f81b6ffab7c4ac0211bb663ffeb2688)
set(CURL_HASH d4d9a5001b491f5726efe9b50bc4aad03029506e73c9261272e809c64b05e814)
set(CXXOPTS_HASH 3bfc70542c521d4b55a46429d808178916a579b28d048bd8c727ee76c39e2072)
set(EXPAT_HASH 85372797ff0673a8fc4a6be16466bb5a0ca28c0dcf3c6f7ac1686b4a3ba2aabb)
set(FLAC_HASH aea54ed186ad07a34750399cb27fc216a2b62d0ffcd6dc2e3064a3518c3146f8)
set(FMT_HASH aa3e8fbb6a0066c03454434add1f1fc23299e85758ceec0d7d2d974431481e40)
set(FONTCONFIG_HASH 6a33dc555cc9ba8b10caf7695878ef134eeb36d0af366041f639b1da9b6ed220)
set(FREETYPE2_HASH 174d9e53402e1bf9ec7277e22ec199ba3e55a6be2c0740cb18c0ee9850fc8c34)
set(GCC_HASH 7294d65cc1a0558cb815af0ca8c7763d86f7a31199794ede3f630c0d1b0a5723)
set(GTEST_HASH 65fab701d9829d38cb77c14acdc431d2108bfdbf8979e40eb8ae567edf10b27c)
set(ICU_HASH a2c443404f00098e9e90acf29dc318e049d2dc78d9ae5f46efb261934a730ce2)
set(INNOSETUP_HASH fa73bf47a4da250d185d07561c2bfda387e5e20db77e4570004cf6a133cc10b1)
set(JSON_HASH 4b92eb0c06d10683f7447ce9406cb97cd4b453be18d7279320f7b2f025c10187)
set(LIBDSM_HASH 747c4563d6291303d9b085c9e7dc96ac44f91871dcac3e20480fdcc066eee88a)
set(LIBEVENT_HASH 7180a979aaa7000e1264da484f712d403fcf7679b1e9212c4e3d09f5c93efc24)
set(LIBICONV_HASH 3b08f5f4f9b4eb82f151a7040bfd6fe6c6fb922efe4b1659c66ea933276965e8)
set(LIBJPEG_TURBO_HASH 560f6338b547544c4f9721b18d8b87685d433ec78b3c644c70d77adad22c55e6)
set(LIBPNG_HASH 71158e53cfdf2877bc99bcab33641d78df3f48e6e0daad030afe9cb8c031aa46)
set(LIBSODIUM_HASH 8e5aeca07a723a27bbecc3beef14b0068d37e7fc0e97f51b3f1c82d2a58005c1)
set(LIBTASN_HASH 1613f0ac1cf484d6ec0ce3b8c06d56263cc7242f1c23b30d82d23de345a63f7a)
set(MINGW_HASH 5afe822af5c4edbf67daaf45eec61d538f49eef6b19524de64897c6b95828caf)
set(NANA_HASH 56f7b1ed006c750fccf8ef15ab1e83f96751f2dfdcb68d93e5f712a6c9b58bcb)
set(NUSPELL_HASH 5d4baa1daf833a18dc06ae0af0571d9574cc849d47daff6b9ce11dac0a5ded6a)
set(OGG_HASH 83e6704730683d004d20e21b8f7f55dcb3383cdf84c0daedf30bde175f774638)
set(OPENAL_HASH 7e1fecdeb45e7f78722b776c5cf30bd33934b961d7fd2a11e0494e064cc631ce)
set(OPENSSL_HASH b6a5f44b7eb69e3fa35dbf15524405b44837a481d43d81daddde3ff21fcbb8e9)
set(PKG_CONFIG_HASH 6fc69c01688c9458a57eb9a1664c9aba372ccda420a02bf4429fe610e7e7d591)
set(PUGIXML_HASH 655ade57fa703fb421c2eb9a0113b5064bddb145d415dd1f88c79353d90d511a)
set(ROCKSDB_HASH 7ec942baab802b2845188d02bc5d4e42c29236e61bcbc08f5b3a6bdd92290c22)
set(SDL_HASH f50e59da0d383b2c84d43db625c6e23aae58f8f90eabd2944e2138ccc253744b)
set(SECP256K1_HASH 61583939f1f25b92e6401e5b819e399da02562de663873df3056993b40148701)
set(SFML_HASH 15ff4d608a018f287c6a885db0a2da86ea389e516d2323629e4d4407a7ce047f)
set(SPDLOG_HASH 15a04e69c222eb6c01094b5c7ff8a249b36bb22788d72519646fb85feb267e67)
set(SQLITE_HASH 1d3049dd0f830a025a53105fc79fd2ab9431aea99e137809d064d8ee8356b032)
set(STDUUID_HASH b1176597e789531c38481acbbed2a6894ad419aab0979c10410d59eb0ebf40d3)
set(VORBIS_HASH 270c76933d0934e42c5ee0a54a36280e2d87af1de3cc3e584806357e237afd13)
set(WINFSP_HASH 073a70e00f77423e34bed98b86e600def93393ba5822204fac57a29324db9f7a)
set(WXWIDGETS_HASH f936c8d694f9c49a367a376f99c751467150a4ed7cbf8f4723ef19b2d2d9998d)
set(ZLIB_HASH 17e88863f3600672ab49182f217281b6fc4d3c762bde361935e436a95214d05c)

100
cmake/libraries.cmake Normal file
View File

@@ -0,0 +1,100 @@
find_package(PkgConfig REQUIRED)
set(Boost_USE_STATIC_LIBS ${PROJECT_STATIC_LINK})
set(CURL_USE_STATIC_LIBS ${PROJECT_STATIC_LINK})
set(OPENSSL_USE_STATIC_LIBS ${PROJECT_STATIC_LINK})
set(SFML_STATIC_LIBRARIES ${PROJECT_STATIC_LINK})
if (PROJECT_IS_DARWIN)
set(ZLIB_USE_STATIC_LIBS OFF)
else()
set(ZLIB_USE_STATIC_LIBS ${PROJECT_STATIC_LINK})
endif()
set(wxWidgets_USE_STATIC ${PROJECT_STATIC_LINK})
set(ICU_USE_STATIC_LIBS ${PROJECT_STATIC_LINK})
include(cmake/libraries/icu.cmake)
include(cmake/libraries/openssl.cmake)
include(cmake/libraries/boost.cmake)
include(cmake/libraries/backward_cpp.cmake)
include(cmake/libraries/cli11.cmake)
include(cmake/libraries/cpp_httplib.cmake)
include(cmake/libraries/curl.cmake)
include(cmake/libraries/cxxopts.cmake)
include(cmake/libraries/dtl.cmake)
include(cmake/libraries/flac.cmake)
include(cmake/libraries/fmt.cmake)
include(cmake/libraries/fontconfig.cmake)
include(cmake/libraries/freetype2.cmake)
include(cmake/libraries/fuse.cmake)
include(cmake/libraries/fzf.cmake)
include(cmake/libraries/gtkmm.cmake)
include(cmake/libraries/json.cmake)
include(cmake/libraries/libbitcoin_system.cmake)
include(cmake/libraries/libdsm.cmake)
include(cmake/libraries/libevent.cmake)
include(cmake/libraries/libiconv.cmake)
include(cmake/libraries/libjpeg_turbo.cmake)
include(cmake/libraries/libpng.cmake)
include(cmake/libraries/libsodium.cmake)
include(cmake/libraries/libtasn.cmake)
include(cmake/libraries/nana.cmake)
include(cmake/libraries/nuspell.cmake)
include(cmake/libraries/ogg.cmake)
include(cmake/libraries/openal.cmake)
include(cmake/libraries/pugixml.cmake)
include(cmake/libraries/rocksdb.cmake)
include(cmake/libraries/sago_platform_folders.cmake)
include(cmake/libraries/sdl.cmake)
include(cmake/libraries/secp256k1.cmake)
include(cmake/libraries/sfml.cmake)
include(cmake/libraries/spdlog.cmake)
include(cmake/libraries/sqlite.cmake)
include(cmake/libraries/stduuid.cmake)
include(cmake/libraries/testing.cmake)
include(cmake/libraries/tpl.cmake)
include(cmake/libraries/vlc.cmake)
include(cmake/libraries/vorbis.cmake)
include(cmake/libraries/winfsp.cmake)
include(cmake/libraries/wxwidgets.cmake)
if(PROJECT_BUILD)
find_package(Threads REQUIRED)
find_package(ZLIB REQUIRED)
include_directories(BEFORE SYSTEM ${ZLIB_INCLUDE_DIRS})
link_libraries(${ZLIB_LIBRARIES})
if(PROJECT_IS_MINGW)
link_libraries(
advapi32
bcrypt
comdlg32
crypt32
dbghelp
gdi32
httpapi
iphlpapi
kernel32
mswsock
ncrypt
ole32
oleaut32
rpcrt4
secur32
shell32
shlwapi
user32
userenv
uuid
version
winhttp
wininet
winspool
ws2_32
)
elseif(NOT PROJECT_IS_DARWIN)
link_libraries(
uring
)
endif()
endif()

View File

@@ -0,0 +1,11 @@
if(PROJECT_ENABLE_BACKWARD_CPP AND PROJECT_BUILD)
if(PROJECT_IS_MINGW)
add_definitions(-DPROJECT_ENABLE_BACKWARD_CPP)
link_libraries(msvcr90)
else()
add_definitions(-DBACKWARD_HAS_BFD)
link_libraries(bfd)
endif()
endif()

152
cmake/libraries/boost.cmake Normal file
View File

@@ -0,0 +1,152 @@
if(PROJECT_ENABLE_BOOST)
if(PROJECT_ENABLE_LIBBITCOIN_SYSTEM)
set(BOOST_MAJOR_VERSION ${BOOST2_MAJOR_VERSION})
set(BOOST_MINOR_VERSION ${BOOST2_MINOR_VERSION})
set(BOOST_PATCH_VERSION ${BOOST2_PATCH_VERSION})
endif()
set(BOOST_ROOT ${PROJECT_EXTERNAL_BUILD_ROOT})
set(BOOST_INCLUDE_DIR ${BOOST_ROOT}/include/boost-${BOOST_MINOR_VERSION}_${BOOST_MINOR_VERSION})
set(PROJECT_EXTERNAL_CMAKE_FLAGS
${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBOOST_INCLUDE_DIR=${BOOST_INCLUDE_DIR}
-DBOOST_ROOT=${BOOST_ROOT}
)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_BOOST)
if (PROJECT_ENABLE_LIBBITCOIN_SYSTEM)
find_package(Boost ${BOOST_MAJOR_VERSION}.${BOOST_MINOR_VERSION}.${BOOST_PATCH_VERSION} EXACT
REQUIRED
COMPONENTS
atomic
chrono
date_time
filesystem
iostreams
locale
log
log_setup
program_options
random
regex
serialization
system
thread
wserialization
)
else()
if(PROJECT_IS_DARWIN)
set(CMAKE_HAVE_THREADS_LIBRARY 1)
set(CMAKE_THREAD_LIBS_INIT "-lpthread")
set(CMAKE_USE_PTHREADS_INIT 1)
set(CMAKE_USE_WIN32_THREADS_INIT 0)
set(THREADS_PREFER_PTHREAD_FLAG ON)
endif()
find_package(Boost ${BOOST_MAJOR_VERSION}.${BOOST_MINOR_VERSION}.${BOOST_PATCH_VERSION}
REQUIRED
COMPONENTS
atomic
chrono
date_time
filesystem
iostreams
locale
log
log_setup
program_options
random
regex
serialization
thread
wserialization
)
endif()
include_directories(BEFORE SYSTEM
${Boost_INCLUDE_DIRS}
)
link_libraries(
${Boost_LIBRARIES}
)
elseif(NOT PROJECT_IS_MINGW OR CMAKE_HOST_WIN32)
if (PROJECT_ENABLE_LIBBITCOIN_SYSTEM OR NOT CMAKE_HOST_WIN32)
if(PROJECT_CMAKE_BUILD_TYPE STREQUAL "Debug")
set(BOOST_BUILD_TYPE_LOWER debug)
else()
set(BOOST_BUILD_TYPE_LOWER release)
endif()
if(PROJECT_IS_ARM64)
set(BOOST_ARCH arm)
else()
set(BOOST_ARCH x86)
endif()
if(PROJECT_STATIC_LINK)
set(BOOST_LINK static)
else()
set(BOOST_LINK "static,shared")
endif()
set(BOOST_BUILD_ARGS
--openssldir=$ENV{OPENSSL_ROOT_DIR}
--prefix=${PROJECT_EXTERNAL_BUILD_ROOT}
address-model=64
architecture=${BOOST_ARCH}
cxxstd=20
cxxstd-dialect=gnu
cxxflags=-std=gnu++${CMAKE_CXX_STANDARD}
cxxstd=${CMAKE_CXX_STANDARD}
define=BOOST_ASIO_HAS_STD_STRING_VIEW
define=BOOST_SYSTEM_NO_DEPRECATED
link=${BOOST_LINK}
linkflags=-std=gnu++${CMAKE_CXX_STANDARD}
threading=multi
variant=${BOOST_BUILD_TYPE_LOWER}
)
if(PROJECT_ENABLE_LIBBITCOIN_SYSTEM)
set(BOOST_URL_HASH SHA256=${BOOST2_HASH})
else()
set(BOOST_URL_HASH SHA256=${BOOST_HASH})
endif()
ExternalProject_Add(boost_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/boost_${BOOST_MAJOR_VERSION}_${BOOST_MINOR_VERSION}_${BOOST_PATCH_VERSION}.tar.gz
URL_HASH ${BOOST_URL_HASH}
BUILD_IN_SOURCE 1
LIST_SEPARATOR |
CONFIGURE_COMMAND ./bootstrap.sh
--with-libraries=atomic,chrono,date_time,filesystem,iostreams,locale,log,program_options,random,regex,serialization,system,test,thread
BUILD_COMMAND
./b2
-sNO_BZIP2=1
-j$ENV{CMAKE_BUILD_PARALLEL_LEVEL}
${BOOST_BUILD_ARGS}
INSTALL_COMMAND
./b2
-sNO_BZIP2=1
-j$ENV{CMAKE_BUILD_PARALLEL_LEVEL}
${BOOST_BUILD_ARGS}
install
)
list(APPEND PROJECT_DEPENDENCIES boost_project)
if(PROJECT_IS_DARWIN OR PROJECT_REQUIRE_ALPINE)
add_dependencies(boost_project icu_project)
endif()
if (NOT CMAKE_HOST_WIN32)
add_dependencies(boost_project openssl_project)
endif()
endif()
endif()
endif()

View File

@@ -0,0 +1,26 @@
if(PROJECT_ENABLE_CLI11)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_CLI11)
find_package(CLI11 ${CLI11_VERSION} REQUIRED)
elseif(NOT PROJECT_IS_MINGW)
ExternalProject_Add(cli11_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/CLI11-${CLI11_VERSION}.tar.gz
URL_HASH SHA256=${CLI11_HASH}
LIST_SEPARATOR |
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
-DCLI11_WARNINGS_AS_ERRORS=OFF
-DCLI11_SINGLE_FILE=ON
-DCLI11_BUILD_DOCS=OFF
-DCLI11_BUILD_TESTS=OFF
-DCLI11_BUILD_EXAMPLES=OFF
-DCLI11_INSTALL=ON
)
list(APPEND PROJECT_DEPENDENCIES cli11_project)
endif()
endif()

View File

@@ -0,0 +1,36 @@
if(PROJECT_ENABLE_CPP_HTTPLIB)
if(PROJECT_BUILD)
add_definitions(
-DCPPHTTPLIB_OPENSSL_SUPPORT
-DCPPHTTPLIB_TCP_NODELAY=true
-DCPPHTTPLIB_ZLIB_SUPPORT
-DPROJECT_ENABLE_CPP_HTTPLIB
)
elseif(NOT PROJECT_IS_MINGW OR CMAKE_HOST_WIN32)
ExternalProject_Add(cpphttplib_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/cpp-httplib-${CPP_HTTPLIB_VERSION}.tar.gz
URL_HASH SHA256=${CPP_HTTPLIB_HASH}
LIST_SEPARATOR |
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
-DHTTPLIB_REQUIRE_BROTLI=OFF
-DHTTPLIB_REQUIRE_OPENSSL=ON
-DHTTPLIB_REQUIRE_ZLIB=ON
-DHTTPLIB_TEST=OFF
-DHTTPLIB_USE_BROTLI_IF_AVAILABLE=OFF
-DHTTPLIB_USE_OPENSSL_IF_AVAILABLE=ON
-DHTTPLIB_USE_ZLIB_IF_AVAILABLE=ON
-DOPENSSL_USE_STATIC_LIBS=${OPENSSL_USE_STATIC_LIBS}
)
list(APPEND PROJECT_DEPENDENCIES cpphttplib_project)
add_dependencies(cpphttplib_project curl_project)
if (NOT CMAKE_HOST_WIN32)
add_dependencies(cpphttplib_project openssl_project)
endif()
endif()
endif()

View File

@@ -0,0 +1,56 @@
if(PROJECT_ENABLE_CURL)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_CURL)
find_package(CURL ${CURL_VERSION} REQUIRED)
include_directories(BEFORE SYSTEM ${CURL_INCLUDE_DIRS})
link_libraries(CURL::libcurl)
if (EXISTS ${PROJECT_DIST_DIR}/cacert.pem)
file(REMOVE ${PROJECT_DIST_DIR}/cacert.pem)
endif()
file(DOWNLOAD https://curl.haxx.se/ca/cacert.pem ${PROJECT_DIST_DIR}/cacert.pem)
elseif(NOT PROJECT_IS_MINGW OR CMAKE_HOST_WIN32)
ExternalProject_Add(curl_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/curl-${CURL_VERSION}.tar.gz
URL_HASH SHA256=${CURL_HASH}
LIST_SEPARATOR |
BUILD_COMMAND
${CMAKE_COMMAND} --build . -- -j$ENV{CMAKE_BUILD_PARALLEL_LEVEL}
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_CURL_EXE=OFF
-DBUILD_LIBCURL_DOCS=OFF
-DBUILD_MISC_DOCS=OFF
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_CURL=ON
-DBUILD_STATIC_LIBS=ON
-DBUILD_TESTING=OFF
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
-DCURL_BROTLI=OFF
-DCURL_CA_BUNDLE=./cacert.pem
-DCURL_CA_FALLBACK=ON
-DCURL_DISABLE_LDAP=ON
-DCURL_USE_LIBPSL=OFF
-DCURL_USE_LIBSSH2=OFF
-DCURL_USE_OPENSSL=${PROJECT_ENABLE_OPENSSL}
-DCURL_ZLIB=ON
-DCURL_ZSTD=OFF
-DENABLE_CURL_MANUAL=OFF
-DENABLE_THREADED_RESOLVER=ON
-DOPENSSL_ROOT_DIR=${OPENSSL_ROOT_DIR}
-DOPENSSL_USE_STATIC_LIBS=${OPENSSL_USE_STATIC_LIBS}
-DUSE_LIBIDN2=OFF
-DUSE_NGHTTP2=OFF
-DZLIB_USE_STATIC_LIBS=${ZLIB_USE_STATIC_LIBS}
)
list(APPEND PROJECT_DEPENDENCIES curl_project)
if (NOT CMAKE_HOST_WIN32)
add_dependencies(curl_project openssl_project)
endif()
endif()
endif()

View File

@@ -0,0 +1,23 @@
if(PROJECT_ENABLE_CXXOPTS)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_CXXOPTS)
elseif(NOT PROJECT_IS_MINGW OR CMAKE_HOST_WIN32)
ExternalProject_Add(cxxopts_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/cxxopts-v${CXXOPTS_VERSION}.tar.gz
URL_HASH SHA256=${CXXOPTS_HASH}
LIST_SEPARATOR |
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
-DCXXOPTS_BUILD_EXAMPLES=OFF
-DCXXOPTS_BUILD_TESTS=OFF
-DCXXOPTS_ENABLE_INSTALL=ON
-DCXXOPTS_ENABLE_WARNINGS=OFF
-DCXXOPTS_USE_UNICODE_HELP=ON
)
list(APPEND PROJECT_DEPENDENCIES cxxopts_project)
endif()
endif()

18
cmake/libraries/dtl.cmake Normal file
View File

@@ -0,0 +1,18 @@
if(PROJECT_ENABLE_DTL)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_DTL)
else()
ExternalProject_Add(dtl_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/dtl-v${DTL_VERSION}.tar.gz
URL_HASH SHA256=d6dcc7834b4117b5c14456ea73b907d0e2bafa5058e3a06b2c504d53517438c5
LIST_SEPARATOR |
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
)
list(APPEND PROJECT_DEPENDENCIES dtl_project)
endif()
endif()

View File

@@ -0,0 +1,31 @@
if(PROJECT_ENABLE_FLAC)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_FLAC)
find_package(FLAC ${FLAC_VERSION} REQUIRED)
include_directories(BEFORE SYSTEM ${FLAC_INCLUDE_DIRS})
link_libraries(FLAC::FLAC)
elseif(NOT PROJECT_IS_MINGW)
ExternalProject_Add(flac_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/flac-${FLAC_VERSION}.tar.gz
URL_HASH SHA256=${FLAC_HASH}
LIST_SEPARATOR |
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON
-DBUILD_EXAMPLES=OFF
-DBUILD_PROGRAMS=OFF
-DBUILD_TESTING=OFF
-DBUILD_DOCS=OFF
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
-DINSTALL_MANPAGES=OFF
)
list(APPEND PROJECT_DEPENDENCIES flac_project)
add_dependencies(flac_project libiconv_project vorbis_project)
endif()
endif()

26
cmake/libraries/fmt.cmake Normal file
View File

@@ -0,0 +1,26 @@
if(PROJECT_ENABLE_FMT)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_FMT)
find_package(fmt ${FMT_VERSION} REQUIRED)
include_directories(BEFORE SYSTEM ${FMT_INCLUDE_DIRS})
link_libraries(fmt::fmt)
elseif(NOT PROJECT_IS_MINGW OR CMAKE_HOST_WIN32)
ExternalProject_Add(fmt_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/fmt-${FMT_VERSION}.tar.gz
URL_HASH SHA256=${FMT_HASH}
LIST_SEPARATOR |
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
-DFMT_DOC=OFF
-DFMT_TEST=OFF
)
list(APPEND PROJECT_DEPENDENCIES fmt_project)
endif()
endif()

View File

@@ -0,0 +1,38 @@
if(PROJECT_ENABLE_FONTCONFIG)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_FONTCONFIG)
find_package(Fontconfig ${FONTCONFIG_VERSION} REQUIRED)
include_directories(BEFORE SYSTEM ${FONTCONFIG_INCLUDE_DIRS})
link_libraries(Fontconfig::Fontconfig)
elseif(NOT PROJECT_IS_MINGW)
ExternalProject_Add(fontconfig_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/fontconfig-${FONTCONFIG_VERSION}.tar.xz
URL_HASH SHA256=${FONTCONFIG_HASH}
BUILD_IN_SOURCE 1
LIST_SEPARATOR |
CONFIGURE_COMMAND meson
setup
--prefix=${PROJECT_EXTERNAL_BUILD_ROOT}
_build
BUILD_COMMAND meson
compile
-C _build
INSTALL_COMMAND meson
install
-C _build
)
list(APPEND PROJECT_DEPENDENCIES fontconfig_project)
add_dependencies(fontconfig_project
freetype2_project
libjpeg_turbo_project
libpng_project
)
endif()
endif()

View File

@@ -0,0 +1,32 @@
if(PROJECT_ENABLE_FREETYPE2)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_FREETYPE2)
find_package(Freetype ${FREETYPE2_VERSION} REQUIRED)
include_directories(BEFORE SYSTEM ${FREETYPE_INCLUDE_DIRS})
link_libraries(Freetype::Freetype)
elseif(NOT PROJECT_IS_MINGW)
ExternalProject_Add(freetype2_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/freetype-${FREETYPE2_VERSION}.tar.gz
URL_HASH SHA256=${FREETYPE2_HASH}
BUILD_IN_SOURCE 1
LIST_SEPARATOR |
CONFIGURE_COMMAND meson
setup
--prefix=${PROJECT_EXTERNAL_BUILD_ROOT}
_build
BUILD_COMMAND meson
compile
-C _build
INSTALL_COMMAND meson
install
-C _build
)
list(APPEND PROJECT_DEPENDENCIES freetype2_project)
endif()
endif()

View File

@@ -0,0 +1,45 @@
if(PROJECT_ENABLE_FUSE AND NOT PROJECT_IS_MINGW)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_FUSE)
include_directories(BEFORE SYSTEM ${PROJECT_FUSE_INCLUDE_DIRS})
if(PROJECT_FUSE STREQUAL "fuse3")
add_definitions(-DFUSE_USE_VERSION=30)
if(PROJECT_STATIC_LINK)
link_libraries(libfuse3.a)
else()
link_libraries(fuse3)
endif()
elseif(PROJECT_FUSE STREQUAL "fuse2")
add_definitions(-DFUSE_USE_VERSION=29)
if(PROJECT_STATIC_LINK)
link_libraries(libfuse.a)
else()
link_libraries(fuse)
endif()
endif()
else()
if (PROJECT_IS_DARWIN)
find_library(OSXFUSE NO_CACHE NAMES OSXFUSE)
if (NOT OSXFUSE)
message(FATAL_ERROR "FUSE for macOS not found (https://macfuse.github.io)")
endif ()
set(PROJECT_FUSE fuse2)
else()
pkg_check_modules(LIBFUSE3 fuse3>=3.0.0)
if(LIBFUSE3_FOUND)
set(PROJECT_FUSE fuse3)
set(PROJECT_FUSE_INCLUDE_DIRS ${LIBFUSE3_INCLUDE_DIRS})
else()
pkg_check_modules(LIBFUSE2 fuse>=2.9.0)
if(LIBFUSE2_FOUND)
set(PROJECT_FUSE fuse2)
set(PROJECT_FUSE_INCLUDE_DIRS ${LIBFUSE2_INCLUDE_DIRS})
else()
message(FATAL_ERROR "fuse library not found")
endif()
endif()
endif()
endif()
endif()

View File

@@ -0,0 +1,3 @@
if(PROJECT_ENABLE_FZF AND PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_FZF)
endif()

View File

@@ -0,0 +1,23 @@
if(PROJECT_ENABLE_GTKMM)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_GTKMM)
find_package(PNG REQUIRED)
pkg_check_modules(GTKMM REQUIRED gtkmm-${GTKMM_VERSION})
add_definitions(${GTKMM_DEFINITIONS})
include_directories(
${GTKMM_INCLUDE_DIRS}
${PNG_INCLUDE_DIRS}
)
link_directories(${GTKMM_LIBRARY_DIRS})
link_libraries(
${GTKMM_LIBRARIES}
${PNG_LIBRARIES}
)
endif()
endif()

24
cmake/libraries/icu.cmake Normal file
View File

@@ -0,0 +1,24 @@
if((PROJECT_IS_DARWIN OR PROJECT_REQUIRE_ALPINE) AND NOT PROJECT_IS_MINGW AND NOT PROJECT_BUILD)
if(PROJECT_BUILD_SHARED_LIBS)
set(ICU_ENABLE_SHARED yes)
else()
set(ICU_ENABLE_SHARED no)
endif()
ExternalProject_Add(icu_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/mingw64/icu-release-${ICU_VERSION}.tar.gz
URL_HASH SHA256=${ICU_HASH}
BUILD_IN_SOURCE 1
LIST_SEPARATOR |
PATCH_COMMAND chmod +x ${PROJECT_3RD_PARTY_DIR}/icu_configure.sh
CONFIGURE_COMMAND cd icu4c/source && ${PROJECT_3RD_PARTY_DIR}/icu_configure.sh
${PROJECT_MARCH}
${PROJECT_EXTERNAL_BUILD_ROOT}
${ICU_ENABLE_SHARED}
BUILD_COMMAND cd icu4c/source && make -j$ENV{CMAKE_BUILD_PARALLEL_LEVEL}
INSTALL_COMMAND cd icu4c/source && make install
)
list(APPEND PROJECT_DEPENDENCIES icu_project)
endif()

View File

@@ -0,0 +1,29 @@
if(PROJECT_ENABLE_JSON)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_JSON)
find_package(nlohmann_json ${JSON_VERSION} REQUIRED)
if(PROJECT_IS_MINGW AND PROJECT_IS_MINGW_UNIX)
include_directories(BEFORE SYSTEM /mingw64/include/nlohmann)
else()
include_directories(BEFORE SYSTEM ${PROJECT_EXTERNAL_BUILD_ROOT}/include/nlohmann)
endif()
elseif(NOT PROJECT_IS_MINGW OR CMAKE_HOST_WIN32)
ExternalProject_Add(json_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/json-${JSON_VERSION}.tar.gz
URL_HASH SHA256=${JSON_HASH}
LIST_SEPARATOR |
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
-DJSON_BuildTests=OFF
-DJSON_Install=ON
-DJSON_MultipleHeaders=OFF
)
list(APPEND PROJECT_DEPENDENCIES json_project)
endif()
endif()

View File

@@ -0,0 +1,51 @@
if(PROJECT_ENABLE_LIBBITCOIN_SYSTEM)
if(PROJECT_BUILD)
add_definitions(
-DPROJECT_ENABLE_LIBBITCOIN_SYSTEM
-DBC_STATIC
-DECMULT_GEN_PREC_BITS=4
-DECMULT_WINDOW_SIZE=15
-DWITH_ICU
)
set(LIBBITCOIN_SYSTEM_ROOT ${PROJECT_BUILD_DIR}/external/src/libbitcoin_system_project)
include_directories(SYSTEM BEFORE ${LIBBITCOIN_SYSTEM_ROOT}/include)
set(PROJECT_ADDITIONAL_SOURCES
${PROJECT_ADDITIONAL_SOURCES}
${LIBBITCOIN_SYSTEM_ROOT}/src/config/*.cpp
${LIBBITCOIN_SYSTEM_ROOT}/src/error.cpp
${LIBBITCOIN_SYSTEM_ROOT}/src/formats/*.cpp
${LIBBITCOIN_SYSTEM_ROOT}/src/math/*.cpp
${LIBBITCOIN_SYSTEM_ROOT}/src/math/external/*.c
${LIBBITCOIN_SYSTEM_ROOT}/src/message/network_address.cpp
${LIBBITCOIN_SYSTEM_ROOT}/src/unicode/*.cpp
${LIBBITCOIN_SYSTEM_ROOT}/src/utility/istream_reader.cpp
${LIBBITCOIN_SYSTEM_ROOT}/src/utility/ostream_writer.cpp
${LIBBITCOIN_SYSTEM_ROOT}/src/utility/string.cpp
${LIBBITCOIN_SYSTEM_ROOT}/src/wallet/dictionary.cpp
${LIBBITCOIN_SYSTEM_ROOT}/src/wallet/electrum.cpp
${LIBBITCOIN_SYSTEM_ROOT}/src/wallet/electrum_dictionary.cpp
${LIBBITCOIN_SYSTEM_ROOT}/src/wallet/mnemonic.cpp
)
else()
ExternalProject_Add(libbitcoin_system_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/libbitcoin-system-${LIBBITCOIN_SYSTEM_VERSION}.tar.gz
URL_HASH SHA256=0d10d79472e914620223f1ddb9396b0fa92ae5eb0b31acc14b9aa634a01d78b6
CONFIGURE_COMMAND echo "No configure"
BUILD_COMMAND echo "No build"
INSTALL_COMMAND echo "No install"
)
list(APPEND PROJECT_DEPENDENCIES libbitcoin_system_project)
if(NOT PROJECT_IS_MINGW_UNIX)
add_dependencies(libbitcoin_system_project
boost_project
secp256k1_project
)
endif()
endif()
endif()

View File

@@ -0,0 +1,87 @@
if(PROJECT_ENABLE_LIBDSM)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_LIBDSM)
find_library(libdsm_LIBRARIES NAMES libdsm.a)
link_libraries(${libdsm_LIBRARIES})
elseif(NOT PROJECT_IS_MINGW)
set(_meson_c_args "-I${PROJECT_EXTERNAL_BUILD_ROOT}/deps/include")
set(_meson_c_link_args "-L${PROJECT_EXTERNAL_BUILD_ROOT}/deps/lib -L${PROJECT_EXTERNAL_BUILD_ROOT}/deps/lib64")
set(_meson_host_arg "")
set(_meson_host_file "${PROJECT_EXTERNAL_BUILD_ROOT}/libdsm_host_machine.ini")
if(PROJECT_IS_DARWIN)
set(_mac_arch_raw "${CMAKE_OSX_ARCHITECTURES}")
string(TOLOWER "${_mac_arch_raw}" _mac_arch)
if(_mac_arch MATCHES ";")
set(_meson_c_args "${_meson_c_args}|-arch|arm64|-arch|x86_64")
set(_meson_c_link_args "${_meson_c_link_args}|-arch|arm64|-arch|x86_64")
else()
if(_mac_arch STREQUAL "arm64")
set(_meson_cpu_family "aarch64")
set(_meson_cpu "arm64")
set(_meson_c_args "${_meson_c_args}|-arch|arm64")
set(_meson_c_link_args "${_meson_c_link_args}|-arch|arm64")
elseif(_mac_arch STREQUAL "x86_64")
set(_meson_cpu_family "x86_64")
set(_meson_cpu "x86_64")
set(_meson_c_args "${_meson_c_args}|-arch|x86_64")
set(_meson_c_link_args "${_meson_c_link_args}|-arch|x86_64")
endif()
if(DEFINED _meson_cpu_family AND DEFINED _meson_cpu)
file(WRITE "${_meson_host_file}"
"[binaries]
c = 'clang'
cpp = 'clang++'
[host_machine]
system = 'darwin'
cpu_family = '${_meson_cpu_family}'
cpu = '${_meson_cpu}'
endian = 'little'
"
)
set(_meson_host_arg "--native-file=${_meson_host_file}")
endif()
endif()
endif()
ExternalProject_Add(libdsm_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/libdsm-${LIBDSM_VERSION}.tar.gz
URL_HASH SHA256=${LIBDSM_HASH}
BUILD_IN_SOURCE 1
LIST_SEPARATOR |
PATCH_COMMAND ${PROJECT_3RD_PARTY_DIR}/libdsm_patch.sh
${PROJECT_3RD_PARTY_DIR}
${CMAKE_BINARY_DIR}/external/src/libdsm_project
CONFIGURE_COMMAND meson
setup
-Dc_args="${_meson_c_args}"
-Dcpp_args="${_meson_c_args}"
-Dc_link_args="${_meson_c_link_args}"
-Dcpp_link_args="${_meson_c_link_args}"
${_meson_host_arg}
--prefix=${PROJECT_EXTERNAL_BUILD_ROOT}
-Dbinaries=false
-Ddefault_library=static
_build
BUILD_COMMAND meson
compile -C _build
INSTALL_COMMAND meson
install -C _build
)
list(APPEND PROJECT_DEPENDENCIES libdsm_project)
add_dependencies(libdsm_project
libiconv_project
libtasn1_project
openssl_project
)
endif()
endif()

View File

@@ -0,0 +1,49 @@
if(PROJECT_ENABLE_LIBEVENT)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_LIBEVENT)
if(PROJECT_IS_MINGW AND NOT PROJECT_IS_MINGW_UNIX)
pkg_check_modules(LIBEVENT REQUIRED libevent>=${LIBEVENT_VERSION})
else()
set(LIBEVENT_STATIC_LINK ${PROJECT_STATIC_LINK})
find_package(Libevent ${LIBEVENT_VERSION} REQUIRED)
endif()
include_directories(BEFORE SYSTEM ${LIBEVENT_INCLUDE_DIRS})
if (PROJECT_IS_MINGW_UNIX)
unset(LIBEVENT_LIBRARIES)
set(LIBEVENT_LIBRARIES
/mingw64/lib/libevent.dll.a
/mingw64/lib/libevent_core.dll.a
/mingw64/lib/libevent_extra.dll.a
)
endif()
link_libraries(${LIBEVENT_LIBRARIES})
elseif(NOT PROJECT_IS_MINGW)
if(PROJECT_BUILD_SHARED_LIBS)
set(LIBEVENT_LIBRARY_TYPE BOTH)
else()
set(LIBEVENT_LIBRARY_TYPE STATIC)
endif()
ExternalProject_Add(libevent_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/libevent-${LIBEVENT_VERSION}-stable.tar.gz
URL_HASH SHA256=${LIBEVENT_HASH}
LIST_SEPARATOR |
PATCH_COMMAND ${PROJECT_3RD_PARTY_DIR}/libevent_patch.sh
${PROJECT_3RD_PARTY_DIR}
${CMAKE_BINARY_DIR}/external/src/libevent_project
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
-DEVENT__DISABLE_OPENSSL=ON
-DEVENT__DISABLE_SAMPLES=ON
-DEVENT__DISABLE_TESTS=ON
-DEVENT__LIBRARY_TYPE=${LIBEVENT_LIBRARY_TYPE}
)
list(APPEND PROJECT_DEPENDENCIES libevent_project)
endif()
endif()

View File

@@ -0,0 +1,25 @@
if(PROJECT_ENABLE_LIBICONV)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_LIBICONV)
find_library(libiconv_LIBRARIES NAMES libiconv.a)
link_libraries(${libiconv_LIBRARIES})
elseif(NOT PROJECT_IS_MINGW)
ExternalProject_Add(libiconv_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/libiconv-${LIBICONV_VERSION}.tar.gz
URL_HASH SHA256=${LIBICONV_HASH}
BUILD_IN_SOURCE 1
LIST_SEPARATOR |
CONFIGURE_COMMAND ./configure
--enable-shared=no
--enable-static=yes
--prefix=${PROJECT_EXTERNAL_BUILD_ROOT}
BUILD_COMMAND make -j1
INSTALL_COMMAND make install
)
list(APPEND PROJECT_DEPENDENCIES libiconv_project)
endif()
endif()

View File

@@ -0,0 +1,27 @@
if(PROJECT_ENABLE_LIBJPEG_TURBO)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_LIBJPEG_TURBO)
find_package(JPEG ${LIBJPEG_TURBO_VERSION} REQUIRED)
include_directories(${JPEG_INCLUDE_DIRS})
link_libraries(JPEG::JPEG)
elseif(NOT PROJECT_IS_MINGW)
ExternalProject_Add(libjpeg_turbo_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/libjpeg_turbo-${LIBJPEG_TURBO_VERSION}.tar.gz
URL_HASH SHA256=${LIBJPEG_TURBO_HASH}
LIST_SEPARATOR |
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
-DENABLE_SHARED=${PROJECT_BUILD_SHARED_LIBS}
-DENABLE_STATIC=ON
)
list(APPEND PROJECT_DEPENDENCIES libjpeg_turbo_project)
endif()
endif()

View File

@@ -0,0 +1,30 @@
if(PROJECT_ENABLE_LIBPNG)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_PNG)
find_package(PNG ${LIBPNG_VERSION} REQUIRED )
include_directories(${PNG_INCLUDE_DIRS})
link_libraries(PNG::PNG)
elseif(NOT PROJECT_IS_MINGW)
ExternalProject_Add(libpng_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/libpng-v${LIBPNG_VERSION}.tar.gz
URL_HASH SHA256=${LIBPNG_HASH}
LIST_SEPARATOR |
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
-DENABLE_SHARED=${PROJECT_BUILD_SHARED_LIBS}
-DPNG_SHARED=ON
-DPNG_STATIC=ON
-DPNG_TESTS=OFF
-DPNG_TOOLS=OFF
)
list(APPEND PROJECT_DEPENDENCIES libpng_project)
endif()
endif()

View File

@@ -0,0 +1,48 @@
if(PROJECT_ENABLE_LIBSODIUM)
if(PROJECT_BUILD)
pkg_check_modules(SODIUM libsodium>=${LIBSODIUM_VERSION} REQUIRED)
add_definitions(-DPROJECT_ENABLE_LIBSODIUM)
include_directories(BEFORE SYSTEM ${SODIUM_INCLUDE_DIRS})
if(PROJECT_IS_MINGW_UNIX)
if(PROJECT_STATIC_LINK)
link_libraries(/mingw64/lib/libsodium.a)
else()
link_libraries(/mingw64/lib/libsodium.dll.a)
endif()
else()
link_libraries(${SODIUM_LIBRARIES})
endif()
elseif(NOT PROJECT_IS_MINGW)
if(PROJECT_IS_MINGW)
set(LIBSODIUM_TYPE mingw64)
else()
set(LIBSODIUM_TYPE linux)
endif()
if(PROJECT_BUILD_SHARED_LIBS)
set(LIBSODIUM_ENABLE_SHARED yes)
else()
set(LIBSODIUM_ENABLE_SHARED no)
endif()
ExternalProject_Add(libsodium_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/libsodium-${LIBSODIUM_VERSION}.tar.gz
URL_HASH SHA256=${LIBSODIUM_HASH}
BUILD_IN_SOURCE 1
LIST_SEPARATOR |
CONFIGURE_COMMAND ${PROJECT_3RD_PARTY_DIR}/libsodium_configure.sh
${LIBSODIUM_TYPE}
${PROJECT_MARCH}
${PROJECT_EXTERNAL_BUILD_ROOT}
${LIBSODIUM_ENABLE_SHARED}
BUILD_COMMAND make -j1
INSTALL_COMMAND make install
)
list(APPEND PROJECT_DEPENDENCIES libsodium_project)
endif()
endif()

View File

@@ -0,0 +1,30 @@
if(PROJECT_ENABLE_LIBTASN)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_LIBTASN)
find_library(libtasn1_LIBRARIES NAMES libtasn1.a)
link_libraries(${libtasn1_LIBRARIES})
elseif(NOT PROJECT_IS_MINGW)
ExternalProject_Add(libtasn1_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/libtasn1-${LIBTASN_VERSION}.tar.gz
URL_HASH SHA256=${LIBTASN_HASH}
BUILD_IN_SOURCE 1
LIST_SEPARATOR |
CONFIGURE_COMMAND ./configure
--disable-doc
--enable-shared=no
--enable-static=yes
--prefix=${PROJECT_EXTERNAL_BUILD_ROOT}
BUILD_COMMAND make -j1
INSTALL_COMMAND make install
)
list(APPEND PROJECT_DEPENDENCIES libtasn1_project)
if (PROJECT_ENABLE_OPENSSL)
add_dependencies(libtasn1_project openssl_project)
endif()
endif()
endif()

View File

@@ -0,0 +1,48 @@
if(PROJECT_ENABLE_NANA)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_NANA)
find_library(NANA_LIBRARIES NAMES nana REQUIRED)
if (NOT PROJECT_IS_MINGW)
find_package(X11 REQUIRED)
endif()
include_directories(SYSTEM ${X11_INCLUDE_DIR})
link_libraries(
${NANA_LIBRARIES}
${X11_LIBRARIES}
)
if (NOT PROJECT_IS_MINGW)
link_libraries(
X11::Xft
X11::Xcursor
)
endif()
elseif(NOT PROJECT_IS_MINGW)
ExternalProject_Add(nana_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/nana-v${NANA_VERSION}.tar.gz
URL_HASH SHA256=${NANA_HASH}
LIST_SEPARATOR |
PATCH_COMMAND ${PROJECT_3RD_PARTY_DIR}/nana_patch.sh
${PROJECT_3RD_PARTY_DIR}
${CMAKE_BINARY_DIR}/external/src/nana_project
CMAKE_ARGS
-DCMAKE_INSTALL_PREFIX=${PROJECT_EXTERNAL_BUILD_ROOT}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
-DNANA_CMAKE_ENABLE_AUDIO=OFF
-DNANA_CMAKE_ENABLE_JPEG=ON
-DNANA_CMAKE_ENABLE_PNG=ON
-DNANA_CMAKE_INSTALL=ON
)
list(APPEND PROJECT_DEPENDENCIES nana_project)
add_dependencies(nana_project libjpeg_turbo_project libpng_project)
endif()
endif()

View File

@@ -0,0 +1,27 @@
if(PROJECT_ENABLE_NUSPELL)
if(PROJECT_BUILD)
find_package(Nuspell ${NUSPELL_VERSION} REQUIRED)
add_definitions(-DPROJECT_ENABLE_NUSPELL)
include_directories(BEFORE SYSTEM ${NUSPELL_INCLUDE_DIRS})
link_libraries(Nuspell::nuspell)
elseif(NOT PROJECT_IS_MINGW)
ExternalProject_Add(nuspell_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/nuspell-v${NUSPELL_VERSION}.tar.gz
URL_HASH SHA256=${NUSPELL_HASH}
LIST_SEPARATOR |
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_DOCS=OFF
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON
-DBUILD_TESTING=OFF
-DBUILD_TOOLS=OFF
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
)
list(APPEND PROJECT_DEPENDENCIES nuspell_project)
endif()
endif()

24
cmake/libraries/ogg.cmake Normal file
View File

@@ -0,0 +1,24 @@
if(PROJECT_ENABLE_OGG)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_OGG)
find_package(Ogg ${OGG_VERSION} REQUIRED)
include_directories(BEFORE SYSTEM ${OGG_INCLUDE_DIRS})
link_libraries(Ogg::ogg)
elseif(NOT PROJECT_IS_MINGW)
ExternalProject_Add(ogg_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/ogg-v${OGG_VERSION}.tar.gz
URL_HASH SHA256=${OGG_HASH}
LIST_SEPARATOR |
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
)
list(APPEND PROJECT_DEPENDENCIES ogg_project)
endif()
endif()

View File

@@ -0,0 +1,24 @@
if(PROJECT_ENABLE_OPENAL)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_OPENAL)
find_package(OpenAL ${OPENAL_VERSION} REQUIRED)
include_directories(BEFORE SYSTEM ${OPENAL_INCLUDE_DIR})
link_libraries(${OPENAL_LIBRARY})
elseif(NOT PROJECT_IS_MINGW)
ExternalProject_Add(openal_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/openal-${OPENAL_VERSION}.tar.gz
URL_HASH SHA256=${OPENAL_HASH}
LIST_SEPARATOR |
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
)
list(APPEND PROJECT_DEPENDENCIES openal_project)
endif()
endif()

View File

@@ -0,0 +1,59 @@
set(OPENSSL_ROOT_DIR $ENV{OPENSSL_ROOT_DIR})
if(PROJECT_ENABLE_OPENSSL)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_OPENSSL)
find_package(OpenSSL ${OPENSSL_VERSION} REQUIRED)
include_directories(BEFORE SYSTEM ${OPENSSL_INCLUDE_DIR})
link_libraries(
OpenSSL::Crypto
OpenSSL::SSL
)
elseif(NOT PROJECT_IS_MINGW)
if(PROJECT_IS_MINGW)
set(OPENSSL_COMPILE_TYPE mingw64)
elseif(PROJECT_IS_DARWIN)
if(PROJECT_IS_ARM64)
set(OPENSSL_COMPILE_TYPE darwin64-arm64)
else()
set(OPENSSL_COMPILE_TYPE darwin64-x86_64)
endif()
elseif(PROJECT_IS_ARM64)
set(OPENSSL_COMPILE_TYPE linux-aarch64)
else()
set(OPENSSL_COMPILE_TYPE linux-x86_64)
endif()
if(PROJECT_IS_MINGW_UNIX)
set(OPENSSL_CROSS_PREFIX "--cross-compile-prefix=x86_64-w64-mingw32-")
endif()
if(PROJECT_BUILD_SHARED_LIBS)
set(OPENSSL_NO_SHARED shared)
else()
set(OPENSSL_NO_SHARED no-shared)
endif()
ExternalProject_Add(openssl_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/openssl-${OPENSSL_VERSION}.tar.gz
URL_HASH SHA256=${OPENSSL_HASH}
BUILD_IN_SOURCE 1
LIST_SEPARATOR |
CONFIGURE_COMMAND ./Configure
${OPENSSL_COMPILE_TYPE}
${OPENSSL_CROSS_PREFIX}
--prefix=${PROJECT_EXTERNAL_BUILD_ROOT}
no-apps
no-docs
${OPENSSL_NO_SHARED}
BUILD_COMMAND make -j1
INSTALL_COMMAND make install
)
list(APPEND PROJECT_DEPENDENCIES openssl_project)
endif()
endif()

View File

@@ -0,0 +1,28 @@
if(PROJECT_ENABLE_PUGIXML)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_PUGIXML)
find_package(pugixml ${PUGIXML_VERSION} REQUIRED)
include_directories(BEFORE SYSTEM ${PUGIXML_INCLUDE_DIR})
if(PROJECT_STATIC_LINK)
link_libraries(pugixml::static)
else()
link_libraries(pugixml::pugixml)
endif()
elseif(NOT PROJECT_IS_MINGW)
ExternalProject_Add(pugixml_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/pugixml-${PUGIXML_VERSION}.tar.gz
URL_HASH SHA256=${PUGIXML_HASH}
LIST_SEPARATOR |
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
)
list(APPEND PROJECT_DEPENDENCIES pugixml_project)
endif()
endif()

View File

@@ -0,0 +1,38 @@
if(PROJECT_ENABLE_ROCKSDB)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_ROCKSDB)
find_library(ROCKSDB_LIBRARY NAMES librocksdb.a REQUIRED)
link_libraries(${ROCKSDB_LIBRARY})
elseif(NOT PROJECT_IS_MINGW OR CMAKE_HOST_WIN32)
ExternalProject_Add(rocksdb_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/rocksdb-${ROCKSDB_VERSION}.tar.gz
URL_HASH SHA256=${ROCKSDB_HASH}
LIST_SEPARATOR |
BUILD_COMMAND
${CMAKE_COMMAND} --build . -- -j$ENV{CMAKE_BUILD_PARALLEL_LEVEL}
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=OFF
-DBUILD_STATIC_LIBS=ON
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
-DFAIL_ON_WARNINGS=OFF
-DPORTABLE=1
-DROCKSDB_BUILD_SHARED=OFF
-DROCKSDB_INSTALL_ON_WINDOWS=ON
-DWITH_BENCHMARK=OFF
-DWITH_BENCHMARK_TOOLS=OFF
-DWITH_BZ2=OFF
-DWITH_CORE_TOOLS=OFF
-DWITH_EXAMPLES=OFF
-DWITH_GFLAGS=OFF
-DWITH_IOSTATS_CONTEXT=OFF
-DWITH_PERF_CONTEXT=OFF
-DWITH_TESTS=OFF
-DWITH_TOOLS=OFF
-DWITH_TRACE_TOOLS=OFF
-DWITH_ZLIB=ON
)
list(APPEND PROJECT_DEPENDENCIES rocksdb_project)
endif()
endif()

View File

@@ -0,0 +1,3 @@
if(PROJECT_ENABLE_SAGO_PLATFORM_FOLDERS AND PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_SAGO_PLATFORM_FOLDERS)
endif()

33
cmake/libraries/sdl.cmake Normal file
View File

@@ -0,0 +1,33 @@
if(PROJECT_ENABLE_SDL)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_SDL)
set(SDL2_NO_MWINDOWS ON)
find_package(SDL2 ${SDL_VERSION} REQUIRED)
include_directories(SYSTEM ${SDL2_INCLUDE_DIRS})
link_libraries(SDL2::SDL2)
elseif(NOT PROJECT_IS_MINGW)
if(PROJECT_BUILD_SHARED_LIBS)
set(SDL_CONFIGURE_OPTS --enable-shared=yes --enable-static=yes)
else()
set(SDL_CONFIGURE_OPTS --enable-shared=no --enable-static=yes)
endif()
ExternalProject_Add(sdl_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/sdl-${SDL_VERSION}.tar.gz
URL_HASH SHA256=${SDL_HASH}
BUILD_IN_SOURCE 1
LIST_SEPARATOR |
CONFIGURE_COMMAND ./configure
--prefix=${PROJECT_EXTERNAL_BUILD_ROOT}
${SDL_CONFIGURE_OPTS}
BUILD_COMMAND make -j1
INSTALL_COMMAND make install
)
list(APPEND PROJECT_DEPENDENCIES sdl_project)
endif()
endif()

View File

@@ -0,0 +1,35 @@
if(PROJECT_ENABLE_SECP256K1)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_SECP256K1)
pkg_check_modules(SECP256K1 libsecp256k1=${SECP256K1_VERSION} REQUIRED)
include_directories(BEFORE SYSTEM ${SECP256K1_INCLUDE_DIRS})
link_libraries(${SECP256K1_LINK_LIBRARIES})
elseif(NOT PROJECT_IS_MINGW OR CMAKE_HOST_WIN32)
if(PROJECT_BUILD_SHARED_LIBS)
set(SECP256K1_ENABLE_SHARED yes)
else()
set(SECP256K1_ENABLE_SHARED no)
endif()
ExternalProject_Add(secp256k1_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/secp256k1-${SECP256K1_VERSION}.tar.gz
URL_HASH SHA256=${SECP256K1_HASH}
BUILD_IN_SOURCE 1
LIST_SEPARATOR |
CONFIGURE_COMMAND ./autogen.sh && ./configure
--enable-shared=${SECP256K1_ENABLE_SHARED}
--enable-static=yes
--enable-module-ecdh
--enable-module-recovery
--prefix=${PROJECT_EXTERNAL_BUILD_ROOT}
BUILD_COMMAND make -j1
INSTALL_COMMAND make install
)
list(APPEND PROJECT_DEPENDENCIES secp256k1_project)
endif()
endif()

View File

@@ -0,0 +1,59 @@
if(PROJECT_ENABLE_SFML)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_SFML)
find_package(OpenGL REQUIRED)
find_package(X11 REQUIRED)
find_package(SFML ${SFML_VERSION}
COMPONENTS
audio
graphics
network
system
window
REQUIRED
)
if(NOT PROJECT_BUILD_SHARED_LIBS)
set(SFML_STATIC_LIB_APPEND "-s")
endif()
link_libraries(
${X11_LIBRARIES}
sfml-audio${SFML_STATIC_LIB_APPEND}
sfml-graphics${SFML_STATIC_LIB_APPEND}
sfml-network${SFML_STATIC_LIB_APPEND}
sfml-system${SFML_STATIC_LIB_APPEND}
sfml-window${SFML_STATIC_LIB_APPEND}
)
include_directories(BEFORE SYSTEM
${X11_INCLUDE_DIR}
${SFML_INCLUDE_DIR}
)
elseif(NOT PROJECT_IS_MINGW)
ExternalProject_Add(sfml_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/SFML-${SFML_VERSION}.tar.gz
URL_HASH SHA256=${SFML_HASH}
PATCH_COMMAND ${PROJECT_3RD_PARTY_DIR}/SFML_patch.sh
LIST_SEPARATOR |
BUILD_COMMAND
${CMAKE_COMMAND} --build . -- -j$ENV{CMAKE_BUILD_PARALLEL_LEVEL}
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
)
list(APPEND PROJECT_DEPENDENCIES sfml_project)
add_dependencies(sfml_project
flac_project
fontconfig_project
freetype2_project
openal_project
)
endif()
endif()

View File

@@ -0,0 +1,26 @@
if(PROJECT_ENABLE_SPDLOG)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_SPDLOG)
find_package(spdlog ${SPDLOG_VERSION} REQUIRED)
include_directories(BEFORE SYSTEM ${SPDLOG_INCLUDE_DIRS})
link_libraries(spdlog::spdlog)
elseif(NOT PROJECT_IS_MINGW OR CMAKE_HOST_WIN32)
ExternalProject_Add(spdlog_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/spdlog-${SPDLOG_VERSION}.tar.gz
URL_HASH SHA256=${SPDLOG_HASH}
LIST_SEPARATOR |
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
-DSPDLOG_BUILD_EXAMPLE=OFF
-DSPDLOG_FMT_EXTERNAL=OFF
-DSPDLOG_FMT_EXTERNAL_HO=OFF
)
list(APPEND PROJECT_DEPENDENCIES spdlog_project)
endif()
endif()

View File

@@ -0,0 +1,29 @@
if(PROJECT_ENABLE_SQLITE)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_SQLITE)
if (PROJECT_IS_MINGW AND NOT PROJECT_IS_MINGW_UNIX)
pkg_check_modules(SQLITE3 REQUIRED sqlite3)
include_directories(SYSTEM BEFORE ${SQLITE3_INCLUDE_DIRS})
link_libraries(${SQLITE3_LIBRARIES})
else()
set(SQLITE_SYSTEM_ROOT ${PROJECT_BUILD_DIR}/external/src/sqlite_project)
include_directories(SYSTEM BEFORE ${SQLITE_SYSTEM_ROOT})
list(APPEND PROJECT_ADDITIONAL_SOURCES
${SQLITE_SYSTEM_ROOT}/sqlite3.c
)
endif()
elseif(NOT PROJECT_IS_MINGW OR PROJECT_IS_MINGW_UNIX)
ExternalProject_Add(sqlite_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/sqlite-amalgamation-${SQLITE_VERSION}.zip
URL_HASH SHA256=${SQLITE_HASH}
CONFIGURE_COMMAND echo "No configure"
BUILD_COMMAND echo "No build"
INSTALL_COMMAND echo "No install"
)
list(APPEND PROJECT_DEPENDENCIES sqlite_project)
endif()
endif()

View File

@@ -0,0 +1,27 @@
if(PROJECT_ENABLE_STDUUID)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_STDUUID)
find_package(stduuid REQUIRED)
include_directories(BEFORE SYSTEM ${stduuid_INCLUDE_DIRS})
link_libraries(${stduuid_LIBRARIES})
elseif(NOT PROJECT_IS_MINGW OR CMAKE_HOST_WIN32)
ExternalProject_Add(stduuid_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/stduuid-${STDUUID_VERSION}.tar.gz
URL_HASH SHA256=${STDUUID_HASH}
LIST_SEPARATOR |
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
-DUUID_BUILD_TESTS=OFF
-DUUID_ENABLE_INSTALL=ON
-DUUID_USING_CXX20_SPAN=ON
)
list(APPEND PROJECT_DEPENDENCIES stduuid_project)
endif()
endif()

View File

@@ -0,0 +1,18 @@
if (PROJECT_ENABLE_TESTING)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_TESTING)
elseif(NOT PROJECT_IS_MINGW)
ExternalProject_Add(gtest_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/googletest-${GTEST_VERSION}.tar.gz
URL_HASH SHA256=${GTEST_HASH}
LIST_SEPARATOR |
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
)
list(APPEND PROJECT_DEPENDENCIES gtest_project)
endif()
endif()

24
cmake/libraries/tpl.cmake Normal file
View File

@@ -0,0 +1,24 @@
if(PROJECT_ENABLE_TPL)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_TPL)
find_package(tiny-process-library REQUIRED)
link_libraries(tiny-process-library::tiny-process-library)
elseif(NOT PROJECT_IS_MINGW OR CMAKE_HOST_WIN32)
ExternalProject_Add(tpl_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/tiny-process-library.tar.gz
URL_HASH SHA256=82e46657e697aff5bf980387c86ef3aa05bb184622abbd75663a4df549c68f73
LIST_SEPARATOR |
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON
-DBUILD_TESTING=OFF
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
)
list(APPEND PROJECT_DEPENDENCIES tpl_project)
endif()
endif()

16
cmake/libraries/vlc.cmake Normal file
View File

@@ -0,0 +1,16 @@
if(PROJECT_ENABLE_VLC AND PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_VLC)
if (PROJECT_IS_MINGW)
set(libvlc_INCLUDE_DIRS ${PROJECT_3RD_PARTY_DIR}/vlc/sdk/include)
set(libvlc_LIBRARIES
${PROJECT_3RD_PARTY_DIR}/vlc/sdk/lib/libvlc.lib
${PROJECT_3RD_PARTY_DIR}/vlc/sdk/lib/libvlccore.lib
)
else()
pkg_check_modules(libvlc REQUIRED libvlc>=${VLC_VERSION})
endif()
include_directories(BEFORE SYSTEM ${libvlc_INCLUDE_DIRS})
link_libraries(${libvlc_LIBRARIES})
endif()

View File

@@ -0,0 +1,34 @@
if(PROJECT_ENABLE_VORBIS)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_VORBIS)
if(PROJECT_IS_MINGW AND NOT PROJECT_IS_MINGW_UNIX)
pkg_check_modules(VORBIS REQUIRED vorbis>=${VORBIS_VERSION})
link_libraries(${VORBIS_LINK_LIBRARIES})
else()
find_package(Vorbis ${VORBIS_VERSION} REQUIRED)
link_libraries(Vorbis::vorbis)
endif()
include_directories(BEFORE SYSTEM ${VORBIS_INCLUDE_DIRS})
elseif(NOT PROJECT_IS_MINGW)
ExternalProject_Add(vorbis_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/vorbis-v${VORBIS_VERSION}.tar.gz
URL_HASH SHA256=${VORBIS_HASH}
PATCH_COMMAND ${PROJECT_3RD_PARTY_DIR}/vorbis_patch.sh
${PROJECT_3RD_PARTY_DIR}
${CMAKE_BINARY_DIR}/external/src/vorbis_project
LIST_SEPARATOR |
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
-DCMAKE_POLICY_VERSION_MINIMUM=3.5
)
list(APPEND PROJECT_DEPENDENCIES vorbis_project)
add_dependencies(vorbis_project ogg_project)
endif()
endif()

View File

@@ -0,0 +1,15 @@
if(PROJECT_ENABLE_WINFSP AND PROJECT_IS_MINGW)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_WINFSP)
include_directories(BEFORE SYSTEM ${PROJECT_3RD_PARTY_DIR}/winfsp-2.1/inc)
link_directories(BEFORE ${PROJECT_3RD_PARTY_DIR}/winfsp-2.1/lib)
if(PROJECT_IS_ARM64)
link_libraries(winfsp-a64)
else()
link_libraries(winfsp-x64)
endif()
endif()
endif()

View File

@@ -0,0 +1,51 @@
if(PROJECT_ENABLE_WXWIDGETS)
if(PROJECT_BUILD)
add_definitions(-DPROJECT_ENABLE_WXWIDGETS)
find_package(OpenGL REQUIRED)
set(wxWidgets_USE_WINDOWS OFF)
find_package(wxWidgets ${WXWIDGETS_VERSION} REQUIRED
COMPONENTS
net
core
base
gl
adv
xml
aui
html
media
propgrid
qa
ribbon
richtext
stc
webview
xrc
)
if(wxWidgets_USE_FILE)
include(${wxWidgets_USE_FILE})
endif()
elseif(NOT PROJECT_IS_MINGW)
ExternalProject_Add(wxwidgets_project
PREFIX external
URL ${PROJECT_3RD_PARTY_DIR}/wxWidgets-${WXWIDGETS_VERSION}.tar.bz2
URL_HASH SHA256=${WXWIDGETS_HASH}
LIST_SEPARATOR |
BUILD_COMMAND
${CMAKE_COMMAND} --build . -- -j$ENV{CMAKE_BUILD_PARALLEL_LEVEL}
CMAKE_ARGS ${PROJECT_EXTERNAL_CMAKE_FLAGS}
-DBUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DBUILD_STATIC_LIBS=ON
-DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES}
-DwxBUILD_MONOLITHIC=OFF
-DwxBUILD_SHARED=${PROJECT_BUILD_SHARED_LIBS}
)
list(APPEND PROJECT_DEPENDENCIES wxwidgets_project)
add_dependencies(wxwidgets_project curl_project)
endif()
endif()

40
cmake/options.cmake Normal file
View File

@@ -0,0 +1,40 @@
option(PROJECT_ENABLE_BACKWARD_CPP "Enable backward-cpp" OFF)
option(PROJECT_ENABLE_BOOST "Enable boost libraries" OFF)
option(PROJECT_ENABLE_CLI11 "Enable CLI11 library" OFF)
option(PROJECT_ENABLE_CPP_HTTPLIB "Enable cpp-httplib" OFF)
option(PROJECT_ENABLE_CURL "Enable curl library" OFF)
option(PROJECT_ENABLE_CXXOPTS "Enable cxxopts library" OFF)
option(PROJECT_ENABLE_DTL "Enable DTL" OFF)
option(PROJECT_ENABLE_FLAC "Enable FLAC library" OFF)
option(PROJECT_ENABLE_FMT "Enable fmt library" OFF)
option(PROJECT_ENABLE_FONTCONFIG "Enable fontconfig library" OFF)
option(PROJECT_ENABLE_FREETYPE2 "Enable freetype2 library" OFF)
option(PROJECT_ENABLE_FUSE "Enable FUSE" OFF)
option(PROJECT_ENABLE_FZF "Enable fzf" OFF)
option(PROJECT_ENABLE_GTKMM "Enable gtkmm" OFF)
option(PROJECT_ENABLE_JSON "Enable JSON for Modern C++ library" OFF)
option(PROJECT_ENABLE_LIBBITCOIN_SYSTEM "Enable libbitcoin-system library" OFF)
option(PROJECT_ENABLE_LIBDSM "Enable dsm library" OFF)
option(PROJECT_ENABLE_LIBEVENT "Enable libevent library" OFF)
option(PROJECT_ENABLE_LIBJPEG_TURBO "Enable libjpeg-turbo library" OFF)
option(PROJECT_ENABLE_LIBPNG "Enable libpng library" OFF)
option(PROJECT_ENABLE_LIBSODIUM "Enable libsodium library" OFF)
option(PROJECT_ENABLE_NANA "Enable nana library" OFF)
option(PROJECT_ENABLE_NUSPELL "Enable nuspell" OFF)
option(PROJECT_ENABLE_OGG "Enable OGG library" OFF)
option(PROJECT_ENABLE_OPENAL "Enable OpenAL" OFF)
option(PROJECT_ENABLE_OPENSSL "Enable OpenSSL library" OFF)
option(PROJECT_ENABLE_PUGIXML "Enable PugiXML library" OFF)
option(PROJECT_ENABLE_ROCKSDB "Enable RocksDB library" OFF)
option(PROJECT_ENABLE_SAGO_PLATFORM_FOLDERS "Enable Sago platform folders" OFF)
option(PROJECT_ENABLE_SECP256K1 "Enable secp256k1 library" OFF)
option(PROJECT_ENABLE_SFML "Enable SFML" OFF)
option(PROJECT_ENABLE_SPDLOG "Enable spdlog library" OFF)
option(PROJECT_ENABLE_SQLITE "Enable SQLite" OFF)
option(PROJECT_ENABLE_STDUUID "Enable stduuid library" OFF)
option(PROJECT_ENABLE_TESTING "Enable building unit tests" OFF)
option(PROJECT_ENABLE_TPL "Enable tiny process library" OFF)
option(PROJECT_ENABLE_VLC "Enable VLC" OFF)
option(PROJECT_ENABLE_VORBIS "Enable Vorbis library" OFF)
option(PROJECT_ENABLE_WINFSP "Enable WinFSP" OFF)
option(PROJECT_ENABLE_WXWIDGETS "Enable wxWidgets library" OFF)

23
cmake/os.cmake Normal file
View File

@@ -0,0 +1,23 @@
if(MSVC)
message(FATAL_ERROR "MSVC will not be supported")
endif()
if(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
message(FATAL_ERROR "FreeBSD is not currently supported")
endif()
if(PROJECT_REQUIRE_ALPINE AND NOT PROJECT_IS_ALPINE AND PROJECT_IS_MINGW AND PROJECT_IS_MINGW_UNIX)
message(FATAL_ERROR "Project requires Alpine Linux to build")
endif()
if (PROJECT_IS_DARWIN)
if (PROJECT_IS_ARM64)
set(CMAKE_OSX_ARCHITECTURES "arm64")
else()
set(CMAKE_OSX_ARCHITECTURES "x86_64")
endif()
endif()
if (PROJECT_IS_DARWIN AND NOT PROJECT_MACOS_BUNDLE_ID)
message(FATAL_ERROR "'PROJECT_MACOS_BUNDLE_ID' is not set in 'config.sh'")
endif()

51
cmake/settings.cmake Normal file
View File

@@ -0,0 +1,51 @@
set(CMAKE_COLOR_MAKEFILE OFF)
set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON)
set(CMAKE_C_STANDARD 11)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
if(PROJECT_STATIC_LINK)
set(CMAKE_POSITION_INDEPENDENT_CODE OFF)
else()
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
endif()
set(CMAKE_BUILD_TYPE ${PROJECT_CMAKE_BUILD_TYPE})
file(MAKE_DIRECTORY ${PROJECT_EXTERNAL_BUILD_ROOT}/lib)
file(CREATE_LINK ${PROJECT_EXTERNAL_BUILD_ROOT}/lib ${PROJECT_EXTERNAL_BUILD_ROOT}/lib64 SYMBOLIC)
list(PREPEND CMAKE_PREFIX_PATH
${PROJECT_EXTERNAL_BUILD_ROOT}
${PROJECT_EXTERNAL_BUILD_ROOT}/share
)
if(PROJECT_IS_MINGW)
list(PREPEND CMAKE_PREFIX_PATH
/mingw64
)
include_directories(BEFORE
/mingw64/include
)
link_directories(BEFORE
/mingw64/lib
/mingw64/lib64
)
endif()
include_directories(BEFORE SYSTEM
${PROJECT_SUPPORT_DIR}/include
${PROJECT_EXTERNAL_BUILD_ROOT}/include
)
link_directories(BEFORE
${PROJECT_EXTERNAL_BUILD_ROOT}/lib
${PROJECT_EXTERNAL_BUILD_ROOT}/lib64
)

158
common.sh Normal file
View File

@@ -0,0 +1,158 @@
#!/usr/bin/env bash
PROJECT_NAME=$1
DEST_DIR=$2
IS_UPDATE=$3
PROJECT_NAME_UPPER=$(echo ${PROJECT_NAME} | tr "[:lower:]" "[:upper:]")
if [ "$(uname -s)" == "Darwin" ]; then
PROJECT_IS_DARWIN=1
export SED=gsed
else
export SED=sed
fi
function error_exit() {
echo $1
exit $2
}
function update_file() {
local FILE=$1
${SED} -i "s/FIFTHGRID_/${PROJECT_NAME_UPPER}_/g" "${FILE}"
${SED} -i "s/fifthgrid/${PROJECT_NAME}/g" "${FILE}"
}
function update_util_sources() {
for FILE in $(find ${DEST_DIR}/support/include/ -type f -name "*.hpp"); do
update_file "${FILE}"
done
for FILE in $(find ${DEST_DIR}/support/src/ -type f -name "*.cpp"); do
update_file "${FILE}"
done
for FILE in $(find ${DEST_DIR}/support/test/ -type f -name "*.hpp"); do
update_file "${FILE}"
done
for FILE in $(find ${DEST_DIR}/support/test/ -type f -name "*.cpp"); do
update_file "${FILE}"
done
}
function process_file() {
local FILE_NAME=$1
local SRC_FILE_NAME=$1
if [ "$2" != "" ]; then
local DEST_PART=/$2
fi
if [ "${FILE_NAME}" == "CMakeLists.txt" ]; then
local SRC_FILE_NAME="CMakeLists.txt_"
fi
if [ "${FILE_NAME}" == "main_test.cpp" ]; then
local DEST_FILE=${DEST_DIR}${DEST_PART}/main.cpp
else
local DEST_FILE=${DEST_DIR}${DEST_PART}/${FILE_NAME}
fi
rsync -av --progress src/${SRC_FILE_NAME} "${DEST_FILE}" ||
error_exit "failed to copy ${FILE_NAME}" 1
${SED} -i s/%PROJECT_NAME%/${PROJECT_NAME}/g "${DEST_FILE}" ||
error_exit "failed to set project name in ${DEST_FILE}" 1
${SED} -i s/fifthgrid/${PROJECT_NAME}/g "${DEST_FILE}" ||
error_exit "failed to set project name in ${DEST_FILE}" 1
${SED} -i s/FIFTHGRID_/${PROJECT_NAME_UPPER}_/g "${DEST_FILE}" ||
error_exit "failed to set project name in ${DEST_FILE}" 1
}
function update_cmakelists() {
for PROJECT_LIBRARY in "${PROJECT_LIBRARIES[@]}"; do
ENABLE_NAME=PROJECT_ENABLE_${PROJECT_LIBRARY}
KEEP_NAME=PROJECT_KEEP_${PROJECT_LIBRARY}
${SED} -i "/%PROJECT_ENABLE%/i \ \ \ \ \ \ -D${ENABLE_NAME}=\$\{${ENABLE_NAME}\}" "${DEST_DIR}/CMakeLists.txt" ||
error_exit "failed to set ${ENABLE_NAME} to ${!ENABLE_NAME} in ${DEST_DIR}/CMakeLists.txt" 1
done
${SED} -i "/%PROJECT_ENABLE%/d" "${DEST_DIR}/CMakeLists.txt" ||
error_exit "failed to delete %PROJECT_ENABLE% in ${DEST_DIR}/CMakeLists.txt" 1
}
function update_config() {
for PROJECT_LIBRARY in "${PROJECT_LIBRARIES[@]}"; do
ENABLE_NAME=PROJECT_ENABLE_${PROJECT_LIBRARY}
KEEP_NAME=PROJECT_KEEP_${PROJECT_LIBRARY}
if [ "${PROJECT_LIBRARY}" == "TESTING" ]; then
${SED} -i "/%PROJECT_ENABLE%/i ${ENABLE_NAME}=ON" "${DEST_DIR}/config.sh" ||
error_exit "failed to set ${ENABLE_NAME} to ON in ${DEST_DIR}/config.sh" 1
else
${SED} -i "/%PROJECT_ENABLE%/i ${ENABLE_NAME}=OFF" "${DEST_DIR}/config.sh" ||
error_exit "failed to set ${ENABLE_NAME} to OFF in ${DEST_DIR}/config.sh" 1
fi
done
${SED} -i "/%PROJECT_ENABLE%/d" "${DEST_DIR}/config.sh" ||
error_exit "failed to delete %PROJECT_ENABLE% in ${DEST_DIR}/config.sh" 1
}
function sync_common() {
rsync -av --progress .clang* "${DEST_DIR}/" ||
error_exit "failed to copy .clang*" 1
rsync -avh --delete --progress cmake/ "${DEST_DIR}/cmake/" ||
error_exit "failed to copy cmake/" 1
rsync -avh --delete --progress docker/ "${DEST_DIR}/docker/" ||
error_exit "failed to copy docker/" 1
rsync -avh --delete --progress src/scripts/ "${DEST_DIR}/scripts/" ||
error_exit "failed to copy src/scripts/" 1
rsync -avh --delete --progress support/ "${DEST_DIR}/support/" ||
error_exit "failed to copy support/" 1
}
function sync_create() {
rsync -avh --delete --progress .cspell/* "${DEST_DIR}/.cspell/" ||
error_exit "failed to copy .cpsell/" 1
rsync -av --progress .gitignore "${DEST_DIR}/" ||
error_exit "failed to copy .gitignore" 1
}
function create_versions_cmake() {
VERSION_LIST=()
for NAME in "${!PROJECT_VERSIONS[@]}"; do
VERSION_LIST+=("set(${NAME}_VERSION ${PROJECT_VERSIONS[${NAME}]})")
done
(printf "%s\n" "${VERSION_LIST[@]}" | sort) >${DEST_DIR}/cmake/versions.cmake
}
if [ "${PROJECT_NAME}" == "" ]; then
error_exit "missing project name" 2
else
if [ "${DEST_DIR}" == "" ]; then
DEST_DIR=${CURRENT_DIR}
fi
DEST_DIR=${DEST_DIR}/${PROJECT_NAME}
if [ "${IS_UPDATE}" == "0" ] && [ -d "${DEST_DIR}" ]; then
error_exit "dest directory already exists: ${DEST_DIR}" 2
fi
mkdir -p "${DEST_DIR}"
DEST_DIR=$(realpath "${DEST_DIR}")
if [ "${IS_UPDATE}" == "1" ] && [ ! -d "${DEST_DIR}" ]; then
error_exit "dest directory not found: ${DEST_DIR}" 2
fi
fi
mkdir -p "${DEST_DIR}/${PROJECT_NAME}/${PROJECT_NAME}/include/"
mkdir -p "${DEST_DIR}/${PROJECT_NAME}/${PROJECT_NAME}/src/"
mkdir -p "${DEST_DIR}/${PROJECT_NAME}/${PROJECT_NAME}_test/include/"
mkdir -p "${DEST_DIR}/${PROJECT_NAME}/${PROJECT_NAME}_test/src/"
mkdir -p "${DEST_DIR}/${PROJECT_NAME}/lib${PROJECT_NAME}/include/"
mkdir -p "${DEST_DIR}/${PROJECT_NAME}/lib${PROJECT_NAME}/src/"

8
create_project.cmd Normal file
View File

@@ -0,0 +1,8 @@
@echo off
setlocal
pushd "%~dp0%"
call src\scripts\setup_msys2.cmd
call mingw64 -no-start ./create_project.sh "%1" "%2"
popd

50
create_project.sh Normal file
View File

@@ -0,0 +1,50 @@
#!/usr/bin/env bash
CURRENT_DIR=$(realpath "$0")
CURRENT_DIR=$(dirname "${CURRENT_DIR}")
. "${CURRENT_DIR}/common.sh" "$1" "$2" 0
pushd "${DEST_DIR}"
git init . || error_exit "failed to execute 'git init .'" 1
popd
sync_common
sync_create
. "${CURRENT_DIR}/src/scripts/versions.sh"
. "${CURRENT_DIR}/src/scripts/libraries.sh"
create_versions_cmake
process_file .jenkins_builds
process_file .jenkins_macos
process_file .nvimrc
process_file CMakeLists.txt
process_file config.sh
process_file initialize.hpp ${PROJECT_NAME}/lib${PROJECT_NAME}/include
process_file initialize.cpp ${PROJECT_NAME}/lib${PROJECT_NAME}/src
process_file main.cpp ${PROJECT_NAME}/${PROJECT_NAME}
process_file main_test.cpp ${PROJECT_NAME}/${PROJECT_NAME}_test
process_file project.cmake
process_file version.hpp ${PROJECT_NAME}/lib${PROJECT_NAME}/include
process_file version.cpp.in ${PROJECT_NAME}
process_file version.rc.in ${PROJECT_NAME}
update_config
update_cmakelists
echo "" >>"${DEST_DIR}/.cspell/words.txt"
echo lib${PROJECT_NAME} >>"${DEST_DIR}/.cspell/words.txt"
update_util_sources
pushd "${DEST_DIR}"
git lfs track "*.exe"
git lfs track "*.msi"
git lfs track "*.tar.gz"
git lfs track "*.tar.xz"
git lfs track "*.tgz"
git lfs track "*.zip"
git add .gitattributes
git commit -m "Added .gitattributes"
popd

84
docker/aarch64/alpine Normal file
View File

@@ -0,0 +1,84 @@
#comment
FROM arm64v8/alpine:3.22.2
MAINTAINER Scott E. Graves <scott.e.graves@protonmail.com>
CMD bash
RUN apk update
RUN apk upgrade
RUN apk add \
autoconf \
automake \
bash \
binutils \
binutils-dev \
bison \
boost-dev \
bzip2-static \
cmake \
diffutils \
elfutils-dev \
file \
fontconfig-dev \
fontconfig-static \
freetype \
freetype-dev \
freetype-static \
fuse3 \
fuse3-dev \
fuse3-static \
g++ \
gcc \
gflags \
gflags-dev \
git \
git-lfs \
libogg-dev \
libogg-static \
libtool \
libudev-zero \
libudev-zero-dev \
libunwind \
libunwind-dev \
libunwind-static \
liburing \
liburing-dev \
libvorbis-dev \
libvorbis-static \
libx11-dev \
libx11-static \
libxcursor \
libxcursor-dev \
libxrandr \
libxrandr-dev \
linux-headers \
make \
mesa \
mesa-dev \
meson \
musl-dev \
ninja \
openal-soft-dev \
openal-soft-libs \
openssl \
patch \
perl \
pkgconfig \
rsync \
tcl \
tcl-dev \
texinfo \
wget \
xz \
xz-dev \
xz-libs \
zlib \
zlib-dev \
zlib-static \
zstd \
zstd-dev \
zstd-libs \
zstd-static \
xz-static
RUN ln -sf /usr/bin/aclocal-1.17 /usr/bin/aclocal-1.16
RUN ln -sf /usr/bin/automake-1.17 /usr/bin/automake-1.16

84
docker/x86_64/alpine Normal file
View File

@@ -0,0 +1,84 @@
#comment
FROM alpine:3.22.2
MAINTAINER Scott E. Graves <scott.e.graves@protonmail.com>
CMD bash
RUN apk update
RUN apk upgrade
RUN apk add \
autoconf \
automake \
bash \
binutils \
binutils-dev \
bison \
boost-dev \
bzip2-static \
cmake \
diffutils \
elfutils-dev \
file \
fontconfig-dev \
fontconfig-static \
freetype \
freetype-dev \
freetype-static \
fuse3 \
fuse3-dev \
fuse3-static \
g++ \
gcc \
gflags \
gflags-dev \
git \
git-lfs \
libogg-dev \
libogg-static \
libtool \
libudev-zero \
libudev-zero-dev \
libunwind \
libunwind-dev \
libunwind-static \
liburing \
liburing-dev \
libvorbis-dev \
libvorbis-static \
libx11-dev \
libx11-static \
libxcursor \
libxcursor-dev \
libxrandr \
libxrandr-dev \
linux-headers \
make \
mesa \
mesa-dev \
meson \
musl-dev \
ninja \
openal-soft-dev \
openal-soft-libs \
openssl \
patch \
perl \
pkgconfig \
rsync \
tcl \
tcl-dev \
texinfo \
wget \
xz \
xz-dev \
xz-libs \
zlib \
zlib-dev \
zlib-static \
zstd \
zstd-dev \
zstd-libs \
zstd-static \
xz-static
RUN ln -sf /usr/bin/aclocal-1.17 /usr/bin/aclocal-1.16
RUN ln -sf /usr/bin/automake-1.17 /usr/bin/automake-1.16

47
docker/x86_64/flutter Normal file
View File

@@ -0,0 +1,47 @@
FROM debian:latest
ARG UID=0
ARG GID=0
RUN apt-get update
RUN apt-get install -y \
bash \
curl \
fonts-droid-fallback \
gdb \
git \
lib32stdc++6 \
libglu1-mesa \
libstdc++6 \
python3 \
unzip \
wget
RUN apt-get clean
RUN git clone https://github.com/flutter/flutter.git /flutter
RUN git config --system --add safe.directory /flutter
ENV PATH="/flutter/bin:/flutter/bin/cache/dart-sdk/bin:${PATH}"
RUN flutter doctor -v
RUN flutter channel master
RUN flutter upgrade
RUN flutter --disable-analytics
RUN flutter config --no-analytics
RUN flutter config --enable-web
RUN flutter config --no-cli-animations
RUN mkdir /nonexistent
RUN chown -R $UID:$GID /nonexistent
RUN mkdir /.config
RUN chown -R $UID:$GID /.config
RUN mkdir /.dart-tool
RUN chown -R $UID:$GID /.dart-tool
RUN mkdir /.pub-cache
RUN chown -R $UID:$GID /.pub-cache
RUN chown -R $UID:$GID /flutter

1189
docker/x86_64/mingw64 Normal file

File diff suppressed because it is too large Load Diff

71
grab_packages.sh Normal file
View File

@@ -0,0 +1,71 @@
#!/usr/bin/env bash
CURRENT_DIR=$(realpath "$0")
CURRENT_DIR=$(dirname "${CURRENT_DIR}")
. "${CURRENT_DIR}/src/scripts/versions.sh"
. "${CURRENT_DIR}/src/scripts/libraries.sh"
function check_should_update() {
local NAME=$1
local ITEM_LIST=(${PROJECT_DOWNLOADS[${NAME}]//;/ })
if [ ! -f "${CURRENT_DIR}/support/${ITEM_LIST[2]}/${ITEM_LIST[1]}" ] ||
[ ! -f "${CURRENT_DIR}/support/${ITEM_LIST[2]}/${ITEM_LIST[1]}.sha256" ]; then
return 0
fi
return 1
}
function download_and_update_hash() {
local NAME=$1
local ITEM_LIST=(${PROJECT_DOWNLOADS[${NAME}]//;/ })
if [ ! -f "${CURRENT_DIR}/support/${ITEM_LIST[2]}/${ITEM_LIST[1]}" ] ||
[ ! -f "${CURRENT_DIR}/support/${ITEM_LIST[2]}/${ITEM_LIST[1]}.sha256" ]; then
local CLEANUP_LIST=(${PROJECT_CLEANUP[${NAME}]//:/ })
if [ "${NAME}" == "GTEST" ]; then
CLEANUP_LIST=(${PROJECT_CLEANUP["TESTING"]//:/ })
fi
if [ "${NAME}" != "BOOST" ] && [ "${NAME}" != "BOOST2" ] && [ "${CLEANUP_LIST[0]}" != "" ]; then
rm -r ${CURRENT_DIR}/support/${CLEANUP_LIST[0]}
fi
rm -f "${CURRENT_DIR}/support/${ITEM_LIST[2]}/${ITEM_LIST[1]}"
rm -f "${CURRENT_DIR}/support/${ITEM_LIST[2]}/${ITEM_LIST[1]}.sha256"
if ! wget ${ITEM_LIST[0]} -O "${CURRENT_DIR}/support/${ITEM_LIST[2]}/${ITEM_LIST[1]}"; then
echo "failed $NAME"
rm -f "${CURRENT_DIR}/support/${ITEM_LIST[2]}/${ITEM_LIST[1]}"
exit 1
fi
pushd "${CURRENT_DIR}/support/${ITEM_LIST[2]}"
sha256sum ${ITEM_LIST[1]} >${ITEM_LIST[1]}.sha256
popd
fi
local HASH=$(cat support/${ITEM_LIST[2]}/${ITEM_LIST[1]}.sha256 | awk '{print $1}')
HASH_LIST+=("set(${NAME}_HASH ${HASH})")
}
function create_hashes_cmake() {
for NAME in "${!PROJECT_DOWNLOADS[@]}"; do
if [ "${NAME}" != "BOOST" ] && [ "${NAME}" != "BOOST2" ]; then
download_and_update_hash $NAME
fi
done
}
pushd "${CURRENT_DIR}"
HASH_LIST=()
create_hashes_cmake
if check_should_update BOOST || check_should_update BOOST2; then
rm -f support/3rd_party/boost_*
fi
download_and_update_hash BOOST
download_and_update_hash BOOST2
(printf "%s\n" "${HASH_LIST[@]}" | sort) >${CURRENT_DIR}/cmake/hashes.cmake
popd

95
scripts/common.sh Normal file
View File

@@ -0,0 +1,95 @@
#!/usr/bin/env bash
SCRIPTS_DIR=$(dirname "$0")
SCRIPTS_DIR=$(realpath ${SCRIPTS_DIR})
SOURCE_DIR=${SCRIPTS_DIR}/..
SOURCE_DIR=$(realpath "${SOURCE_DIR}")
TEST_DIR=${SOURCE_DIR}/build
PLATFORM=$1
BUILD_TYPE=$2
WITH_TYPE=$3
BUILD_ARCH=$4
if [ "$(uname -s)" == "Darwin" ]; then
export SED=gsed
else
export SED=sed
fi
function error_exit() {
echo $1
exit $2
}
if [ "${BUILD_TYPE}" != "shared" ] && [ "${BUILD_TYPE}" != "static" ]; then
error_exit "must specify 'shared' or 'static'" 1
fi
if [ "${TEST_DIR}" == "" ]; then
error_exit "TEST_DIR is not set" 1
fi
mkdir -p "${TEST_DIR}"
NAME=${PLATFORM}_${BUILD_TYPE}
if [ "${WITH_TYPE}" == "1" ]; then
NAME=${NAME}_crypto
elif [ "${WITH_TYPE}" == "2" ]; then
NAME=${NAME}_dsm
elif [ "${WITH_TYPE}" == "3" ]; then
NAME=${NAME}_sqlite
elif [ "${WITH_TYPE}" == "4" ]; then
NAME=${NAME}_errors_v1
elif [ "${WITH_TYPE}" == "5" ]; then
NAME=${NAME}_fmt
elif [ "${WITH_TYPE}" == "6" ]; then
NAME=${NAME}_libevent
elif [ "${WITH_TYPE}" == "7" ]; then
NAME=${NAME}_crypto_no_boost
fi
if [ "${BUILD_ARCH}" != "" ]; then
NAME=${NAME}_libevent_${BUILD_ARCH}
fi
rm -rf "${TEST_DIR}/${NAME}"
pushd "${SOURCE_DIR}"
./create_project.sh ${NAME} ${TEST_DIR} || error_exit "failed to create ${PLATFORM} project" 2
popd
pushd "${TEST_DIR}/${NAME}"
if [ "${WITH_TYPE}" == "1" ]; then
${SED} -i "s/PROJECT_ENABLE_LIBSODIUM=OFF/PROJECT_ENABLE_LIBSODIUM=ON/g" ./config.sh
${SED} -i "s/PROJECT_ENABLE_BOOST=OFF/PROJECT_ENABLE_BOOST=ON/g" ./config.sh
${SED} -i "s/PROJECT_ENABLE_JSON=OFF/PROJECT_ENABLE_JSON=ON/g" ./config.sh
elif [ "${WITH_TYPE}" == "2" ]; then
${SED} -i "s/PROJECT_ENABLE_LIBDSM=OFF/PROJECT_ENABLE_LIBDSM=ON/g" ./config.sh
elif [ "${WITH_TYPE}" == "3" ]; then
${SED} -i "s/PROJECT_ENABLE_SQLITE=OFF/PROJECT_ENABLE_SQLITE=ON/g" ./config.sh
elif [ "${WITH_TYPE}" == "4" ]; then
${SED} -i "s/PROJECT_ENABLE_V2_ERRORS=ON/PROJECT_ENABLE_V2_ERRORS=OFF/g" ./config.sh
elif [ "${WITH_TYPE}" == "5" ]; then
${SED} -i "s/PROJECT_ENABLE_FMT=OFF/PROJECT_ENABLE_FMT=ON/g" ./config.sh
elif [ "${WITH_TYPE}" == "6" ]; then
${SED} -i "s/PROJECT_ENABLE_LIBEVENT=OFF/PROJECT_ENABLE_LIBEVENT=ON/g" ./config.sh
elif [ "${WITH_TYPE}" == "7" ]; then
${SED} -i "s/PROJECT_ENABLE_LIBSODIUM=OFF/PROJECT_ENABLE_LIBSODIUM=ON/g" ./config.sh
fi
if [ "${BUILD_TYPE}" == "shared" ]; then
${SED} -i "s/PROJECT_STATIC_LINK=ON/PROJECT_STATIC_LINK=OFF/g" ./config.sh
fi
./scripts/make_${PLATFORM}.sh "${BUILD_ARCH}" || error_exit "build ${PLATFORM} ${BUILD_ARCH} failed" 3
if [ "${PLATFORM}" == "win32" ]; then
./scripts/run_tests.sh "${BUILD_ARCH}" "" "" 1 1 || error_exit "testing ${PLATFORM} failed" 4
else
./scripts/run_tests.sh "${BUILD_ARCH}" || error_exit "testing ${PLATFORM} ${BUILD_ARCH} failed" 4
fi
popd
rm -rf "${TEST_DIR}/${NAME}"

6
scripts/test_unix.sh Normal file
View File

@@ -0,0 +1,6 @@
#!/usr/bin/env bash
SCRIPTS_DIR=$(dirname "$0")
SCRIPTS_DIR=$(realpath ${SCRIPTS_DIR})
"${SCRIPTS_DIR}/common.sh" unix "$1" "$2" "$3"

6
scripts/test_win32.sh Normal file
View File

@@ -0,0 +1,6 @@
#!/usr/bin/env bash
SCRIPTS_DIR=$(dirname "$0")
SCRIPTS_DIR=$(realpath ${SCRIPTS_DIR})
"${SCRIPTS_DIR}/common.sh" win32 "$1" "$2"

88
src/.jenkins_builds Normal file
View File

@@ -0,0 +1,88 @@
#!groovy
pipeline {
agent none
environment {
PROJECT_TEST_CONFIG_DIR = "/.ci/%PROJECT_NAME%/test"
}
options {
disableConcurrentBuilds()
skipDefaultCheckout()
timestamps()
}
stages {
stage('Build • Test • Deliver') {
agent any
stages {
stage('Checkout') {
steps {
script {
int maxAttempts = 6
int baseDelay = 10
for (int attempt = 1; attempt <= maxAttempts; attempt++) {
try {
checkout scm
break
} catch (err) {
if (attempt == maxAttempts) { throw err }
int waitSec = baseDelay * (1 << (attempt - 1))
echo "Checkout failed (attempt ${attempt}/${maxAttempts}). Waiting ${waitSec}s before retry..."
sleep time: waitSec, unit: 'SECONDS'
}
}
}
}
}
stage('linux_x86_64') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/make_unix.sh' } } }
}
stage('mingw64') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/make_win32.sh' } } }
}
stage('linux_aarch64') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/make_unix.sh aarch64' } } }
}
stage('test') {
steps {
script {
retryWithBackoff(2, 5) { sh 'scripts/test.sh' }
retryWithBackoff(2, 5) { sh 'scripts/test.sh "" "" "" "" 1 1' }
retryWithBackoff(2, 5) { sh 'scripts/test.sh aarch64' }
}
}
}
stage('deliver') {
steps {
script {
retryWithBackoff(3, 10) { sh 'scripts/deliver.sh /mnt/%PROJECT_NAME% "" "" "" "" 1 1' }
retryWithBackoff(3, 10) { sh 'scripts/deliver.sh /mnt/%PROJECT_NAME% "" aarch64' }
retryWithBackoff(3, 10) { sh 'scripts/deliver.sh /mnt/%PROJECT_NAME%' }
}
}
}
}
}
}
}
def retryWithBackoff(int maxAttempts, int baseDelaySeconds, Closure body) {
for (int attempt = 1; attempt <= maxAttempts; attempt++) {
try {
body()
return
} catch (err) {
if (attempt == maxAttempts) { throw err }
int waitSec = baseDelaySeconds * (1 << (attempt - 1))
echo "Step failed (attempt ${attempt}/${maxAttempts}). Waiting ${waitSec}s before retry..."
sleep time: waitSec, unit: 'SECONDS'
}
}
}

82
src/.jenkins_macos Normal file
View File

@@ -0,0 +1,82 @@
#!groovy
pipeline {
agent none
environment {
PROJECT_TEST_CONFIG_DIR = "${env.HOME}/.ci/%PROJECT_NAME%/test"
}
options {
disableConcurrentBuilds()
skipDefaultCheckout()
timestamps()
}
stages {
stage('Build • Test • Deliver') {
agent any
stages {
stage('Checkout') {
steps {
script {
int maxAttempts = 6
int baseDelay = 10
for (int attempt = 1; attempt <= maxAttempts; attempt++) {
try {
checkout scm
break
} catch (err) {
if (attempt == maxAttempts) { throw err }
int waitSec = baseDelay * (1 << (attempt - 1))
echo "Checkout failed (attempt ${attempt}/${maxAttempts}). Waiting ${waitSec}s before retry..."
sleep time: waitSec, unit: 'SECONDS'
}
}
}
}
}
stage('darwin_aarch64') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/make_unix.sh aarch64' } } }
}
stage('darwin_x86_64') {
steps { script { retryWithBackoff(2, 5) { sh 'scripts/make_unix.sh x86_64' } } }
}
stage('test') {
steps {
script {
retryWithBackoff(2, 5) { sh 'scripts/test.sh aarch64' }
retryWithBackoff(2, 5) { sh 'scripts/test.sh x86_64' }
}
}
}
stage('deliver') {
steps {
script {
retryWithBackoff(3, 10) { sh 'scripts/deliver.sh /mnt/%PROJECT_NAME% "" aarch64' }
retryWithBackoff(3, 10) { sh 'scripts/deliver.sh /mnt/%PROJECT_NAME% "" x86_64' }
}
}
}
}
}
}
}
def retryWithBackoff(int maxAttempts, int baseDelaySeconds, Closure body) {
for (int attempt = 1; attempt <= maxAttempts; attempt++) {
try {
body()
return
} catch (err) {
if (attempt == maxAttempts) { throw err }
int waitSec = baseDelaySeconds * (1 << (attempt - 1))
echo "Step failed (attempt ${attempt}/${maxAttempts}). Waiting ${waitSec}s before retry..."
sleep time: waitSec, unit: 'SECONDS'
}
}
}

47
src/.nvimrc Normal file
View File

@@ -0,0 +1,47 @@
if has('win32') || has('win64')
let &makeprg=".\\scripts\\make_win32.cmd"
let g:nmakeprg=".\\scripts\\make_win32.cmd"
" let g:gtest#gtest_command = "cd build2 && .\\unittests"
else
let &makeprg="./scripts/make_unix.sh"
let g:nmakeprg="./scripts/make_unix.sh"
" let g:gtest#gtest_command = "cd build && ./unittests"
endif
set path+=.,%PROJECT_NAME%/**
lua << EOF
if vim.env.NV_DARCULA_ENABLE_DAP then
local dap = require("dap")
local g = require("nvim-goodies")
local gos = require("nvim-goodies.os")
local gpath = require("nvim-goodies.path")
local externalConsole = gos.is_windows
local type = "cppdbg"
local cwd = gpath.create_path("./build")
dap.configurations.cpp = {
{
name = "Main",
type = type,
request = "launch",
program = function()
return gpath.create_path(cwd, "%PROJECT_NAME%")
end,
cwd = cwd,
stopAtEntry = true,
externalConsole=externalConsole,
},
{
name = "Test",
type = type,
request = "launch",
program = function()
return gpath.create_path(cwd, "%PROJECT_NAME%_tests")
end,
cwd = cwd,
stopAtEntry = true,
externalConsole=externalConsole,
}
}
end
EOF

192
src/CMakeLists.txt_ Normal file
View File

@@ -0,0 +1,192 @@
cmake_minimum_required(VERSION 3.27)
cmake_policy(SET CMP0135 NEW)
cmake_policy(SET CMP0144 NEW)
if (NOT PROJECT_INTERFACE)
message(FATAL_ERROR "Project must be compiled via 'make_win32.cmd'/'make_win32.sh' or 'make_unix.sh' build scripts. Invoking 'cmake' directly is not supported.")
endif()
project(${PROJECT_NAME}
DESCRIPTION ${PROJECT_DESC}
HOMEPAGE_URL ${PROJECT_URL}
VERSION ${PROJECT_MAJOR_VERSION}.${PROJECT_MINOR_VERSION}.${PROJECT_REVISION_VERSION}
)
include(CheckIncludeFileCXX)
include(CheckIncludeFiles)
include(ExternalProject)
check_include_files(sys/xattr.h HAS_SETXATTR)
if(HAS_SETXATTR)
add_definitions(-DHAS_SETXATTR)
endif()
include(cmake/hashes.cmake)
include(cmake/versions.cmake)
include(cmake/arch.cmake)
include(cmake/os.cmake)
include(cmake/options.cmake)
option(PROJECT_REQUIRE_ALPINE "Require Alpine Linux as build system" OFF)
option(PROJECT_STATIC_LINK "Static link executables" OFF)
if(PROJECT_STATIC_LINK)
add_definitions(-DPROJECT_STATIC_LINK)
endif()
if(PROJECT_IS_MINGW)
add_definitions(-DPROJECT_IS_MINGW)
if(PROJECT_IS_MINGW_UNIX)
add_definitions(-DPROJECT_IS_MINGW_UNIX)
endif()
endif()
if(PROJECT_REQUIRE_ALPINE)
add_definitions(-DPROJECT_REQUIRE_ALPINE)
endif()
if(PROJECT_IS_ARM64)
add_definitions(-DPROJECT_IS_ARM64)
endif()
if(PROJECT_IS_DARWIN)
add_definitions(-DPROJECT_IS_DARWIN)
endif()
if(PROJECT_IS_MINGW)
option(PROJECT_ENABLE_WIN32_LONG_PATH_NAMES "Enable path sizes of 32767 characters on Windows" OFF)
if(PROJECT_ENABLE_WIN32_LONG_PATH_NAMES)
add_definitions(-DPROJECT_ENABLE_WIN32_LONG_PATH_NAMES)
endif()
endif()
if (PROJECT_ENABLE_V2_ERRORS)
add_definitions(-DPROJECT_ENABLE_V2_ERRORS)
endif()
include(cmake/settings.cmake)
include(cmake/flags.cmake)
include(cmake/functions.cmake)
include(cmake/libraries.cmake)
if(PROJECT_BUILD)
file(WRITE ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/version.cpp "")
if (PROJECT_IS_MINGW)
set(PROJECT_WINDOWS_VERSION_RC ${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/version.rc)
file(WRITE ${PROJECT_WINDOWS_VERSION_RC} "")
endif()
file(GLOB_RECURSE ADDITIONAL_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/version.cpp
${PROJECT_SUPPORT_DIR}/src/*.c
${PROJECT_SUPPORT_DIR}/src/*.cpp
)
list(APPEND PROJECT_ADDITIONAL_SOURCES
${ADDITIONAL_SOURCES}
)
include(project.cmake)
string(REPLACE "\\<" "<" PROJECT_COMPANY_NAME "${PROJECT_COMPANY_NAME}")
string(REPLACE "\\<" "<" PROJECT_COPYRIGHT "${PROJECT_COPYRIGHT}")
string(REPLACE "\\<" "<" PROJECT_DESC "${PROJECT_DESC}")
string(REPLACE "\\>" ">" PROJECT_COMPANY_NAME "${PROJECT_COMPANY_NAME}")
string(REPLACE "\\>" ">" PROJECT_COPYRIGHT "${PROJECT_COPYRIGHT}")
string(REPLACE "\\>" ">" PROJECT_DESC "${PROJECT_DESC}")
if (PROJECT_IS_MINGW)
if ("${PROJECT_RELEASE_ITER}" STREQUAL "release")
set(PROJECT_PRERELEASE 0)
else()
set(PROJECT_PRERELEASE VS_FF_PRERELEASE)
endif()
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/version.rc.in
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/version.rc
@ONLY
)
endif()
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/version.cpp.in
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/version.cpp
@ONLY
)
if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${PROJECT_NAME}.iss.in")
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}/${PROJECT_NAME}.iss.in
${PROJECT_DIST_DIR}/../${PROJECT_NAME}.iss
@ONLY
)
endif()
find_package(ICU REQUIRED COMPONENTS data i18n io uc)
else()
message(STATUS "-=[CMake Settings]=-")
message(STATUS " C standard: ${CMAKE_C_STANDARD}")
message(STATUS " C++ standard: ${CMAKE_CXX_STANDARD}")
message(STATUS " CPU architecture: ${PROJECT_MARCH}")
if(PROJECT_ENABLE_FUSE)
message(STATUS " FUSE version: ${PROJECT_FUSE}")
endif()
string(REPLACE "<" "\\<" PROJECT_COMPANY_NAME "${PROJECT_COMPANY_NAME}")
string(REPLACE "<" "\\<" PROJECT_COPYRIGHT "${PROJECT_COPYRIGHT}")
string(REPLACE "<" "\\<" PROJECT_DESC "${PROJECT_DESC}")
string(REPLACE ">" "\\>" PROJECT_COMPANY_NAME "${PROJECT_COMPANY_NAME}")
string(REPLACE ">" "\\>" PROJECT_COPYRIGHT "${PROJECT_COPYRIGHT}")
string(REPLACE ">" "\\>" PROJECT_DESC "${PROJECT_DESC}")
add_custom_target(project ALL
DEPENDS ${PROJECT_DEPENDENCIES}
COMMAND cd build && cmake
${CMAKE_CURRENT_SOURCE_DIR}
-DCMAKE_GENERATOR=${CMAKE_GENERATOR}
-DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
-DPROJECT_3RD_PARTY_DIR=${PROJECT_3RD_PARTY_DIR}
-DPROJECT_BUILD=ON
-DPROJECT_BUILD_ARCH=${PROJECT_BUILD_ARCH}
-DPROJECT_BUILD_DIR=${PROJECT_BUILD_DIR}
-DPROJECT_BUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS}
-DPROJECT_CMAKE_BUILD_TYPE=${PROJECT_CMAKE_BUILD_TYPE}
-DPROJECT_COMPANY_NAME=${PROJECT_COMPANY_NAME}
-DPROJECT_COPYRIGHT=${PROJECT_COPYRIGHT}
-DPROJECT_DESC=${PROJECT_DESC}
-DPROJECT_DIST_DIR=${PROJECT_DIST_DIR}
-DPROJECT_ENABLE_V2_ERRORS=${PROJECT_ENABLE_V2_ERRORS}
-DPROJECT_ENABLE_WIN32_LONG_PATH_NAMES=${PROJECT_ENABLE_WIN32_LONG_PATH_NAMES}
%PROJECT_ENABLE%
-DPROJECT_EXTERNAL_BUILD_ROOT=${PROJECT_EXTERNAL_BUILD_ROOT}
-DPROJECT_FUSE=${PROJECT_FUSE}
-DPROJECT_FUSE_INCLUDE_DIRS=${PROJECT_FUSE_INCLUDE_DIRS}
-DPROJECT_GIT_REV=${PROJECT_GIT_REV}
-DPROJECT_INTERFACE=1
-DPROJECT_IS_ALPINE=${PROJECT_IS_ALPINE}
-DPROJECT_IS_ARM64=${PROJECT_IS_ARM64}
-DPROJECT_IS_DARWIN=${PROJECT_IS_DARWIN}
-DPROJECT_IS_MINGW=${PROJECT_IS_MINGW}
-DPROJECT_IS_MINGW_UNIX=${PROJECT_IS_MINGW_UNIX}
-DPROJECT_MAJOR_VERSION=${PROJECT_MAJOR_VERSION}
-DPROJECT_MACOS_BUNDLE_ID=${PROJECT_MACOS_BUNDLE_ID}
-DPROJECT_MACOS_ICNS_NAME=${PROJECT_MACOS_ICNS_NAME}
-DPROJECT_MINOR_VERSION=${PROJECT_MINOR_VERSION}
-DPROJECT_NAME=${PROJECT_NAME}
-DPROJECT_RELEASE_ITER=${PROJECT_RELEASE_ITER}
-DPROJECT_RELEASE_NUM=${PROJECT_RELEASE_NUM}
-DPROJECT_REQUIRE_ALPINE=${PROJECT_REQUIRE_ALPINE}
-DPROJECT_REVISION_VERSION=${PROJECT_REVISION_VERSION}
-DPROJECT_STATIC_LINK=${PROJECT_STATIC_LINK}
-DPROJECT_SUPPORT_DIR=${PROJECT_SUPPORT_DIR}
-DPROJECT_TOOLCHAIN_FILE_CMAKE=${PROJECT_TOOLCHAIN_FILE_CMAKE}
-DPROJECT_TOOLCHAIN_FILE_MESON=${PROJECT_TOOLCHAIN_FILE_MESON}
-DPROJECT_URL=${PROJECT_URL}
)
endif()

42
src/config.sh Normal file
View File

@@ -0,0 +1,42 @@
#!/usr/bin/env bash
PROJECT_NAME="%PROJECT_NAME%"
PROJECT_COMPANY_NAME=""
PROJECT_COPYRIGHT=""
PROJECT_DESC=""
PROJECT_URL=""
PROJECT_MACOS_BUNDLE_ID="com.fifthgrid.${PROJECT_NAME}"
PROJECT_MACOS_ICNS_NAME=""
PROJECT_MAJOR_VERSION=0
PROJECT_MINOR_VERSION=0
PROJECT_REVISION_VERSION=1
PROJECT_RELEASE_NUM=0
PROJECT_RELEASE_ITER=alpha
PROJECT_APP_LIST=(${PROJECT_NAME})
PROJECT_PRIVATE_KEY=${DEVELOPER_PRIVATE_KEY}
PROJECT_PUBLIC_KEY=${DEVELOPER_PUBLIC_KEY}
PROJECT_STATIC_LINK=ON
PROJECT_MINGW64_COPY_DEPENDENCIES+=()
PROJECT_MSYS2_PACKAGE_LIST+=()
PROJECT_ENABLE_V2_ERRORS=ON
PROJECT_ENABLE_WIN32_LONG_PATH_NAMES=OFF
%PROJECT_ENABLE%
PROJECT_KEEP_BACKWARD_CPP=1
if [ "${PROJECT_ENABLE_TESTING}" == "ON" ]; then
PROJECT_APP_LIST+=(${PROJECT_NAME}_test)
fi
if [ -f "./override.sh" ]; then
. ./override.sh
fi

149
src/initialize.cpp Normal file
View File

@@ -0,0 +1,149 @@
#if defined(PROJECT_ENABLE_CURL)
#include "curl/curl.h"
#endif // defined(PROJECT_ENABLE_CURL)
#if defined(PROJECT_ENABLE_OPENSSL)
#include "openssl/ssl.h"
#endif // defined(PROJECT_ENABLE_OPENSSL)
#if defined(PROJECT_REQUIRE_ALPINE) && !defined(PROJECT_IS_MINGW)
#include <filesystem>
#include <pthread.h>
#include <stdlib.h>
#endif // defined(PROJECT_REQUIRE_ALPINE) && !defined(PROJECT_IS_MINGW)
#if defined(PROJECT_ENABLE_LIBSODIUM)
#include "sodium.h"
#endif // defined(PROJECT_ENABLE_LIBSODIUM)
#if defined(PROJECT_ENABLE_SQLITE)
#include "sqlite3.h"
#endif // defined(PROJECT_ENABLE_SQLITE)
#if defined(PROJECT_ENABLE_SPDLOG)
#include <chrono>
#include "spdlog/async.h"
#include "spdlog/sinks/stdout_color_sinks.h"
#include "spdlog/spdlog.h"
#endif // defined(PROJECT_ENABLE_SPDLOG)
#include "initialize.hpp"
#include "utils/error.hpp"
#if defined(PROJECT_REQUIRE_ALPINE) && !defined(PROJECT_IS_MINGW)
#include "utils/path.hpp"
#endif // defined(PROJECT_REQUIRE_ALPINE) && !defined (PROJECT_IS_MINGW)
#if defined(__APPLE__)
#include <csignal>
#endif // defined(__APPLE__)
namespace {
#if defined(PROJECT_ENABLE_CURL)
bool curl_initialized{false};
#endif // defined(PROJECT_ENABLE_CURL)
#if defined(PROJECT_ENABLE_SPDLOG)
bool spdlog_initialized{false};
#endif // defined(PROJECT_ENABLE_SPDLOG)
#if defined(PROJECT_ENABLE_SQLITE)
bool sqlite3_initialized{false};
#endif // defined(PROJECT_ENABLE_SQLITE)
} // namespace
namespace fifthgrid {
auto project_initialize() -> bool {
FIFTHGRID_USES_FUNCTION_NAME();
#if defined(__APPLE__)
std::signal(SIGPIPE, SIG_IGN);
#endif // defined(__APPLE__)
#if defined(PROJECT_REQUIRE_ALPINE) && !defined(PROJECT_IS_MINGW)
{
static constexpr auto guard_size{4096U};
static constexpr auto stack_size{8U * 1024U * 1024U};
pthread_attr_t attr{};
pthread_attr_setstacksize(&attr, stack_size);
pthread_attr_setguardsize(&attr, guard_size);
pthread_setattr_default_np(&attr);
}
#endif // defined(PROJECT_REQUIRE_ALPINE) && !defined(PROJECT_IS_MINGW)
#if defined(PROJECT_ENABLE_SPDLOG)
spdlog::drop_all();
spdlog::flush_every(std::chrono::seconds(5));
spdlog::set_pattern("%Y-%m-%d|%T.%e|%^%l%$|%v");
spdlog::create_async<spdlog::sinks::stdout_color_sink_mt>("console");
spdlog_initialized = true;
#endif // defined(PROJECT_ENABLE_SPDLOG)
#if defined(PROJECT_ENABLE_LIBSODIUM)
if (sodium_init() == -1) {
utils::error::handle_error(function_name, "failed to initialize sodium");
return false;
}
#endif // defined(PROJECT_ENABLE_LIBSODIUM)
#if defined(PROJECT_ENABLE_OPENSSL)
SSL_library_init();
#endif // defined(PROJECT_ENABLE_OPENSSL)
#if defined(PROJECT_ENABLE_CURL)
{
auto res = curl_global_init(CURL_GLOBAL_ALL);
if (res != 0) {
utils::error::handle_error(function_name,
"failed to initialize curl|result|" +
std::to_string(res));
return false;
}
curl_initialized = true;
}
#endif // defined(PROJECT_ENABLE_CURL)
#if defined(PROJECT_ENABLE_SQLITE)
{
auto res = sqlite3_initialize();
if (res != SQLITE_OK) {
utils::error::handle_error(function_name,
"failed to initialize sqlite3|result|" +
std::to_string(res));
return false;
}
sqlite3_initialized = true;
}
#endif // defined(PROJECT_ENABLE_SQLITE)
return true;
}
void project_cleanup() {
#if defined(PROJECT_ENABLE_CURL)
if (curl_initialized) {
curl_global_cleanup();
curl_initialized = false;
}
#endif // defined(PROJECT_ENABLE_CURL)
#if defined(PROJECT_ENABLE_SQLITE)
if (sqlite3_initialized) {
sqlite3_shutdown();
sqlite3_initialized = false;
}
#endif // defined(PROJECT_ENABLE_SQLITE)
#if defined(PROJECT_ENABLE_SPDLOG)
if (spdlog_initialized) {
spdlog::shutdown();
spdlog_initialized = false;
}
#endif // defined(PROJECT_ENABLE_SPDLOG)
}
} // namespace fifthgrid

10
src/initialize.hpp Normal file
View File

@@ -0,0 +1,10 @@
#ifndef LIBFIFTHGRID_INCLUDE_INITIALIZE_HPP_
#define LIBFIFTHGRID_INCLUDE_INITIALIZE_HPP_
namespace fifthgrid {
void project_cleanup();
[[nodiscard]] auto project_initialize() -> bool;
} // namespace fifthgrid
#endif // LIBFIFTHGRID_INCLUDE_INITIALIZE_HPP_

36
src/main.cpp Normal file
View File

@@ -0,0 +1,36 @@
#if defined(PROJECT_ENABLE_BACKWARD_CPP)
#include "backward.hpp"
#endif // defined(PROJECT_ENABLE_BACKWARD_CPP)
#include "initialize.hpp"
#include "utils/config.hpp"
#include "utils/error.hpp"
using namespace fifthgrid;
auto main(int argc, char **argv) -> int {
FIFTHGRID_USES_FUNCTION_NAME();
#if defined(PROJECT_ENABLE_BACKWARD_CPP)
static backward::SignalHandling sh;
#endif // defined(PROJECT_ENABLE_BACKWARD_CPP)
if (not fifthgrid::project_initialize()) {
fifthgrid::project_cleanup();
return -1;
}
int exit_code{0};
try {
// TODO Main code here
} catch (const std::exception &e) {
utils::error::handle_exception(function_name, e);
} catch (...) {
utils::error::handle_exception(function_name);
}
fifthgrid::project_cleanup();
return exit_code;
}

39
src/main_test.cpp Normal file
View File

@@ -0,0 +1,39 @@
#if defined(PROJECT_ENABLE_BACKWARD_CPP)
#include "backward.hpp"
#endif // defined(PROJECT_ENABLE_BACKWARD_CPP)
#include "gtest/gtest.h"
#include "initialize.hpp"
#include "utils/config.hpp"
#include "utils/error.hpp"
using namespace fifthgrid;
int PROJECT_TEST_RESULT{0};
auto main(int argc, char **argv) -> int {
FIFTHGRID_USES_FUNCTION_NAME();
#if defined(PROJECT_ENABLE_BACKWARD_CPP)
static backward::SignalHandling sh;
#endif
if (not fifthgrid::project_initialize()) {
fifthgrid::project_cleanup();
return -1;
}
try {
::testing::InitGoogleTest(&argc, argv);
PROJECT_TEST_RESULT = RUN_ALL_TESTS();
} catch (const std::exception &e) {
utils::error::handle_exception(function_name, e);
} catch (...) {
utils::error::handle_exception(function_name);
}
fifthgrid::project_cleanup();
return PROJECT_TEST_RESULT;
}

5
src/project.cmake Normal file
View File

@@ -0,0 +1,5 @@
add_project_library(lib${PROJECT_NAME} "" "" "${PROJECT_ADDITIONAL_SOURCES}")
add_project_executable(${PROJECT_NAME} lib${PROJECT_NAME} lib${PROJECT_NAME})
add_project_test_executable(${PROJECT_NAME}_test lib${PROJECT_NAME} lib${PROJECT_NAME})

11
src/scripts/cleanup.cmd Normal file
View File

@@ -0,0 +1,11 @@
@echo off
setlocal
set ARG1=%~1
set ARG2=%~2
set ARG3=%~3
pushd "%~dp0%"
call mingw64 -no-start ./cleanup.sh "%ARG1%" "%ARG2%" "%ARG3%" 1 0
popd

43
src/scripts/cleanup.sh Normal file
View File

@@ -0,0 +1,43 @@
#!/usr/bin/env bash
PROJECT_SCRIPTS_DIR=$(dirname "$0")
PROJECT_SCRIPTS_DIR=$(realpath ${PROJECT_SCRIPTS_DIR})
. "${PROJECT_SCRIPTS_DIR}/env.sh" "$1" "$2" "$3" "$4" "$5" 1 1>/dev/null 2>&1
for PROJECT_LIBRARY in "${PROJECT_LIBRARIES[@]}"; do
PROJECT_LIBRARY_LOWER=$(echo ${PROJECT_LIBRARY} | tr "[:upper:]" "[:lower:]")
ENABLE_NAME=PROJECT_ENABLE_${PROJECT_LIBRARY}
KEEP_NAME=PROJECT_KEEP_${PROJECT_LIBRARY}
if [ ${!ENABLE_NAME} == "OFF" ] && [ ${!KEEP_NAME} != "1" ]; then
CLEANUP_LIST=(${PROJECT_CLEANUP[${PROJECT_LIBRARY}]//:/ })
for CLEANUP_ITEM in "${CLEANUP_LIST[@]}"; do
rm -r ${PROJECT_SUPPORT_DIR}/${CLEANUP_ITEM}
done
${SED} -i "/.*\/${PROJECT_LIBRARY_LOWER}\.cmake/d" "${PROJECT_SOURCE_DIR}/cmake/libraries.cmake"
${SED} -i "/D${ENABLE_NAME}/d" "${PROJECT_SOURCE_DIR}/CMakeLists.txt"
${SED} -i "/${ENABLE_NAME}/d" "${PROJECT_SOURCE_DIR}/cmake/options.cmake"
${SED} -i "/\[${PROJECT_LIBRARY}\]/d" "${PROJECT_SOURCE_DIR}/scripts/libraries.sh"
${SED} -i "/\ \ ${PROJECT_LIBRARY}/d" "${PROJECT_SOURCE_DIR}/scripts/libraries.sh"
${SED} -i "/${PROJECT_LIBRARY}_HASH/d" "${PROJECT_SOURCE_DIR}/cmake/hashes.cmake"
${SED} -i "/${PROJECT_LIBRARY}2_HASH/d" "${PROJECT_SOURCE_DIR}/cmake/hashes.cmake"
${SED} -i "/${PROJECT_LIBRARY}_VERSION/d" "${PROJECT_SOURCE_DIR}/cmake/versions.cmake"
${SED} -i "/${PROJECT_LIBRARY}2_VERSION/d" "${PROJECT_SOURCE_DIR}/cmake/versions.cmake"
${SED} -i "/\[${PROJECT_LIBRARY}\]/d" "${PROJECT_SOURCE_DIR}/scripts/versions.sh"
${SED} -i "/\[${PROJECT_LIBRARY}2\]/d" "${PROJECT_SOURCE_DIR}/scripts/versions.sh"
rm -f "${PROJECT_SOURCE_DIR}/cmake/libraries/${PROJECT_LIBRARY_LOWER}.cmake"
fi
if [ ${!ENABLE_NAME} == "ON" ] && [ "${PROJECT_CLEANUP[${PROJECT_LIBRARY}_ON]}" != "" ]; then
CLEANUP_LIST=(${PROJECT_CLEANUP[${PROJECT_LIBRARY}_ON]//:/ })
for CLEANUP_ITEM in "${CLEANUP_LIST[@]}"; do
rm -r ${PROJECT_SUPPORT_DIR}/${CLEANUP_ITEM}
done
fi
done
${SED} -i "s/\ OFF)/\ ON)/" "${PROJECT_SOURCE_DIR}/cmake/options.cmake"

View File

@@ -0,0 +1,207 @@
#!/usr/bin/env bash
PROJECT_MINGW64_COPY_DEPENDENCIES=()
PROJECT_SCRIPTS_DIR=$(realpath "$0")
PROJECT_SCRIPTS_DIR=$(dirname "${PROJECT_SCRIPTS_DIR}")
. "${PROJECT_SCRIPTS_DIR}/env.sh" "$1" "$2" "$3" "$4" "$5" 1>/dev/null 2>&1
if [ "${PROJECT_IS_MINGW}" == "1" ] && [ "${PROJECT_STATIC_LINK}" == "OFF" ]; then
mkdir -p "${PROJECT_DIST_DIR}"
rm -f ${PROJECT_DIST_DIR}/*.dll
PROJECT_MINGW64_COPY_DEPENDENCIES+=(
/mingw64/bin/libgcc_s_seh-1.dll
/mingw64/bin/libstdc++-6.dll
/mingw64/bin/libwinpthread-1.dll
/mingw64/bin/libzlib1.dll
/mingw64/bin/libzstd.dll
/mingw64/bin/zlib1.dll
)
if [ "${PROJECT_ENABLE_BACKWARD_CPP}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/msvcr90.dll)
fi
if [ "${PROJECT_ENABLE_BOOST}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libboost*.dll)
fi
if [ "${PROJECT_ENABLE_CLI11}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libcli11*.dll)
fi
if [ "${PROJECT_ENABLE_CURL}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(
/mingw64/bin/libcurl*.dll
/mingw64/bin/libnghttp2-*.dll
)
fi
if [ "${PROJECT_ENABLE_FLAC}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libFLAC*.dll)
fi
if [ "${PROJECT_ENABLE_FMT}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libfmt*.dll)
fi
if [ "${PROJECT_ENABLE_FONTCONFIG}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(
/mingw64/bin/libexpat*.dll
/mingw64/bin/libfontconfig*.dll
)
fi
if [ "${PROJECT_ENABLE_FREETYPE2}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libfreetype*.dll)
fi
if [ "${PROJECT_ENABLE_LIBDSM}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libdsm.dll)
fi
if [ "${PROJECT_ENABLE_LIBEVENT}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libevent*.dll)
fi
if [ "${PROJECT_ENABLE_LIBICONV}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libiconv.dll)
fi
if [ "${PROJECT_ENABLE_LIBJPEG_TURBO}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libjpeg*.dll)
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libturbo*.dll)
fi
if [ "${PROJECT_ENABLE_LIBPNG}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libpng*.dll)
fi
if [ "${PROJECT_ENABLE_LIBSODIUM}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libsodium*.dll)
fi
if [ "${PROJECT_ENABLE_NANA}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libnana*.dll)
fi
if [ "${PROJECT_ENABLE_NUSPELL}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libnuspell-*.dll)
fi
if [ "${PROJECT_ENABLE_OGG}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libogg*.dll)
fi
if [ "${PROJECT_ENABLE_OPENAL}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libopenal*.dll)
fi
if [ "${PROJECT_ENABLE_OPENSSL}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(
/mingw64/bin/libssl*.dll
/mingw64/bin/libcrypt*.dll
)
fi
if [ "${PROJECT_ENABLE_PUGIXML}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libpugi*.dll)
fi
if [ "${PROJECT_ENABLE_SDL}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/SDL2*.dll)
fi
if [ "${PROJECT_ENABLE_SECP256K1}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libsecp256k1*.dll)
fi
if [ "${PROJECT_ENABLE_SFML}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libsfml*.dll)
fi
if [ "${PROJECT_ENABLE_SPDLOG}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libspdlog*.dll)
fi
if [ "${PROJECT_ENABLE_SQLITE}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libsqlite3-*.dll)
fi
if [ "${PROJECT_ENABLE_TASN}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libtasn1.dll)
fi
if [ "${PROJECT_ENABLE_TESTING}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(
/mingw64/bin/libgtest*.dll
/mingw64/bin/libgmock*.dll
)
fi
if [ "${PROJECT_ENABLE_TPL}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libtiny-process*.dll)
fi
if [ "${PROJECT_ENABLE_VORBIS}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libvorbis*.dll)
fi
if [ "${PROJECT_ENABLE_WXWIDGETS}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libLerc.dll)
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libsharpyuv-*.dll)
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libdeflate.dll)
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libglib-2*.dll)
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libgraphite2.dll)
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libharfbuzz-*.dll)
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libjbig-*.dll)
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libpcre2-*.dll)
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libtiff-*.dll)
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libwebp-*.dll)
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libwxbase*.dll)
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/libwxm*.dll)
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/wxbase*.dll)
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/bin/wxm*.dll)
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/lib/gcc_x64_dll/libwxbase*.dll)
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/lib/gcc_x64_dll/libwxm*.dll)
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/lib/gcc_x64_dll/wxbase*.dll)
PROJECT_MINGW64_COPY_DEPENDENCIES+=(/mingw64/lib/gcc_x64_dll/wxm*.dll)
fi
if [ "${PROJECT_ENABLE_SDL}" == "ON" ] || [ "${PROJECT_ENABLE_SFML}" == "ON" ] ||
[ "${PROJECT_ENABLE_WXWIDGETS}" == "ON" ] || [ "${PROJECT_ENABLE_NANA}" == "ON" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(
/mingw64/bin/libOpenCL*.dll
/mingw64/bin/libopencl*.dll
/mingw64/bin/libgallium_wgl.dll
/mingw64/bin/libva*.dll
/mingw64/bin/opengl*.dll
/mingw64/bin/vulkan*.dll
)
fi
rsync -av --progress ${PROJECT_EXTERNAL_BUILD_ROOT}/bin/*.dll "${PROJECT_DIST_DIR}/"
rsync -av --progress ${PROJECT_EXTERNAL_BUILD_ROOT}/lib/*.dll "${PROJECT_DIST_DIR}/"
if [ "${PROJECT_ENABLE_WXWIDGETS}" == "ON" ]; then
rsync -av --progress ${PROJECT_EXTERNAL_BUILD_ROOT}/lib/gcc_x64_dll/*.dll "${PROJECT_DIST_DIR}/"
fi
fi
if [ "${PROJECT_ENABLE_WINFSP}" == "ON" ]; then
if [ "${PROJECT_BUILD_ARCH}" == "x86_64" ]; then
WINFSP_DLL_PART=x64
fi
if [ "${WINFSP_DLL_PART}" != "" ]; then
PROJECT_MINGW64_COPY_DEPENDENCIES+=(${PROJECT_3RD_PARTY_DIR}/winfsp-2.1/bin/winfsp-${WINFSP_DLL_PART}.dll)
fi
fi
if [ "${PROJECT_ENABLE_VLC}" == "ON" ]; then
rsync -av --progress ${PROJECT_3RD_PARTY_DIR}/vlc/ "${PROJECT_DIST_DIR}/vlc/"
fi
for PROJECT_DEPENDENCY in "${PROJECT_MINGW64_COPY_DEPENDENCIES[@]}"; do
rsync -av --progress ${PROJECT_DEPENDENCY} "${PROJECT_DIST_DIR}/"
done

View File

@@ -0,0 +1,25 @@
#!/usr/bin/env bash
PROJECT_SCRIPTS_DIR=$(realpath "$0")
PROJECT_SCRIPTS_DIR=$(dirname "${PROJECT_SCRIPTS_DIR}")
. "${PROJECT_SCRIPTS_DIR}/env.sh" "$1" "$2" "$3" "$4" "$5" 1 1>/dev/null 2>&1
if [ -f "${PROJECT_SCRIPTS_DIR}/cleanup.sh" ]; then
. "${PROJECT_SCRIPTS_DIR}/cleanup.sh" "$1" "$2" "$3" "$4" "$5"
rm ${PROJECT_SCRIPTS_DIR}/cleanup.*
fi
function create_containers() {
BUILD_TYPE=$1
for FILE in "${PROJECT_SOURCE_DIR}/docker/${BUILD_TYPE}/*"; do
DOCKER_CREATE_ONLY=1
DOCKER_NAME=$(basename ${FILE})
DOCKER_TAG=${PROJECT_NAME}:${DOCKER_NAME}
. "${PROJECT_SCRIPTS_DIR}/docker_common.sh"
done
}
create_containers aarch64
create_containers x86_64

13
src/scripts/deliver.cmd Normal file
View File

@@ -0,0 +1,13 @@
@echo off
setlocal
set DEST=%~1
set DIST=%~2
set ARG1=%~3
set ARG2=%~4
set ARG3=%~5
pushd "%~dp0%"
call mingw64 -no-start ./deliver.sh "%DEST%" "%DIST%" "%ARG1%" "%ARG2%" "%ARG3%" 1 0 || exit 1
popd

103
src/scripts/deliver.sh Normal file
View File

@@ -0,0 +1,103 @@
#!/usr/bin/env bash
DEST_DIR=$1
DIST_DIR=$2
PROJECT_SCRIPTS_DIR=$(realpath "$0")
PROJECT_SCRIPTS_DIR=$(dirname "${PROJECT_SCRIPTS_DIR}")
. "${PROJECT_SCRIPTS_DIR}/env.sh" "$3" "$4" "$5" "$6" "$7"
function error_exit() {
echo $1
exit $2
}
if [ ! -d "${PROJECT_DIST_DIR}" ]; then
error_exit "dist directory not found: ${PROJECT_DIST_DIR}" 2
fi
if [ "${DIST_DIR}" == "" ]; then
DIST_DIR="${PROJECT_DIST_DIR}"
fi
DIST_DIR=$(realpath "${DIST_DIR}")
if [ ! -d "${DIST_DIR}" ]; then
error_exit "dist directory not found: ${DIST_DIR}" 2
fi
if [ "${DEST_DIR}" == "" ]; then
error_exit "dest directory not set" 2
fi
if [ ! -d "${DEST_DIR}" ]; then
error_exit "dest directory not found: ${DEST_DIR}" 2
fi
pushd "${PROJECT_SOURCE_DIR}"
BRANCH=$(git branch --show-current)
RELEASE=$(grep PROJECT_RELEASE_ITER= ./config.sh | ${SED} s/PROJECT_RELEASE_ITER=//g)
popd
if [ "${BRANCH}" == "master" ] || [ "${BRANCH}" == "alpha" ] ||
[ "${BRANCH}" == "main" ] || [ "${BRANCH}" == "release" ] ||
[ "${BRANCH}" == "beta" ] || [ "${BRANCH}" == "rc" ]; then
DEST_DIR=${DEST_DIR}/${RELEASE}
elif [[ ${BRANCH} = *'-alpha-'* ]] || [[ ${BRANCH} = *'-beta-'* ]] ||
[[ ${BRANCH} = *'-rc-'* ]] || [[ ${BRANCH} = *'-release-'* ]]; then
DEST_DIR=${DEST_DIR}/nightly
else
error_exit "skipping ${PROJECT_FILE_PART}" 0
fi
pushd "${DIST_DIR}"
if [ ! -f "./${PROJECT_OUT_FILE}" ]; then
error_exit "failed to find file: ${PROJECT_OUT_FILE}" 1
fi
if [ ! -f "./${PROJECT_OUT_FILE}.sha256" ]; then
error_exit "failed to find file: ${PROJECT_OUT_FILE}.sha256" 1
fi
if [ "${PROJECT_PRIVATE_KEY}" != "" ] && [ ! -f "./${PROJECT_OUT_FILE}.sig" ]; then
error_exit "failed to find file: ${PROJECT_OUT_FILE}.sig" 1
fi
cp -f ./${PROJECT_OUT_FILE} ${DEST_DIR} ||
error_exit "failed to deliver file: ${PROJECT_OUT_FILE}" 1
cp -f ./${PROJECT_OUT_FILE}.sha256 ${DEST_DIR} ||
error_exit "failed to deliver file: ${PROJECT_OUT_FILE}.sha256" 1
if [ "${PROJECT_PRIVATE_KEY}" != "" ]; then
cp -f ./${PROJECT_OUT_FILE}.sig ${DEST_DIR} ||
error_exit "failed to deliver file: ${PROJECT_OUT_FILE}.sig" 1
fi
if [ "${PROJECT_IS_MINGW}" == "1" ] && [ -f "${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}_setup.exe" ]; then
cp -f "${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}_setup.exe" ${DEST_DIR} ||
error_exit "failed to deliver file: ${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}" 1
cp -f "${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}_setup.exe.sha256" ${DEST_DIR} ||
error_exit "failed to deliver file: ${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}_setup.exe.sha256" 1
if [ "${PROJECT_PRIVATE_KEY}" != "" ]; then
cp -f "${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}_setup.exe.sig" ${DEST_DIR} ||
error_exit "failed to deliver file: ${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}_setup.exe.sig" 1
fi
fi
if [ "${PROJECT_IS_DARWIN}" == "1" ] && [ -f "${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}.dmg" ]; then
cp -f -X "${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}.dmg" ${DEST_DIR} ||
error_exit "failed to deliver file: ${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}.dmg" 1
cp -f -X "${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}.dmg.sha256" ${DEST_DIR} ||
error_exit "failed to deliver file: ${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}.dmg.sha256" 1
if [ "${PROJECT_PRIVATE_KEY}" != "" ]; then
cp -f -X "${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}.dmg.sig" ${DEST_DIR} ||
error_exit "failed to deliver file: ${PROJECT_DIST_DIR}/${PROJECT_FILE_PART}.dmg.sig" 1
fi
fi
popd
error_exit "delivered ${PROJECT_FILE_PART}" 0

View File

@@ -0,0 +1,67 @@
#!/usr/bin/env bash
if [ "${PROJECT_BUILD_ARCH}" == "aarch64" ] &&
[ "${PROJECT_ENABLE_MULTIARCH_DOCKER}" == "1" ]; then
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
fi
if [ "${DOCKER_NAME}" == "mingw64" ]; then
APP_VERSION_BUILD_ARGS=${PROJECT_MINGW64_DOCKER_BUILD_ARGS}
IS_MINGW=1
IS_UNIX=1
else
IS_MINGW=0
IS_UNIX=0
fi
if [ "${DOCKER_CREATE_ONLY}" != "1" ]; then
docker stop ${DOCKER_CONTAINER}
docker rm ${DOCKER_CONTAINER}
fi
pushd "${PROJECT_SOURCE_DIR}/support"
cp -f ${PROJECT_SOURCE_DIR}/docker/${PROJECT_BUILD_ARCH}/${DOCKER_NAME} Dockerfile
if [ "${PROJECT_BUILD_ARCH}" == "aarch64" ]; then
docker build ${APP_VERSION_BUILD_ARGS} \
--platform linux/arm64 \
--build-arg NUM_JOBS=${NUM_JOBS} \
--build-arg UID=$(id -u) \
--build-arg GID=$(id -g) \
--build-arg USERNAME=$(id -un) \
-t ${DOCKER_TAG} . || exit 1
else
docker build ${APP_VERSION_BUILD_ARGS} \
--build-arg NUM_JOBS=${NUM_JOBS} \
--build-arg UID=$(id -u) \
--build-arg GID=$(id -g) \
--build-arg USERNAME=$(id -un) \
-t ${DOCKER_TAG} . || exit 1
fi
rm Dockerfile
popd
if [ "${DOCKER_CREATE_ONLY}" != "1" ]; then
docker run -td \
--env DEVELOPER_PRIVATE_KEY=${DEVELOPER_PRIVATE_KEY} \
--env DEVELOPER_PUBLIC_KEY=${DEVELOPER_PUBLIC_KEY} \
--env MY_NUM_JOBS=${NUM_JOBS} \
--name ${DOCKER_CONTAINER} \
-u $(id -u):$(id -g) \
-v /.ci/${PROJECT_NAME}:/.ci/${PROJECT_NAME}:ro \
-v ${PROJECT_SOURCE_DIR}:${PROJECT_SOURCE_DIR}:rw,z \
-w ${PROJECT_SOURCE_DIR} \
${DOCKER_TAG} || exit 1
if [ "${DOCKER_SHELL}" == "1" ]; then
docker exec -it ${DOCKER_CONTAINER} /bin/bash
else
docker exec \
${DOCKER_CONTAINER} \
/bin/bash -c \
"${PROJECT_SOURCE_DIR}/scripts/make_common.sh \"${PROJECT_BUILD_ARCH}\" \"${PROJECT_CMAKE_BUILD_TYPE}\" \"${PROJECT_BUILD_CLEAN}\" ${IS_MINGW} ${IS_UNIX}" || exit 1
fi
docker stop ${DOCKER_CONTAINER}
docker rm ${DOCKER_CONTAINER}
fi

441
src/scripts/env.sh Normal file
View File

@@ -0,0 +1,441 @@
#!/usr/bin/env bash
PROJECT_BUILD_ARCH=$1
PROJECT_CMAKE_BUILD_TYPE=$2
PROJECT_BUILD_CLEAN=$3
PROJECT_IS_MINGW=$4
PROJECT_IS_MINGW_UNIX=$5
DISABLE_CREATE_DIRS=$6
PROJECT_FLUTTER_BASE_HREF="/"
if [ "${PROJECT_IS_MINGW}" != "1" ]; then
PROJECT_IS_MINGW_UNIX=0
fi
PROJECT_SOURCE_DIR=${PROJECT_SCRIPTS_DIR}/..
PROJECT_SOURCE_DIR=$(realpath "${PROJECT_SOURCE_DIR}")
NUM_JOBS=${MY_NUM_JOBS}
if [[ -z "${NUM_JOBS}" ]]; then
NUM_JOBS=$(getconf _NPROCESSORS_ONLN 2>/dev/null ||
getconf NPROCESSORS_ONLN 2>/dev/null || echo 1)
if [ "${NUM_JOBS}" -gt "4" ]; then
NUM_JOBS=$(expr ${NUM_JOBS} - 2)
elif [ "${NUM_JOBS}" -gt "1" ]; then
NUM_JOBS=$(expr ${NUM_JOBS} - 1)
fi
fi
pushd "${PROJECT_SOURCE_DIR}"
PROJECT_GIT_REV=$(git rev-parse --short HEAD)
. "${PROJECT_SCRIPTS_DIR}/versions.sh"
. "${PROJECT_SCRIPTS_DIR}/libraries.sh"
for PROJECT_LIBRARY in "${PROJECT_LIBRARIES[@]}"; do
ENABLE_NAME=PROJECT_ENABLE_${PROJECT_LIBRARY}
KEEP_NAME=PROJECT_KEEP_${PROJECT_LIBRARY}
if [ "${PROJECT_LIBRARY}" == "TESTING" ]; then
export ${ENABLE_NAME}=ON
else
export ${ENABLE_NAME}=OFF
fi
export ${KEEP_NAME}=0
done
PROJECT_APP_LIST=()
PROJECT_CMAKE_OPTS=""
PROJECT_ENABLE_V2_ERRORS=OFF
PROJECT_ENABLE_WIN32_LONG_PATH_NAMES=OFF
PROJECT_IS_ALPINE=0
PROJECT_IS_ARM64=0
PROJECT_IS_DARWIN=0
PROJECT_MINGW64_COPY_DEPENDENCIES=()
PROJECT_MSYS2_PACKAGE_LIST=()
PROJECT_REQUIRE_ALPINE=OFF
PROJECT_STATIC_LINK=OFF
PROJECT_MACOS_BUNDLE_ID=""
PROJECT_MACOS_ICNS_NAME=""
if [ "$(uname -s)" == "Darwin" ]; then
PROJECT_IS_DARWIN=1
export SED=gsed
else
export SED=sed
fi
if [ "${PROJECT_BUILD_ARCH}" == "" ]; then
if [ "$(uname -m)" == "arm64" ]; then
PROJECT_BUILD_ARCH=aarch64
else
PROJECT_BUILD_ARCH=x86_64
fi
fi
if [ "${PROJECT_BUILD_ARCH}" == "aarch64" ]; then
PROJECT_IS_ARM64=1
fi
if [ "${PROJECT_BUILD_ARCH}" == "x86_64" ]; then
PROJECT_BUILD_ARCH2="x86-64"
else
PROJECT_BUILD_ARCH2="${PROJECT_BUILD_ARCH}"
fi
if [ -f /etc/alpine-release ]; then
PROJECT_IS_ALPINE=1
fi
if [ "${PROJECT_IS_MINGW}" == "" ]; then
PROJECT_IS_MINGW=0
fi
if [ "${PROJECT_IS_MINGW_UNIX}" == "" ]; then
PROJECT_IS_MINGW_UNIX=0
fi
. "${PROJECT_SOURCE_DIR}/config.sh"
if [ "${PROJECT_IS_MINGW}" == "0" ]; then
PROJECT_ENABLE_WIN32_LONG_PATH_NAMES=OFF
fi
if [ "${PROJECT_ENABLE_SFML}" == "ON" ]; then
PROJECT_ENABLE_FLAC=ON
PROJECT_ENABLE_FONTCONFIG=ON
PROJECT_ENABLE_FREETYPE2=ON
PROJECT_ENABLE_OGG=ON
PROJECT_ENABLE_OPENAL=ON
PROJECT_ENABLE_VORBIS=ON
PROJECT_STATIC_LINK=OFF
fi
if [ "${PROJECT_ENABLE_CPP_HTTPLIB}" == "ON" ]; then
PROJECT_ENABLE_CURL=ON
PROJECT_ENABLE_OPENSSL=ON
fi
if [ "${PROJECT_ENABLE_CURL}" == "ON" ]; then
PROJECT_ENABLE_OPENSSL=ON
fi
if [ "${PROJECT_ENABLE_LIBBITCOIN_SYSTEM}" == "ON" ]; then
PROJECT_ENABLE_BOOST=ON
PROJECT_ENABLE_SECP256K1=ON
fi
if [ "${PROJECT_ENABLE_FONTCONFIG}" == "ON" ]; then
PROJECT_ENABLE_FREETYPE2=ON
fi
if [ "${PROJECT_ENABLE_WXWIDGETS}" == "ON" ]; then
PROJECT_ENABLE_CURL=ON
PROJECT_STATIC_LINK=OFF
fi
if [ "${PROJECT_ENABLE_SPDLOG}" == "ON" ]; then
PROJECT_ENABLE_FMT=OFF
fi
if [ "${PROJECT_ENABLE_VORBIS}" == "ON" ]; then
PROJECT_ENABLE_OGG=ON
fi
if [ "${PROJECT_ENABLE_FLAC}" == "ON" ]; then
PROJECT_ENABLE_LIBICONV=ON
PROJECT_ENABLE_OGG=ON
PROJECT_ENABLE_VORBIS=ON
fi
if [ "${PROJECT_ENABLE_BOOST}" == "ON" ]; then
PROJECT_ENABLE_OPENSSL=ON
fi
if [ "${PROJECT_ENABLE_FONTCONFIG}" == "ON" ] || [ "${PROJECT_ENABLE_NANA}" == "ON" ] ||
[ "${PROJECT_ENABLE_SFML}" == "ON" ] || [ "${PROJECT_ENABLE_WXWIDGETS}" == "ON" ] ||
[ "${PROJECT_ENABLE_SDL}" == "ON" ]; then
PROJECT_ENABLE_LIBJPEG_TURBO=ON
PROJECT_ENABLE_LIBPNG=ON
fi
if [ "${PROJECT_IS_MINGW}" == "1" ]; then
PROJECT_ENABLE_BACKWARD_CPP=OFF
fi
if [ "${PROJECT_ENABLE_LIBDSM}" == "ON" ]; then
PROJECT_ENABLE_LIBICONV=ON
PROJECT_ENABLE_LIBTASN=ON
PROJECT_ENABLE_OPENSSL=ON
fi
if [ "${PROJECT_CMAKE_BUILD_TYPE}" == "" ]; then
PROJECT_CMAKE_BUILD_TYPE=RelWithDebInfo
fi
PROJECT_CMAKE_BUILD_TYPE_LOWER=$(echo "${PROJECT_CMAKE_BUILD_TYPE}" | tr '[:upper:]' '[:lower:]')
if [ "${PROJECT_CMAKE_BUILD_TYPE_LOWER}" == "release" ]; then
PROJECT_CMAKE_BUILD_TYPE=RelWithDebInfo
elif [ "${PROJECT_CMAKE_BUILD_TYPE_LOWER}" == "debug" ]; then
PROJECT_CMAKE_BUILD_TYPE=Debug
fi
if [ "${PROJECT_IS_MINGW}" == "1" ] && [ "${PROJECT_IS_MINGW_UNIX}" != "1" ]; then
PROJECT_STATIC_LINK=OFF
fi
if [ "${PROJECT_STATIC_LINK}" == "ON" ]; then
PROJECT_BUILD_SHARED_LIBS=OFF
PROJECT_ENABLE_BACKWARD_CPP=OFF
PROJECT_LINK_TYPE=static
if [ "${PROJECT_IS_DARWIN}" == "0" ]; then
PROJECT_REQUIRE_ALPINE=ON
else
PROJECT_REQUIRE_ALPINE=OFF
fi
else
PROJECT_BUILD_SHARED_LIBS=ON
PROJECT_LINK_TYPE=shared
PROJECT_REQUIRE_ALPINE=OFF
fi
PROJECT_BUILD_DIR=${PROJECT_SOURCE_DIR}/build/${PROJECT_CMAKE_BUILD_TYPE_LOWER}/${PROJECT_LINK_TYPE}
PROJECT_DIST_DIR=${PROJECT_SOURCE_DIR}/dist/${PROJECT_CMAKE_BUILD_TYPE_LOWER}/${PROJECT_LINK_TYPE}
if [ "${PROJECT_IS_MINGW}" == "1" ]; then
PROJECT_DIST_DIR=${PROJECT_DIST_DIR}/win32
PROJECT_BUILD_DIR=${PROJECT_BUILD_DIR}/win32
elif [ "${PROJECT_IS_DARWIN}" == "1" ]; then
PROJECT_DIST_DIR=${PROJECT_DIST_DIR}/darwin
PROJECT_BUILD_DIR=${PROJECT_BUILD_DIR}/darwin
else
PROJECT_DIST_DIR=${PROJECT_DIST_DIR}/linux
PROJECT_BUILD_DIR=${PROJECT_BUILD_DIR}/linux
fi
if [ "${PROJECT_IS_ARM64}" == "1" ]; then
PROJECT_DIST_DIR=${PROJECT_DIST_DIR}/aarch64
PROJECT_BUILD_DIR=${PROJECT_BUILD_DIR}/aarch64
else
PROJECT_DIST_DIR=${PROJECT_DIST_DIR}/x86_64
PROJECT_BUILD_DIR=${PROJECT_BUILD_DIR}/x86_64
fi
PROJECT_DIST_DIR=${PROJECT_DIST_DIR}/${PROJECT_NAME}
PROJECT_EXTERNAL_BUILD_ROOT=${PROJECT_BUILD_DIR}/deps
PROJECT_SUPPORT_DIR=${PROJECT_SOURCE_DIR}/support
PROJECT_3RD_PARTY_DIR=${PROJECT_SUPPORT_DIR}/3rd_party
if [ "${PROJECT_ENABLE_OPENSSL}" == "ON" ]; then
if [ "${PROJECT_IS_MINGW}" == "1" ]; then
OPENSSL_ROOT_DIR=/mingw64
else
OPENSSL_ROOT_DIR=${PROJECT_EXTERNAL_BUILD_ROOT}
fi
fi
if [ "${PROJECT_IS_MINGW}" == "1" ] && [ "${PROJECT_IS_MINGW_UNIX}" == "1" ]; then
PROJECT_TOOLCHAIN_FILE_CMAKE=/cmake_toolchain.cmake
PROJECT_TOOLCHAIN_FILE_MESON=/meson_cross_file.txt
PROJECT_CMAKE_OPTS="-DCMAKE_TOOLCHAIN_FILE=${PROJECT_TOOLCHAIN_FILE_CMAKE} ${PROJECT_CMAKE_OPTS}"
fi
if [ -f "${PROJECT_SOURCE_DIR}/cmake/versions.cmake" ]; then
VERSIONS=($(${SED} -e s/\ /=/g -e s/set\(//g -e s/\)//g "${PROJECT_SOURCE_DIR}/cmake/versions.cmake"))
PROJECT_MINGW64_DOCKER_BUILD_ARGS=()
for VERSION in "${VERSIONS[@]}"; do
LOOKUP_NAME=$(echo ${VERSION} | ${SED} s/_VERSION.*// | sed s/GTEST/TESTING/g)
ENABLE_NAME=PROJECT_ENABLE_${LOOKUP_NAME}
if [ "${!ENABLE_NAME}" != "OFF" ]; then
PROJECT_MINGW64_DOCKER_BUILD_ARGS+=("--build-arg ${VERSION}")
fi
done
PROJECT_MINGW64_DOCKER_BUILD_ARGS=${PROJECT_MINGW64_DOCKER_BUILD_ARGS[*]}
fi
PROJECT_CMAKE_OPTS="-DPROJECT_3RD_PARTY_DIR=${PROJECT_3RD_PARTY_DIR} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_BUILD_ARCH=${PROJECT_BUILD_ARCH} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_BUILD_DIR=${PROJECT_BUILD_DIR} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_BUILD_SHARED_LIBS=${PROJECT_BUILD_SHARED_LIBS} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_CMAKE_BUILD_TYPE=${PROJECT_CMAKE_BUILD_TYPE} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_DIST_DIR=${PROJECT_DIST_DIR} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_ENABLE_V2_ERRORS=${PROJECT_ENABLE_V2_ERRORS} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_ENABLE_WIN32_LONG_PATH_NAMES=${PROJECT_ENABLE_WIN32_LONG_PATH_NAMES} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_EXTERNAL_BUILD_ROOT=${PROJECT_EXTERNAL_BUILD_ROOT} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_GIT_REV=${PROJECT_GIT_REV} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_IS_ALPINE=${PROJECT_IS_ALPINE} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_IS_ARM64=${PROJECT_IS_ARM64} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_IS_DARWIN=${PROJECT_IS_DARWIN} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_IS_MINGW=${PROJECT_IS_MINGW} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_IS_MINGW_UNIX=${PROJECT_IS_MINGW_UNIX} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_MACOS_BUNDLE_ID=${PROJECT_MACOS_BUNDLE_ID} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_MACOS_ICNS_NAME=${PROJECT_MACOS_ICNS_NAME} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_MAJOR_VERSION=${PROJECT_MAJOR_VERSION} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_MINOR_VERSION=${PROJECT_MINOR_VERSION} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_NAME=${PROJECT_NAME} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_RELEASE_ITER=${PROJECT_RELEASE_ITER} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_RELEASE_NUM=${PROJECT_RELEASE_NUM} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_REQUIRE_ALPINE=${PROJECT_REQUIRE_ALPINE} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_REVISION_VERSION=${PROJECT_REVISION_VERSION} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_STATIC_LINK=${PROJECT_STATIC_LINK} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_SUPPORT_DIR=${PROJECT_SUPPORT_DIR} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_TOOLCHAIN_FILE_CMAKE=${PROJECT_TOOLCHAIN_FILE_CMAKE} ${PROJECT_CMAKE_OPTS}"
PROJECT_CMAKE_OPTS="-DPROJECT_TOOLCHAIN_FILE_MESON=${PROJECT_TOOLCHAIN_FILE_MESON} ${PROJECT_CMAKE_OPTS}"
for PROJECT_LIBRARY in "${PROJECT_LIBRARIES[@]}"; do
ENABLE_NAME=PROJECT_ENABLE_${PROJECT_LIBRARY}
PROJECT_CMAKE_OPTS="${PROJECT_CMAKE_OPTS} -D${ENABLE_NAME}=${!ENABLE_NAME}"
done
PKG_CONFIG_PATH="${PROJECT_EXTERNAL_BUILD_ROOT}/lib/pkgconfig:${PROJECT_EXTERNAL_BUILD_ROOT}/lib64/pkgconfig:${PROJECT_EXTERNAL_BUILD_ROOT}/shared/pkgconfig:${PKG_CONFIG_PATH}"
if [ "${DISABLE_CREATE_DIRS}" != "1" ]; then
mkdir -p "${PROJECT_BUILD_DIR}"
mkdir -p "${PROJECT_DIST_DIR}"
fi
PATH="${PROJECT_EXTERNAL_BUILD_ROOT}/bin:${PATH}"
if [ "${PROJECT_IS_MINGW}" == "1" ]; then
PROJECT_OS=windows
elif [ "${PROJECT_IS_DARWIN}" == "1" ]; then
PROJECT_OS=darwin
else
PROJECT_OS=linux
fi
PROJECT_FILE_PART=${PROJECT_NAME}_${PROJECT_MAJOR_VERSION}.${PROJECT_MINOR_VERSION}.${PROJECT_REVISION_VERSION}-${PROJECT_RELEASE_ITER}_${PROJECT_GIT_REV}_${PROJECT_OS}_${PROJECT_BUILD_ARCH2}
PROJECT_OUT_FILE=${PROJECT_FILE_PART}.tar.gz
if [ "${PROJECT_IS_MINGW}" == "1" ]; then
PROJECT_APP_BINARY_EXT=.exe
fi
if [ "${PROJECT_IS_MINGW}" == "1" ] && [ "${PROJECT_IS_MINGW_UNIX}" != "1" ]; then
MSYS=winsymlinks:nativestrict
fi
PROJECT_ENABLE_INNOSETUP=1
export MSYS
export NUM_JOBS
export OPENSSL_ROOT_DIR
export PATH
export PKG_CONFIG_PATH
export PROJECT_3RD_PARTY_DIR
export PROJECT_APP_BINARY_EXT
export PROJECT_APP_LIST
export PROJECT_BUILD_ARCH
export PROJECT_BUILD_ARCH2
export PROJECT_BUILD_CLEAN
export PROJECT_BUILD_DIR
export PROJECT_BUILD_SHARED_LIBS
export PROJECT_CMAKE_BUILD_TYPE
export PROJECT_CMAKE_BUILD_TYPE_LOWER
export PROJECT_CMAKE_OPTS
export PROJECT_COMPANY_NAME
export PROJECT_COPYRIGHT
export PROJECT_DESC
export PROJECT_DIST_DIR
export PROJECT_ENABLE_V2_ERRORS
export PROJECT_ENABLE_WIN32_LONG_PATH_NAMES
export PROJECT_FILE_PART
export PROJECT_FLUTTER_BASE_HREF
export PROJECT_GIT_REV
export PROJECT_IS_ALPINE
export PROJECT_IS_ARM64
export PROJECT_IS_DARWIN
export PROJECT_IS_MINGW
export PROJECT_IS_MINGW_UNIX
export PROJECT_LINK_TYPE
export PROJECT_MACOS_BUNDLE_ID
export PROJECT_MACOS_ICNS_NAME
export PROJECT_MAJOR_VERSION
export PROJECT_MINGW64_COPY_DEPENDENCIES
export PROJECT_MINGW64_DOCKER_BUILD_ARGS
export PROJECT_MINOR_VERSION
export PROJECT_MSYS2_PACKAGE_LIST
export PROJECT_NAME
export PROJECT_OS
export PROJECT_OUT_FILE
export PROJECT_PRIVATE_KEY
export PROJECT_PUBLIC_KEY
export PROJECT_RELEASE_ITER
export PROJECT_RELEASE_NUM
export PROJECT_REQUIRE_ALPINE
export PROJECT_REVISION_VERSION
export PROJECT_SOURCE_DIR
export PROJECT_STATIC_LINK
export PROJECT_SUPPORT_DIR
export PROJECT_TOOLCHAIN_FILE_CMAKE
export PROJECT_TOOLCHAIN_FILE_MESON
export PROJECT_URL
for PROJECT_LIBRARY in "${PROJECT_LIBRARIES[@]}"; do
ENABLE_NAME=PROJECT_ENABLE_${PROJECT_LIBRARY}
KEEP_NAME=PROJECT_KEEP_${PROJECT_LIBRARY}
export ${ENABLE_NAME}
export ${KEEP_NAME}
done
echo "-=[Settings]=-"
echo " App binary extension: ${PROJECT_APP_BINARY_EXT}"
echo " App list: ${PROJECT_APP_LIST[*]}"
echo " Build arch: ${PROJECT_BUILD_ARCH}"
echo " Build arch2: ${PROJECT_BUILD_ARCH2}"
echo " Build clean: ${PROJECT_BUILD_CLEAN}"
echo " Build dir: ${PROJECT_BUILD_DIR}"
echo " Build shared libraries: ${PROJECT_BUILD_SHARED_LIBS}"
echo " CMake options: -G\"Unix Makefiles\" -DPROJECT_COMPANY_NAME=\"${PROJECT_COMPANY_NAME}\" -DPROJECT_COPYRIGHT=\"${PROJECT_COPYRIGHT}\" -DPROJECT_DESC=\"${PROJECT_DESC}\" -DPROJECT_URL=\"${PROJECT_URL}\" ${PROJECT_CMAKE_OPTS} "
echo " CMake toolchain file: ${PROJECT_TOOLCHAIN_FILE_CMAKE}"
echo " Cmake Build type: ${PROJECT_CMAKE_BUILD_TYPE}"
echo " Company name: ${PROJECT_COMPANY_NAME}"
echo " Copyright: ${PROJECT_COPYRIGHT}"
echo " Description: ${PROJECT_DESC}"
echo " Dist dir: ${PROJECT_DIST_DIR}"
echo " Enable v2 errors: ${PROJECT_ENABLE_V2_ERRORS}"
echo " External build root: ${PROJECT_EXTERNAL_BUILD_ROOT}"
echo " File part: ${PROJECT_FILE_PART}"
echo " Flutter base href: ${PROJECT_FLUTTER_BASE_HREF}"
echo " Is ARM64: ${PROJECT_IS_ARM64}"
echo " Is Alpine: ${PROJECT_IS_ALPINE}"
echo " Is Darwin: ${PROJECT_IS_DARWIN}"
echo " Is MINGW on Unix: ${PROJECT_IS_MINGW_UNIX}"
echo " Is MINGW: ${PROJECT_IS_MINGW}"
echo " Job count: ${NUM_JOBS}"
echo " Link type: ${PROJECT_LINK_TYPE}"
if [ "${PROJECT_IS_MINGW}" == "1" ]; then
echo " Long path names: ${PROJECT_ENABLE_WIN32_LONG_PATH_NAMES}"
fi
if [ "${PROJECT_IS_DARWIN}" == "1" ]; then
echo " macOS bundle ID: ${PROJECT_MACOS_BUNDLE_ID}"
echo " macOS icns name: ${PROJECT_MACOS_ICNS_NAME}"
fi
echo " Meson toolchain file: ${PROJECT_TOOLCHAIN_FILE_MESON}"
if [ "${PROJECT_IS_MINGW}" == "1" ] && [ "${PROJECT_IS_MINGW_UNIX}" == "1" ]; then
echo " MinGW docker build args: ${PROJECT_MINGW64_DOCKER_BUILD_ARGS}"
fi
echo " OPENSSL_ROOT_DIR: ${OPENSSL_ROOT_DIR}"
echo " Out file: ${PROJECT_OUT_FILE}"
echo " PATH: ${PATH}"
echo " PKG_CONFIG_PATH: ${PKG_CONFIG_PATH}"
echo " Require Alpine: ${PROJECT_REQUIRE_ALPINE}"
echo " Static link: ${PROJECT_STATIC_LINK}"
echo " Support dir: ${PROJECT_SUPPORT_DIR}"
echo " Third-party dir: ${PROJECT_3RD_PARTY_DIR}"
echo " Unit testing enabled: ${PROJECT_ENABLE_TESTING}"
echo " URL: ${PROJECT_URL}"
echo "-=[Libraries]=-"
for PROJECT_LIBRARY in "${PROJECT_LIBRARIES[@]}"; do
ENABLE_NAME=PROJECT_ENABLE_${PROJECT_LIBRARY}
KEEP_NAME=PROJECT_KEEP_${PROJECT_LIBRARY}
if [ "${!ENABLE_NAME}" == "ON" ] || [ "${!KEEP_NAME}" == "1" ]; then
echo " ${ENABLE_NAME}: Enable[${!ENABLE_NAME}] Keep[${!KEEP_NAME}]"
fi
done
popd

12
src/scripts/info.cmd Normal file
View File

@@ -0,0 +1,12 @@
@echo off
setlocal
set ARG1=%~1
set ARG2=%~2
set ARG3=%~3
pushd "%~dp0%"
call mingw64 -no-start ./info.sh "%ARG1%" "%ARG2%" "%ARG3%" 1 0
popd

5
src/scripts/info.sh Normal file
View File

@@ -0,0 +1,5 @@
#!/usr/bin/env bash
PROJECT_SCRIPTS_DIR=$(realpath "$0")
PROJECT_SCRIPTS_DIR=$(dirname "${PROJECT_SCRIPTS_DIR}")
. "${PROJECT_SCRIPTS_DIR}/env.sh" "$1" "$2" "$3" "$4" "$5" 1

146
src/scripts/libraries.sh Normal file
View File

@@ -0,0 +1,146 @@
#!/usr/bin/env bash
PROJECT_LIBRARIES=(
BACKWARD_CPP
BOOST
CLI11
CPP_HTTPLIB
CURL
CXXOPTS
DTL
FLAC
FMT
FONTCONFIG
FREETYPE2
FUSE
FZF
GTKMM
JSON
LIBBITCOIN_SYSTEM
LIBDSM
LIBEVENT
LIBICONV
LIBJPEG_TURBO
LIBPNG
LIBSODIUM
LIBTASN
NANA
NUSPELL
OGG
OPENAL
OPENSSL
PUGIXML
ROCKSDB
SAGO_PLATFORM_FOLDERS
SDL
SECP256K1
SFML
SPDLOG
SQLITE
STDUUID
TESTING
TPL
VLC
VORBIS
WINFSP
WXWIDGETS
)
declare -A PROJECT_CLEANUP
PROJECT_CLEANUP[BACKWARD_CPP]="include/backward.hpp:src/backward.cpp"
PROJECT_CLEANUP[BINUTILS]="3rd_party/mingw64/binutils-*"
PROJECT_CLEANUP[BOOST]="3rd_party/boost_*"
PROJECT_CLEANUP[CLI11]="3rd_party/CLI11-*"
PROJECT_CLEANUP[CPP_HTTPLIB]="3rd_party/cpp-httplib-*"
PROJECT_CLEANUP[CURL]="3rd_party/curl-*"
PROJECT_CLEANUP[CXXOPTS]="3rd_party/cxxopts-*"
PROJECT_CLEANUP[DTL]="3rd_party/dtl-*"
PROJECT_CLEANUP[EXPAT]="3rd_party/mingw64/expat-*"
PROJECT_CLEANUP[FLAC]="3rd_party/flac-*"
PROJECT_CLEANUP[FMT]="3rd_party/fmt-*"
PROJECT_CLEANUP[FONTCONFIG]="3rd_party/fontconfig-*"
PROJECT_CLEANUP[FREETYPE2]="3rd_party/freetype-*"
PROJECT_CLEANUP[FZF]="include/fzf.h:src/fzf.c"
PROJECT_CLEANUP[GCC]="3rd_party/mingw64/gcc-*"
PROJECT_CLEANUP[ICU]="3rd_party/mingw64/icu-release-*"
PROJECT_CLEANUP[JSON]="3rd_party/json-*"
PROJECT_CLEANUP[INNOSETUP]="3rd_party/mingw64/innosetup-*"
PROJECT_CLEANUP[LIBBITCOIN_SYSTEM]="3rd_party/boost_${PROJECT_VERSIONS[BOOST2_MAJOR]}_${PROJECT_VERSIONS[BOOST2_MINOR]}_*:3rd_party/libbitcoin-system-*"
PROJECT_CLEANUP[LIBBITCOIN_SYSTEM_ON]="3rd_party/boost_${PROJECT_VERSIONS[BOOST_MAJOR]}_${PROJECT_VERSIONS[BOOST_MINOR]}_*"
PROJECT_CLEANUP[LIBDSM]="3rd_party/libdsm-*:3rd_party/libdsm*"
PROJECT_CLEANUP[LIBEVENT]="3rd_party/libevent*"
PROJECT_CLEANUP[LIBICONV]="3rd_party/libiconv-*"
PROJECT_CLEANUP[LIBJPEG_TURBO]="3rd_party/libjpeg_turbo-*"
PROJECT_CLEANUP[LIBPNG]="3rd_party/libpng-*"
PROJECT_CLEANUP[LIBSODIUM]="3rd_party/libsodium-*:3rd_party/libsodium*"
PROJECT_CLEANUP[LIBTASN]="3rd_party/libtasn1-*"
PROJECT_CLEANUP[MINGW]="3rd_party/mingw64/mingw-w64-*"
PROJECT_CLEANUP[NANA]="3rd_party/nana-*:3rd_party/nana*"
PROJECT_CLEANUP[NUSPELL]="3rd_party/nuspell-*"
PROJECT_CLEANUP[OGG]="3rd_party/ogg-*"
PROJECT_CLEANUP[OPENAL]="3rd_party/openal-*"
PROJECT_CLEANUP[OPENSSL]="3rd_party/openssl-*"
PROJECT_CLEANUP[PKG_CONFIG]="3rd_party/mingw64/pkg-config-*"
PROJECT_CLEANUP[PUGIXML]="3rd_party/pugixml-*"
PROJECT_CLEANUP[ROCKSDB]="3rd_party/rocksdb-*"
PROJECT_CLEANUP[SAGO_PLATFORM_FOLDERS]="include/platform_folders.hpp:src/platform_folders.cpp"
PROJECT_CLEANUP[SDL]="3rd_party/sdl-*"
PROJECT_CLEANUP[SECP256K1]="3rd_party/secp256k1-*"
PROJECT_CLEANUP[SFML]="3rd_party/SFML-*:3rd_party/SFML*:include/RoundedRectangleShape.hpp:include/Text2.hpp:src/RoundedRectangleShape.cpp:src/Text2.cpp"
PROJECT_CLEANUP[SPDLOG]="3rd_party/spdlog-*"
PROJECT_CLEANUP[SQLITE]="3rd_party/sqlite*"
PROJECT_CLEANUP[STDUUID]="3rd_party/stduuid-*"
PROJECT_CLEANUP[TESTING]="3rd_party/googletest-*"
PROJECT_CLEANUP[TPL]="3rd_party/tiny-process-library*"
PROJECT_CLEANUP[VLC]="3rd_party/vlc*"
PROJECT_CLEANUP[VORBIS]="3rd_party/vorbis-*:3rd_party/vorbis*"
PROJECT_CLEANUP[WINFSP]="3rd_party/winfsp-*"
PROJECT_CLEANUP[WXWIDGETS]="3rd_party/wxWidgets-*"
PROJECT_CLEANUP[ZLIB]="3rd_party/mingw64/zlib-*"
export PROJECT_CLEANUP
declare -A PROJECT_DOWNLOADS
PROJECT_DOWNLOADS[BINUTILS]="https://ftp.gnu.org/gnu/binutils/binutils-${PROJECT_VERSIONS[BINUTILS]}.tar.xz;binutils-${PROJECT_VERSIONS[BINUTILS]}.tar.xz;3rd_party/mingw64"
PROJECT_DOWNLOADS[BOOST2]="https://archives.boost.io/release/${PROJECT_VERSIONS[BOOST2_MAJOR]}.${PROJECT_VERSIONS[BOOST2_MINOR]}.${PROJECT_VERSIONS[BOOST2_PATCH]}/source/boost_${PROJECT_VERSIONS[BOOST2_MAJOR]}_${PROJECT_VERSIONS[BOOST2_MINOR]}_${PROJECT_VERSIONS[BOOST2_PATCH]}.tar.gz;boost_${PROJECT_VERSIONS[BOOST2_MAJOR]}_${PROJECT_VERSIONS[BOOST2_MINOR]}_${PROJECT_VERSIONS[BOOST2_PATCH]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[BOOST]="https://archives.boost.io/release/${PROJECT_VERSIONS[BOOST_MAJOR]}.${PROJECT_VERSIONS[BOOST_MINOR]}.${PROJECT_VERSIONS[BOOST_PATCH]}/source/boost_${PROJECT_VERSIONS[BOOST_MAJOR]}_${PROJECT_VERSIONS[BOOST_MINOR]}_${PROJECT_VERSIONS[BOOST_PATCH]}.tar.gz;boost_${PROJECT_VERSIONS[BOOST_MAJOR]}_${PROJECT_VERSIONS[BOOST_MINOR]}_${PROJECT_VERSIONS[BOOST_PATCH]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[CLI11]="https://github.com/CLIUtils/CLI11/archive/refs/tags/v${PROJECT_VERSIONS[CLI11]}.tar.gz;CLI11-${PROJECT_VERSIONS[CLI11]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[CPP_HTTPLIB]="https://github.com/yhirose/cpp-httplib/archive/refs/tags/v${PROJECT_VERSIONS[CPP_HTTPLIB]}.tar.gz;cpp-httplib-${PROJECT_VERSIONS[CPP_HTTPLIB]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[CURL]="https://github.com/curl/curl/archive/refs/tags/curl-${PROJECT_VERSIONS[CURL2]}.tar.gz;curl-${PROJECT_VERSIONS[CURL]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[CXXOPTS]="https://github.com/jarro2783/cxxopts/archive/refs/tags/v${PROJECT_VERSIONS[CXXOPTS]}.tar.gz;cxxopts-v${PROJECT_VERSIONS[CXXOPTS]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[EXPAT]="https://github.com/libexpat/libexpat/archive/refs/tags/R_${PROJECT_VERSIONS[EXPAT2]}.tar.gz;expat-${PROJECT_VERSIONS[EXPAT]}.tar.gz;3rd_party/mingw64"
PROJECT_DOWNLOADS[FLAC]="https://github.com/xiph/flac/archive/refs/tags/${PROJECT_VERSIONS[FLAC]}.tar.gz;flac-${PROJECT_VERSIONS[FLAC]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[FMT]="https://github.com/fmtlib/fmt/archive/refs/tags/${PROJECT_VERSIONS[FMT]}.tar.gz;fmt-${PROJECT_VERSIONS[FMT]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[FONTCONFIG]="https://www.freedesktop.org/software/fontconfig/release/fontconfig-${PROJECT_VERSIONS[FONTCONFIG]}.tar.xz;fontconfig-${PROJECT_VERSIONS[FONTCONFIG]}.tar.xz;3rd_party"
PROJECT_DOWNLOADS[FREETYPE2]="https://download.savannah.gnu.org/releases/freetype/freetype-${PROJECT_VERSIONS[FREETYPE2]}.tar.gz;freetype-${PROJECT_VERSIONS[FREETYPE2]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[GCC]="https://mirrorservice.org/sites/sourceware.org/pub/gcc/releases/gcc-${PROJECT_VERSIONS[GCC]}/gcc-${PROJECT_VERSIONS[GCC]}.tar.gz;gcc-${PROJECT_VERSIONS[GCC]}.tar.gz;3rd_party/mingw64"
PROJECT_DOWNLOADS[GTEST]="https://github.com/google/googletest/archive/refs/tags/v${PROJECT_VERSIONS[GTEST]}.tar.gz;googletest-${PROJECT_VERSIONS[GTEST]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[ICU]="https://github.com/unicode-org/icu/archive/refs/tags/release-${PROJECT_VERSIONS[ICU]}.tar.gz;icu-release-${PROJECT_VERSIONS[ICU]}.tar.gz;3rd_party/mingw64"
PROJECT_DOWNLOADS[JSON]="https://github.com/nlohmann/json/archive/refs/tags/v${PROJECT_VERSIONS[JSON]}.tar.gz;json-${PROJECT_VERSIONS[JSON]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[INNOSETUP]="https://files.jrsoftware.org/is/6/innosetup-${PROJECT_VERSIONS[INNOSETUP]}.exe;innosetup-${PROJECT_VERSIONS[INNOSETUP]}.exe;3rd_party/mingw64"
PROJECT_DOWNLOADS[WINFSP]="https://github.com/winfsp/winfsp/releases/download/v${PROJECT_VERSIONS[WINFSP2]}/winfsp-${PROJECT_VERSIONS[WINFSP]}.msi;winfsp-${PROJECT_VERSIONS[WINFSP]}.msi;3rd_party"
PROJECT_DOWNLOADS[LIBDSM]="https://github.com/videolabs/libdsm/archive/refs/tags/v${PROJECT_VERSIONS[LIBDSM]}.tar.gz;libdsm-${PROJECT_VERSIONS[LIBDSM]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[LIBEVENT]="https://github.com/libevent/libevent/archive/refs/tags/release-${PROJECT_VERSIONS[LIBEVENT]}-stable.tar.gz;libevent-${PROJECT_VERSIONS[LIBEVENT]}-stable.tar.gz;3rd_party"
PROJECT_DOWNLOADS[LIBICONV]="https://ftp.gnu.org/pub/gnu/libiconv/libiconv-${PROJECT_VERSIONS[LIBICONV]}.tar.gz;libiconv-${PROJECT_VERSIONS[LIBICONV]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[LIBJPEG_TURBO]="https://github.com/libjpeg-turbo/libjpeg-turbo/archive/refs/tags/${PROJECT_VERSIONS[LIBJPEG_TURBO]}.tar.gz;libjpeg_turbo-${PROJECT_VERSIONS[LIBJPEG_TURBO]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[LIBPNG]="https://github.com/pnggroup/libpng/archive/refs/tags/v${PROJECT_VERSIONS[LIBPNG]}.tar.gz;libpng-v${PROJECT_VERSIONS[LIBPNG]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[LIBSODIUM]="https://github.com/jedisct1/libsodium/archive/refs/tags/${PROJECT_VERSIONS[LIBSODIUM]}-RELEASE.tar.gz;libsodium-${PROJECT_VERSIONS[LIBSODIUM]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[LIBTASN]="https://ftp.gnu.org/gnu/libtasn1/libtasn1-${PROJECT_VERSIONS[LIBTASN]}.tar.gz;libtasn1-${PROJECT_VERSIONS[LIBTASN]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[MINGW]="https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/mingw-w64-v${PROJECT_VERSIONS[MINGW]}.tar.bz2;;mingw-w64-v${PROJECT_VERSIONS[MINGW]}.tar.bz2;3rd_party/mingw64"
PROJECT_DOWNLOADS[NANA]="https://github.com/cnjinhao/nana/archive/refs/tags/v${PROJECT_VERSIONS[NANA]}.tar.gz;nana-v${PROJECT_VERSIONS[NANA]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[NUSPELL]="https://github.com/nuspell/nuspell/archive/refs/tags/v${PROJECT_VERSIONS[NUSPELL]}.tar.gz;nuspell-v${PROJECT_VERSIONS[NUSPELL]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[OGG]="https://github.com/xiph/ogg/releases/download/v${PROJECT_VERSIONS[OGG]}/libogg-${PROJECT_VERSIONS[OGG]}.tar.gz;ogg-v${PROJECT_VERSIONS[OGG]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[OPENAL]="https://github.com/kcat/openal-soft/archive/refs/tags/${PROJECT_VERSIONS[OPENAL]}.tar.gz;openal-${PROJECT_VERSIONS[OPENAL]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[OPENSSL]="https://github.com/openssl/openssl/releases/download/openssl-${PROJECT_VERSIONS[OPENSSL]}/openssl-${PROJECT_VERSIONS[OPENSSL]}.tar.gz;openssl-${PROJECT_VERSIONS[OPENSSL]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[PKG_CONFIG]="https://pkgconfig.freedesktop.org/releases/pkg-config-${PROJECT_VERSIONS[PKG_CONFIG]}.tar.gz;pkg-config-${PROJECT_VERSIONS[PKG_CONFIG]}.tar.gz;3rd_party/mingw64"
PROJECT_DOWNLOADS[PUGIXML]="https://github.com/zeux/pugixml/releases/download/v${PROJECT_VERSIONS[PUGIXML]}/pugixml-${PROJECT_VERSIONS[PUGIXML]}.tar.gz;pugixml-${PROJECT_VERSIONS[PUGIXML]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[ROCKSDB]="https://github.com/facebook/rocksdb/archive/refs/tags/v${PROJECT_VERSIONS[ROCKSDB]}.tar.gz;rocksdb-${PROJECT_VERSIONS[ROCKSDB]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[SDL]="https://github.com/libsdl-org/SDL/archive/refs/tags/release-${PROJECT_VERSIONS[SDL]}.tar.gz;sdl-${PROJECT_VERSIONS[SDL]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[SECP256K1]="https://github.com/libbitcoin/secp256k1/archive/refs/tags/v${PROJECT_VERSIONS[SECP256K1]}.tar.gz;secp256k1-${PROJECT_VERSIONS[SECP256K1]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[SFML]="https://github.com/SFML/SFML/archive/refs/tags/${PROJECT_VERSIONS[SFML]}.tar.gz;SFML-${PROJECT_VERSIONS[SFML]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[SPDLOG]="https://github.com/gabime/spdlog/archive/refs/tags/v${PROJECT_VERSIONS[SPDLOG]}.tar.gz;spdlog-${PROJECT_VERSIONS[SPDLOG]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[SQLITE]="https://www.sqlite.org/2025/sqlite-amalgamation-${PROJECT_VERSIONS[SQLITE]}.zip;sqlite-amalgamation-${PROJECT_VERSIONS[SQLITE]}.zip;3rd_party"
PROJECT_DOWNLOADS[STDUUID]="https://github.com/mariusbancila/stduuid/archive/refs/tags/v${PROJECT_VERSIONS[STDUUID]}.tar.gz;stduuid-${PROJECT_VERSIONS[STDUUID]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[VORBIS]="https://github.com/xiph/vorbis/archive/refs/tags/v${PROJECT_VERSIONS[VORBIS]}.tar.gz;vorbis-v${PROJECT_VERSIONS[VORBIS]}.tar.gz;3rd_party"
PROJECT_DOWNLOADS[WXWIDGETS]="https://github.com/wxWidgets/wxWidgets/releases/download/v${PROJECT_VERSIONS[WXWIDGETS]}/wxWidgets-${PROJECT_VERSIONS[WXWIDGETS]}.tar.bz2;wxWidgets-${PROJECT_VERSIONS[WXWIDGETS]}.tar.bz2;3rd_party"
PROJECT_DOWNLOADS[ZLIB]="https://github.com/madler/zlib/archive/refs/tags/v${PROJECT_VERSIONS[ZLIB]}.tar.gz;zlib-${PROJECT_VERSIONS[ZLIB]}.tar.gz;3rd_party/mingw64"
export PROJECT_DOWNLOADS

121
src/scripts/make_common.sh Normal file
View File

@@ -0,0 +1,121 @@
#!/usr/bin/env bash
PROJECT_SCRIPTS_DIR=$(realpath "$0")
PROJECT_SCRIPTS_DIR=$(dirname "${PROJECT_SCRIPTS_DIR}")
. "${PROJECT_SCRIPTS_DIR}/env.sh" "$1" "$2" "$3" "$4" "$5"
mkdir -p "${PROJECT_BUILD_DIR}/build"
if [ -d "${PROJECT_DIST_DIR}" ]; then
rm -rf "${PROJECT_DIST_DIR}"
mkdir -p "${PROJECT_DIST_DIR}"
fi
if [ -f "${PROJECT_SOURCE_DIR}/pre_build.sh" ]; then
"${PROJECT_SOURCE_DIR}/pre_build.sh"
fi
ln -sf "${PROJECT_BUILD_DIR}/build/compile_commands.json" "${PROJECT_SOURCE_DIR}/compile_commands.json"
pushd "${PROJECT_BUILD_DIR}"
export CMAKE_BUILD_PARALLEL_LEVEL=${NUM_JOBS}
cmake "${PROJECT_SOURCE_DIR}" \
-G"Unix Makefiles" \
-DPROJECT_COMPANY_NAME="${PROJECT_COMPANY_NAME}" \
-DPROJECT_COPYRIGHT="${PROJECT_COPYRIGHT}" \
-DPROJECT_DESC="${PROJECT_DESC}" \
-DPROJECT_INTERFACE=1 \
-DPROJECT_URL="${PROJECT_URL}" \
${PROJECT_CMAKE_OPTS} || exit 1
if [ "${PROJECT_BUILD_CLEAN}" == "clean" ]; then
make clean
pushd build
make clean
popd
fi
make || exit 1
pushd build
make -j${CMAKE_BUILD_PARALLEL_LEVEL} || exit 1
popd
popd
if [ -f "${PROJECT_SOURCE_DIR}/LICENSE.md" ]; then
rsync -av --progress "${PROJECT_SOURCE_DIR}/LICENSE.md" "${PROJECT_DIST_DIR}/"
fi
if [ "${PROJECT_BUILD_SHARED_LIBS}" == "ON" ] && [ "${PROJECT_IS_MINGW}" != "1" ]; then
rsync -av --progress ${PROJECT_EXTERNAL_BUILD_ROOT}/ "${PROJECT_DIST_DIR}/"
pushd "${PROJECT_DIST_DIR}"
rm lib64
ln -sf lib lib64
popd
fi
for APP in ${PROJECT_APP_LIST[@]}; do
if [ "${PROJECT_BUILD_SHARED_LIBS}" == "ON" ]; then
if [ "${PROJECT_IS_MINGW}" == "1" ]; then
rsync -av --progress "${PROJECT_BUILD_DIR}/build/${APP}${PROJECT_APP_BINARY_EXT}" "${PROJECT_DIST_DIR}/"
else
rm "${PROJECT_DIST_DIR}/${APP}${PROJECT_APP_BINARY_EXT}"
if [ "${PROJECT_ENABLE_CURL}" == "ON" ]; then
mv "${PROJECT_DIST_DIR}/cacert.pem" "${PROJECT_DIST_DIR}/bin/cacert.pem"
fi
rsync -av --progress "${PROJECT_BUILD_DIR}/build/${APP}${PROJECT_APP_BINARY_EXT}" "${PROJECT_DIST_DIR}/bin/"
if [ "${PROJECT_IS_DARWIN}" == "1" ]; then
cat <<EOF >>"${PROJECT_DIST_DIR}/${APP}${PROJECT_APP_BINARY_EXT}"
#!/bin/sh
PROJECT_SCRIPTS_DIR=\$(realpath "\$0")
PROJECT_SCRIPTS_DIR=\$(dirname "\${PROJECT_SCRIPTS_DIR}")
DYLD_LIBRARY_PATH="\${PROJECT_SCRIPTS_DIR}/lib:\${PROJECT_SCRIPTS_DIR}/lib64:\${DYLD_LIBRARY_PATH}"
export DYLD_LIBRARY_PATH
\${PROJECT_SCRIPTS_DIR}/bin/${APP}${PROJECT_APP_BINARY_EXT} \$*
EOF
else
cat <<EOF >>"${PROJECT_DIST_DIR}/${APP}${PROJECT_APP_BINARY_EXT}"
#!/bin/sh
PROJECT_SCRIPTS_DIR=\$(realpath "\$0")
PROJECT_SCRIPTS_DIR=\$(dirname "\${PROJECT_SCRIPTS_DIR}")
export LD_LIBRARY_PATH="\${PROJECT_SCRIPTS_DIR}/lib:\${PROJECT_SCRIPTS_DIR}/lib64:\${LD_LIBRARY_PATH}"
\${PROJECT_SCRIPTS_DIR}/bin/${APP}${PROJECT_APP_BINARY_EXT} \$*
EOF
fi
chmod +x "${PROJECT_DIST_DIR}/${APP}${PROJECT_APP_BINARY_EXT}"
fi
elif [ ! -d "${PROJECT_BUILD_DIR}/build/${APP}.app" ]; then
rsync -av --progress "${PROJECT_BUILD_DIR}/build/${APP}${PROJECT_APP_BINARY_EXT}" "${PROJECT_DIST_DIR}/"
fi
done
if [ -d "${PROJECT_BUILD_DIR}/build/${PROJECT_NAME}.app" ]; then
rsync -av --progress "${PROJECT_BUILD_DIR}/build/${PROJECT_NAME}.app/" \
"${PROJECT_DIST_DIR}/${PROJECT_NAME}.app/"
fi
if [ -f "${PROJECT_SOURCE_DIR}/web/${PROJECT_NAME}/pubspec.yaml" ]; then
if [ -d "${PROJECT_DIST_DIR}/${PROJECT_NAME}.app" ]; then
rsync -av --progress "${PROJECT_SOURCE_DIR}/web/${PROJECT_NAME}/build/web/" \
"${PROJECT_DIST_DIR}/${PROJECT_NAME}.app/Contents/Resources/web/"
cp "${PROJECT_DIST_DIR}/cacert.pem" "${PROJECT_DIST_DIR}/${PROJECT_NAME}.app/Contents/MacOS/cacert.pem"
else
rsync -av --progress "${PROJECT_SOURCE_DIR}/web/${PROJECT_NAME}/build/web/" \
"${PROJECT_DIST_DIR}/web/"
fi
fi
if [ "${PROJECT_IS_MINGW}" == "1" ]; then
. "${PROJECT_SCRIPTS_DIR}/copy_mingw64_deps.sh" "$1" "$2" "$3" "$4" "$5"
fi
if [ -f "${PROJECT_SOURCE_DIR}/post_build.sh" ]; then
"${PROJECT_SOURCE_DIR}/post_build.sh"
fi
. "${PROJECT_SCRIPTS_DIR}/make_package.sh" "$1" "$2" "$3" "$4" "$5"

View File

@@ -0,0 +1,43 @@
#!/usr/bin/env bash
PROJECT_SCRIPTS_DIR=$(realpath "$0")
PROJECT_SCRIPTS_DIR=$(dirname "${PROJECT_SCRIPTS_DIR}")
. "${PROJECT_SCRIPTS_DIR}/env.sh" "$1" "$2" "$3" "$4" "$5"
if [ -f "${PROJECT_SOURCE_DIR}/web/${PROJECT_NAME}/pubspec.yaml" ]; then
if [[ "${PROJECT_IS_DARWIN}" == "0" && ("${PROJECT_IS_MINGW}" == "0" || "${PROJECT_IS_MINGW_UNIX}" == "1") ]]; then
FLUTTER_CONTAINER_NAME="${PROJECT_NAME}_flutter"
FLUTTER_TAG_NAME="${PROJECT_NAME}:flutter"
docker stop ${FLUTTER_CONTAINER_NAME}
docker rm ${FLUTTER_CONTAINER_NAME}
docker build "${PROJECT_SOURCE_DIR}/docker/x86_64/" \
--build-arg UID=$(id -u) \
--build-arg GID=$(id -g) \
-t ${FLUTTER_TAG_NAME} \
-f "${PROJECT_SOURCE_DIR}/docker/x86_64/flutter" || exit 1
docker run -td \
--name ${FLUTTER_CONTAINER_NAME} \
-u $(id -u):$(id -g) \
-v ${PROJECT_SOURCE_DIR}:${PROJECT_SOURCE_DIR}:rw,z \
-w ${PROJECT_SOURCE_DIR}/web/${PROJECT_NAME} \
${FLUTTER_TAG_NAME} || exit 1
docker exec \
${FLUTTER_CONTAINER_NAME} \
/bin/bash -c \
"flutter clean;flutter build web --base-href=${PROJECT_FLUTTER_BASE_HREF}" || exit 1
docker stop ${FLUTTER_CONTAINER_NAME}
docker rm ${FLUTTER_CONTAINER_NAME}
else
pushd "${PROJECT_SOURCE_DIR}/web/${PROJECT_NAME}"
export MSYS_NO_PATHCONV=1
flutter clean
flutter build web --base-href=${PROJECT_FLUTTER_BASE_HREF} || exit 1
export MSYS_NO_PATHCONV=0
popd
fi
fi

View File

@@ -0,0 +1,11 @@
@echo off
setlocal
set ARG1=%~1
set ARG2=%~2
set ARG3=%~3
pushd "%~dp0%"
call mingw64 -no-start ./make_package.sh "%ARG1%" "%ARG2%" "%ARG3%" 1 0 || exit 1
popd

153
src/scripts/make_package.sh Normal file
View File

@@ -0,0 +1,153 @@
#!/usr/bin/env bash
TEMP_DIR=$(mktemp -d)
PROJECT_SCRIPTS_DIR=$(realpath "$0")
PROJECT_SCRIPTS_DIR=$(dirname "${PROJECT_SCRIPTS_DIR}")
. "${PROJECT_SCRIPTS_DIR}/env.sh" "$1" "$2" "$3" "$4" "$5"
function error_exit() {
echo $1
rm -rf ${TEMP_DIR}
exit $2
}
function cleanup_packages() {
local SOURCE_FILE=$1
pushd "${PROJECT_DIST_DIR}"
if [ -f "${SOURCE_FILE}" ]; then
rm -f "${SOURCE_FILE}" || error_exit "failed to delete file: ${SOURCE_FILE}" 1
fi
if [ -f "${SOURCE_FILE}.sha256" ]; then
rm -f "${SOURCE_FILE}.sha256" || error_exit "failed to delete file: ${SOURCE_FILE}.sha256" 1
fi
if [ -f "${SOURCE_FILE}.sig" ]; then
rm -f "${SOURCE_FILE}.sig" || error_exit "failed to delete file: ${SOURCE_FILE}.sig" 1
fi
popd
}
function create_file_validations() {
local SOURCE_FILE=$1
sha256sum ${SOURCE_FILE} >${SOURCE_FILE}.sha256 || error_exit "failed to create sha256 for file: ${SOURCE_FILE}" 1
if [ "${PROJECT_PRIVATE_KEY}" != "" ]; then
openssl dgst -sha256 -sign "${PROJECT_PRIVATE_KEY}" -out "${SOURCE_FILE}.sig" "${SOURCE_FILE}" || error_exit "failed to create signature for file: ${SOURCE_FILE}" 1
openssl dgst -sha256 -verify "${PROJECT_PUBLIC_KEY}" -signature "${SOURCE_FILE}.sig" "${SOURCE_FILE}" || error_exit "failed to validate signature for file: ${SOURCE_FILE}" 1
fi
}
if [ ! -d "${PROJECT_DIST_DIR}" ]; then
error_exit "dist directory not found: ${PROJECT_DIST_DIR}" 2
fi
cleanup_packages "${PROJECT_OUT_FILE}"
cleanup_packages "${PROJECT_FILE_PART}_setup.exe"
cleanup_packages "${PROJECT_FILE_PART}.dmg"
rsync -av --progress ${PROJECT_DIST_DIR}/ ${TEMP_DIR}/${PROJECT_NAME}/ || error_exit "failed to rsync" 1
for APP in ${PROJECT_APP_LIST[@]}; do
if [ -d "${TEMP_DIR}/${PROJECT_NAME}/${APP}.app" ]; then
strip "${TEMP_DIR}/${PROJECT_NAME}/${APP}.app/Contents/MacOS/${APP}${PROJECT_APP_BINARY_EXT}"
elif [ "${PROJECT_BUILD_SHARED_LIBS}" == "ON" ] && [ "${PROJECT_IS_MINGW}" != "1" ]; then
strip "${TEMP_DIR}/${PROJECT_NAME}/bin/${APP}${PROJECT_APP_BINARY_EXT}"
else
strip "${TEMP_DIR}/${PROJECT_NAME}/${APP}${PROJECT_APP_BINARY_EXT}"
fi
done
pushd "${TEMP_DIR}/${PROJECT_NAME}/"
IFS=$'\n'
set -f
FILE_LIST=$(find . -type f -not -path "*/.app/*")
for FILE in ${FILE_LIST}; do
create_file_validations "${FILE}"
done
unset IFS
set +f
popd
pushd "${PROJECT_DIST_DIR}"
tar cvzf "${PROJECT_OUT_FILE}" -C ${TEMP_DIR} . || error_exit "failed to create archive: ${PROJECT_OUT_FILE}" 1
create_file_validations "${PROJECT_OUT_FILE}"
popd
if [ -d "${TEMP_DIR}/${PROJECT_NAME}/${PROJECT_NAME}.app" ]; then
APP_SRC="${TEMP_DIR}/${PROJECT_NAME}/${PROJECT_NAME}.app"
DMG_ROOT="${TEMP_DIR}/dmgroot"
mkdir -p "${DMG_ROOT}" || error_exit "failed to create dmgroot" 1
INSTALLER="${DMG_ROOT}/Install ${PROJECT_NAME}.command"
INSTALLER_SRC="${PROJECT_SOURCE_DIR}/${PROJECT_NAME}/Install ${PROJECT_NAME}.command"
if [ -f "${INSTALLER_SRC}" ]; then
HIDDEN_DIR="${DMG_ROOT}/.payload"
mkdir -p "${HIDDEN_DIR}" || error_exit "failed to create payload dir" 1
APP_DEST_DIR="${HIDDEN_DIR}"
else
APP_DEST_DIR="${DMG_ROOT}"
fi
rsync -a "${APP_SRC}" "${APP_DEST_DIR}/" || error_exit "failed to stage app bundle" 1
if [ -f "${INSTALLER_SRC}" ]; then
chflags hidden "${HIDDEN_DIR}" "${HIDDEN_DIR}/${PROJECT_NAME}.app" 2>/dev/null || true
fi
ln -s /Applications "${DMG_ROOT}/Applications" 2>/dev/null || true
if [ -f "${INSTALLER_SRC}" ]; then
cp -f "${INSTALLER_SRC}" "${INSTALLER}" || error_exit "failed to copy install command" 1
chmod +x "${INSTALLER}" || error_exit "failed to chmod install command" 1
SAFE_PREFIX="$(printf '%s' "${PROJECT_MACOS_BUNDLE_ID}" | sed -e 's/[\/&]/\\&/g')"
/usr/bin/sed -i '' -e "s|^LABEL_PREFIX=.*$|LABEL_PREFIX=\"${SAFE_PREFIX}\"|g" "${INSTALLER}"
LABEL_ASSIGNED="$(/usr/bin/awk -F= '/^LABEL_PREFIX=/{sub(/^[^=]*=/,""); gsub(/^"|"$/,""); print; exit}' "${INSTALLER}")"
if ! /usr/bin/awk -v v="${LABEL_ASSIGNED}" '
BEGIN {
if (length(v) == 0) exit 1;
if (v == "__LABEL_PREFIX__") exit 1;
if (v !~ /^[A-Za-z0-9._-]+$/) exit 1;
if (v !~ /\./) exit 1;
exit 0;
}'; then
error_exit "DMG build abort: invalid LABEL_PREFIX written to installer (value: \"${LABEL_ASSIGNED}\"). Check PROJECT_MACOS_BUNDLE_ID and sed substitution." 1
fi
fi
DMG_OUT="${PROJECT_FILE_PART}.dmg"
hdiutil create \
-volname "${PROJECT_NAME}" \
-fs HFS+ \
-srcfolder "${DMG_ROOT}" \
-ov -format UDZO \
"${PROJECT_DIST_DIR}/${DMG_OUT}" || error_exit "hdiutil failed" 1
pushd "${PROJECT_DIST_DIR}"
create_file_validations "${DMG_OUT}"
popd
elif [ "${PROJECT_IS_MINGW}" == "1" ] && [ -f "${PROJECT_DIST_DIR}/../${PROJECT_NAME}.iss" ]; then
cp -f "${PROJECT_DIST_DIR}/../${PROJECT_NAME}.iss" "${TEMP_DIR}/${PROJECT_NAME}.iss"
rsync -av --progress --delete ${PROJECT_SOURCE_DIR}/support/3rd_party/*.msi ${TEMP_DIR}/3rd_party/
pushd "${TEMP_DIR}"
if [ "${PROJECT_IS_MINGW_UNIX}" == "1" ]; then
wine64 "c:/Program Files (x86)/Inno Setup 6/iscc.exe" "${PROJECT_NAME}.iss" || exit 1
else
iscc "${PROJECT_NAME}.iss" || exit 1
fi
pushd "Output"
create_file_validations "${PROJECT_FILE_PART}_setup.exe"
cp -f * "${PROJECT_DIST_DIR}/"
popd
popd
fi
error_exit "created package ${PROJECT_FILE_PART}" 0

22
src/scripts/make_unix.sh Normal file
View File

@@ -0,0 +1,22 @@
#!/usr/bin/env bash
PROJECT_SCRIPTS_DIR=$(realpath "$0")
PROJECT_SCRIPTS_DIR=$(dirname "${PROJECT_SCRIPTS_DIR}")
. "${PROJECT_SCRIPTS_DIR}/env.sh" "$1" "$2" "$3" 0 0
if [ -f "${PROJECT_SCRIPTS_DIR}/cleanup.sh" ]; then
. "${PROJECT_SCRIPTS_DIR}/cleanup.sh" "$1" "$2" "$3" 0 0
rm ${PROJECT_SCRIPTS_DIR}/cleanup.*
fi
"${PROJECT_SOURCE_DIR}/scripts/make_flutter.sh" "${PROJECT_BUILD_ARCH}" "${PROJECT_CMAKE_BUILD_TYPE}" "${PROJECT_BUILD_CLEAN}" 0 0 || exit 1
if [[ "${PROJECT_IS_DARWIN}" == "0" && ("${PROJECT_REQUIRE_ALPINE}" == "ON" || "${PROJECT_IS_ARM64}" == "1") ]]; then
DOCKER_NAME=alpine
DOCKER_CONTAINER=${PROJECT_NAME}_${DOCKER_NAME}_${PROJECT_BUILD_ARCH}
DOCKER_TAG=${PROJECT_NAME}:${DOCKER_NAME}
. "${PROJECT_SCRIPTS_DIR}/docker_common.sh" || exit 1
else
"${PROJECT_SOURCE_DIR}/scripts/make_common.sh" "${PROJECT_BUILD_ARCH}" "${PROJECT_CMAKE_BUILD_TYPE}" "${PROJECT_BUILD_CLEAN}" 0 0 || exit 1
fi

View File

@@ -0,0 +1,18 @@
@echo off
setlocal
set ARG1=%~1
set ARG2=%~2
set ARG3=%~3
pushd "%~dp0%"
call setup_msys2.cmd "%ARG1%" "%ARG2%" "%ARG3%"
if exist "cleanup.cmd" (
call cleanup.cmd "%ARG1%" "%ARG2%" "%ARG3%" 1 0
del cleanup.*
)
call mingw64 -no-start ./make_flutter.sh "%ARG1%" "%ARG2%" "%ARG3%" 1 0 || exit 1
call mingw64 -no-start ./make_common.sh "%ARG1%" "%ARG2%" "%ARG3%" 1 0 || exit 1
popd

Some files were not shown because too many files have changed in this diff Show More