From f1272c50d36496e5cc6e8cb0c63ad38b02774b78 Mon Sep 17 00:00:00 2001 From: IRBorisov <8611739+IRBorisov@users.noreply.github.com> Date: Wed, 17 Apr 2024 21:10:07 +0300 Subject: [PATCH] Setup Linux build for pyconcept and ConceptCoreLibrary --- .dockerignore | 27 ++++-- .gitignore | 1 + BuildAll.sh | 27 ++++++ Dockerfile | 11 +-- README.md | 9 +- TODO.txt | 2 + ccl/core/test/CMakeLists.txt | 1 + docker-compose.yml | 2 +- entrypoint.sh | 91 ------------------ pyconcept/CMakeLists.txt | 12 --- pyconcept/scripts/Build.sh | 32 +++--- pyconcept/setup.py | 4 +- ...С начальник-подчиненный.trs => Schema1.trs} | Bin pyconcept/tests/testBinding.py | 2 +- scripts/BuildSingle.ps1 | 2 +- 15 files changed, 84 insertions(+), 139 deletions(-) create mode 100644 BuildAll.sh create mode 100644 TODO.txt delete mode 100644 entrypoint.sh rename pyconcept/tests/data/{КС начальник-подчиненный.trs => Schema1.trs} (100%) diff --git a/.dockerignore b/.dockerignore index 88371da..f89928e 100644 --- a/.dockerignore +++ b/.dockerignore @@ -4,26 +4,35 @@ .github # Windows specific -*.ps1 +.vs +**/*.ps1 +**/*.vcxproj* +**/*.sln +**/packages.config # Local build/utility folders .vscode -.vs -*.vcxproj.user -*.pyc -*.pyd +**/*.pyc +**/*.pyd **/CMakeUserPresets.json output packages -**/build -**/venv +**/build/ +**/secrets/ +**/venv/ **/pyconcept/ccl -**/egg-info +**/*egg-info + + +# Docker +Dockerfile # Specific items docker-compose.yml rslang/src/RSParserImpl.output -rslang/src/RSParserImpl.gv \ No newline at end of file +rslang/src/RSParserImpl.gv +**/*.y +**/*.l \ No newline at end of file diff --git a/.gitignore b/.gitignore index 09a9b2c..58f7b81 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ *.pyc *.pyd +secrets packages build output diff --git a/BuildAll.sh b/BuildAll.sh new file mode 100644 index 0000000..1818159 --- /dev/null +++ b/BuildAll.sh @@ -0,0 +1,27 @@ +# +# Build script for linux distro +# +set -e # Exit immediately if a command exits with a non-zero status. +set -u # Treat unset variables as an error when substituting. + +export CMAKE_BUILD_TYPE="Release" + +# Choose between clang/clang++ or gcc/g++ +export CC="gcc" +export CXX="g++" + +# Build CCL +cd /home/ccl +conan profile detect --force +conan install . --build=missing +cmake --preset conan-release +cmake --build --preset conan-release +ctest --test-dir build/Release --output-on-failure +cmake --install build/Release --prefix /home/output + +# Build pyconcept +cd /home/pyconcept +sh scripts/Build.sh + +echo 'Done' +exit 0 diff --git a/Dockerfile b/Dockerfile index 5a79907..2ce1080 100644 --- a/Dockerfile +++ b/Dockerfile @@ -89,15 +89,10 @@ RUN apt-get autoclean -y && \ # ====================== END OF CPP-Python environment ================== FROM cpp-builder as CCL -ARG CMAKE_BUILD_TYPE="Release" -# Choose between clang/clang++ or gcc/g++ -ENV CC="gcc" -ENV CXX="g++" - -ENV BUILD_HOME=/home -WORKDIR $BUILD_HOME +WORKDIR /home COPY . /home -ENTRYPOINT ["sh", "/home/entrypoint.sh"] \ No newline at end of file +RUN sed -i 's/\r$//g' /home/BuildAll.sh && \ + chmod +x /home/BuildAll.sh diff --git a/README.md b/README.md index d571e66..9dbaa80 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ C++ library for manipulating concepts in formal language of advanced set theory ## 📦 Project build -- ccl + coredll + pyconcept - Dockerfile to setup Clang / GCC build for Ubuntu development. +- ccl + coredll + pyconcept - Dockerfile to setup Clang / GCC build for Ubuntu development (see BuildAll.sh). - ccl + coredll local dev - Visual Studio Solution for Windows development - 'CCL_full.sln'. - ccl - VS Code and ccl/CMakeLists.txt for other platforms. - pyconcept - python setup.py OR pyconcept/scripts @@ -20,6 +20,13 @@ After changing grammar / syntax you can rebuild lexers and parser using 'scripts - parser requires [Bison](https://www.gnu.org/software/bison/) installed - lexer requires [Re-flex](https://github.com/Genivia/RE-flex) +To run terminal after building docker container use command + +``` +docker run --rm -it --entrypoint /bin/bash concept-core-builder + +``` + ## 💝 Acknowledgements This project is based on multiple projects and works listed below. If you notice any problems with licensing or missing acknowledgements please inform repository maintainer. diff --git a/TODO.txt b/TODO.txt new file mode 100644 index 0000000..0731f79 --- /dev/null +++ b/TODO.txt @@ -0,0 +1,2 @@ +- wrap ConceptCoreLibrary in conan package for pyconcept consumption +- setup github actions to build and (maybe) publish pyconcept package \ No newline at end of file diff --git a/ccl/core/test/CMakeLists.txt b/ccl/core/test/CMakeLists.txt index 797d35f..1c0f0f1 100644 --- a/ccl/core/test/CMakeLists.txt +++ b/ccl/core/test/CMakeLists.txt @@ -29,5 +29,6 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") ) endif() +enable_testing() include(GoogleTest) gtest_discover_tests(ccl_Tests) \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 6c29c61..3c24308 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,4 +11,4 @@ services: context: ./ volumes: - concept_volume:/home/output - command: sh /home/entrypoint.sh + command: /bin/sh BuildAll.sh diff --git a/entrypoint.sh b/entrypoint.sh deleted file mode 100644 index 818725e..0000000 --- a/entrypoint.sh +++ /dev/null @@ -1,91 +0,0 @@ -# -# Build script for linux distro -# -set -e # Exit immediately if a command exits with a non-zero status. -set -u # Treat unset variables as an error when substituting. - -# Set-Location $PSScriptRoot - -# & conan profile detect --force -# & conan install . - -# & cmake --preset conan-default -# # & cmake --preset conan-default -DCC_BuildTests=False -# & cmake --build --preset conan-release -# & ctest --test-dir build --output-on-failure -# & cmake --install build --prefix ../output - -echo 'Done' -exit 0 - - - -# packageName='pyconcept' -# output='../../output/py' -# pythonEnv='venv/bin/python3' - -# python3.12 -m venv venv -# $pythonEnv -m pip install -r requirements-build.txt - -# mkdir -p import -# cp -r ../../output/include import/ -# cp -r ../../output/lib import/ - -# $pythonEnv -m build --no-isolation --wheel --outdir=$output/$packageName - -# wheel=$(find $output/$packageName -name '*.whl') - -# $pythonEnv -m pip uninstall -y $packageName -# $pythonEnv -m pip install $wheel -# $pythonEnv -m unittest - -# rm -rf venv - - - - -# COPY cclCommons /home/cclCommons -# WORKDIR /home/cclCommons/build -# RUN cmake ../ && \ -# cmake --build . && \ -# ctest --output-on-failure && \ -# cmake --install . --prefix /home/output -# WORKDIR /home - -# COPY rslang /home/rslang -# WORKDIR /home/rslang/build -# RUN cmake ../ && \ -# cmake --build . && \ -# ctest --output-on-failure && \ -# cmake --install . --prefix /home/output -# WORKDIR /home - -# COPY cclLang /home/cclLang -# WORKDIR /home/cclLang/build -# RUN cmake ../ && \ -# cmake --build . && \ -# ctest --output-on-failure && \ -# cmake --install . --prefix /home/output -# WORKDIR /home - -# COPY cclGraph /home/cclGraph -# WORKDIR /home/cclGraph/build -# RUN cmake ../ && \ -# cmake --build . && \ -# ctest --output-on-failure && \ -# cmake --install . --prefix /home/output -# WORKDIR /home - -# COPY core /home/core -# WORKDIR /home/core/build -# RUN cmake ../ && \ -# cmake --build . && \ -# ctest --output-on-failure && \ -# cmake --install . --prefix /home/output -# WORKDIR /home - -# # Build python library -# COPY examples/pyconcept /home/examples/pyconcept -# WORKDIR /home/examples/pyconcept -# RUN script/Build.sh -# WORKDIR /home diff --git a/pyconcept/CMakeLists.txt b/pyconcept/CMakeLists.txt index 1918ab6..5521c3b 100644 --- a/pyconcept/CMakeLists.txt +++ b/pyconcept/CMakeLists.txt @@ -26,18 +26,6 @@ find_package(pybind11 REQUIRED) ## Project Setup ## pybind11_add_module(pyconcept MODULE src/pyconcept.cpp) -# add_library(pyconcept) - -# set_target_properties(pyconcept PROPERTIES -# OUTPUT_NAME pyconcept -# DEBUG_POSTFIX d -# POSITION_INDEPENDENT_CODE ON -# ) - -# target_sources(pyconcept -# PRIVATE -# src/pyconcept.cpp -# ) target_include_directories(pyconcept PUBLIC diff --git a/pyconcept/scripts/Build.sh b/pyconcept/scripts/Build.sh index a8eb034..b452d62 100644 --- a/pyconcept/scripts/Build.sh +++ b/pyconcept/scripts/Build.sh @@ -1,25 +1,31 @@ -# Build script for linux distro -set -e +# Build script for Linux +set -e packageName='pyconcept' -output='../../output/py' +output='../output/py' pythonEnv='venv/bin/python3' +# Setup python env python3.12 -m venv venv -$pythonEnv -m pip install -r requirements-build.txt +${pythonEnv} -m pip install -r requirements-build.txt -mkdir -p import -cp -r ../../output/include import/ -cp -r ../../output/lib import/ +# Import sources from ccl +mkdir -p ccl +cd ../ccl +cp -r `ls -A | grep -v 'build'` "../pyconcept/ccl" +cd ../pyconcept -$pythonEnv -m build --no-isolation --wheel --outdir=$output/$packageName +# Build pyconcept +${pythonEnv} -m build --no-isolation --wheel --outdir=${output}/${packageName} -wheel=$(find $output/$packageName -name '*.whl') +wheel=$(find ${output}/${packageName} -name '*.whl') -$pythonEnv -m pip uninstall -y $packageName -$pythonEnv -m pip install $wheel -$pythonEnv -m unittest +# Test pyconcept +${pythonEnv} -m pip uninstall -y ${packageName} +${pythonEnv} -m pip install ${wheel} +${pythonEnv} -m unittest -rm -rf venv +# rm -rf venv +# rm -rf build exit 0 \ No newline at end of file diff --git a/pyconcept/setup.py b/pyconcept/setup.py index c5853f2..74ef948 100644 --- a/pyconcept/setup.py +++ b/pyconcept/setup.py @@ -36,7 +36,7 @@ class CMakeBuild(build_ext): build_type = 'Debug' if debug_flag else 'Release' cmake_generator = os.environ.get('CMAKE_GENERATOR', '') cmake_args = [ - '--preset conan-default', + '--preset conan-release' if self.compiler.compiler_type != 'msvc' else '--preset conan-default', f"-DCMAKE_LIBRARY_OUTPUT_DIRECTORY={output_folder}{os.sep}", f"-DCMAKE_BUILD_TYPE={build_type}" ] @@ -81,7 +81,7 @@ class CMakeBuild(build_ext): build_args += [f"-j{self.parallel}"] subprocess.run(['conan', 'profile', 'detect', '--force'], check=True) - subprocess.run(['conan', 'install', '.'], check=True) + subprocess.run(['conan', 'install', '.', '--build=missing'], check=True) subprocess.run(['cmake', target.source_dir, *cmake_args], check=True) subprocess.run(['cmake', '--build', '.', *build_args], check=True) diff --git a/pyconcept/tests/data/КС начальник-подчиненный.trs b/pyconcept/tests/data/Schema1.trs similarity index 100% rename from pyconcept/tests/data/КС начальник-подчиненный.trs rename to pyconcept/tests/data/Schema1.trs diff --git a/pyconcept/tests/testBinding.py b/pyconcept/tests/testBinding.py index 228be3e..a886b54 100644 --- a/pyconcept/tests/testBinding.py +++ b/pyconcept/tests/testBinding.py @@ -64,7 +64,7 @@ class TestBinding(unittest.TestCase): self.assertEqual(fixedSchema['items'][1]['alias'], 'S1') def _get_default_schema(self) -> str: - file_path = os.getcwd() + r'/tests/data/КС начальник-подчиненный.trs' + file_path = os.getcwd() + r'/tests/data/Schema1.trs' return _read_trs(file_path) diff --git a/scripts/BuildSingle.ps1 b/scripts/BuildSingle.ps1 index a9499d4..4363a21 100644 --- a/scripts/BuildSingle.ps1 +++ b/scripts/BuildSingle.ps1 @@ -3,7 +3,7 @@ Set-Location $PSScriptRoot & conan profile detect --force -& conan install . +& conan install . --build=missing & cmake --preset conan-default # & cmake --preset conan-default -DCC_BuildTests=False