From 843718b4a324daff335bff3705a6f9163b64d527 Mon Sep 17 00:00:00 2001 From: IRBorisov <8611739+IRBorisov@users.noreply.github.com> Date: Wed, 17 Apr 2024 00:11:47 +0300 Subject: [PATCH] Setup pyconcept build with CMake --- .dockerignore | 2 +- .gitignore | 2 +- .vscode/settings.json | 25 ++++++++++++++------- pyconcept/CMakeLists.txt | 8 +++---- pyconcept/MANIFEST.in | 3 +-- pyconcept/scripts/Build.ps1 | 36 ++++++++++++++++++++----------- pyconcept/scripts/BuildSingle.ps1 | 11 ---------- pyconcept/setup.py | 18 +++++++--------- 8 files changed, 54 insertions(+), 51 deletions(-) delete mode 100644 pyconcept/scripts/BuildSingle.ps1 diff --git a/.dockerignore b/.dockerignore index 9f280b7..88371da 100644 --- a/.dockerignore +++ b/.dockerignore @@ -19,7 +19,7 @@ output packages **/build **/venv -**/pyconcept/import +**/pyconcept/ccl **/egg-info diff --git a/.gitignore b/.gitignore index 4df4cc1..09a9b2c 100644 --- a/.gitignore +++ b/.gitignore @@ -11,7 +11,7 @@ build output venv/ CMakeUserPresets.json -pyconcept/import/ +pyconcept/ccl/ *egg-info ccl/rslang/src/RSParserImpl.output diff --git a/.vscode/settings.json b/.vscode/settings.json index d45c67f..69f2595 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,20 @@ { + "search.exclude": { + ".mypy_cache/": true, + ".pytest_cache/": true + }, + "python.testing.unittestArgs": ["-v", "-s", "./tests", "-p", "t_*.py"], + "python.testing.pytestEnabled": false, + "python.testing.unittestEnabled": true, + "python.analysis.typeCheckingMode": "off", + "python.analysis.ignore": ["**/tests/**", "**/venv/**"], + "cmake.configureOnEdit": false, + "cmake.configureOnOpen": false, + "cmake.sourceDirectory": "${workspaceFolder}/ccl", + "cmake.configureArgs": ["--preset=conan-default"], + "cmake.buildArgs": ["--preset=conan-release"], + "cmake.ctestArgs": ["--test-dir build", "--output-on-failure"], + "cmake.installPrefix": "output", "cSpell.words": [ "coredll", "DCMAKE", @@ -14,12 +30,5 @@ "pyconcept", "rslang", "symmdiff" - ], - "cmake.configureOnEdit": false, - "cmake.configureOnOpen": false, - "cmake.sourceDirectory": "${workspaceFolder}/ccl", - "cmake.configureArgs": ["--preset=conan-default"], - "cmake.buildArgs": ["--preset=conan-release"], - "cmake.ctestArgs": ["--test-dir build", "--output-on-failure"], - "cmake.installPrefix": "output" + ] } diff --git a/pyconcept/CMakeLists.txt b/pyconcept/CMakeLists.txt index ef8f882..1918ab6 100644 --- a/pyconcept/CMakeLists.txt +++ b/pyconcept/CMakeLists.txt @@ -10,12 +10,13 @@ set(CMAKE_CXX_EXTENSIONS OFF) ## Project options ## option(CC_UseSanitizers "Use sanitizers" FALSE) +option(CC_BuildTests "Include tests executable" FALSE) # Compiler options include(cmake/CXXTargets.cmake) -# Libraries folder -link_directories(import/lib) +## Import internal targets +add_subdirectory(ccl) # Add pybind11 set(PYBIND11_FINDPYTHON ON) @@ -49,9 +50,6 @@ target_include_directories(pyconcept target_link_libraries(pyconcept PUBLIC ConceptCoreLibrary - RSlang - cclLang - cclGraph PRIVATE pybind11_all_do_not_use ccl_CXXwarnings diff --git a/pyconcept/MANIFEST.in b/pyconcept/MANIFEST.in index 23cabc1..0f2b8ed 100644 --- a/pyconcept/MANIFEST.in +++ b/pyconcept/MANIFEST.in @@ -4,6 +4,5 @@ graft include graft tests graft cmake - include CMakeLists.txt -recursive-include import * \ No newline at end of file +recursive-include ccl * \ No newline at end of file diff --git a/pyconcept/scripts/Build.ps1 b/pyconcept/scripts/Build.ps1 index 264b2bc..efb1193 100644 --- a/pyconcept/scripts/Build.ps1 +++ b/pyconcept/scripts/Build.ps1 @@ -1,15 +1,20 @@ Set-Location $PSScriptRoot\.. $packageName = 'pyconcept' -$output = "${PSScriptRoot}\..\..\..\output\py\x64\${packageName}" +$output = "${PSScriptRoot}\..\..\output\py\${packageName}" $python = '.\venv\Scripts\python.exe' -$conan = 'conan' +$conan = '.\venv\Scripts\conan.exe' + +$ccl_source = "${PSScriptRoot}\..\..\ccl" +$ccl_destination = "${PSScriptRoot}\..\ccl" +$ccl_exclude = @('*.vcxproj*','*packages.config','CMakeUserPresets.json') function Build { - PrepareEnv + # PrepareEnv PrepareImports PrepareOutput - $wheel = BuildWheel + BuildProject + $wheel = Get-Childitem -Path "${output}\*.whl" -Name if (-not (${wheel}) -or $LASTEXITCODE -ne 0) { Write-Error "No wheel generated for ${packageName}" Exit 1 @@ -19,7 +24,7 @@ function Build { } function PrepareEnv { - Write-Host "Setting up environment for ${python}" -ForegroundColor DarkGreen + Write-Host "Set up environment for ${python}" -ForegroundColor DarkGreen if (-not (Test-Path -Path ${python} -PathType Leaf)) { & 'python' -m venv .\venv & $python -m pip install --upgrade pip @@ -29,25 +34,30 @@ function PrepareEnv { function PrepareImports { Write-Host 'Copy imports' -ForegroundColor DarkGreen - if (Test-Path -Path 'import') { - Remove-Item 'import' -Recurse -Force + if (Test-Path -Path ${ccl_destination}) { + Remove-Item ${ccl_destination} -Recurse -Force } - Copy-Item -Path "..\..\output\include" -Destination "import\include" -Recurse - Copy-Item -Path "..\..\output\lib\x64" -Destination "import\lib" -Recurse + New-Item -Path ${ccl_destination} -ItemType Directory | Out-Null + $source = Resolve-Path(${ccl_source}) + $destination = Resolve-Path(${ccl_destination}) + Get-ChildItem ${source} -Recurse -Exclude ${ccl_exclude} ` + | Where-Object -Property 'FullName' -CNotLike '*build*' ` + | Copy-Item -Destination {Join-Path ${destination}.Path $_.FullName.Substring(${source}.Path.length)} } function PrepareOutput { + Write-Host "Clear output at ${output}" -ForegroundColor DarkGreen if (Test-Path -Path ${output}) { Remove-Item ${output} -Recurse -Force } } -function BuildWheel { - Write-Host 'Building project...' -ForegroundColor DarkGreen +function BuildProject { + Write-Host 'Configuring Conan...' -ForegroundColor DarkGreen & ${conan} profile detect --force & ${conan} install . - & $python -m build --no-isolation --wheel --outdir="${output}" - return Get-Childitem -Path "${output}\*.whl" -Name + Write-Host 'Building project...' -ForegroundColor DarkGreen + & $python -m build --wheel --no-isolation --outdir="${output}" } function TestWheel([string] $wheelPath) { diff --git a/pyconcept/scripts/BuildSingle.ps1 b/pyconcept/scripts/BuildSingle.ps1 deleted file mode 100644 index 84446c2..0000000 --- a/pyconcept/scripts/BuildSingle.ps1 +++ /dev/null @@ -1,11 +0,0 @@ -# Build single project -# TODO: setup project folder as parameter -Set-Location $PSScriptRoot - -& conan profile detect --force -& conan install . - -& cmake --preset conan-default -& cmake --build --preset conan-release -& ctest --test-dir build --output-on-failure -& cmake --install build --prefix ../output \ No newline at end of file diff --git a/pyconcept/setup.py b/pyconcept/setup.py index a879936..af14333 100644 --- a/pyconcept/setup.py +++ b/pyconcept/setup.py @@ -32,11 +32,11 @@ class CMakeBuild(build_ext): ext_fullpath = Path.cwd() / self.get_ext_fullpath(ext.name) output_folder = ext_fullpath.parent.resolve() - debug = int(os.environ.get('DEBUG', 0)) if self.debug is None else self.debug - build_type = 'Debug' if debug else 'Release' + debug_flag = int(os.environ.get('DEBUG', 0)) if self.debug is None else self.debug + build_type = 'Debug' if debug_flag else 'Release' cmake_generator = os.environ.get('CMAKE_GENERATOR', '') cmake_args = [ - '--preset conan-release', + '--preset conan-default', f"-DCMAKE_LIBRARY_OUTPUT_DIRECTORY={output_folder}{os.sep}", f"-DCMAKE_BUILD_TYPE={build_type}" ] @@ -44,7 +44,7 @@ class CMakeBuild(build_ext): if 'CMAKE_ARGS' in os.environ: cmake_args += [item for item in os.environ['CMAKE_ARGS'].split(' ') if item] - build_args = ['--preset conan-release'] + build_args = ['--preset conan-debug' if debug_flag else '--preset conan-release'] if self.compiler.compiler_type != 'msvc': if not cmake_generator or cmake_generator == 'Ninja': try: @@ -80,15 +80,13 @@ class CMakeBuild(build_ext): if hasattr(self, 'parallel') and self.parallel: build_args += [f"-j{self.parallel}"] - build_temp = Path(self.build_temp) / ext.name - if not build_temp.exists(): - build_temp.mkdir(parents=True) - subprocess.run( - ['cmake', ext.sourcedir, *cmake_args], cwd=build_temp, check=True + ['cmake', ext.sourcedir, *cmake_args], + check=True ) subprocess.run( - ['cmake', '--build', '.', *build_args], cwd=build_temp, check=True + ['cmake', '--build', '.', *build_args], + check=True )