[buildcore] Add ability to setup host specific build directories

This commit is contained in:
Gary Talent 2022-11-23 00:04:42 -06:00
parent 52efae287b
commit 94c663ff77
3 changed files with 55 additions and 29 deletions

View File

@ -36,8 +36,16 @@ SCRIPTS=${BUILDCORE_PATH}/scripts
SETUP_BUILD=${PYTHON3} ${SCRIPTS}/setup-build.py SETUP_BUILD=${PYTHON3} ${SCRIPTS}/setup-build.py
PYBB=${PYTHON3} ${SCRIPTS}/pybb.py PYBB=${PYTHON3} ${SCRIPTS}/pybb.py
CMAKE_BUILD=${PYBB} cmake-build CMAKE_BUILD=${PYBB} cmake-build
GET_ENV=${PYBB} getenv
CTEST=${PYBB} ctest-all CTEST=${PYBB} ctest-all
RM_RF=${PYBB} rm RM_RF=${PYBB} rm
HOST=$(shell ${PYBB} hostname)
BUILDCORE_HOST_SPECIFIC_BUILDPATH=$(shell ${GET_ENV} BUILDCORE_HOST_SPECIFIC_BUILDPATH)
ifneq (${BUILDCORE_HOST_SPECIFIC_BUILDPATH},)
BUILD_PATH=build/${HOST}
else
BUILD_PATH=build
endif
ifdef USE_VCPKG ifdef USE_VCPKG
ifndef VCPKG_DIR_BASE ifndef VCPKG_DIR_BASE
VCPKG_DIR_BASE=.vcpkg VCPKG_DIR_BASE=.vcpkg
@ -58,27 +66,28 @@ CURRENT_BUILD=$(HOST_ENV)-$(shell ${ENV_RUN} ${PYBB} cat .current_build)
.PHONY: build .PHONY: build
build: build:
${ENV_RUN} ${CMAKE_BUILD} build ${ENV_RUN} ${CMAKE_BUILD} ${BUILD_PATH}
.PHONY: install .PHONY: install
install: install:
${ENV_RUN} ${CMAKE_BUILD} build install ${ENV_RUN} ${CMAKE_BUILD} ${BUILD_PATH} install
.PHONY: clean .PHONY: clean
clean: clean:
${ENV_RUN} ${CMAKE_BUILD} build clean ${ENV_RUN} ${CMAKE_BUILD} ${BUILD_PATH} clean
.PHONY: purge .PHONY: purge
purge: purge:
${ENV_RUN} ${RM_RF} .current_build ${ENV_RUN} ${RM_RF} .current_build
${ENV_RUN} ${RM_RF} build ${ENV_RUN} ${RM_RF} ${BUILD_PATH}
${ENV_RUN} ${RM_RF} dist ${ENV_RUN} ${RM_RF} dist
.PHONY: test .PHONY: test
test: build test: build
${ENV_RUN} ${CMAKE_BUILD} build test ${ENV_RUN} mypy ${SCRIPTS}
${ENV_RUN} ${CMAKE_BUILD} ${BUILD_PATH} test
.PHONY: test-verbose .PHONY: test-verbose
test-verbose: build test-verbose: build
${ENV_RUN} ${CTEST} build --output-on-failure ${ENV_RUN} ${CTEST} ${BUILD_PATH} --output-on-failure
.PHONY: test-rerun-verbose .PHONY: test-rerun-verbose
test-rerun-verbose: build test-rerun-verbose: build
${ENV_RUN} ${CTEST} build --rerun-failed --output-on-failure ${ENV_RUN} ${CTEST} ${BUILD_PATH} --rerun-failed --output-on-failure
.PHONY: devenv-image .PHONY: devenv-image
devenv-image: devenv-image:
@ -148,17 +157,17 @@ endif # USE_VCPKG ###############################################
.PHONY: configure-xcode .PHONY: configure-xcode
configure-xcode: configure-xcode:
${ENV_RUN} ${SETUP_BUILD} ${VCPKG_TOOLCHAIN} --build_tool=xcode --current_build=0 ${ENV_RUN} ${SETUP_BUILD} ${VCPKG_TOOLCHAIN} --build_tool=xcode --current_build=0 --build_root=${BUILD_PATH}
.PHONY: configure-release .PHONY: configure-release
configure-release: configure-release:
${ENV_RUN} ${SETUP_BUILD} ${VCPKG_TOOLCHAIN} --build_type=release ${ENV_RUN} ${SETUP_BUILD} ${VCPKG_TOOLCHAIN} --build_type=release --build_root=${BUILD_PATH}
.PHONY: configure-debug .PHONY: configure-debug
configure-debug: configure-debug:
${ENV_RUN} ${SETUP_BUILD} ${VCPKG_TOOLCHAIN} --build_type=debug ${ENV_RUN} ${SETUP_BUILD} ${VCPKG_TOOLCHAIN} --build_type=debug --build_root=${BUILD_PATH}
.PHONY: configure-asan .PHONY: configure-asan
configure-asan: configure-asan:
${ENV_RUN} ${SETUP_BUILD} ${VCPKG_TOOLCHAIN} --build_type=asan ${ENV_RUN} ${SETUP_BUILD} ${VCPKG_TOOLCHAIN} --build_type=asan --build_root=${BUILD_PATH}

View File

@ -12,25 +12,13 @@
# don't translate well to that other operating system # don't translate well to that other operating system
import os import os
import platform
import shutil import shutil
import subprocess import subprocess
import sys import sys
from typing import List, Optional from typing import List, Optional
def cat(paths: List[str]) -> int:
for path in paths:
try:
with open(path) as f:
data = f.read()
sys.stdout.write(data)
except FileNotFoundError:
sys.stderr.write('cat: {}: no such file or directory\n'.format(path))
return 1
sys.stdout.write('\n')
return 0
def mkdir(path: str): def mkdir(path: str):
if not os.path.exists(path): if not os.path.exists(path):
os.mkdir(path) os.mkdir(path)
@ -91,6 +79,31 @@ def conan() -> int:
return 0 return 0
def cat(paths: List[str]) -> int:
for path in paths:
try:
with open(path) as f:
data = f.read()
sys.stdout.write(data)
except FileNotFoundError:
sys.stderr.write('cat: {}: no such file or directory\n'.format(path))
return 1
sys.stdout.write('\n')
return 0
def get_env(var_name: str) -> int:
if var_name not in os.environ:
return 1
sys.stdout.write(os.environ[var_name])
return 0
def hostname() -> int:
sys.stdout.write(platform.node())
return 0
def main() -> int: def main() -> int:
err = 0 err = 0
if sys.argv[1] == 'mkdir': if sys.argv[1] == 'mkdir':
@ -109,6 +122,10 @@ def main() -> int:
err = cmake_build(sys.argv[2], sys.argv[3] if len(sys.argv) > 3 else None) err = cmake_build(sys.argv[2], sys.argv[3] if len(sys.argv) > 3 else None)
elif sys.argv[1] == 'cat': elif sys.argv[1] == 'cat':
err = cat(sys.argv[2:]) err = cat(sys.argv[2:])
elif sys.argv[1] == 'getenv':
err = get_env(sys.argv[2])
elif sys.argv[1] == 'hostname':
err = hostname()
else: else:
sys.stderr.write('Command not found\n') sys.stderr.write('Command not found\n')
err = 1 err = 1
@ -117,7 +134,6 @@ def main() -> int:
if __name__ == '__main__': if __name__ == '__main__':
try: try:
err = main() sys.exit(main())
sys.exit(err)
except KeyboardInterrupt: except KeyboardInterrupt:
sys.exit(err) sys.exit(1)

View File

@ -24,6 +24,7 @@ def main() -> int:
default='{:s}-{:s}'.format(sys.platform, platform.machine())) default='{:s}-{:s}'.format(sys.platform, platform.machine()))
parser.add_argument('--build_type', help='Build type (asan,debug,release)', default='release') parser.add_argument('--build_type', help='Build type (asan,debug,release)', default='release')
parser.add_argument('--build_tool', help='Build tool (default,xcode)', default='') parser.add_argument('--build_tool', help='Build tool (default,xcode)', default='')
parser.add_argument('--build_root', help='Path to the root of build directories (must be in project dir)', default='build')
parser.add_argument('--toolchain', help='Path to CMake toolchain file', default='') parser.add_argument('--toolchain', help='Path to CMake toolchain file', default='')
parser.add_argument('--current_build', help='Indicates whether or not to make this the active build', default=1) parser.add_argument('--current_build', help='Indicates whether or not to make this the active build', default=1)
args = parser.parse_args() args = parser.parse_args()
@ -63,7 +64,7 @@ def main() -> int:
return 1 return 1
project_dir = os.getcwd() project_dir = os.getcwd()
build_dir = '{:s}/build/{:s}'.format(project_dir, build_config) build_dir = '{:s}/{:s}/{:s}'.format(project_dir, args.build_root, build_config)
rm(build_dir) rm(build_dir)
cmake_cmd = [ cmake_cmd = [
'cmake', '-S', project_dir, '-B', build_dir, build_tool, 'cmake', '-S', project_dir, '-B', build_dir, build_tool,
@ -89,7 +90,7 @@ def main() -> int:
rm('compile_commands.json') rm('compile_commands.json')
if platform.system() != 'Windows': if platform.system() != 'Windows':
os.symlink('build/{:s}/compile_commands.json'.format(build_config), 'compile_commands.json') os.symlink('{:s}/compile_commands.json'.format(build_dir), 'compile_commands.json')
return 0 return 0