refactor: refactor project layout
- move header files into an individual directory to prevent the possibility that file name is conflict in Linux include directory. - update build script generator. use jinja2 template engine to get better view, rather than python code written by hand. - add version number and version comparation macros in core library.
This commit is contained in:
1 parent
2206825223
commit
0cd9582757
38 files changed
+293
-329
No files matched your search
@@ -1,2 +1,3 @@
|
|||||||
# -------------------- Output --------------------
|
# -------------------- Output --------------------
|
||||||
win_build.bat
|
win_build.bat
|
||||||
|
linux_build.sh
|
||||||
@@ -0,0 +1,108 @@
|
|||||||
|
import jinja2
|
||||||
|
import argparse
|
||||||
|
import os
|
||||||
|
import io
|
||||||
|
import re
|
||||||
|
import shlex
|
||||||
|
|
||||||
|
def validate_cpp_ver(ver: str) -> str:
|
||||||
|
if re.match(r'^[0-9]+$', ver) is not None: return ver
|
||||||
|
else: raise argparse.ArgumentTypeError('invalid version of C++ standard.')
|
||||||
|
|
||||||
|
def write_line(f: io.TextIOWrapper, val: str) -> None:
|
||||||
|
f.write(val)
|
||||||
|
f.write('\n')
|
||||||
|
|
||||||
|
# Reference: https://stackoverflow.com/questions/29213106/how-to-securely-escape-command-line-arguments-for-the-cmd-exe-shell-on-windows
|
||||||
|
def escape_for_cmd_exe(arg):
|
||||||
|
meta_re = re.compile(r'([()%!^"<>&|])')
|
||||||
|
return meta_re.sub('^\1', arg)
|
||||||
|
def escape_cmd_argument(arg):
|
||||||
|
if not arg or re.search(r'(["\s])', arg):
|
||||||
|
arg = '"' + arg.replace('"', r'\"') + '"'
|
||||||
|
return escape_for_cmd_exe(arg)
|
||||||
|
def escape_sh_argument(arg):
|
||||||
|
return shlex.quote(arg)
|
||||||
|
|
||||||
|
class ScriptSettings:
|
||||||
|
m_CppVersion: str
|
||||||
|
m_BuildDoc: bool
|
||||||
|
m_PIC: bool
|
||||||
|
|
||||||
|
def __init__(self, cpp_ver: str, build_doc: bool, pic: bool):
|
||||||
|
self.m_CppVersion = cpp_ver
|
||||||
|
self.m_BuildDoc = build_doc
|
||||||
|
self.m_PIC = pic
|
||||||
|
|
||||||
|
class TemplateRender:
|
||||||
|
m_Loader: jinja2.BaseLoader
|
||||||
|
m_Environment: jinja2.Environment
|
||||||
|
|
||||||
|
m_WinTemplate: jinja2.Template
|
||||||
|
m_LinuxTemplate: jinja2.Template
|
||||||
|
|
||||||
|
m_Settings: ScriptSettings
|
||||||
|
|
||||||
|
def __init__(self, settings: ScriptSettings) -> None:
|
||||||
|
self.m_Loader = jinja2.FileSystemLoader(self.__get_dir())
|
||||||
|
self.m_Environment = jinja2.Environment(loader=self.m_Loader)
|
||||||
|
|
||||||
|
self.m_WinTemplate = self.m_Environment.get_template('win_build.template.bat')
|
||||||
|
self.m_LinuxTemplate = self.m_Environment.get_template('linux_build.template.sh')
|
||||||
|
|
||||||
|
self.m_Settings = settings
|
||||||
|
|
||||||
|
def __get_dir(self) -> str:
|
||||||
|
return os.path.dirname(__file__)
|
||||||
|
|
||||||
|
def __escape_path(self, val: str, is_win: bool) -> str:
|
||||||
|
if is_win: return escape_cmd_argument(val)
|
||||||
|
else: return escape_sh_argument(val)
|
||||||
|
|
||||||
|
def __render(self, template: jinja2.Template, dest_file: str, is_win: bool) -> None:
|
||||||
|
with open(os.path.join(self.__get_dir(), dest_file), 'w', encoding='utf-8') as f:
|
||||||
|
f.write(template.render(
|
||||||
|
repo_root_dir = self.__escape_path(os.path.dirname(self.__get_dir()), is_win),
|
||||||
|
cpp_version = self.m_Settings.m_CppVersion,
|
||||||
|
build_doc = self.m_Settings.m_BuildDoc,
|
||||||
|
pic = settings.m_PIC
|
||||||
|
))
|
||||||
|
|
||||||
|
def render_win_script(self) -> None:
|
||||||
|
self.__render(self.m_WinTemplate, 'win_build.bat', True)
|
||||||
|
|
||||||
|
def render_linux_script(self) -> None:
|
||||||
|
self.__render(self.m_LinuxTemplate, 'linux_build.sh', False)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# parse argument
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
prog='YYCC Windows Build Script Generator',
|
||||||
|
description='YYCC Windows Build Script Generator'
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'-c', '--cpp',
|
||||||
|
action='store', default='17', dest='cpp', type=validate_cpp_ver,
|
||||||
|
help='The version of C++ standard used when building.'
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'-d', '--build-doc',
|
||||||
|
action='store_true', dest='build_doc',
|
||||||
|
help='Build YYCC without documentation.'
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'-p', '--pic',
|
||||||
|
action='store_true', dest='pic',
|
||||||
|
help='Enable Position Independent Code flag on non-Windows platform. This is crucial for compiling dynamic library using this library.'
|
||||||
|
)
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
# build settings
|
||||||
|
settings = ScriptSettings(args.cpp, args.build_doc, args.pic)
|
||||||
|
# build template render and render result
|
||||||
|
render = TemplateRender(settings)
|
||||||
|
render.render_win_script()
|
||||||
|
render.render_linux_script()
|
||||||
|
|
||||||
|
|
||||||
@@ -1,170 +0,0 @@
|
|||||||
import argparse
|
|
||||||
import os
|
|
||||||
import io
|
|
||||||
import re
|
|
||||||
|
|
||||||
def validate_cpp_ver(ver: str) -> str:
|
|
||||||
if re.match(r'^[0-9]+$', ver) is not None: return ver
|
|
||||||
else: raise argparse.ArgumentTypeError('invalid version of C++ standard.')
|
|
||||||
|
|
||||||
def write_line(f: io.TextIOWrapper, val: str) -> None:
|
|
||||||
f.write(val)
|
|
||||||
f.write('\n')
|
|
||||||
|
|
||||||
# Reference: https://stackoverflow.com/questions/29213106/how-to-securely-escape-command-line-arguments-for-the-cmd-exe-shell-on-windows
|
|
||||||
def escape_argument(arg):
|
|
||||||
if not arg or re.search(r'(["\s])', arg):
|
|
||||||
arg = '"' + arg.replace('"', r'\"') + '"'
|
|
||||||
return escape_for_cmd_exe(arg)
|
|
||||||
def escape_for_cmd_exe(arg):
|
|
||||||
meta_re = re.compile(r'([()%!^"<>&|])')
|
|
||||||
return meta_re.sub('^\1', arg)
|
|
||||||
|
|
||||||
class ScriptSettings:
|
|
||||||
m_CppVersion: str
|
|
||||||
m_NoDoc: bool
|
|
||||||
|
|
||||||
def __init__(self, cpp_ver: str, no_doc: bool):
|
|
||||||
self.m_CppVersion = cpp_ver
|
|
||||||
self.m_NoDoc = no_doc
|
|
||||||
|
|
||||||
def script_head(f: io.TextIOWrapper, s: ScriptSettings) -> None:
|
|
||||||
# change directory to root folder
|
|
||||||
write_line(f, ':: Navigate to project root directory')
|
|
||||||
root_dir: str = os.path.dirname(os.path.dirname(__file__))
|
|
||||||
write_line(f, f'CD /d {escape_argument(root_dir)}')
|
|
||||||
# create build directory and enter
|
|
||||||
write_line(f, ':: Create build directory and enter it')
|
|
||||||
write_line(f, 'MKDIR bin')
|
|
||||||
write_line(f, 'CD bin')
|
|
||||||
cpp_dir: str = f'cpp{s.m_CppVersion}'
|
|
||||||
write_line(f, f'MKDIR {cpp_dir}')
|
|
||||||
write_line(f, f'CD {cpp_dir}')
|
|
||||||
# blank line
|
|
||||||
write_line(f, '')
|
|
||||||
|
|
||||||
def script_tail(f: io.TextIOWrapper, s: ScriptSettings) -> None:
|
|
||||||
# leave build directory and report success
|
|
||||||
write_line(f, ':: Leave build directory and report')
|
|
||||||
write_line(f, 'CD ..\\..')
|
|
||||||
write_line(f, 'ECHO Windows CMake Build Done')
|
|
||||||
|
|
||||||
def create_directory(f: io.TextIOWrapper, s: ScriptSettings) -> None:
|
|
||||||
# create build directory
|
|
||||||
write_line(f, ':: Create internal build directory')
|
|
||||||
write_line(f, 'MKDIR Win32')
|
|
||||||
write_line(f, 'MKDIR x64')
|
|
||||||
write_line(f, 'MKDIR documentation')
|
|
||||||
# create install directory
|
|
||||||
write_line(f, ':: Create internal install directory')
|
|
||||||
write_line(f, 'MKDIR install')
|
|
||||||
write_line(f, 'CD install')
|
|
||||||
write_line(f, 'MKDIR Win32_Debug')
|
|
||||||
write_line(f, 'MKDIR Win32_Release')
|
|
||||||
write_line(f, 'MKDIR x64_Debug')
|
|
||||||
write_line(f, 'MKDIR x64_Release')
|
|
||||||
write_line(f, 'CD ..')
|
|
||||||
# create msvc install directory
|
|
||||||
write_line(f, ':: Create internal MSVC specific install directory')
|
|
||||||
write_line(f, 'MKDIR msvc_install')
|
|
||||||
write_line(f, 'CD msvc_install')
|
|
||||||
write_line(f, 'MKDIR bin')
|
|
||||||
write_line(f, 'MKDIR include')
|
|
||||||
write_line(f, 'MKDIR lib')
|
|
||||||
write_line(f, 'MKDIR share')
|
|
||||||
write_line(f, 'CD bin')
|
|
||||||
write_line(f, 'MKDIR Win32')
|
|
||||||
write_line(f, 'MKDIR x64')
|
|
||||||
write_line(f, 'CD ..')
|
|
||||||
write_line(f, 'CD lib')
|
|
||||||
write_line(f, 'MKDIR Win32\\Debug')
|
|
||||||
write_line(f, 'MKDIR Win32\\Release')
|
|
||||||
write_line(f, 'MKDIR x64\\Debug')
|
|
||||||
write_line(f, 'MKDIR x64\\Release')
|
|
||||||
write_line(f, 'CD ..')
|
|
||||||
write_line(f, 'CD ..')
|
|
||||||
# blank line
|
|
||||||
write_line(f, '')
|
|
||||||
|
|
||||||
def cmake_build(f: io.TextIOWrapper, s: ScriptSettings) -> None:
|
|
||||||
# build for Win32
|
|
||||||
write_line(f, ':: Build for Win32')
|
|
||||||
write_line(f, 'CD Win32')
|
|
||||||
write_line(f, f'cmake -G "Visual Studio 16 2019" -A Win32 -DCMAKE_CXX_STANDARD={s.m_CppVersion} -DYYCC_BUILD_TESTBENCH=ON ../../..')
|
|
||||||
write_line(f, 'cmake --build . --config Debug')
|
|
||||||
write_line(f, 'cmake --install . --prefix=../install/Win32_Debug --config Debug')
|
|
||||||
write_line(f, 'cmake --build . --config Release')
|
|
||||||
write_line(f, 'cmake --install . --prefix=../install/Win32_Release --config Release')
|
|
||||||
write_line(f, 'CD ..')
|
|
||||||
# build for x64
|
|
||||||
write_line(f, ':: Build for x64')
|
|
||||||
write_line(f, 'CD x64')
|
|
||||||
write_line(f, f'cmake -G "Visual Studio 16 2019" -A x64 -DCMAKE_CXX_STANDARD={s.m_CppVersion} -DYYCC_BUILD_TESTBENCH=ON ../../..')
|
|
||||||
write_line(f, 'cmake --build . --config Debug')
|
|
||||||
write_line(f, 'cmake --install . --prefix=../install/x64_Debug --config Debug')
|
|
||||||
write_line(f, 'cmake --build . --config Release')
|
|
||||||
write_line(f, 'cmake --install . --prefix=../install/x64_Release --config Release')
|
|
||||||
write_line(f, 'CD ..')
|
|
||||||
# build for documentation
|
|
||||||
if not s.m_NoDoc:
|
|
||||||
write_line(f, ':: Build for documentation')
|
|
||||||
write_line(f, 'CD documentation')
|
|
||||||
write_line(f, f'cmake -G "Visual Studio 16 2019" -A x64 -DCMAKE_CXX_STANDARD={s.m_CppVersion} -DYYCC_BUILD_DOC=ON ../../..')
|
|
||||||
write_line(f, 'cmake --build . --config Release')
|
|
||||||
write_line(f, 'cmake --build . --target YYCCDocumentation')
|
|
||||||
write_line(f, 'cmake --install . --prefix=../install/x64_Release --config Release')
|
|
||||||
write_line(f, 'CD ..')
|
|
||||||
# blank line
|
|
||||||
write_line(f, '')
|
|
||||||
|
|
||||||
def msvc_build(f: io.TextIOWrapper, s: ScriptSettings) -> None:
|
|
||||||
# copy include from x64_Release build
|
|
||||||
write_line(f, ':: Copy header files')
|
|
||||||
write_line(f, 'XCOPY install\\x64_Release\\include msvc_install\\include\\ /E /Y')
|
|
||||||
# copy binary testbench
|
|
||||||
write_line(f, ':: Copy binary files')
|
|
||||||
write_line(f, 'COPY install\\Win32_Release\\bin\\YYCCTestbench.exe msvc_install\\bin\\Win32\\YYCCTestbench.exe /Y')
|
|
||||||
write_line(f, 'COPY install\\x64_Release\\bin\\YYCCTestbench.exe msvc_install\\bin\\x64\\YYCCTestbench.exe /Y')
|
|
||||||
# copy static library
|
|
||||||
write_line(f, ':: Copy library files')
|
|
||||||
write_line(f, 'COPY install\\Win32_Debug\\lib\\YYCCommonplace.lib msvc_install\\lib\\Win32\\Debug\\YYCCommonplace.lib /Y')
|
|
||||||
write_line(f, 'COPY install\\Win32_Release\\lib\\YYCCommonplace.lib msvc_install\\lib\\Win32\\Release\\YYCCommonplace.lib /Y')
|
|
||||||
write_line(f, 'COPY install\\x64_Debug\\lib\\YYCCommonplace.lib msvc_install\\lib\\x64\\Debug\\YYCCommonplace.lib /Y')
|
|
||||||
write_line(f, 'COPY install\\x64_Release\\lib\\YYCCommonplace.lib msvc_install\\lib\\x64\\Release\\YYCCommonplace.lib /Y')
|
|
||||||
# Copy document from x64_Release build
|
|
||||||
if not s.m_NoDoc:
|
|
||||||
write_line(f, ':: Copy documentation files')
|
|
||||||
write_line(f, 'XCOPY install\\x64_Release\\share msvc_install\\share\\ /E /Y')
|
|
||||||
# blank line
|
|
||||||
write_line(f, '')
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
# parse argument
|
|
||||||
parser = argparse.ArgumentParser(
|
|
||||||
prog='YYCC Windows Build Script Generator',
|
|
||||||
description='YYCC Windows Build Script Generator'
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
'-c', '--cpp',
|
|
||||||
action='store', default='17', dest='cpp', type=validate_cpp_ver,
|
|
||||||
help='The version of C++ standard used when building.'
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
'-d', '--no-doc',
|
|
||||||
action='store_true', dest='no_doc',
|
|
||||||
help='Build YYCC without documentation.'
|
|
||||||
)
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
# build settings
|
|
||||||
settings = ScriptSettings(args.cpp, args.no_doc)
|
|
||||||
# write result
|
|
||||||
filepath = os.path.join(os.path.dirname(__file__), 'win_build.bat')
|
|
||||||
with open(filepath, 'w') as f:
|
|
||||||
write_line(f, '@ECHO OFF')
|
|
||||||
script_head(f, settings)
|
|
||||||
create_directory(f, settings)
|
|
||||||
cmake_build(f, settings)
|
|
||||||
msvc_build(f, settings)
|
|
||||||
script_tail(f, settings)
|
|
||||||
|
|
||||||
@@ -1,9 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
README_PATH=$(pwd)/README.md
|
# Navigate to project root directory
|
||||||
if [ ! -f "$README_PATH" ]; then
|
cd {{ repo_root_dir }}
|
||||||
echo "Error: You must run this script at the root folder of this project!"
|
|
||||||
exit
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Create main binary directory
|
# Create main binary directory
|
||||||
mkdir bin
|
mkdir bin
|
||||||
@@ -19,10 +16,10 @@ cd ..
|
|||||||
|
|
||||||
# Build current system debug and release version
|
# Build current system debug and release version
|
||||||
cd build
|
cd build
|
||||||
cmake -DCMAKE_BUILD_TYPE=Debug ../.. --fresh
|
cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_CXX_STANDARD={{ cpp_version }} {{ '-DCMAKE_POSITION_INDEPENDENT_CODE=True' if pic else '' }} ../.. --fresh
|
||||||
cmake --build .
|
cmake --build .
|
||||||
cmake --install . --prefix ../install/Debug
|
cmake --install . --prefix ../install/Debug
|
||||||
cmake -DCMAKE_BUILD_TYPE=Release -DYYCC_BUILD_TESTBENCH=ON ../.. --fresh
|
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_STANDARD={{ cpp_version }} {{ '-DCMAKE_POSITION_INDEPENDENT_CODE=True' if pic else '' }} -DYYCC_BUILD_TESTBENCH=ON ../.. --fresh
|
||||||
cmake --build .
|
cmake --build .
|
||||||
cmake --install . --prefix ../install/Release
|
cmake --install . --prefix ../install/Release
|
||||||
cd ..
|
cd ..
|
||||||
@@ -1,57 +0,0 @@
|
|||||||
@ECHO OFF
|
|
||||||
:: Check environment
|
|
||||||
SET README_PATH=%CD%\README.md
|
|
||||||
IF EXIST %README_PATH% (
|
|
||||||
REM DO NOTHING
|
|
||||||
) ELSE (
|
|
||||||
ECHO Error: You must run this script at the root folder of this project!
|
|
||||||
EXIT /b
|
|
||||||
)
|
|
||||||
|
|
||||||
:: Create main binary directory
|
|
||||||
MKDIR bin
|
|
||||||
CD bin
|
|
||||||
:: Create build folder
|
|
||||||
MKDIR Win32
|
|
||||||
MKDIR x64
|
|
||||||
MKDIR documentation
|
|
||||||
:: Create install folder
|
|
||||||
MKDIR install
|
|
||||||
CD install
|
|
||||||
MKDIR Win32_Debug
|
|
||||||
MKDIR Win32_Release
|
|
||||||
MKDIR x64_Debug
|
|
||||||
MKDIR x64_Release
|
|
||||||
CD ..
|
|
||||||
|
|
||||||
:: Build for Win32
|
|
||||||
CD Win32
|
|
||||||
cmake -G "Visual Studio 16 2019" -A Win32 -DYYCC_BUILD_TESTBENCH=ON ../..
|
|
||||||
cmake --build . --config Debug
|
|
||||||
cmake --install . --prefix=../install/Win32_Debug --config Debug
|
|
||||||
cmake --build . --config Release
|
|
||||||
cmake --install . --prefix=../install/Win32_Release --config Release
|
|
||||||
CD ..
|
|
||||||
|
|
||||||
:: Build for x64
|
|
||||||
CD x64
|
|
||||||
cmake -G "Visual Studio 16 2019" -A x64 -DYYCC_BUILD_TESTBENCH=ON ../..
|
|
||||||
cmake --build . --config Debug
|
|
||||||
cmake --install . --prefix=../install/x64_Debug --config Debug
|
|
||||||
cmake --build . --config Release
|
|
||||||
cmake --install . --prefix=../install/x64_Release --config Release
|
|
||||||
CD ..
|
|
||||||
|
|
||||||
:: Build for documentation
|
|
||||||
IF NOT "%1"=="NODOC" (
|
|
||||||
CD documentation
|
|
||||||
cmake -G "Visual Studio 16 2019" -A x64 -DYYCC_BUILD_DOC=ON ../..
|
|
||||||
cmake --build . --config Release
|
|
||||||
cmake --build . --target YYCCDocumentation
|
|
||||||
cmake --install . --prefix=../install/x64_Release --config Release
|
|
||||||
CD ..
|
|
||||||
)
|
|
||||||
|
|
||||||
:: Exit to original path
|
|
||||||
CD ..
|
|
||||||
ECHO Windows CMake Build Done
|
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
@ECHO OFF
|
||||||
|
:: Navigate to project root directory
|
||||||
|
CD /d {{ repo_root_dir }}
|
||||||
|
:: Create build directory and enter it
|
||||||
|
MKDIR bin
|
||||||
|
CD bin
|
||||||
|
MKDIR cpp{{ cpp_version }}
|
||||||
|
CD cpp{{ cpp_version }}
|
||||||
|
|
||||||
|
:: Create internal build directory
|
||||||
|
MKDIR Win32
|
||||||
|
MKDIR x64
|
||||||
|
MKDIR documentation
|
||||||
|
:: Create internal install directory
|
||||||
|
MKDIR install
|
||||||
|
CD install
|
||||||
|
MKDIR Win32_Debug
|
||||||
|
MKDIR Win32_Release
|
||||||
|
MKDIR x64_Debug
|
||||||
|
MKDIR x64_Release
|
||||||
|
CD ..
|
||||||
|
:: Create internal MSVC specific install directory
|
||||||
|
MKDIR msvc_install
|
||||||
|
CD msvc_install
|
||||||
|
MKDIR bin
|
||||||
|
MKDIR include
|
||||||
|
MKDIR lib
|
||||||
|
MKDIR share
|
||||||
|
CD bin
|
||||||
|
MKDIR Win32
|
||||||
|
MKDIR x64
|
||||||
|
CD ..
|
||||||
|
CD lib
|
||||||
|
MKDIR Win32\Debug
|
||||||
|
MKDIR Win32\Release
|
||||||
|
MKDIR x64\Debug
|
||||||
|
MKDIR x64\Release
|
||||||
|
CD ..
|
||||||
|
CD ..
|
||||||
|
|
||||||
|
:: Build for Win32
|
||||||
|
CD Win32
|
||||||
|
cmake -G "Visual Studio 16 2019" -A Win32 -DCMAKE_CXX_STANDARD={{ cpp_version }} -DYYCC_BUILD_TESTBENCH=ON ../../..
|
||||||
|
cmake --build . --config Debug
|
||||||
|
cmake --install . --prefix=../install/Win32_Debug --config Debug
|
||||||
|
cmake --build . --config Release
|
||||||
|
cmake --install . --prefix=../install/Win32_Release --config Release
|
||||||
|
CD ..
|
||||||
|
:: Build for x64
|
||||||
|
CD x64
|
||||||
|
cmake -G "Visual Studio 16 2019" -A x64 -DCMAKE_CXX_STANDARD={{ cpp_version }} -DYYCC_BUILD_TESTBENCH=ON ../../..
|
||||||
|
cmake --build . --config Debug
|
||||||
|
cmake --install . --prefix=../install/x64_Debug --config Debug
|
||||||
|
cmake --build . --config Release
|
||||||
|
cmake --install . --prefix=../install/x64_Release --config Release
|
||||||
|
CD ..
|
||||||
|
|
||||||
|
{% if build_doc %}
|
||||||
|
:: Build for documentation
|
||||||
|
CD documentation
|
||||||
|
'cmake -G "Visual Studio 16 2019" -A x64 -DCMAKE_CXX_STANDARD={{ cpp_version }} -DYYCC_BUILD_DOC=ON ../../..
|
||||||
|
cmake --build . --config Release
|
||||||
|
cmake --build . --target YYCCDocumentation
|
||||||
|
cmake --install . --prefix=../install/x64_Release --config Release
|
||||||
|
CD ..
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
:: Copy header files
|
||||||
|
XCOPY install\x64_Release\include msvc_install\include\ /E /Y
|
||||||
|
:: Copy binary files
|
||||||
|
COPY install\Win32_Release\bin\YYCCTestbench.exe msvc_install\bin\Win32\YYCCTestbench.exe /Y
|
||||||
|
COPY install\x64_Release\bin\YYCCTestbench.exe msvc_install\bin\x64\YYCCTestbench.exe /Y
|
||||||
|
:: Copy library files
|
||||||
|
COPY install\Win32_Debug\lib\YYCCommonplace.lib msvc_install\lib\Win32\Debug\YYCCommonplace.lib /Y
|
||||||
|
COPY install\Win32_Release\lib\YYCCommonplace.lib msvc_install\lib\Win32\Release\YYCCommonplace.lib /Y
|
||||||
|
COPY install\x64_Debug\lib\YYCCommonplace.lib msvc_install\lib\x64\Debug\YYCCommonplace.lib /Y
|
||||||
|
COPY install\x64_Release\lib\YYCCommonplace.lib msvc_install\lib\x64\Release\YYCCommonplace.lib /Y
|
||||||
|
{% if build_doc %}
|
||||||
|
:: Copy documentation files
|
||||||
|
XCOPY install\x64_Release\share msvc_install\share\ /E /Y
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
:: Leave build directory and report
|
||||||
|
CD ..\..
|
||||||
|
ECHO Windows CMake Build Done
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
@ECHO OFF
|
|
||||||
SET README_PATH=%CD%\README.md
|
|
||||||
IF EXIST %README_PATH% (
|
|
||||||
REM DO NOTHING
|
|
||||||
) ELSE (
|
|
||||||
ECHO Error: You must run this script at the root folder of this project!
|
|
||||||
EXIT /b
|
|
||||||
)
|
|
||||||
|
|
||||||
:: Enter main binary directory
|
|
||||||
CD bin
|
|
||||||
|
|
||||||
:: Create MSVC binary directory
|
|
||||||
MKDIR msvc_install
|
|
||||||
CD msvc_install
|
|
||||||
:: Create direcotries tree
|
|
||||||
MKDIR bin
|
|
||||||
MKDIR include
|
|
||||||
MKDIR lib
|
|
||||||
MKDIR share
|
|
||||||
CD bin
|
|
||||||
MKDIR Win32
|
|
||||||
MKDIR x64
|
|
||||||
CD ..
|
|
||||||
CD lib
|
|
||||||
MKDIR Win32\Debug
|
|
||||||
MKDIR Win32\Release
|
|
||||||
MKDIR x64\Debug
|
|
||||||
MKDIR x64\Release
|
|
||||||
CD ..
|
|
||||||
:: Exit MSVC binary directory
|
|
||||||
CD ..
|
|
||||||
|
|
||||||
:: Copy result
|
|
||||||
:: Copy include from x64_Release build
|
|
||||||
XCOPY install\x64_Release\include msvc_install\include\ /E /Y
|
|
||||||
:: Copy document from x64_Release build
|
|
||||||
IF NOT "%1"=="NODOC" (
|
|
||||||
XCOPY install\x64_Release\share msvc_install\share\ /E /Y
|
|
||||||
)
|
|
||||||
:: Copy binary testbench
|
|
||||||
COPY install\Win32_Release\bin\YYCCTestbench.exe msvc_install\bin\Win32\YYCCTestbench.exe /Y
|
|
||||||
COPY install\x64_Release\bin\YYCCTestbench.exe msvc_install\bin\x64\YYCCTestbench.exe /Y
|
|
||||||
:: Copy static library
|
|
||||||
COPY install\Win32_Debug\lib\YYCCommonplace.lib msvc_install\lib\Win32\Debug\YYCCommonplace.lib /Y
|
|
||||||
COPY install\Win32_Release\lib\YYCCommonplace.lib msvc_install\lib\Win32\Release\YYCCommonplace.lib /Y
|
|
||||||
COPY install\x64_Debug\lib\YYCCommonplace.lib msvc_install\lib\x64\Debug\YYCCommonplace.lib /Y
|
|
||||||
COPY install\x64_Release\lib\YYCCommonplace.lib msvc_install\lib\x64\Release\YYCCommonplace.lib /Y
|
|
||||||
|
|
||||||
:: Exit to original path
|
|
||||||
CD ..
|
|
||||||
ECHO Windows MSVC Build Done
|
|
||||||
+30
-29
@@ -4,17 +4,17 @@ add_library(YYCCommonplace STATIC "")
|
|||||||
target_sources(YYCCommonplace
|
target_sources(YYCCommonplace
|
||||||
PRIVATE
|
PRIVATE
|
||||||
# Sources
|
# Sources
|
||||||
COMHelper.cpp
|
YYCC/COMHelper.cpp
|
||||||
ArgParser.cpp
|
YYCC/ArgParser.cpp
|
||||||
ConfigManager.cpp
|
YYCC/ConfigManager.cpp
|
||||||
ConsoleHelper.cpp
|
YYCC/ConsoleHelper.cpp
|
||||||
DialogHelper.cpp
|
YYCC/DialogHelper.cpp
|
||||||
EncodingHelper.cpp
|
YYCC/EncodingHelper.cpp
|
||||||
ExceptionHelper.cpp
|
YYCC/ExceptionHelper.cpp
|
||||||
StdPatch.cpp
|
YYCC/StdPatch.cpp
|
||||||
IOHelper.cpp
|
YYCC/IOHelper.cpp
|
||||||
StringHelper.cpp
|
YYCC/StringHelper.cpp
|
||||||
WinFctHelper.cpp
|
YYCC/WinFctHelper.cpp
|
||||||
# Natvis (only for MSVC)
|
# Natvis (only for MSVC)
|
||||||
$<$<CXX_COMPILER_ID:MSVC>:YYCC.natvis>
|
$<$<CXX_COMPILER_ID:MSVC>:YYCC.natvis>
|
||||||
)
|
)
|
||||||
@@ -24,25 +24,26 @@ FILE_SET HEADERS
|
|||||||
FILES
|
FILES
|
||||||
# Headers
|
# Headers
|
||||||
# Common headers
|
# Common headers
|
||||||
Constraints.hpp
|
YYCC/Constraints.hpp
|
||||||
COMHelper.hpp
|
YYCC/COMHelper.hpp
|
||||||
ArgParser.hpp
|
YYCC/ArgParser.hpp
|
||||||
ConfigManager.hpp
|
YYCC/ConfigManager.hpp
|
||||||
ConsoleHelper.hpp
|
YYCC/ConsoleHelper.hpp
|
||||||
DialogHelper.hpp
|
YYCC/DialogHelper.hpp
|
||||||
EncodingHelper.hpp
|
YYCC/EncodingHelper.hpp
|
||||||
EnumHelper.hpp
|
YYCC/EnumHelper.hpp
|
||||||
ExceptionHelper.hpp
|
YYCC/ExceptionHelper.hpp
|
||||||
StdPatch.hpp
|
YYCC/StdPatch.hpp
|
||||||
IOHelper.hpp
|
YYCC/IOHelper.hpp
|
||||||
ParserHelper.hpp
|
YYCC/ParserHelper.hpp
|
||||||
StringHelper.hpp
|
YYCC/StringHelper.hpp
|
||||||
WinFctHelper.hpp
|
YYCC/WinFctHelper.hpp
|
||||||
# Windows including guard pair
|
# Windows including guard pair
|
||||||
WinImportPrefix.hpp
|
YYCC/WinImportPrefix.hpp
|
||||||
WinImportSuffix.hpp
|
YYCC/WinImportSuffix.hpp
|
||||||
# Misc
|
# Internal
|
||||||
YYCCInternal.hpp
|
YYCC/YYCCInternal.hpp
|
||||||
|
# Exposed
|
||||||
YYCCommonplace.hpp
|
YYCCommonplace.hpp
|
||||||
)
|
)
|
||||||
# Setup header infomations
|
# Setup header infomations
|
||||||
|
|||||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
@@ -1,5 +1,38 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#pragma region Library Version and Comparation Macros
|
||||||
|
|
||||||
|
#define YYCC_VER_MAJOR 1
|
||||||
|
#define YYCC_VER_MINOR 3
|
||||||
|
#define YYCC_VER_PATCH 0
|
||||||
|
|
||||||
|
/// @brief Return true if left version number is equal to right version number, otherwise false.
|
||||||
|
#define YYCC_VERCMP_E(av1, av2, av3, bv1, bv2, bv3) ((av1) == (bv1) && (av2) == (bv2) && (av3) == (bv3))
|
||||||
|
/// @brief Return true if left version number is not equal to right version number, otherwise false.
|
||||||
|
#define YYCC_VERCMP_NE(av1, av2, av3, bv1, bv2, bv3) (!YYCC_VERCMP_E(av1, av2, av3, bv1, bv2, bv3))
|
||||||
|
/// @brief Return true if left version number is greater than right version number, otherwise false.
|
||||||
|
#define YYCC_VERCMP_G(av1, av2, av3, bv1, bv2, bv3) ( \
|
||||||
|
((av1) > (bv1)) || \
|
||||||
|
((av1) == (bv1) && (av2) > (bv2)) || \
|
||||||
|
((av1) == (bv1) && (av2) == (bv2) && (av3) > (bv3)) \
|
||||||
|
)
|
||||||
|
/// @brief Return true if left version number is greater than or equal to right version number, otherwise false.
|
||||||
|
#define YYCC_VERCMP_GE(av1, av2, av3, bv1, bv2, bv3) (YYCC_VERCMP_G(av1, av2, av3, bv1, bv2, bv3) || YYCC_VERCMP_E(av1, av2, av3, bv1, bv2, bv3))
|
||||||
|
/// @brief Return true if left version number is not lower than right version number, otherwise false.
|
||||||
|
#define YYCC_VERCMP_NL(av1, av2, av3, bv1, bv2, bv3) YYCC_VERCMP_GE(av1, av2, av3, bv1, bv2, bv3)
|
||||||
|
/// @brief Return true if left version number is lower than right version number, otherwise false.
|
||||||
|
#define YYCC_VERCMP_L(av1, av2, av3, bv1, bv2, bv3) ( \
|
||||||
|
((av1) < (bv1)) || \
|
||||||
|
((av1) == (bv1) && (av2) < (bv2)) || \
|
||||||
|
((av1) == (bv1) && (av2) == (bv2) && (av3) < (bv3)) \
|
||||||
|
)
|
||||||
|
/// @brief Return true if left version number is lower than or equal to right version number, otherwise false.
|
||||||
|
#define YYCC_VERCMP_LE(av1, av2, av3, bv1, bv2, bv3) (YYCC_VERCMP_L(av1, av2, av3, bv1, bv2, bv3) || YYCC_VERCMP_E(av1, av2, av3, bv1, bv2, bv3))
|
||||||
|
/// @brief Return true if left version number is not greater than right version number, otherwise false.
|
||||||
|
#define YYCC_VERCMP_NG(av1, av2, av3, bv1, bv2, bv3) YYCC_VERCMP_LE(av1, av2, av3, bv1, bv2, bv3)
|
||||||
|
|
||||||
|
#pragma endregion
|
||||||
|
|
||||||
#pragma region Operating System Identifier Macros
|
#pragma region Operating System Identifier Macros
|
||||||
|
|
||||||
// Define operating system macros
|
// Define operating system macros
|
||||||
+14
-14
@@ -1,18 +1,18 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "YYCCInternal.hpp"
|
#include "YYCC/YYCCInternal.hpp"
|
||||||
|
|
||||||
#include "EncodingHelper.hpp"
|
#include "YYCC/EncodingHelper.hpp"
|
||||||
#include "StringHelper.hpp"
|
#include "YYCC/StringHelper.hpp"
|
||||||
#include "ConsoleHelper.hpp"
|
#include "YYCC/ConsoleHelper.hpp"
|
||||||
#include "COMHelper.hpp"
|
#include "YYCC/COMHelper.hpp"
|
||||||
#include "DialogHelper.hpp"
|
#include "YYCC/DialogHelper.hpp"
|
||||||
#include "ParserHelper.hpp"
|
#include "YYCC/ParserHelper.hpp"
|
||||||
#include "IOHelper.hpp"
|
#include "YYCC/IOHelper.hpp"
|
||||||
#include "WinFctHelper.hpp"
|
#include "YYCC/WinFctHelper.hpp"
|
||||||
#include "StdPatch.hpp"
|
#include "YYCC/StdPatch.hpp"
|
||||||
#include "EnumHelper.hpp"
|
#include "YYCC/EnumHelper.hpp"
|
||||||
#include "ExceptionHelper.hpp"
|
#include "YYCC/ExceptionHelper.hpp"
|
||||||
|
|
||||||
#include "ConfigManager.hpp"
|
#include "YYCC/ConfigManager.hpp"
|
||||||
#include "ArgParser.hpp"
|
#include "YYCC/ArgParser.hpp"
|
||||||
@@ -484,6 +484,17 @@ namespace YYCCTestbench {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void VersionMacroTestbench() {
|
||||||
|
Assert(YYCC_VERCMP_E(1, 2, 3, 1, 2, 3), YYCC_U8("YYCC_VERCMP_E"));
|
||||||
|
Assert(!YYCC_VERCMP_NE(1, 2, 3, 1, 2, 3), YYCC_U8("YYCC_VERCMP_NE"));
|
||||||
|
Assert(YYCC_VERCMP_G(1, 2, 3, 0, 2, 5), YYCC_U8("YYCC_VERCMP_G"));
|
||||||
|
Assert(YYCC_VERCMP_GE(1, 2, 3, 1, 2, 3), YYCC_U8("YYCC_VERCMP_GE"));
|
||||||
|
Assert(YYCC_VERCMP_NL(1, 2, 3, 1, 2, 3), YYCC_U8("YYCC_VERCMP_NL"));
|
||||||
|
Assert(YYCC_VERCMP_L(0, 2, 5, 1, 2, 3), YYCC_U8("YYCC_VERCMP_L"));
|
||||||
|
Assert(YYCC_VERCMP_LE(1, 2, 3, 1, 2, 3), YYCC_U8("YYCC_VERCMP_LE"));
|
||||||
|
Assert(YYCC_VERCMP_NG(1, 2, 3, 1, 2, 3), YYCC_U8("YYCC_VERCMP_NG"));
|
||||||
|
}
|
||||||
|
|
||||||
enum class TestEnum : int8_t {
|
enum class TestEnum : int8_t {
|
||||||
Test1, Test2, Test3
|
Test1, Test2, Test3
|
||||||
};
|
};
|
||||||
@@ -698,6 +709,12 @@ auto al = YYCC::ArgParser::ArgumentList::CreateFromStd(sizeof(test_argv) / sizeo
|
|||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char* argv[]) {
|
int main(int argc, char* argv[]) {
|
||||||
|
|
||||||
|
#if YYCC_VERCMP_NE(YYCC_VER_MAJOR, YYCC_VER_MINOR, YYCC_VER_PATCH, 1, 3 ,0)
|
||||||
|
#error "The YYCC library used when compiling is not match code expected, this may cause build error."
|
||||||
|
#error "If you trust it, please annotate these preprocessor statement, otherwise please contact developer."
|
||||||
|
#endif
|
||||||
|
|
||||||
// common testbench
|
// common testbench
|
||||||
// normal
|
// normal
|
||||||
YYCCTestbench::EncodingTestbench();
|
YYCCTestbench::EncodingTestbench();
|
||||||
@@ -706,6 +723,7 @@ int main(int argc, char* argv[]) {
|
|||||||
YYCCTestbench::WinFctTestbench();
|
YYCCTestbench::WinFctTestbench();
|
||||||
YYCCTestbench::StdPatchTestbench();
|
YYCCTestbench::StdPatchTestbench();
|
||||||
YYCCTestbench::EnumHelperTestbench();
|
YYCCTestbench::EnumHelperTestbench();
|
||||||
|
YYCCTestbench::VersionMacroTestbench();
|
||||||
// advanced
|
// advanced
|
||||||
YYCCTestbench::ConfigManagerTestbench();
|
YYCCTestbench::ConfigManagerTestbench();
|
||||||
YYCCTestbench::ArgParserTestbench(argc, argv);
|
YYCCTestbench::ArgParserTestbench(argc, argv);
|
||||||
|
|||||||
Reference in new issue
Block a user