浏览代码

Merge pull request #594 from theavege/add/github-actions

add github-actions
circular17 8 月之前
父节点
当前提交
82112d1d07

+ 7 - 0
.github/dependabot.yml

@@ -0,0 +1,7 @@
+---
+version: 2
+updates:
+  - package-ecosystem: "github-actions"
+    directory: "/"
+    schedule:
+      interval: "monthly"

+ 130 - 0
.github/workflows/make.ps1

@@ -0,0 +1,130 @@
+#!/usr/bin/env pwsh
+##############################################################################################################
+
+Function Show-Usage {
+    "
+Usage: pwsh -File $($PSCommandPath) [OPTIONS]
+Options:
+    build   Build program
+" | Out-Host
+}
+
+Function Build-Project {
+    New-Variable -Name VAR -Option Constant -Value @{
+        Src = 'lazpaint'
+        Use = '.'
+        Pkg = 'use\components.txt'
+    }
+    If (! (Test-Path -Path $Var.Src)) {
+        'Source do not find!' | Out-Host
+        Exit 1
+    }
+    If (Test-Path -Path '.gitmodules') {
+        & git submodule update --init --recursive --force --remote | Out-Host
+        ".... [[$($LastExitCode)]] git submodule update" | Out-Host
+    }
+    @(
+        @{
+            Cmd = 'lazbuild'
+            Url = 'https://fossies.org/windows/misc/lazarus-3.6-fpc-3.2.2-win64.exe'
+            Path = "C:\Lazarus"
+        }
+    ) | Where-Object { ! (Test-Path -Path $_.Path) } |
+        ForEach-Object {
+            $_.Url | Request-File | Install-Program
+            $Env:PATH+=";$($_.Path)"
+            (Get-Command $_.Cmd).Source | Out-Host
+        }
+    If (Test-Path -Path $VAR.Use) {
+        If (Test-Path -Path $VAR.Pkg) {
+            Get-Content -Path $VAR.Pkg |
+                Where-Object {
+                    ! (Test-Path -Path "$($VAR.Use)\$($_)") &&
+                    ! (& lazbuild --verbose-pkgsearch $_ ) &&
+                    ! (& lazbuild --add-package $_)
+                } | ForEach-Object {
+                    Return @{
+                        Uri = "https://packages.lazarus-ide.org/$($_).zip"
+                        Path = "$($VAR.Use)\$($_)"
+                        OutFile = (New-TemporaryFile).FullName
+                    }
+                } | ForEach-Object -Parallel {
+                    Invoke-WebRequest -OutFile $_.OutFile -Uri $_.Uri
+                    Expand-Archive -Path $_.OutFile -DestinationPath $_.Path
+                    Remove-Item $_.OutFile
+                    Return ".... download $($_.Uri)"
+                } | Out-Host
+        }
+        (Get-ChildItem -Filter '*.lpk' -Recurse -File –Path $VAR.Use).FullName |
+            ForEach-Object {
+                & lazbuild --add-package-link $_ | Out-Null
+                Return ".... [$($LastExitCode)] add package link $($_)"
+            } | Out-Host
+    }
+    Exit (
+        (Get-ChildItem -Filter '*.lpi' -Recurse -File –Path $Var.Src).FullName |
+            Sort-Object |
+            ForEach-Object {
+                $Output = (& lazbuild --build-all --recursive --no-write-project --build-mode='release' $_)
+                $Result = @(".... [$($LastExitCode)] build project $($_)")
+                $exitCode = Switch ($LastExitCode) {
+                    0 {
+                        $Result += $Output | Select-String -Pattern 'Linking'
+                        0
+                    }
+                    Default {
+                        $Result += $Output | Select-String -Pattern 'Error:', 'Fatal:'
+                        1
+                    }
+                }
+                $Result | Out-Host
+                Return $exitCode
+            } | Measure-Object -Sum
+    ).Sum
+}
+
+Function Request-File {
+    While ($Input.MoveNext()) {
+        New-Variable -Name VAR -Option Constant -Value @{
+            Uri = $Input.Current
+            OutFile = (Split-Path -Path $Input.Current -Leaf).Split('?')[0]
+        }
+        Invoke-WebRequest @VAR
+        Return $VAR.OutFile
+    }
+}
+
+Function Install-Program {
+    While ($Input.MoveNext()) {
+        Switch ((Split-Path -Path $Input.Current -Leaf).Split('.')[-1]) {
+            'msi' {
+                & msiexec /passive /package $Input.Current | Out-Null
+            }
+            Default {
+                & ".\$($Input.Current)" /SP- /VERYSILENT /SUPPRESSMSGBOXES /NORESTART | Out-Null
+            }
+        }
+        Remove-Item $Input.Current
+    }
+}
+
+Function Switch-Action {
+    $ErrorActionPreference = 'stop'
+    Set-PSDebug -Strict #-Trace 1
+    Invoke-ScriptAnalyzer -EnableExit -Path $PSCommandPath
+    If ($args.count -gt 0) {
+        Switch ($args[0]) {
+            'build' {
+                Build-Project
+            }
+            Default {
+                Show-Usage
+            }
+        }
+    } Else {
+        Show-Usage
+    }
+}
+
+##############################################################################################################
+Switch-Action @args

+ 97 - 0
.github/workflows/make.sh

@@ -0,0 +1,97 @@
+#!/usr/bin/env bash
+
+function priv_clippit
+(
+    cat <<EOF
+Usage: bash ${0} [OPTIONS]
+Options:
+    build   Build program
+EOF
+)
+
+function priv_lazbuild
+(
+    declare -rA VAR=(
+        [src]='lazpaint'
+        [use]='.'
+        [pkg]='use/components.txt'
+    )
+    if ! [[ -d "${VAR[src]}" ]]; then
+        printf '\x1b[31m\tSource do not find!\x1b[0m\n' "${?}" "${REPLY}"
+        exit 1
+    fi
+    if [[ -f '.gitmodules' ]]; then
+        git submodule update --init --recursive --force --remote &
+    fi
+    if ! (command -v lazbuild); then
+        source '/etc/os-release'
+        case ${ID:?} in
+            debian | ubuntu)
+                sudo apt-get update
+                sudo apt-get install -y lazarus{-ide-qt5,} cppcheck pylint&
+                ;;
+        esac
+    fi
+    wait
+    if [[ -d "${VAR[use]}" ]]; then
+        if [[ -f "${VAR[pkg]}" ]]; then
+            while read -r; do
+                if [[ -n "${REPLY}" ]] &&
+                    ! [[ -d "${VAR[use]}/${REPLY}" ]] &&
+                    ! (lazbuild --verbose-pkgsearch "${REPLY}") &&
+                    ! (lazbuild --add-package "${REPLY}"); then
+                        (
+                            declare -A TMP=(
+                                [url]="https://packages.lazarus-ide.org/${REPLY}.zip"
+                                [dir]="${VAR[use]}/${REPLY}"
+                                [out]=$(mktemp)
+                            )
+                            wget --quiet --output-document "${TMP[out]}" "${TMP[url]}"
+                            unzip -o "${TMP[out]}" -d "${TMP[dir]}"
+                            rm --verbose "${TMP[out]}"
+                        ) &
+                    fi
+            done < "${VAR[pkg]}"
+            wait
+        fi
+        find "${VAR[use]}" -type 'f' -name '*.lpk' -printf '\033[32m\tadd package link\t%p\033[0m\n' -exec \
+            lazbuild --add-package-link {} + 1>&2
+    fi
+    declare -i errors=0
+    while read -r; do
+        declare -A TMP=(
+            [out]=$(mktemp)
+        )
+        if (lazbuild --build-all --recursive --no-write-project --build-mode='release' --widgetset='qt5' "${REPLY}" > "${TMP[out]}"); then
+            printf '\x1b[32m\t[%s]\t%s\x1b[0m\n' "${?}" "${REPLY}"
+            grep --color='always' 'Linking' "${TMP[out]}"
+        else
+            printf '\x1b[31m\t[%s]\t%s\x1b[0m\n' "${?}" "${REPLY}"
+            grep --color='always' --extended-regexp '(Error|Fatal):' "${TMP[out]}"
+            ((errors+=1))
+        fi 1>&2
+        rm "${TMP[out]}"
+    done < <(find "${VAR[src]}" -type 'f' -name '*.lpi' | sort)
+    find 'resources' -type 'f' -name '*.py' -printf '\033[32m\tlint files.py\t%p\033[0m\n' -exec \
+        python3 -m pylint {} + 1>&2
+    find "${VAR[src]}" -type 'f' -name '*.c' -printf '\033[32m\tlint files.c\t%p\033[0m\n' -exec \
+        cppcheck --language=c --enable=warning,style --template=gcc {} + 1>&2
+    find "${PWD}" -type 'f' -name '*.sh' -printf '\033[32m\tlint files.sh\t%p\033[0m\n' -exec \
+        shellcheck --external-sources {} + 1>&2
+    exit "${errors}"
+)
+
+function priv_main
+(
+    set -euo pipefail
+    if ((${#})); then
+        case ${1} in
+            build) priv_lazbuild ;;
+            *) priv_clippit ;;
+        esac
+    else
+        priv_clippit
+    fi
+)
+
+priv_main "${@}" >/dev/null

+ 49 - 0
.github/workflows/make.yml

@@ -0,0 +1,49 @@
+---
+name: Make
+
+on:
+  schedule:
+    - cron:  '0 0 1 * *'
+  push:
+    branches:
+      - "**"
+  pull_request:
+    branches:
+      - master
+      - main
+
+concurrency:
+  group: ${{ github.workflow }}-${{ github.ref }}
+  cancel-in-progress: true
+
+jobs:
+  build:
+    runs-on: ${{ matrix.os }}
+    timeout-minutes: 120
+    strategy:
+      matrix:
+        os:
+          - ubuntu-latest
+          - windows-latest
+    steps:
+    - name: Checkout
+      uses: actions/checkout@v4
+      with:
+        submodules: true
+
+    - name: Build on Linux
+      if: runner.os == 'Linux'
+      shell: bash
+      run: bash .github/workflows/make.sh build
+
+    - name: Build on Windows
+      if: runner.os == 'Windows'
+      shell: powershell
+      run: pwsh -File .github/workflows/make.ps1 build
+
+    - name: Archive
+      if: runner.os == 'Windows'
+      uses: actions/upload-artifact@v4
+      with:
+        retention-days: 1
+        path: src\bin\*.exe

+ 6 - 0
.gitmodules

@@ -0,0 +1,6 @@
+[submodule "use/bgracontrols"]
+	path = use/bgracontrols
+	url = [email protected]:bgrabitmap/bgracontrols.git
+[submodule "use/bgrabitmap"]
+	path = use/bgrabitmap
+	url = [email protected]:bgrabitmap/bgrabitmap.git

+ 82 - 10
lazpaint/test_embedded/project1.lpi

@@ -1,10 +1,12 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <CONFIG>
   <ProjectOptions>
-    <Version Value="10"/>
+    <Version Value="12"/>
     <PathDelim Value="\"/>
     <General>
-      <MainUnit Value="0"/>
+      <Flags>
+        <CompatibilityMode Value="True"/>
+      </Flags>
       <ResourceType Value="res"/>
       <UseXPManifest Value="True"/>
       <Icon Value="0"/>
@@ -12,18 +14,88 @@
     <i18n>
       <EnableI18N LFM="False"/>
     </i18n>
-    <BuildModes Count="1" Active="Default">
+    <BuildModes Count="3" Active="Debug">
       <Item1 Name="Default" Default="True"/>
+      <Item2 Name="Debug">
+        <CompilerOptions>
+          <Version Value="11"/>
+          <PathDelim Value="\"/>
+          <Target>
+            <Filename Value="project1"/>
+          </Target>
+          <SearchPaths>
+            <IncludeFiles Value="$(ProjOutDir)"/>
+            <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
+          </SearchPaths>
+          <Parsing>
+            <SyntaxOptions>
+              <IncludeAssertionCode Value="True"/>
+            </SyntaxOptions>
+          </Parsing>
+          <CodeGeneration>
+            <Checks>
+              <IOChecks Value="True"/>
+              <RangeChecks Value="True"/>
+              <OverflowChecks Value="True"/>
+              <StackChecks Value="True"/>
+            </Checks>
+            <VerifyObjMethodCallValidity Value="True"/>
+          </CodeGeneration>
+          <Linking>
+            <Debugging>
+              <DebugInfoType Value="dsDwarf3"/>
+              <UseHeaptrc Value="True"/>
+              <TrashVariables Value="True"/>
+              <UseExternalDbgSyms Value="True"/>
+            </Debugging>
+            <Options>
+              <Win32>
+                <GraphicApplication Value="True"/>
+              </Win32>
+            </Options>
+          </Linking>
+        </CompilerOptions>
+      </Item2>
+      <Item3 Name="Release">
+        <CompilerOptions>
+          <Version Value="11"/>
+          <PathDelim Value="\"/>
+          <Target>
+            <Filename Value="project1"/>
+          </Target>
+          <SearchPaths>
+            <IncludeFiles Value="$(ProjOutDir)"/>
+            <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
+          </SearchPaths>
+          <CodeGeneration>
+            <SmartLinkUnit Value="True"/>
+            <Optimizations>
+              <OptimizationLevel Value="3"/>
+            </Optimizations>
+          </CodeGeneration>
+          <Linking>
+            <Debugging>
+              <GenerateDebugInfo Value="False"/>
+              <RunWithoutDebug Value="True"/>
+            </Debugging>
+            <LinkSmart Value="True"/>
+            <Options>
+              <Win32>
+                <GraphicApplication Value="True"/>
+              </Win32>
+            </Options>
+          </Linking>
+        </CompilerOptions>
+      </Item3>
     </BuildModes>
     <PublishOptions>
       <Version Value="2"/>
-      <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
-      <ExcludeFileFilter Value="*.(bak|ppu|o|so);*~;backup"/>
     </PublishOptions>
     <RunParams>
-      <local>
-        <FormatVersion Value="1"/>
-      </local>
+      <FormatVersion Value="2"/>
+      <Modes Count="1">
+        <Mode0 Name="default"/>
+      </Modes>
     </RunParams>
     <RequiredPackages Count="2">
       <Item1>
@@ -40,7 +112,7 @@
         <IsPartOfProject Value="True"/>
         <EditorIndex Value="1"/>
         <TopLine Value="8"/>
-        <CursorPos Y="18"/>
+        <CursorPos Y="19"/>
         <UsageCount Value="20"/>
         <Loaded Value="True"/>
       </Unit0>
@@ -52,7 +124,7 @@
         <ResourceBaseClass Value="Form"/>
         <UnitName Value="Unit1"/>
         <IsVisibleTab Value="True"/>
-        <TopLine Value="4"/>
+        <TopLine Value="51"/>
         <CursorPos X="3" Y="66"/>
         <UsageCount Value="20"/>
         <Loaded Value="True"/>

+ 1 - 1
lazpaintcontrols/lcvectorialfillinterface.pas

@@ -1407,6 +1407,6 @@ begin
 end;
 
 begin
-  {$i fillimages.lrs}
+  {$i ../resources/fillimages.lrs}
 end.
 

+ 1 - 0
use/bgrabitmap

@@ -0,0 +1 @@
+Subproject commit 311fa8d5f9b2baabdb3490ded5f721e68ea67ae2

+ 1 - 0
use/bgracontrols

@@ -0,0 +1 @@
+Subproject commit 555c0df8e2c52c60a9099d1bfd7b14c19852d5a4