From 71471a0416fa31492c8831194f8dc8d975195ff4 Mon Sep 17 00:00:00 2001 From: Akos Kiss Date: Mon, 4 Jun 2018 03:55:29 +0200 Subject: [PATCH] Add better support for proper installation after build (#2370) - Add `--install` option to `tools/build.py`. - Make use of `--install` in `tools/run-tests.py` by testing the installed the executables instead of those in the build tree. Related changes: - Collect unit test binaries in the `tests` subdir of the build tree instead of `bin`. - The `ls`-based collection of the unit test binaries had some shortcomings hitherto unrevealed (it didn't filter for files so it could potentially "collect" dictionaries, too), which has now been replaced with a more stable `find`-based solution. JerryScript-DCO-1.0-Signed-off-by: Akos Kiss akiss@inf.u-szeged.hu --- CMakeLists.txt | 17 ++++++----------- tests/unit-core/CMakeLists.txt | 4 ++-- tests/unit-doc/CMakeLists.txt | 1 + tests/unit-ext/CMakeLists.txt | 4 ++-- tests/unit-ext/module/CMakeLists.txt | 1 + tests/unit-libm/CMakeLists.txt | 4 ++-- tools/build.py | 25 ++++++++++++++++++++----- tools/run-tests.py | 7 +++++-- tools/runners/run-unittests.sh | 4 ++-- 9 files changed, 41 insertions(+), 26 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cbf339e25..c8ed2073e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -131,17 +131,12 @@ message(STATUS "DOCTESTS " ${DOCTESTS}) message(STATUS "FEATURE_INIT_FINI " ${FEATURE_INIT_FINI}) # Setup directories -# Project binary dir -set(PROJECT_BINARY_DIR "${CMAKE_BINARY_DIR}") - -# Library output directory -set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib/") - -# Executable output directory -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/bin/") - -# Archive targets output Directory -set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/lib/") +# Note: This mimics a conventional file system layout in the build directory for +# the sake of convenient location of build artefacts. Proper installation to +# traditional locations is also supported, e.g., to /usr/local. +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin/") +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib/") +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/lib/") # Remove rdynamic option set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS ) diff --git a/tests/unit-core/CMakeLists.txt b/tests/unit-core/CMakeLists.txt index dbd9a2594..6723f0353 100644 --- a/tests/unit-core/CMakeLists.txt +++ b/tests/unit-core/CMakeLists.txt @@ -34,8 +34,8 @@ foreach(SOURCE_UNIT_TEST_MAIN ${SOURCE_UNIT_TEST_MAIN_MODULES}) set(TARGET_NAME unit-${TARGET_NAME}) add_executable(${TARGET_NAME} ${SOURCE_UNIT_TEST_MAIN}) - set_property(TARGET ${TARGET_NAME} - PROPERTY LINK_FLAGS "${LINKER_FLAGS_COMMON}") + set_property(TARGET ${TARGET_NAME} PROPERTY LINK_FLAGS "${LINKER_FLAGS_COMMON}") + set_property(TARGET ${TARGET_NAME} PROPERTY RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/tests") target_link_libraries(${TARGET_NAME} jerry-core jerry-port-default-minimal) diff --git a/tests/unit-doc/CMakeLists.txt b/tests/unit-doc/CMakeLists.txt index 3476e0066..6bcb335c3 100644 --- a/tests/unit-doc/CMakeLists.txt +++ b/tests/unit-doc/CMakeLists.txt @@ -82,6 +82,7 @@ macro(doctest_add_executables NAME_PREFIX) add_dependencies(${TARGET_NAME} all-doc-files) set_property(TARGET ${TARGET_NAME} APPEND_STRING PROPERTY COMPILE_FLAGS "${COMPILE_FLAGS_DOCTEST}") set_property(TARGET ${TARGET_NAME} PROPERTY LINK_FLAGS "${LINKER_FLAGS_COMMON}") + set_property(TARGET ${TARGET_NAME} PROPERTY RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/tests") target_link_libraries(${TARGET_NAME} jerry-ext jerry-core jerry-port-default-minimal) endforeach() endmacro() diff --git a/tests/unit-ext/CMakeLists.txt b/tests/unit-ext/CMakeLists.txt index e7e95d7ab..bb211ac7e 100644 --- a/tests/unit-ext/CMakeLists.txt +++ b/tests/unit-ext/CMakeLists.txt @@ -28,8 +28,8 @@ foreach(SOURCE_UNIT_TEST_EXT ${SOURCE_UNIT_TEST_EXT_MODULES}) set(TARGET_NAME unit-${TARGET_NAME}) add_executable(${TARGET_NAME} ${SOURCE_UNIT_TEST_EXT}) - set_property(TARGET ${TARGET_NAME} - PROPERTY LINK_FLAGS "${LINKER_FLAGS_COMMON}") + set_property(TARGET ${TARGET_NAME} PROPERTY LINK_FLAGS "${LINKER_FLAGS_COMMON}") + set_property(TARGET ${TARGET_NAME} PROPERTY RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/tests") target_link_libraries(${TARGET_NAME} jerry-ext jerry-core jerry-port-default-minimal) diff --git a/tests/unit-ext/module/CMakeLists.txt b/tests/unit-ext/module/CMakeLists.txt index 7aa1bf3b7..038df68f2 100644 --- a/tests/unit-ext/module/CMakeLists.txt +++ b/tests/unit-ext/module/CMakeLists.txt @@ -24,5 +24,6 @@ endif() add_executable(${JERRYX_MODULE_UNITTEST_NAME} ${JERRYX_MODULE_UNIT_TEST_SOURCES}) set_property(TARGET ${JERRYX_MODULE_UNITTEST_NAME} PROPERTY LINK_FLAGS "${LINKER_FLAGS_COMMON}") +set_property(TARGET ${JERRYX_MODULE_UNITTEST_NAME} PROPERTY RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/tests") target_link_libraries(${JERRYX_MODULE_UNITTEST_NAME} jerry-ext jerry-core jerry-port-default-minimal) target_include_directories(${JERRYX_MODULE_UNITTEST_NAME} PRIVATE ${INCLUDE_UNIT_EXT}) diff --git a/tests/unit-libm/CMakeLists.txt b/tests/unit-libm/CMakeLists.txt index 83a8b256b..c96696b72 100644 --- a/tests/unit-libm/CMakeLists.txt +++ b/tests/unit-libm/CMakeLists.txt @@ -26,8 +26,8 @@ foreach(SOURCE_UNIT_TEST_MAIN ${SOURCE_UNIT_TEST_MAIN_MODULES}) set(TARGET_NAME unit-${TARGET_NAME}) add_executable(${TARGET_NAME} ${SOURCE_UNIT_TEST_MAIN}) - set_property(TARGET ${TARGET_NAME} - PROPERTY LINK_FLAGS "${LINKER_FLAGS_COMMON}") + set_property(TARGET ${TARGET_NAME} PROPERTY LINK_FLAGS "${LINKER_FLAGS_COMMON}") + set_property(TARGET ${TARGET_NAME} PROPERTY RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/tests") target_link_libraries(${TARGET_NAME} jerry-libm) if(JERRY_LIBC) diff --git a/tools/build.py b/tools/build.py index 0d32e579e..5cb15f89e 100755 --- a/tools/build.py +++ b/tools/build.py @@ -68,6 +68,8 @@ def get_arguments(): help='enable error messages (%(choices)s; default: %(default)s)') parser.add_argument('--external-context', metavar='X', choices=['ON', 'OFF'], default='OFF', type=str.upper, help='enable external context (%(choices)s; default: %(default)s)') + parser.add_argument('--install', metavar='DIR', nargs='?', default=None, const=False, + help='install after build (default: don\'t install; default directory if install: OS-specific)') parser.add_argument('-j', '--jobs', metavar='N', action='store', type=int, default=multiprocessing.cpu_count() + 1, help='Allowed N build jobs at once (default: %(default)s)') parser.add_argument('--jerry-cmdline', metavar='X', choices=['ON', 'OFF'], default='ON', type=str.upper, @@ -206,18 +208,27 @@ def configure_output_dir(arguments): if not os.path.exists(arguments.builddir): os.makedirs(arguments.builddir) -def configure_build(arguments): +def configure_jerry(arguments): configure_output_dir(arguments) build_options = generate_build_options(arguments) cmake_cmd = ['cmake', '-B' + arguments.builddir, '-H' + settings.PROJECT_DIR] + + if arguments.install: + cmake_cmd.append('-DCMAKE_INSTALL_PREFIX=%s' % arguments.install) + cmake_cmd.extend(build_options) return subprocess.call(cmake_cmd) -def build_jerry(arguments): - return subprocess.call(['make', '--no-print-directory', '-j', str(arguments.jobs), '-C', arguments.builddir]) +def make_jerry(arguments, target=None): + make_cmd = ['make', '--no-print-directory', '-j', str(arguments.jobs), '-C', arguments.builddir] + + if target: + make_cmd.append(target) + + return subprocess.call(make_cmd) def print_result(ret): print('=' * 30) @@ -229,10 +240,14 @@ def print_result(ret): def main(): arguments = get_arguments() - ret = configure_build(arguments) + + ret = configure_jerry(arguments) if not ret: - ret = build_jerry(arguments) + ret = make_jerry(arguments) + + if not ret and arguments.install is not None: + ret = make_jerry(arguments, 'install') print_result(ret) sys.exit(ret) diff --git a/tools/run-tests.py b/tools/run-tests.py index 930d72956..21d78d073 100755 --- a/tools/run-tests.py +++ b/tools/run-tests.py @@ -206,6 +206,9 @@ def create_binary(job, options): build_dir_path = os.path.join(options.outdir, job.name) build_cmd.append('--builddir=%s' % build_dir_path) + install_dir_path = os.path.join(build_dir_path, 'local') + build_cmd.append('--install=%s' % install_dir_path) + if options.toolchain: build_cmd.append('--toolchain=%s' % options.toolchain) @@ -227,7 +230,7 @@ def create_binary(job, options): return ret, build_dir_path def get_binary_path(build_dir_path): - return os.path.join(build_dir_path, 'bin', 'jerry') + return os.path.join(build_dir_path, 'local', 'bin', 'jerry') def hash_binary(bin_path): blocksize = 65536 @@ -388,7 +391,7 @@ def run_unittests(options): ret_test |= run_check([ settings.UNITTEST_RUNNER_SCRIPT, - os.path.join(build_dir_path, 'bin'), + os.path.join(build_dir_path, 'tests'), "-q" if options.quiet else "", ]) diff --git a/tools/runners/run-unittests.sh b/tools/runners/run-unittests.sh index 837ce12be..536ef453b 100755 --- a/tools/runners/run-unittests.sh +++ b/tools/runners/run-unittests.sh @@ -29,8 +29,8 @@ UNITTEST_OK=$DIR/unittests.passed rm -f $UNITTEST_ERROR $UNITTEST_OK -UNITTESTS=$(ls $DIR/unit-*) -total=$(ls $DIR/unit-* | wc -l) +UNITTESTS=$(find $DIR -maxdepth 1 -type f -name 'unit-*') +total=$(find $DIR -maxdepth 1 -type f -name 'unit-*' | wc -l) if [ "$total" -eq 0 ] then