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:
parent
2206825223
commit
0cd9582757
1
script/.gitignore
vendored
1
script/.gitignore
vendored
@ -1,2 +1,3 @@
|
|||||||
# -------------------- Output --------------------
|
# -------------------- Output --------------------
|
||||||
win_build.bat
|
win_build.bat
|
||||||
|
linux_build.sh
|
||||||
|
108
script/gen_build_script.py
Normal file
108
script/gen_build_script.py
Normal file
@ -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
|
|
85
script/win_build.template.bat
Normal file
85
script/win_build.template.bat
Normal file
@ -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
|
|
@ -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
|
||||||
|
@ -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
|
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user