Initial release
120
.clang-format
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
#
|
||||||
|
# http://clang.llvm.org/docs/ClangFormatStyleOptions.html
|
||||||
|
#
|
||||||
|
Language: Cpp
|
||||||
|
AccessModifierOffset: -4
|
||||||
|
AlignAfterOpenBracket: Align
|
||||||
|
AlignConsecutiveAssignments: true
|
||||||
|
AlignConsecutiveDeclarations: true
|
||||||
|
AlignEscapedNewlines: DontAlign
|
||||||
|
AlignOperands: true
|
||||||
|
AlignTrailingComments: true
|
||||||
|
AllowAllParametersOfDeclarationOnNextLine: true
|
||||||
|
AllowShortBlocksOnASingleLine: true
|
||||||
|
AllowShortCaseLabelsOnASingleLine: true
|
||||||
|
AllowShortFunctionsOnASingleLine: All
|
||||||
|
AllowShortIfStatementsOnASingleLine: false
|
||||||
|
AllowShortLoopsOnASingleLine: false
|
||||||
|
AlwaysBreakAfterDefinitionReturnType: None
|
||||||
|
AlwaysBreakAfterReturnType: None
|
||||||
|
AlwaysBreakBeforeMultilineStrings: false
|
||||||
|
AlwaysBreakTemplateDeclarations: false
|
||||||
|
BinPackArguments: true
|
||||||
|
BinPackParameters: false
|
||||||
|
BraceWrapping:
|
||||||
|
AfterClass: true
|
||||||
|
AfterControlStatement: false
|
||||||
|
AfterEnum: false
|
||||||
|
AfterFunction: true
|
||||||
|
AfterNamespace: false
|
||||||
|
AfterObjCDeclaration: false
|
||||||
|
AfterStruct: true
|
||||||
|
AfterUnion: false
|
||||||
|
AfterExternBlock: false
|
||||||
|
BeforeCatch: false
|
||||||
|
BeforeElse: false
|
||||||
|
IndentBraces: false
|
||||||
|
SplitEmptyFunction: false
|
||||||
|
SplitEmptyRecord: false
|
||||||
|
SplitEmptyNamespace: false
|
||||||
|
BreakBeforeBinaryOperators: None
|
||||||
|
BreakBeforeBraces: Custom
|
||||||
|
BreakBeforeInheritanceComma: false
|
||||||
|
BreakInheritanceList: BeforeColon
|
||||||
|
BreakBeforeTernaryOperators: false
|
||||||
|
BreakConstructorInitializersBeforeComma: false
|
||||||
|
BreakConstructorInitializers: BeforeComma
|
||||||
|
BreakAfterJavaFieldAnnotations: false
|
||||||
|
BreakStringLiterals: true
|
||||||
|
ColumnLimit: 140
|
||||||
|
CommentPragmas: '^ IWYU pragma:'
|
||||||
|
CompactNamespaces: true
|
||||||
|
ConstructorInitializerAllOnOneLineOrOnePerLine: true
|
||||||
|
ConstructorInitializerIndentWidth: 4
|
||||||
|
ContinuationIndentWidth: 4
|
||||||
|
Cpp11BracedListStyle: true
|
||||||
|
DerivePointerAlignment: false
|
||||||
|
DisableFormat: false
|
||||||
|
ExperimentalAutoDetectBinPacking: false
|
||||||
|
FixNamespaceComments: true
|
||||||
|
ForEachMacros:
|
||||||
|
- forever
|
||||||
|
- foreach
|
||||||
|
- Q_FOREACH
|
||||||
|
- BOOST_FOREACH
|
||||||
|
IncludeBlocks: Preserve
|
||||||
|
IncludeCategories:
|
||||||
|
- Regex: '^<Q.*'
|
||||||
|
Priority: 200
|
||||||
|
- Regex: '^(<|"(gtest|gmock|isl|json)/)'
|
||||||
|
Priority: 3
|
||||||
|
- Regex: '.*'
|
||||||
|
Priority: 1
|
||||||
|
IncludeIsMainRegex: '(Test)?$'
|
||||||
|
IndentCaseLabels: false
|
||||||
|
IndentPPDirectives: None
|
||||||
|
IndentWidth: 4
|
||||||
|
IndentWrappedFunctionNames: false
|
||||||
|
JavaScriptQuotes: Leave
|
||||||
|
JavaScriptWrapImports: true
|
||||||
|
#KeepLineBreaksForNonEmptyLines: false
|
||||||
|
KeepEmptyLinesAtTheStartOfBlocks: false
|
||||||
|
MacroBlockBegin: ''
|
||||||
|
MacroBlockEnd: ''
|
||||||
|
MaxEmptyLinesToKeep: 1
|
||||||
|
NamespaceIndentation: None
|
||||||
|
ObjCBinPackProtocolList: Auto
|
||||||
|
ObjCBlockIndentWidth: 4
|
||||||
|
ObjCSpaceAfterProperty: false
|
||||||
|
ObjCSpaceBeforeProtocolList: true
|
||||||
|
PenaltyBreakAssignment: 150
|
||||||
|
PenaltyBreakBeforeFirstCallParameter: 300
|
||||||
|
PenaltyBreakComment: 500
|
||||||
|
PenaltyBreakFirstLessLess: 400
|
||||||
|
PenaltyBreakString: 600
|
||||||
|
PenaltyBreakTemplateDeclaration: 10
|
||||||
|
PenaltyExcessCharacter: 50
|
||||||
|
PenaltyReturnTypeOnItsOwnLine: 300
|
||||||
|
PointerAlignment: Left
|
||||||
|
ReflowComments: true
|
||||||
|
SortIncludes: false
|
||||||
|
SortUsingDeclarations: false
|
||||||
|
SpaceAfterCStyleCast: true
|
||||||
|
SpaceAfterTemplateKeyword: false
|
||||||
|
SpaceBeforeAssignmentOperators: true
|
||||||
|
SpaceBeforeCpp11BracedList: false
|
||||||
|
SpaceBeforeCtorInitializerColon: true
|
||||||
|
SpaceBeforeInheritanceColon: true
|
||||||
|
SpaceBeforeParens: ControlStatements
|
||||||
|
SpaceBeforeRangeBasedForLoopColon: true
|
||||||
|
SpaceInEmptyParentheses: false
|
||||||
|
SpacesBeforeTrailingComments: 1
|
||||||
|
SpacesInAngles: false
|
||||||
|
SpacesInContainerLiterals: false
|
||||||
|
SpacesInCStyleCastParentheses: false
|
||||||
|
SpacesInParentheses: false
|
||||||
|
SpacesInSquareBrackets: false
|
||||||
|
Standard: Cpp11
|
||||||
|
TabWidth: 4
|
||||||
|
UseTab: Never
|
||||||
|
|
||||||
19
.claude/commands/commit-push-pr.md
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
allowed-tools: Bash(git checkout --branch:*), Bash(git add:*), Bash(git status:*), Bash(git push:*), Bash(git commit:*), Bash(gh pr create:*)
|
||||||
|
description: Commit, push, and open a PR
|
||||||
|
---
|
||||||
|
|
||||||
|
## Context
|
||||||
|
|
||||||
|
- Current git status: !`git status`
|
||||||
|
- Current git diff (staged and unstaged changes): !`git diff HEAD`
|
||||||
|
- Current branch: !`git branch --show-current`
|
||||||
|
|
||||||
|
## Your task
|
||||||
|
|
||||||
|
Based on the above changes:
|
||||||
|
1. Create a new branch if on main
|
||||||
|
2. Create a single commit with an appropriate message
|
||||||
|
3. Push the branch to origin
|
||||||
|
4. Create a pull request using `gh pr create`
|
||||||
|
5. You have the capability to call multiple tools in a single response. You MUST do all of the above in a single message. Do not use any other tools or do anything else. Do not send any other text or messages besides these tool calls.
|
||||||
38
.claude/commands/dedupe.md
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
---
|
||||||
|
allowed-tools: Bash(gh issue view:*), Bash(gh search:*), Bash(gh issue list:*), Bash(gh api:*), Bash(gh issue comment:*)
|
||||||
|
description: Find duplicate GitHub issues
|
||||||
|
---
|
||||||
|
|
||||||
|
Find up to 3 likely duplicate issues for a given GitHub issue.
|
||||||
|
|
||||||
|
To do this, follow these steps precisely:
|
||||||
|
|
||||||
|
1. Use an agent to check if the Github issue (a) is closed, (b) does not need to be deduped (eg. because it is broad product feedback without a specific solution, or positive feedback), or (c) already has a duplicates comment that you made earlier. If so, do not proceed.
|
||||||
|
2. Use an agent to view a Github issue, and ask the agent to return a summary of the issue
|
||||||
|
3. Then, launch 5 parallel agents to search Github for duplicates of this issue, using diverse keywords and search approaches, using the summary from #1
|
||||||
|
4. Next, feed the results from #1 and #2 into another agent, so that it can filter out false positives, that are likely not actually duplicates of the original issue. If there are no duplicates remaining, do not proceed.
|
||||||
|
5. Finally, comment back on the issue with a list of up to three duplicate issues (or zero, if there are no likely duplicates)
|
||||||
|
|
||||||
|
Notes (be sure to tell this to your agents, too):
|
||||||
|
|
||||||
|
- Use `gh` to interact with Github, rather than web fetch
|
||||||
|
- Do not use other tools, beyond `gh` (eg. don't use other MCP servers, file edit, etc.)
|
||||||
|
- Make a todo list first
|
||||||
|
- For your comment, follow the following format precisely (assuming for this example that you found 3 suspected duplicates):
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Found 3 possible duplicate issues:
|
||||||
|
|
||||||
|
1. <link to issue>
|
||||||
|
2. <link to issue>
|
||||||
|
3. <link to issue>
|
||||||
|
|
||||||
|
This issue will be automatically closed as a duplicate in 3 days.
|
||||||
|
|
||||||
|
- If your issue is a duplicate, please close it and 👍 the existing issue instead
|
||||||
|
- To prevent auto-closure, add a comment or 👎 this comment
|
||||||
|
|
||||||
|
🤖 OrcaSlicer bot
|
||||||
|
|
||||||
|
---
|
||||||
40
.claude/commands/oncall-triage.md
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
---
|
||||||
|
allowed-tools: Bash(gh issue list:*), Bash(gh issue view:*), Bash(gh issue edit:*), TodoWrite
|
||||||
|
description: Triage GitHub issues and label critical ones for oncall
|
||||||
|
---
|
||||||
|
|
||||||
|
You're an oncall triage assistant for GitHub issues. Your task is to identify critical issues that require immediate oncall attention and apply the "oncall" label.
|
||||||
|
|
||||||
|
Repository: OrcaSlicer/OrcaSlicer
|
||||||
|
|
||||||
|
Task overview:
|
||||||
|
|
||||||
|
1. First, get all open bugs updated in the last 3 days with at least 50 engagements:
|
||||||
|
```bash
|
||||||
|
gh issue list --repo OrcaSlicer/OrcaSlicer --state open --label bug --limit 1000 --json number,title,updatedAt,comments,reactions | jq -r '.[] | select((.updatedAt >= (now - 259200 | strftime("%Y-%m-%dT%H:%M:%SZ"))) and ((.comments | length) + ([.reactions[].content] | length) >= 50)) | "\(.number)"'
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Save the list of issue numbers and create a TODO list with ALL of them. This ensures you process every single one.
|
||||||
|
|
||||||
|
3. For each issue in your TODO list:
|
||||||
|
- Use `gh issue view <number> --repo OrcaSlicer/OrcaSlicer --json title,body,labels,comments` to get full details
|
||||||
|
- Read and understand the full issue content and comments to determine actual user impact
|
||||||
|
- Evaluate: Is this truly blocking users from using Claude Code?
|
||||||
|
- Consider: "crash", "stuck", "frozen", "hang", "unresponsive", "cannot use", "blocked", "broken"
|
||||||
|
- Does it prevent core functionality? Can users work around it?
|
||||||
|
- Be conservative - only flag issues that truly prevent users from getting work done
|
||||||
|
|
||||||
|
4. For issues that are truly blocking and don't already have the "oncall" label:
|
||||||
|
- Use `gh issue edit <number> --repo OrcaSlicer/OrcaSlicer --add-label "oncall"`
|
||||||
|
- Mark the issue as complete in your TODO list
|
||||||
|
|
||||||
|
5. After processing all issues, provide a summary:
|
||||||
|
- List each issue number that received the "oncall" label
|
||||||
|
- Include the issue title and brief reason why it qualified
|
||||||
|
- If no issues qualified, state that clearly
|
||||||
|
|
||||||
|
Important:
|
||||||
|
- Process ALL issues in your TODO list systematically
|
||||||
|
- Don't post any comments to issues
|
||||||
|
- Only add the "oncall" label, never remove it
|
||||||
|
- Use individual `gh issue view` commands instead of bash for loops to avoid approval prompts
|
||||||
10
.cursorignore
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# Add directories or file patterns to ignore during indexing (e.g. foo/ or *.csv)
|
||||||
|
deps/
|
||||||
|
build_*/
|
||||||
|
build/
|
||||||
|
localization/
|
||||||
|
sandboxes/
|
||||||
|
resources/*
|
||||||
|
!resources/web/
|
||||||
|
!resources/dailytip
|
||||||
|
!resources/shaders
|
||||||
2
.devcontainer/Dockerfile
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
ARG BASE_IMAGE
|
||||||
|
FROM ${BASE_IMAGE}
|
||||||
44
.devcontainer/devcontainer.json
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
{
|
||||||
|
"name": "OrcaSlicer",
|
||||||
|
"build": {
|
||||||
|
"dockerfile": "Dockerfile",
|
||||||
|
"args": {
|
||||||
|
"PLATFORM": "linux/amd64",
|
||||||
|
"BASE_IMAGE": "mcr.microsoft.com/devcontainers/cpp:ubuntu-22.04"
|
||||||
|
},
|
||||||
|
"options": ["--platform=linux/amd64"]
|
||||||
|
},
|
||||||
|
"runArgs": ["--platform=linux/amd64"],
|
||||||
|
"features": {
|
||||||
|
"ghcr.io/devcontainers/features/desktop-lite:1": {
|
||||||
|
"password": "orca"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"customizations": {
|
||||||
|
"vscode": {
|
||||||
|
"settings": {
|
||||||
|
},
|
||||||
|
|
||||||
|
// Add the IDs of extensions you want installed when the container is created.
|
||||||
|
"extensions": [
|
||||||
|
"ms-vscode.cmake-tools",
|
||||||
|
"ms-vscode.cpptools-extension-pack"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
"forwardPorts": [6080],
|
||||||
|
"portsAttributes": {
|
||||||
|
"6080": {
|
||||||
|
"label": "VNC web client (noVNC)",
|
||||||
|
"onAutoForward": "silent"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"otherPortsAttributes": {
|
||||||
|
"onAutoForward": "ignore"
|
||||||
|
},
|
||||||
|
"onCreateCommand": {
|
||||||
|
"Set postCreate executable flag": "chmod +x .devcontainer/postCreate.sh"
|
||||||
|
},
|
||||||
|
"postCreateCommand": "sudo .devcontainer/postCreate.sh"
|
||||||
|
}
|
||||||
15
.devcontainer/postCreate.sh
Executable file
@@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Update and upgrade all system packages
|
||||||
|
apt update
|
||||||
|
apt upgrade -y
|
||||||
|
|
||||||
|
build_linux="./build_linux.sh -u"
|
||||||
|
echo "-----------------------------------------"
|
||||||
|
echo "Running ${build_linux}..."
|
||||||
|
echo "-----------------------------------------"
|
||||||
|
${build_linux}
|
||||||
|
|
||||||
|
echo "------------------------------"
|
||||||
|
echo "Installing missing packages..."
|
||||||
|
echo "------------------------------"
|
||||||
|
apt install -y libgl1-mesa-dev m4 autoconf libtool
|
||||||
30
.dockerignore
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
Build
|
||||||
|
Build.bat
|
||||||
|
/build/
|
||||||
|
deps/build
|
||||||
|
MYMETA.json
|
||||||
|
MYMETA.yml
|
||||||
|
_build
|
||||||
|
blib
|
||||||
|
xs/buildtmp
|
||||||
|
*.o
|
||||||
|
*.log
|
||||||
|
MANIFEST.bak
|
||||||
|
xs/MANIFEST.bak
|
||||||
|
xs/assertlib*
|
||||||
|
.init_bundle.ini
|
||||||
|
.vs/*
|
||||||
|
local-lib
|
||||||
|
/src/TAGS
|
||||||
|
/.vscode/
|
||||||
|
build-linux/*
|
||||||
|
deps/build-linux/*
|
||||||
|
**/.DS_Store
|
||||||
|
install_*
|
||||||
|
build_*/
|
||||||
|
!build_linux.sh
|
||||||
|
SVG
|
||||||
|
scripts/Dockerfile
|
||||||
|
scripts/DockerBuild.sh
|
||||||
|
scripts/DockerRun.sh
|
||||||
|
scripts/.dockerignore
|
||||||
1
.gitattributes
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
*.sh text eol=lf
|
||||||
133
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
@@ -0,0 +1,133 @@
|
|||||||
|
name: 🐞 Bug Report
|
||||||
|
description: File a bug report
|
||||||
|
labels: ["bug"]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
**Thank you for using Orca Slicer and wanting to report a bug.**
|
||||||
|
|
||||||
|
Please note that this is not the place to make feature requests or ask for help.
|
||||||
|
For this, please use the [Feature request](https://github.com/OrcaSlicer/OrcaSlicer/issues/new?assignees=&labels=&projects=&template=feature_request.yml) issue type or you can discuss your idea on our [Discord server](https://discord.gg/P4VE9UY9gJ) with others.
|
||||||
|
|
||||||
|
Before filing, please check if the issue already exists (either open or closed) by using the search bar on the issues page. If it does, comment there. Even if it's closed, we can reopen it based on your comment.
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Is there an existing issue for this problem?
|
||||||
|
description: Please search to see if an issue already exists for the bug you encountered.
|
||||||
|
options:
|
||||||
|
- label: I have searched the existing issues
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: version
|
||||||
|
attributes:
|
||||||
|
label: OrcaSlicer Version
|
||||||
|
description: Which version of Orca Slicer are you running? You can see the full version in `Help` -> `About Orca Slicer`.
|
||||||
|
placeholder: e.g. 1.9.0
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
id: os_type
|
||||||
|
attributes:
|
||||||
|
label: "Operating System (OS)"
|
||||||
|
description: "What OSes are you are experiencing issues on?"
|
||||||
|
multiple: true
|
||||||
|
options:
|
||||||
|
- Linux
|
||||||
|
- macOS
|
||||||
|
- Windows
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
id: os_version
|
||||||
|
attributes:
|
||||||
|
label: "OS Version"
|
||||||
|
description: "What OS version does this relate to?"
|
||||||
|
placeholder: "i.e. OS: Windows 7/8/10/11 ..., Ubuntu 22.04/Fedora 36 ..., macOS 10.15/11.1/12.3 ..."
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: system_info
|
||||||
|
attributes:
|
||||||
|
label: Additional system information
|
||||||
|
description: For the performance issue, please also show the CPU, Memory information; For the 3D Rendering issue, please also show the Display Card information.
|
||||||
|
placeholder: |
|
||||||
|
CPU: 11th gen Intel r core tm i7-1185g7/AMD Ryzen 7 6800h/...
|
||||||
|
Memory: 32/16 GB...
|
||||||
|
Display Card: NVIDIA Quadro P400/...
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: input
|
||||||
|
id: printer
|
||||||
|
attributes:
|
||||||
|
label: Printer
|
||||||
|
description: Which printer was selected
|
||||||
|
placeholder: Voron 2.4/VzBot/Prusa MK4/Bambu Lab X1 series/Bambu Lab P1P/...
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: reproduce_steps
|
||||||
|
attributes:
|
||||||
|
label: How to reproduce
|
||||||
|
description: Please described the detailed steps to reproduce this issue
|
||||||
|
placeholder: |
|
||||||
|
1. Go to '...'
|
||||||
|
2. Click on '...'
|
||||||
|
3. Scroll down to '...'
|
||||||
|
4. See error
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: actual_results
|
||||||
|
attributes:
|
||||||
|
label: Actual results
|
||||||
|
description: What happens after the above steps? Please, enclose a screenshot whenever possible (even when you think the description is clear).
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: expected_results
|
||||||
|
attributes:
|
||||||
|
label: Expected results
|
||||||
|
description: What should happen after the above steps?
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: markdown
|
||||||
|
id: file_required
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Please be sure to add the following files:
|
||||||
|
* Please upload a ZIP archive containing the **project file** used when the problem arise. Please export it just before or after the problem occurs. Even if you did nothing and/or there is no object, export it! (We need the configurations in project file).
|
||||||
|
You can export the project file from the application menu in `File`->`Save project as...`, then zip it
|
||||||
|
* A **log file** for crashes and similar issues.
|
||||||
|
You can find your log file here:
|
||||||
|
Windows: `%APPDATA%\OrcaSlicer\log` or usually `C:\Users\<your username>\AppData\Roaming\OrcaSlicer\log`
|
||||||
|
MacOS: `$HOME/Library/Application Support/OrcaSlicer/log`
|
||||||
|
Linux: `$HOME/.config/OrcaSlicer/log`
|
||||||
|
If Orca Slicer still starts, you can also reach this directory from the application menu in `Help` -> `Show Configuration Folder`
|
||||||
|
You can zip the log directory, or just select the newest logs when this issue happens, and zip them
|
||||||
|
- type: textarea
|
||||||
|
id: file_uploads
|
||||||
|
attributes:
|
||||||
|
label: Project file & Debug log uploads
|
||||||
|
description: Drop the project file and debug log here
|
||||||
|
placeholder: |
|
||||||
|
Project File: `File` -> `Save project as...` then zip it & drop it here
|
||||||
|
Log File: `Help` -> `Show Configuration Folder`, then zip the log directory, or just select the newest logs in `log` when this issue happens and zip them, then drop the zip file here
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: checkboxes
|
||||||
|
id: file_checklist
|
||||||
|
attributes:
|
||||||
|
label: Checklist of files to include
|
||||||
|
options:
|
||||||
|
- label: Log file
|
||||||
|
- label: Project file
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Anything else?
|
||||||
|
description: |
|
||||||
|
Screenshots? References? Anything that will give us more context about the issue you are encountering!
|
||||||
|
|
||||||
|
Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in.
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
8
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
blank_issues_enabled: false
|
||||||
|
contact_links:
|
||||||
|
- name: Community Support (Discord channel)
|
||||||
|
url: https://discord.gg/P4VE9UY9gJ
|
||||||
|
about: Please ask and answer support "how do I?"questions here.
|
||||||
|
- name: Discussion Forum
|
||||||
|
url: https://github.com/OrcaSlicer/OrcaSlicer/discussions
|
||||||
|
about: Please raise ideas and feature suggestions here.
|
||||||
66
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
name: 🚀 Feature Request / Enhancement
|
||||||
|
description: Suggest an improvement to make Orca Slicer even better!
|
||||||
|
labels: ["enhancement"]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Thanks for taking the time to fill out this feature request!
|
||||||
|
|
||||||
|
If your idea is still at the formulation stage, or you're not sure it would
|
||||||
|
be useful to many users, you can raise it as a discussion topic under [Ideas](https://github.com/OrcaSlicer/OrcaSlicer/discussions/categories/ideas)
|
||||||
|
or you can raise it on the [Discord server](https://discord.gg/P4VE9UY9gJ).
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Is there an existing issue for this feature request?
|
||||||
|
description: |
|
||||||
|
Please search to see if an issue already exists for a feature, or perhaps one similar.
|
||||||
|
You can then comment and react so that we know know much interest there is in the feature request.
|
||||||
|
options:
|
||||||
|
- label: I have searched the existing issues
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Is your feature request related to a problem?
|
||||||
|
description: A clear and concise description of what the problem is.
|
||||||
|
placeholder: I'm always frustrated when [...]
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
attributes:
|
||||||
|
label: Which printers will be beneficial to this feature?
|
||||||
|
description: Select affected printer firmware type.
|
||||||
|
multiple: true
|
||||||
|
options:
|
||||||
|
- Klipper
|
||||||
|
- Marlin
|
||||||
|
- Others
|
||||||
|
- All
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Describe the solution you'd like
|
||||||
|
description: A clear and concise description of what you want to happen.
|
||||||
|
placeholder: It should do [...]
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Describe alternatives you've considered
|
||||||
|
description: A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
placeholder: |
|
||||||
|
1. [...]
|
||||||
|
2. [...]
|
||||||
|
3. [...]
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Additional context
|
||||||
|
description: |
|
||||||
|
Add any other context, diagrams, illustations or screenshots about the feature request here.
|
||||||
|
|
||||||
|
Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in.
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
11
.github/actions/apt-install-deps/action.yml
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
name: 'Apt Install Deps'
|
||||||
|
description: 'Install the packages needed for building and deploying'
|
||||||
|
runs:
|
||||||
|
using: 'composite'
|
||||||
|
steps:
|
||||||
|
- name: Install dependencies from build_linux.sh
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
mkdir -p ${{ github.workspace }}/deps/build/OrcaSlicer_dep
|
||||||
|
sudo env "ORCA_UPDATER_SIG_KEY=$ORCA_UPDATER_SIG_KEY" ./build_linux.sh -ur
|
||||||
|
sudo chown $USER -R ./
|
||||||
18
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
# Only care about major updates to github actions
|
||||||
|
- package-ecosystem: "github-actions"
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: "monthly"
|
||||||
|
ignore: # Only suggest major updates for built-in actions
|
||||||
|
- dependency-name: "github/*"
|
||||||
|
update-types: ["version-update:semver-patch", "version-update:semver-minor"]
|
||||||
|
- dependency-name: "actions/*"
|
||||||
|
update-types: ["version-update:semver-patch", "version-update:semver-minor"]
|
||||||
|
# Docker dependencies
|
||||||
|
- package-ecosystem: "docker"
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: "monthly"
|
||||||
|
# no support for c/cpp
|
||||||
21
.github/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# Description
|
||||||
|
|
||||||
|
<!--
|
||||||
|
> Please provide a summary of the changes made in this PR. Include details such as:
|
||||||
|
> * What issue does this PR address or fix?
|
||||||
|
> * What new features or enhancements does this PR introduce?
|
||||||
|
> * Are there any breaking changes or dependencies that need to be considered?
|
||||||
|
-->
|
||||||
|
|
||||||
|
# Screenshots/Recordings/Graphs
|
||||||
|
|
||||||
|
<!--
|
||||||
|
> Please attach relevant screenshots to showcase the UI changes.
|
||||||
|
> Please attach images that can help explain the changes.
|
||||||
|
-->
|
||||||
|
|
||||||
|
## Tests
|
||||||
|
|
||||||
|
<!--
|
||||||
|
> Please describe the tests that you have conducted to verify the changes made in this PR.
|
||||||
|
-->
|
||||||
26
.github/workflows/assign.yml
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
name: Assign Issue
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: 0 0 * * *
|
||||||
|
issue_comment:
|
||||||
|
types: [created]
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
assign:
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Assign the user or unassign stale assignments
|
||||||
|
# Note: v3.0.0 is broken (dist/index.mjs vs action.yml expects index.js)
|
||||||
|
# See: https://github.com/takanome-dev/assign-issue-action/issues/426
|
||||||
|
uses: takanome-dev/assign-issue-action@v2.2
|
||||||
|
with:
|
||||||
|
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
maintainers: 'noisyfox,softfever'
|
||||||
|
days_until_unassign: 30
|
||||||
|
block_assignment: false
|
||||||
|
reminder_days: 7
|
||||||
|
max_assignments: 12
|
||||||
31
.github/workflows/auto-close-duplicates.yml
vendored
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
name: Auto-close duplicate issues
|
||||||
|
description: Auto-closes issues that are duplicates of existing issues
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "0 9 * * *"
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
auto-close-duplicates:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 10
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
issues: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
|
- name: Setup Bun
|
||||||
|
uses: oven-sh/setup-bun@v2
|
||||||
|
with:
|
||||||
|
bun-version: latest
|
||||||
|
|
||||||
|
- name: Auto-close duplicate issues
|
||||||
|
run: bun run scripts/auto-close-duplicates.ts
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
GITHUB_REPOSITORY_OWNER: ${{ github.repository_owner }}
|
||||||
|
GITHUB_REPOSITORY_NAME: ${{ github.event.repository.name }}
|
||||||
|
STATSIG_API_KEY: ${{ secrets.STATSIG_API_KEY }}
|
||||||
44
.github/workflows/backfill-duplicate-comments.yml
vendored
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
name: Backfill Duplicate Comments
|
||||||
|
description: Triggers duplicate detection for old issues that don't have duplicate comments
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
days_back:
|
||||||
|
description: 'How many days back to look for old issues'
|
||||||
|
required: false
|
||||||
|
default: '90'
|
||||||
|
type: string
|
||||||
|
dry_run:
|
||||||
|
description: 'Dry run mode (true to only log what would be done)'
|
||||||
|
required: false
|
||||||
|
default: 'true'
|
||||||
|
type: choice
|
||||||
|
options:
|
||||||
|
- 'true'
|
||||||
|
- 'false'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
backfill-duplicate-comments:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 30
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
issues: read
|
||||||
|
actions: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
|
- name: Setup Bun
|
||||||
|
uses: oven-sh/setup-bun@v2
|
||||||
|
with:
|
||||||
|
bun-version: latest
|
||||||
|
|
||||||
|
- name: Backfill duplicate comments
|
||||||
|
run: bun run scripts/backfill-duplicate-comments.ts
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
DAYS_BACK: ${{ inputs.days_back }}
|
||||||
|
DRY_RUN: ${{ inputs.dry_run }}
|
||||||
55
.github/workflows/build_all.yml
vendored
Normal file
@@ -0,0 +1,55 @@
|
|||||||
|
name: Build all (manual only)
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
build-deps-only:
|
||||||
|
description: 'Only build dependencies (bypasses caching)'
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}-${{ github.event_name }}-${{ github.event.pull_request.number || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build_linux:
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
uses: ./.github/workflows/build_check_cache.yml
|
||||||
|
with:
|
||||||
|
os: ${{ vars.SELF_HOSTED && 'orca-lnx-server' || 'ubuntu-24.04' }}
|
||||||
|
build-deps-only: ${{ inputs.build-deps-only || false }}
|
||||||
|
secrets: inherit
|
||||||
|
|
||||||
|
build_windows:
|
||||||
|
uses: ./.github/workflows/build_check_cache.yml
|
||||||
|
with:
|
||||||
|
os: ${{ vars.SELF_HOSTED && 'orca-win-server' || 'windows-latest' }}
|
||||||
|
build-deps-only: ${{ inputs.build-deps-only || false }}
|
||||||
|
secrets: inherit
|
||||||
|
|
||||||
|
build_macos_arch:
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
arch:
|
||||||
|
- arm64
|
||||||
|
- x86_64
|
||||||
|
uses: ./.github/workflows/build_check_cache.yml
|
||||||
|
with:
|
||||||
|
os: ${{ vars.SELF_HOSTED && 'orca-macos-arm64' || 'macos-14' }}
|
||||||
|
arch: ${{ matrix.arch }}
|
||||||
|
build-deps-only: ${{ inputs.build-deps-only || false }}
|
||||||
|
secrets: inherit
|
||||||
|
|
||||||
|
build_macos_universal:
|
||||||
|
name: Build macOS Universal
|
||||||
|
needs: build_macos_arch
|
||||||
|
if: ${{ !cancelled() && needs.build_macos_arch.result == 'success' && !inputs.build-deps-only }}
|
||||||
|
uses: ./.github/workflows/build_orca.yml
|
||||||
|
with:
|
||||||
|
os: ${{ vars.SELF_HOSTED && 'orca-macos-arm64' || 'macos-14' }}
|
||||||
|
arch: universal
|
||||||
|
macos-combine-only: true
|
||||||
|
secrets: inherit
|
||||||
64
.github/workflows/build_check_cache.yml
vendored
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
name: Check Cache
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
os:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
arch:
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
build-deps-only:
|
||||||
|
required: false
|
||||||
|
type: boolean
|
||||||
|
force-build:
|
||||||
|
required: false
|
||||||
|
type: boolean
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check_cache: # determines if there is a cache and outputs variables used in caching process
|
||||||
|
name: Check Cache
|
||||||
|
runs-on: ${{ inputs.os }}
|
||||||
|
outputs:
|
||||||
|
cache-key: ${{ steps.set_outputs.outputs.cache-key }}
|
||||||
|
cache-path: ${{ steps.set_outputs.outputs.cache-path }}
|
||||||
|
valid-cache: ${{ steps.cache_deps.outputs.cache-hit }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
lfs: 'false'
|
||||||
|
|
||||||
|
- name: set outputs
|
||||||
|
id: set_outputs
|
||||||
|
env:
|
||||||
|
# Keep macOS cache keys and paths architecture-specific.
|
||||||
|
cache-os: ${{ runner.os == 'macOS' && format('macos-{0}', inputs.arch) || (runner.os == 'Windows' && 'windows' || 'linux-clang') }}
|
||||||
|
dep-folder-name: ${{ runner.os == 'macOS' && format('/{0}', inputs.arch) || '/OrcaSlicer_dep' }}
|
||||||
|
output-cmd: ${{ runner.os == 'Windows' && '$env:GITHUB_OUTPUT' || '"$GITHUB_OUTPUT"'}}
|
||||||
|
run: |
|
||||||
|
echo cache-key=${{ env.cache-os }}-cache-orcaslicer_deps-build-${{ hashFiles('deps/**') }} >> ${{ env.output-cmd }}
|
||||||
|
echo cache-path=${{ github.workspace }}/deps/build${{ env.dep-folder-name }} >> ${{ env.output-cmd }}
|
||||||
|
|
||||||
|
- name: load cache
|
||||||
|
id: cache_deps
|
||||||
|
uses: actions/cache@v5
|
||||||
|
with:
|
||||||
|
path: ${{ steps.set_outputs.outputs.cache-path }}
|
||||||
|
key: ${{ steps.set_outputs.outputs.cache-key }}
|
||||||
|
lookup-only: true
|
||||||
|
|
||||||
|
build_deps: # call next step
|
||||||
|
name: Build Deps
|
||||||
|
needs: [check_cache]
|
||||||
|
uses: ./.github/workflows/build_deps.yml
|
||||||
|
with:
|
||||||
|
cache-key: ${{ needs.check_cache.outputs.cache-key }}
|
||||||
|
cache-path: ${{ needs.check_cache.outputs.cache-path }}
|
||||||
|
valid-cache: ${{ needs.check_cache.outputs.valid-cache == 'true' }}
|
||||||
|
os: ${{ inputs.os }}
|
||||||
|
arch: ${{ inputs.arch }}
|
||||||
|
build-deps-only: ${{ inputs.build-deps-only }}
|
||||||
|
force-build: ${{ inputs.force-build }}
|
||||||
|
secrets: inherit
|
||||||
140
.github/workflows/build_deps.yml
vendored
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
cache-key:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
cache-path:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
valid-cache:
|
||||||
|
required: true
|
||||||
|
type: boolean
|
||||||
|
os:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
arch:
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
build-deps-only:
|
||||||
|
required: false
|
||||||
|
type: boolean
|
||||||
|
force-build:
|
||||||
|
required: false
|
||||||
|
type: boolean
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build_deps:
|
||||||
|
name: Build Deps
|
||||||
|
if: ${{ !cancelled() && (inputs.build-deps-only || inputs.force-build || inputs.valid-cache != true) }}
|
||||||
|
runs-on: ${{ inputs.os }}
|
||||||
|
env:
|
||||||
|
date:
|
||||||
|
steps:
|
||||||
|
|
||||||
|
# Setup the environment
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
lfs: 'false'
|
||||||
|
|
||||||
|
- name: load cached deps
|
||||||
|
uses: actions/cache@v5
|
||||||
|
with:
|
||||||
|
path: ${{ inputs.cache-path }}
|
||||||
|
key: ${{ inputs.cache-key }}
|
||||||
|
|
||||||
|
- uses: lukka/get-cmake@latest
|
||||||
|
with:
|
||||||
|
cmakeVersion: "~4.3.0" # use most recent 4.3.x version
|
||||||
|
useLocalCache: true # <--= Use the local cache (default is 'false').
|
||||||
|
useCloudCache: true
|
||||||
|
|
||||||
|
- name: setup dev on Windows
|
||||||
|
if: runner.os == 'Windows'
|
||||||
|
uses: microsoft/setup-msbuild@v3
|
||||||
|
|
||||||
|
- name: Get the date on Ubuntu and macOS
|
||||||
|
if: runner.os != 'Windows'
|
||||||
|
run: echo "date=$(date +'%Y%m%d')" >> $GITHUB_ENV
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
- name: Get the date on Windows
|
||||||
|
if: runner.os == 'Windows'
|
||||||
|
run: echo "date=$(Get-Date -Format 'yyyyMMdd')" | Out-File -Append -FilePath $env:GITHUB_ENV -Encoding utf8
|
||||||
|
shell: pwsh
|
||||||
|
|
||||||
|
|
||||||
|
# Build Dependencies
|
||||||
|
- name: Build on Windows
|
||||||
|
if: runner.os == 'Windows'
|
||||||
|
working-directory: ${{ github.workspace }}
|
||||||
|
run: |
|
||||||
|
if (-not "${{ vars.SELF_HOSTED }}") {
|
||||||
|
choco install strawberryperl
|
||||||
|
}
|
||||||
|
.\build_release_vs.bat deps
|
||||||
|
.\build_release_vs.bat pack
|
||||||
|
shell: pwsh
|
||||||
|
|
||||||
|
- name: Build on Mac ${{ inputs.arch }}
|
||||||
|
if: runner.os == 'macOS'
|
||||||
|
working-directory: ${{ github.workspace }}
|
||||||
|
run: |
|
||||||
|
if [ -z "${{ vars.SELF_HOSTED }}" ]; then
|
||||||
|
brew install automake texinfo libtool
|
||||||
|
fi
|
||||||
|
./build_release_macos.sh -dx ${{ !vars.SELF_HOSTED && '-1' || '' }} -a ${{ inputs.arch }} -t 10.15
|
||||||
|
(cd "${{ github.workspace }}/deps/build/${{ inputs.arch }}" && \
|
||||||
|
find . -mindepth 1 -maxdepth 1 ! -name 'OrcaSlicer_dep' -exec rm -rf {} +)
|
||||||
|
|
||||||
|
|
||||||
|
- name: Apt-Install Dependencies
|
||||||
|
if: runner.os == 'Linux' && !vars.SELF_HOSTED
|
||||||
|
uses: ./.github/actions/apt-install-deps
|
||||||
|
|
||||||
|
- name: Build on Ubuntu
|
||||||
|
if: runner.os == 'Linux'
|
||||||
|
working-directory: ${{ github.workspace }}
|
||||||
|
run: |
|
||||||
|
mkdir -p ${{ github.workspace }}/deps/build/destdir
|
||||||
|
./build_linux.sh -drlL
|
||||||
|
cd deps/build
|
||||||
|
tar -czvf OrcaSlicer_dep_ubuntu_$(date +"%Y%m%d").tar.gz destdir
|
||||||
|
|
||||||
|
|
||||||
|
# Upload Artifacts
|
||||||
|
# - name: Upload Mac ${{ inputs.arch }} artifacts
|
||||||
|
# if: runner.os == 'macOS'
|
||||||
|
# uses: actions/upload-artifact@v6
|
||||||
|
# with:
|
||||||
|
# name: OrcaSlicer_dep_mac_${{ env.date }}
|
||||||
|
# path: ${{ github.workspace }}/deps/build/OrcaSlicer_dep*.tar.gz
|
||||||
|
|
||||||
|
# - name: Upload Windows artifacts
|
||||||
|
# if: runner.os == 'Windows'
|
||||||
|
# uses: actions/upload-artifact@v6
|
||||||
|
# with:
|
||||||
|
# name: OrcaSlicer_dep_win64_${{ env.date }}
|
||||||
|
# path: ${{ github.workspace }}/deps/build/OrcaSlicer_dep*.zip
|
||||||
|
|
||||||
|
# - name: Upload Ubuntu artifacts
|
||||||
|
# if: runner.os == 'Linux' && !env.ACT
|
||||||
|
# env:
|
||||||
|
# ubuntu-ver: '2404'
|
||||||
|
# uses: actions/upload-artifact@v6
|
||||||
|
# with:
|
||||||
|
# name: OrcaSlicer_dep_ubuntu_${{ env.ubuntu-ver }}_${{ env.date }}
|
||||||
|
# path: ${{ github.workspace }}/deps/build/OrcaSlicer_dep_ubuntu_*.tar.gz
|
||||||
|
|
||||||
|
build_orca:
|
||||||
|
name: Build OrcaSlicer
|
||||||
|
needs: [build_deps]
|
||||||
|
if: ${{ !cancelled() && !inputs.build-deps-only && (inputs.force-build || (inputs.valid-cache == true && needs.build_deps.result == 'skipped') || (inputs.valid-cache != true && success())) }}
|
||||||
|
uses: ./.github/workflows/build_orca.yml
|
||||||
|
with:
|
||||||
|
cache-key: ${{ inputs.cache-key }}
|
||||||
|
cache-path: ${{ inputs.cache-path }}
|
||||||
|
os: ${{ inputs.os }}
|
||||||
|
arch: ${{ inputs.arch }}
|
||||||
|
secrets: inherit
|
||||||
120
.github/workflows/build_linux_appimage.yml
vendored
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
name: Build Linux AppImage
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: build-linux-appimage-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
env:
|
||||||
|
CACHE_REV: v1
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
linux_appimage_ubuntu24:
|
||||||
|
name: Linux AppImage (ubuntu-24.04)
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
timeout-minutes: 360
|
||||||
|
env:
|
||||||
|
DIST_ID: ubuntu24.04
|
||||||
|
EVENT_TAG: ${{ github.event.release.tag_name }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
lfs: 'false'
|
||||||
|
|
||||||
|
- uses: lukka/get-cmake@latest
|
||||||
|
with:
|
||||||
|
cmakeVersion: "~4.3.0"
|
||||||
|
useLocalCache: true
|
||||||
|
useCloudCache: true
|
||||||
|
|
||||||
|
- name: Compute version
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
tag="${EVENT_TAG:-${GITHUB_REF_NAME:-}}"
|
||||||
|
if [[ "$tag" == v* ]]; then
|
||||||
|
ver="${tag#v}"
|
||||||
|
else
|
||||||
|
ver="git${GITHUB_SHA::7}"
|
||||||
|
fi
|
||||||
|
echo "VER=$ver" >> "$GITHUB_ENV"
|
||||||
|
|
||||||
|
- name: Compute deps cache key
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
deps_tree="$(git rev-parse HEAD:deps 2>/dev/null || echo no-deps)"
|
||||||
|
recipe_hash="$(find build_linux.sh scripts/linux.d -type f -print0 | sort -z | xargs -0 cat | sha256sum | cut -c1-12)"
|
||||||
|
echo "DEPS_CACHE_KEY=linux-${DIST_ID}-deps-${deps_tree}-${recipe_hash}-${CACHE_REV}" >> "$GITHUB_ENV"
|
||||||
|
|
||||||
|
- name: Apt-Install Dependencies
|
||||||
|
uses: ./.github/actions/apt-install-deps
|
||||||
|
|
||||||
|
- name: Linux - cache deps
|
||||||
|
id: cache_linux_deps
|
||||||
|
uses: actions/cache@v5
|
||||||
|
with:
|
||||||
|
path: ${{ github.workspace }}/deps/build/OrcaSlicer_dep
|
||||||
|
key: ${{ env.DEPS_CACHE_KEY }}
|
||||||
|
|
||||||
|
- name: Linux - build deps if missing
|
||||||
|
if: steps.cache_linux_deps.outputs.cache-hit != 'true'
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
for attempt in 1 2 3; do
|
||||||
|
echo "Build Linux deps attempt $attempt"
|
||||||
|
if ./build_linux.sh -drlL; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
if [ "$attempt" -lt 3 ]; then
|
||||||
|
echo "Transient dependency download/build failure, retrying after backoff"
|
||||||
|
sleep $((attempt * 20))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
exit 1
|
||||||
|
|
||||||
|
- name: Linux - build AppImage
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
rm -rf build build-dbg build-dbginfo out
|
||||||
|
mkdir -p out
|
||||||
|
|
||||||
|
./build_linux.sh -istrlL
|
||||||
|
./scripts/check_appimage_libs.sh ./build/package ./build/package/bin/orca-slicer
|
||||||
|
|
||||||
|
mapfile -t appimages < <(find build -maxdepth 3 -type f -name '*.AppImage' ! -name 'appimagetool.AppImage' | LC_ALL=C sort)
|
||||||
|
|
||||||
|
if (( ${#appimages[@]} == 0 )); then
|
||||||
|
echo "ERROR: AppImage not produced"
|
||||||
|
find build -maxdepth 3 -type f | LC_ALL=C sort
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if (( ${#appimages[@]} > 1 )); then
|
||||||
|
echo "INFO: multiple AppImage candidates found, using the first sorted entry"
|
||||||
|
printf '%s\n' "${appimages[@]}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
appimage="${appimages[0]}"
|
||||||
|
mv "$appimage" "out/OrcaSlicer-BMCU_Linux_AppImage_${DIST_ID}_amd64_${VER}.AppImage"
|
||||||
|
chmod +x "out/OrcaSlicer-BMCU_Linux_AppImage_${DIST_ID}_amd64_${VER}.AppImage"
|
||||||
|
|
||||||
|
- name: Linux - checksums
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
(cd out && sha256sum * > "SHA256SUMS_${DIST_ID}_appimage.txt")
|
||||||
|
|
||||||
|
- name: Upload artifacts (Linux AppImage ubuntu24.04)
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: orcaslicer-bmcu-linux-appimage-${{ env.DIST_ID }}-${{ github.sha }}
|
||||||
|
path: out/
|
||||||
|
if-no-files-found: error
|
||||||
439
.github/workflows/build_linux_portable.yml
vendored
Normal file
@@ -0,0 +1,439 @@
|
|||||||
|
name: Build Linux Portable
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: build-linux-portable-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
env:
|
||||||
|
CACHE_REV: v1
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
linux_ubuntu22:
|
||||||
|
name: Linux (ubuntu-22.04)
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
timeout-minutes: 360
|
||||||
|
env:
|
||||||
|
DIST_ID: ubuntu22.04
|
||||||
|
EVENT_TAG: ${{ github.event.release.tag_name }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
lfs: 'false'
|
||||||
|
|
||||||
|
- uses: lukka/get-cmake@latest
|
||||||
|
with:
|
||||||
|
cmakeVersion: "~4.3.0"
|
||||||
|
useLocalCache: true
|
||||||
|
useCloudCache: true
|
||||||
|
|
||||||
|
- name: Compute version
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
tag="${EVENT_TAG:-${GITHUB_REF_NAME:-}}"
|
||||||
|
if [[ "$tag" == v* ]]; then
|
||||||
|
ver="${tag#v}"
|
||||||
|
else
|
||||||
|
ver="git${GITHUB_SHA::7}"
|
||||||
|
fi
|
||||||
|
echo "VER=$ver" >> "$GITHUB_ENV"
|
||||||
|
|
||||||
|
- name: Compute deps cache key
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
deps_tree="$(git rev-parse HEAD:deps 2>/dev/null || echo no-deps)"
|
||||||
|
recipe_hash="$(find build_linux.sh scripts/linux.d -type f -print0 | sort -z | xargs -0 cat | sha256sum | cut -c1-12)"
|
||||||
|
echo "DEPS_CACHE_KEY=linux-${DIST_ID}-deps-${deps_tree}-${recipe_hash}-${CACHE_REV}" >> "$GITHUB_ENV"
|
||||||
|
|
||||||
|
- name: Apt-Install Dependencies
|
||||||
|
uses: ./.github/actions/apt-install-deps
|
||||||
|
|
||||||
|
- name: Linux - cache deps
|
||||||
|
id: cache_linux_deps
|
||||||
|
uses: actions/cache@v5
|
||||||
|
with:
|
||||||
|
path: ${{ github.workspace }}/deps/build/OrcaSlicer_dep
|
||||||
|
key: ${{ env.DEPS_CACHE_KEY }}
|
||||||
|
|
||||||
|
- name: Linux - build deps if missing
|
||||||
|
if: steps.cache_linux_deps.outputs.cache-hit != 'true'
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
for attempt in 1 2 3; do
|
||||||
|
echo "Build Linux deps attempt $attempt"
|
||||||
|
if ./build_linux.sh -drlL; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
if [ "$attempt" -lt 3 ]; then
|
||||||
|
echo "Transient dependency download/build failure, retrying after backoff"
|
||||||
|
sleep $((attempt * 20))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
exit 1
|
||||||
|
|
||||||
|
- name: Linux - build + install
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
rm -rf build install-dir out
|
||||||
|
mkdir -p out
|
||||||
|
|
||||||
|
cmake -S . -B build -G "Ninja Multi-Config" \
|
||||||
|
-DCMAKE_PREFIX_PATH="${PWD}/deps/build/OrcaSlicer_dep/usr/local" \
|
||||||
|
-DSLIC3R_STATIC=1 \
|
||||||
|
-DSLIC3R_GTK=3 \
|
||||||
|
-DBBL_RELEASE_TO_PUBLIC=1 \
|
||||||
|
-DBBL_INTERNAL_TESTING=0 \
|
||||||
|
-DSLIC3R_PCH=ON \
|
||||||
|
-DORCA_TOOLS=ON \
|
||||||
|
-DCMAKE_INSTALL_PREFIX="${PWD}/install-dir"
|
||||||
|
|
||||||
|
cmake --build build --config Release --target install -j"$(nproc)"
|
||||||
|
|
||||||
|
./scripts/run_gettext.sh
|
||||||
|
mkdir -p install-dir/resources/i18n
|
||||||
|
cp -a resources/i18n/. install-dir/resources/i18n/
|
||||||
|
|
||||||
|
app_bin=""
|
||||||
|
for candidate in \
|
||||||
|
"install-dir/bin/OrcaSlicer" \
|
||||||
|
"install-dir/bin/orca-slicer" \
|
||||||
|
"install-dir/OrcaSlicer" \
|
||||||
|
"install-dir/orca-slicer"; do
|
||||||
|
if [ -x "$candidate" ]; then
|
||||||
|
app_bin="${candidate#install-dir/}"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -z "$app_bin" ]; then
|
||||||
|
echo "ERROR: installed OrcaSlicer binary not found"
|
||||||
|
find install-dir -maxdepth 3 -type f | sort
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "APP_BIN=$app_bin" >> "$GITHUB_ENV"
|
||||||
|
tar -C install-dir -czf "out/OrcaSlicer-BMCU_LinuxDir_${DIST_ID}_amd64_${VER}.tar.gz" .
|
||||||
|
|
||||||
|
- name: Linux - build AppImage (best-effort)
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
if [ -x "build/src/build_linux_image.sh" ]; then
|
||||||
|
(cd build && ./src/build_linux_image.sh -i -R Release) || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
appimage="$(find build -maxdepth 3 -type f -name '*.AppImage' | head -n 1 || true)"
|
||||||
|
if [ -n "$appimage" ]; then
|
||||||
|
mv "$appimage" "out/OrcaSlicer-BMCU_${DIST_ID}_amd64_${VER}.AppImage"
|
||||||
|
chmod +x "out/OrcaSlicer-BMCU_${DIST_ID}_amd64_${VER}.AppImage"
|
||||||
|
else
|
||||||
|
echo "WARN: no AppImage produced"
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Linux - build .deb from install-dir
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y dpkg-dev fakeroot binutils
|
||||||
|
|
||||||
|
rm -rf pkgroot debian
|
||||||
|
mkdir -p pkgroot/DEBIAN pkgroot/opt/orcaslicer pkgroot/usr/bin
|
||||||
|
cp -a install-dir/. pkgroot/opt/orcaslicer/
|
||||||
|
|
||||||
|
cat > pkgroot/usr/bin/orca-slicer-bmcu <<EOF
|
||||||
|
#!/bin/sh
|
||||||
|
exec /opt/orcaslicer/${APP_BIN} "$@"
|
||||||
|
EOF
|
||||||
|
chmod 0755 pkgroot/usr/bin/orca-slicer-bmcu
|
||||||
|
|
||||||
|
if [[ "${EVENT_TAG:-${GITHUB_REF_NAME:-}}" == v* ]]; then
|
||||||
|
deb_ver="${VER}~${DIST_ID}"
|
||||||
|
else
|
||||||
|
deb_ver="0.0~${VER}~${DIST_ID}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p debian
|
||||||
|
cat > debian/control <<'EOF'
|
||||||
|
Source: orcaslicer-bmcu
|
||||||
|
Section: utils
|
||||||
|
Priority: optional
|
||||||
|
Maintainer: PJARCZAK CI <ci@invalid>
|
||||||
|
Standards-Version: 4.6.2
|
||||||
|
|
||||||
|
Package: orcaslicer-bmcu
|
||||||
|
Architecture: amd64
|
||||||
|
Description: dummy control for dpkg-shlibdeps
|
||||||
|
EOF
|
||||||
|
|
||||||
|
depends=""
|
||||||
|
if [ -x "pkgroot/opt/orcaslicer/${APP_BIN}" ]; then
|
||||||
|
set +e
|
||||||
|
out="$(dpkg-shlibdeps --ignore-missing-info -O \
|
||||||
|
-lpkgroot/opt/orcaslicer/bin \
|
||||||
|
-lpkgroot/opt/orcaslicer/lib \
|
||||||
|
-lpkgroot/opt/orcaslicer/lib64 \
|
||||||
|
pkgroot/opt/orcaslicer/${APP_BIN} 2>&1)"
|
||||||
|
rc=$?
|
||||||
|
set -e
|
||||||
|
|
||||||
|
if [ $rc -eq 0 ]; then
|
||||||
|
depends="$(printf "%s\n" "$out" | sed -n 's/^shlibs:Depends=//p' | tail -n 1)"
|
||||||
|
else
|
||||||
|
echo "WARN: dpkg-shlibdeps failed:"
|
||||||
|
echo "$out"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -z "$depends" ]]; then
|
||||||
|
depends="libc6, libstdc++6, libgcc-s1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat > pkgroot/DEBIAN/control <<EOF
|
||||||
|
Package: orcaslicer-bmcu
|
||||||
|
Version: ${deb_ver}
|
||||||
|
Section: utils
|
||||||
|
Priority: optional
|
||||||
|
Architecture: amd64
|
||||||
|
Maintainer: PJARCZAK CI <ci@invalid>
|
||||||
|
Depends: ${depends}
|
||||||
|
Description: OrcaSlicer BMCU build (installed in /opt/orcaslicer)
|
||||||
|
Wrapper: /usr/bin/orca-slicer-bmcu
|
||||||
|
EOF
|
||||||
|
|
||||||
|
fakeroot dpkg-deb --build pkgroot "out/OrcaSlicer-BMCU_${DIST_ID}_amd64_${VER}.deb"
|
||||||
|
|
||||||
|
- name: Linux - checksums
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
(cd out && sha256sum * > "SHA256SUMS_${DIST_ID}.txt")
|
||||||
|
|
||||||
|
- name: Upload artifacts (Linux ubuntu22.04)
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: orcaslicer-bmcu-linux-${{ env.DIST_ID }}-${{ github.sha }}
|
||||||
|
path: out/
|
||||||
|
if-no-files-found: error
|
||||||
|
|
||||||
|
linux_ubuntu24:
|
||||||
|
name: Linux (ubuntu-24.04)
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
timeout-minutes: 360
|
||||||
|
env:
|
||||||
|
DIST_ID: ubuntu24.04
|
||||||
|
EVENT_TAG: ${{ github.event.release.tag_name }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
lfs: 'false'
|
||||||
|
|
||||||
|
- uses: lukka/get-cmake@latest
|
||||||
|
with:
|
||||||
|
cmakeVersion: "~4.3.0"
|
||||||
|
useLocalCache: true
|
||||||
|
useCloudCache: true
|
||||||
|
|
||||||
|
- name: Compute version
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
tag="${EVENT_TAG:-${GITHUB_REF_NAME:-}}"
|
||||||
|
if [[ "$tag" == v* ]]; then
|
||||||
|
ver="${tag#v}"
|
||||||
|
else
|
||||||
|
ver="git${GITHUB_SHA::7}"
|
||||||
|
fi
|
||||||
|
echo "VER=$ver" >> "$GITHUB_ENV"
|
||||||
|
|
||||||
|
- name: Compute deps cache key
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
deps_tree="$(git rev-parse HEAD:deps 2>/dev/null || echo no-deps)"
|
||||||
|
recipe_hash="$(find build_linux.sh scripts/linux.d -type f -print0 | sort -z | xargs -0 cat | sha256sum | cut -c1-12)"
|
||||||
|
echo "DEPS_CACHE_KEY=linux-${DIST_ID}-deps-${deps_tree}-${recipe_hash}-${CACHE_REV}" >> "$GITHUB_ENV"
|
||||||
|
|
||||||
|
- name: Apt-Install Dependencies
|
||||||
|
uses: ./.github/actions/apt-install-deps
|
||||||
|
|
||||||
|
- name: Linux - cache deps
|
||||||
|
id: cache_linux_deps
|
||||||
|
uses: actions/cache@v5
|
||||||
|
with:
|
||||||
|
path: ${{ github.workspace }}/deps/build/OrcaSlicer_dep
|
||||||
|
key: ${{ env.DEPS_CACHE_KEY }}
|
||||||
|
|
||||||
|
- name: Linux - build deps if missing
|
||||||
|
if: steps.cache_linux_deps.outputs.cache-hit != 'true'
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
for attempt in 1 2 3; do
|
||||||
|
echo "Build Linux deps attempt $attempt"
|
||||||
|
if ./build_linux.sh -drlL; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
if [ "$attempt" -lt 3 ]; then
|
||||||
|
echo "Transient dependency download/build failure, retrying after backoff"
|
||||||
|
sleep $((attempt * 20))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
exit 1
|
||||||
|
|
||||||
|
- name: Linux - build + install
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
rm -rf build install-dir out
|
||||||
|
mkdir -p out
|
||||||
|
|
||||||
|
cmake -S . -B build -G "Ninja Multi-Config" \
|
||||||
|
-DCMAKE_PREFIX_PATH="${PWD}/deps/build/OrcaSlicer_dep/usr/local" \
|
||||||
|
-DSLIC3R_STATIC=1 \
|
||||||
|
-DSLIC3R_GTK=3 \
|
||||||
|
-DBBL_RELEASE_TO_PUBLIC=1 \
|
||||||
|
-DBBL_INTERNAL_TESTING=0 \
|
||||||
|
-DSLIC3R_PCH=ON \
|
||||||
|
-DORCA_TOOLS=ON \
|
||||||
|
-DCMAKE_INSTALL_PREFIX="${PWD}/install-dir"
|
||||||
|
|
||||||
|
cmake --build build --config Release --target install -j"$(nproc)"
|
||||||
|
|
||||||
|
./scripts/run_gettext.sh
|
||||||
|
mkdir -p install-dir/resources/i18n
|
||||||
|
cp -a resources/i18n/. install-dir/resources/i18n/
|
||||||
|
|
||||||
|
app_bin=""
|
||||||
|
for candidate in \
|
||||||
|
"install-dir/bin/OrcaSlicer" \
|
||||||
|
"install-dir/bin/orca-slicer" \
|
||||||
|
"install-dir/OrcaSlicer" \
|
||||||
|
"install-dir/orca-slicer"; do
|
||||||
|
if [ -x "$candidate" ]; then
|
||||||
|
app_bin="${candidate#install-dir/}"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -z "$app_bin" ]; then
|
||||||
|
echo "ERROR: installed OrcaSlicer binary not found"
|
||||||
|
find install-dir -maxdepth 3 -type f | sort
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "APP_BIN=$app_bin" >> "$GITHUB_ENV"
|
||||||
|
tar -C install-dir -czf "out/OrcaSlicer-BMCU_LinuxDir_${DIST_ID}_amd64_${VER}.tar.gz" .
|
||||||
|
|
||||||
|
- name: Linux - build AppImage (best-effort)
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
if [ -x "build/src/build_linux_image.sh" ]; then
|
||||||
|
(cd build && ./src/build_linux_image.sh -i -R Release) || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
appimage="$(find build -maxdepth 3 -type f -name '*.AppImage' | head -n 1 || true)"
|
||||||
|
if [ -n "$appimage" ]; then
|
||||||
|
mv "$appimage" "out/OrcaSlicer-BMCU_${DIST_ID}_amd64_${VER}.AppImage"
|
||||||
|
chmod +x "out/OrcaSlicer-BMCU_${DIST_ID}_amd64_${VER}.AppImage"
|
||||||
|
else
|
||||||
|
echo "WARN: no AppImage produced"
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Linux - build .deb from install-dir
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y dpkg-dev fakeroot binutils
|
||||||
|
|
||||||
|
rm -rf pkgroot debian
|
||||||
|
mkdir -p pkgroot/DEBIAN pkgroot/opt/orcaslicer pkgroot/usr/bin
|
||||||
|
cp -a install-dir/. pkgroot/opt/orcaslicer/
|
||||||
|
|
||||||
|
cat > pkgroot/usr/bin/orca-slicer-bmcu <<EOF
|
||||||
|
#!/bin/sh
|
||||||
|
exec /opt/orcaslicer/${APP_BIN} "$@"
|
||||||
|
EOF
|
||||||
|
chmod 0755 pkgroot/usr/bin/orca-slicer-bmcu
|
||||||
|
|
||||||
|
if [[ "${EVENT_TAG:-${GITHUB_REF_NAME:-}}" == v* ]]; then
|
||||||
|
deb_ver="${VER}~${DIST_ID}"
|
||||||
|
else
|
||||||
|
deb_ver="0.0~${VER}~${DIST_ID}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p debian
|
||||||
|
cat > debian/control <<'EOF'
|
||||||
|
Source: orcaslicer-bmcu
|
||||||
|
Section: utils
|
||||||
|
Priority: optional
|
||||||
|
Maintainer: PJARCZAK CI <ci@invalid>
|
||||||
|
Standards-Version: 4.6.2
|
||||||
|
|
||||||
|
Package: orcaslicer-bmcu
|
||||||
|
Architecture: amd64
|
||||||
|
Description: dummy control for dpkg-shlibdeps
|
||||||
|
EOF
|
||||||
|
|
||||||
|
depends=""
|
||||||
|
if [ -x "pkgroot/opt/orcaslicer/${APP_BIN}" ]; then
|
||||||
|
set +e
|
||||||
|
out="$(dpkg-shlibdeps --ignore-missing-info -O \
|
||||||
|
-lpkgroot/opt/orcaslicer/bin \
|
||||||
|
-lpkgroot/opt/orcaslicer/lib \
|
||||||
|
-lpkgroot/opt/orcaslicer/lib64 \
|
||||||
|
pkgroot/opt/orcaslicer/${APP_BIN} 2>&1)"
|
||||||
|
rc=$?
|
||||||
|
set -e
|
||||||
|
|
||||||
|
if [ $rc -eq 0 ]; then
|
||||||
|
depends="$(printf "%s\n" "$out" | sed -n 's/^shlibs:Depends=//p' | tail -n 1)"
|
||||||
|
else
|
||||||
|
echo "WARN: dpkg-shlibdeps failed:"
|
||||||
|
echo "$out"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -z "$depends" ]]; then
|
||||||
|
depends="libc6, libstdc++6, libgcc-s1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
cat > pkgroot/DEBIAN/control <<EOF
|
||||||
|
Package: orcaslicer-bmcu
|
||||||
|
Version: ${deb_ver}
|
||||||
|
Section: utils
|
||||||
|
Priority: optional
|
||||||
|
Architecture: amd64
|
||||||
|
Maintainer: PJARCZAK CI <ci@invalid>
|
||||||
|
Depends: ${depends}
|
||||||
|
Description: OrcaSlicer BMCU build (installed in /opt/orcaslicer)
|
||||||
|
Wrapper: /usr/bin/orca-slicer-bmcu
|
||||||
|
EOF
|
||||||
|
|
||||||
|
fakeroot dpkg-deb --build pkgroot "out/OrcaSlicer-BMCU_${DIST_ID}_amd64_${VER}.deb"
|
||||||
|
|
||||||
|
- name: Linux - checksums
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
(cd out && sha256sum * > "SHA256SUMS_${DIST_ID}.txt")
|
||||||
|
|
||||||
|
- name: Upload artifacts (Linux ubuntu24.04)
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: orcaslicer-bmcu-linux-${{ env.DIST_ID }}-${{ github.sha }}
|
||||||
|
path: out/
|
||||||
|
if-no-files-found: error
|
||||||
241
.github/workflows/build_macos_bridge.yml
vendored
Normal file
@@ -0,0 +1,241 @@
|
|||||||
|
name: Build macOS with Linux bridge runtime
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
prepare_linux_bridge_runtime:
|
||||||
|
name: Prepare Linux bridge runtime
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
lfs: 'false'
|
||||||
|
|
||||||
|
- uses: lukka/get-cmake@latest
|
||||||
|
with:
|
||||||
|
cmakeVersion: "~4.3.0"
|
||||||
|
useLocalCache: true
|
||||||
|
useCloudCache: true
|
||||||
|
|
||||||
|
- name: Apt-Install Dependencies
|
||||||
|
uses: ./.github/actions/apt-install-deps
|
||||||
|
|
||||||
|
- name: Build Linux deps
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
for attempt in 1 2 3; do
|
||||||
|
echo "Build Linux deps attempt $attempt"
|
||||||
|
if ./build_linux.sh -drlL; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
if [ "$attempt" -lt 3 ]; then
|
||||||
|
echo "Transient dependency download/build failure, retrying after backoff"
|
||||||
|
sleep $((attempt * 20))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
exit 1
|
||||||
|
|
||||||
|
- name: Configure linux bridge host build
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
cmake -S . -B build -G "Ninja Multi-Config" -DORCA_TOOLS=ON
|
||||||
|
|
||||||
|
- name: Build linux host runtime
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
cmake --build build --config Release --target pjarczak_bambu_linux_host
|
||||||
|
bash tools/pjarczak_bambu_linux_host/package_linux_host_runtime.sh build
|
||||||
|
tar -czvf linux_host_runtime_${{ github.sha }}.tar.gz -C tools/pjarczak_bambu_linux_host/runtime linux-x86_64
|
||||||
|
|
||||||
|
- name: Upload linux host runtime artifact
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: linux_host_runtime_${{ github.sha }}
|
||||||
|
path: ./linux_host_runtime_${{ github.sha }}.tar.gz
|
||||||
|
if-no-files-found: error
|
||||||
|
|
||||||
|
build_macos_arm64:
|
||||||
|
name: Build macOS arm64
|
||||||
|
runs-on: macos-14
|
||||||
|
needs: prepare_linux_bridge_runtime
|
||||||
|
env:
|
||||||
|
ORCA_UPDATER_SIG_KEY: ${{ secrets.ORCA_UPDATER_SIG_KEY }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
lfs: 'false'
|
||||||
|
|
||||||
|
- uses: lukka/get-cmake@latest
|
||||||
|
with:
|
||||||
|
cmakeVersion: "~4.3.0"
|
||||||
|
useLocalCache: true
|
||||||
|
useCloudCache: true
|
||||||
|
|
||||||
|
- name: Download linux host runtime artifact
|
||||||
|
uses: actions/download-artifact@v8
|
||||||
|
with:
|
||||||
|
name: linux_host_runtime_${{ github.sha }}
|
||||||
|
path: ${{ github.workspace }}/linux_host_runtime_artifact
|
||||||
|
|
||||||
|
- name: Extract linux host runtime artifact on macOS arm64
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
mkdir -p "$GITHUB_WORKSPACE/tools/pjarczak_bambu_linux_host/runtime"
|
||||||
|
tar -xzf "$GITHUB_WORKSPACE/linux_host_runtime_artifact/linux_host_runtime_${{ github.sha }}.tar.gz" -C "$GITHUB_WORKSPACE/tools/pjarczak_bambu_linux_host/runtime"
|
||||||
|
|
||||||
|
- name: Install mac tools
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
brew install automake texinfo libtool
|
||||||
|
brew list
|
||||||
|
mkdir -p "$GITHUB_WORKSPACE/deps/build/arm64"
|
||||||
|
|
||||||
|
- name: Build macOS arm64 deps
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
./build_release_macos.sh -dx -1 -a arm64 -t 11.3
|
||||||
|
|
||||||
|
- name: Build macOS arm64 app bundle
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
./build_release_macos.sh -s -n -x -1 -a arm64 -t 11.3
|
||||||
|
|
||||||
|
- name: Pack macOS arm64 app bundle
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
tar -czvf OrcaSlicer_Mac_bundle_arm64_${{ github.sha }}.tar.gz -C build/arm64 OrcaSlicer
|
||||||
|
|
||||||
|
- name: Upload macOS arm64 app bundle
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: OrcaSlicer_Mac_bundle_arm64_${{ github.sha }}
|
||||||
|
path: ${{ github.workspace }}/OrcaSlicer_Mac_bundle_arm64_${{ github.sha }}.tar.gz
|
||||||
|
if-no-files-found: error
|
||||||
|
|
||||||
|
build_macos_x86_64:
|
||||||
|
name: Build macOS x86_64
|
||||||
|
runs-on: macos-14
|
||||||
|
needs: prepare_linux_bridge_runtime
|
||||||
|
env:
|
||||||
|
ORCA_UPDATER_SIG_KEY: ${{ secrets.ORCA_UPDATER_SIG_KEY }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
lfs: 'false'
|
||||||
|
|
||||||
|
- uses: lukka/get-cmake@latest
|
||||||
|
with:
|
||||||
|
cmakeVersion: "~4.3.0"
|
||||||
|
useLocalCache: true
|
||||||
|
useCloudCache: true
|
||||||
|
|
||||||
|
- name: Download linux host runtime artifact
|
||||||
|
uses: actions/download-artifact@v8
|
||||||
|
with:
|
||||||
|
name: linux_host_runtime_${{ github.sha }}
|
||||||
|
path: ${{ github.workspace }}/linux_host_runtime_artifact
|
||||||
|
|
||||||
|
- name: Extract linux host runtime artifact on macOS x86_64
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
mkdir -p "$GITHUB_WORKSPACE/tools/pjarczak_bambu_linux_host/runtime"
|
||||||
|
tar -xzf "$GITHUB_WORKSPACE/linux_host_runtime_artifact/linux_host_runtime_${{ github.sha }}.tar.gz" -C "$GITHUB_WORKSPACE/tools/pjarczak_bambu_linux_host/runtime"
|
||||||
|
|
||||||
|
- name: Install mac tools
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
brew install automake texinfo libtool
|
||||||
|
brew list
|
||||||
|
mkdir -p "$GITHUB_WORKSPACE/deps/build/x86_64"
|
||||||
|
|
||||||
|
- name: Build macOS x86_64 deps
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
./build_release_macos.sh -dx -1 -a x86_64 -t 11.3
|
||||||
|
|
||||||
|
- name: Build macOS x86_64 app bundle
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
./build_release_macos.sh -s -n -x -1 -a x86_64 -t 11.3
|
||||||
|
|
||||||
|
- name: Pack macOS x86_64 app bundle
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
tar -czvf OrcaSlicer_Mac_bundle_x86_64_${{ github.sha }}.tar.gz -C build/x86_64 OrcaSlicer
|
||||||
|
|
||||||
|
- name: Upload macOS x86_64 app bundle
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: OrcaSlicer_Mac_bundle_x86_64_${{ github.sha }}
|
||||||
|
path: ${{ github.workspace }}/OrcaSlicer_Mac_bundle_x86_64_${{ github.sha }}.tar.gz
|
||||||
|
if-no-files-found: error
|
||||||
|
|
||||||
|
build_macos_universal:
|
||||||
|
name: Build macOS universal
|
||||||
|
runs-on: macos-14
|
||||||
|
needs:
|
||||||
|
- build_macos_arm64
|
||||||
|
- build_macos_x86_64
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
lfs: 'false'
|
||||||
|
|
||||||
|
- uses: lukka/get-cmake@latest
|
||||||
|
with:
|
||||||
|
cmakeVersion: "~4.3.0"
|
||||||
|
useLocalCache: true
|
||||||
|
useCloudCache: true
|
||||||
|
|
||||||
|
- name: Download macOS app bundles
|
||||||
|
uses: actions/download-artifact@v8
|
||||||
|
with:
|
||||||
|
pattern: OrcaSlicer_Mac_bundle_*_${{ github.sha }}
|
||||||
|
path: ${{ github.workspace }}/mac_bundles
|
||||||
|
|
||||||
|
- name: Extract macOS app bundles
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
mkdir -p build/arm64 build/x86_64
|
||||||
|
arm_bundle=$(find "$GITHUB_WORKSPACE/mac_bundles/OrcaSlicer_Mac_bundle_arm64_${{ github.sha }}" -name '*.tar.gz' -print -quit)
|
||||||
|
x86_bundle=$(find "$GITHUB_WORKSPACE/mac_bundles/OrcaSlicer_Mac_bundle_x86_64_${{ github.sha }}" -name '*.tar.gz' -print -quit)
|
||||||
|
tar -xzvf "$arm_bundle" -C "$GITHUB_WORKSPACE/build/arm64"
|
||||||
|
tar -xzvf "$x86_bundle" -C "$GITHUB_WORKSPACE/build/x86_64"
|
||||||
|
|
||||||
|
- name: Build universal mac app bundle
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
./build_release_macos.sh -u -x -1 -a universal -t 11.3
|
||||||
|
|
||||||
|
- name: Create DMG without runtime validation
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
mkdir -p "$GITHUB_WORKSPACE/build/universal/OrcaSlicer_dmg"
|
||||||
|
rm -rf "$GITHUB_WORKSPACE/build/universal/OrcaSlicer_dmg"/*
|
||||||
|
cp -R "$GITHUB_WORKSPACE/build/universal/OrcaSlicer/OrcaSlicer.app" "$GITHUB_WORKSPACE/build/universal/OrcaSlicer_dmg/"
|
||||||
|
ln -sfn /Applications "$GITHUB_WORKSPACE/build/universal/OrcaSlicer_dmg/Applications"
|
||||||
|
ver=$(grep 'set(SoftFever_VERSION' version.inc | cut -d '"' -f2)
|
||||||
|
hdiutil create -volname "OrcaSlicer" -srcfolder "$GITHUB_WORKSPACE/build/universal/OrcaSlicer_dmg" -ov -format UDZO "OrcaSlicer_Mac_universal_V${ver}.dmg"
|
||||||
|
|
||||||
|
- name: Explain skipped hosted runtime validation
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
echo "Hosted macOS runners do not support nested virtualization, so bundled Lima runtime validation is intentionally skipped here."
|
||||||
|
|
||||||
|
- name: Upload macOS universal DMG
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: OrcaSlicer_Mac_universal_${{ github.sha }}
|
||||||
|
path: ${{ github.workspace }}/OrcaSlicer_Mac_universal_V*.dmg
|
||||||
|
if-no-files-found: error
|
||||||
464
.github/workflows/build_orca.yml
vendored
Normal file
@@ -0,0 +1,464 @@
|
|||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
cache-key:
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
cache-path:
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
os:
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
arch:
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
macos-combine-only:
|
||||||
|
required: false
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build_orca:
|
||||||
|
name: Build OrcaSlicer
|
||||||
|
runs-on: ${{ inputs.os }}
|
||||||
|
env:
|
||||||
|
date:
|
||||||
|
ver:
|
||||||
|
ver_pure:
|
||||||
|
ubuntu-ver: '2404'
|
||||||
|
ubuntu-ver-str: '_Ubuntu2404'
|
||||||
|
ORCA_UPDATER_SIG_KEY: ${{ secrets.ORCA_UPDATER_SIG_KEY }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
lfs: 'false'
|
||||||
|
|
||||||
|
- name: load cached deps
|
||||||
|
if: ${{ !(runner.os == 'macOS' && inputs.macos-combine-only) }}
|
||||||
|
uses: actions/cache@v5
|
||||||
|
with:
|
||||||
|
path: ${{ inputs.cache-path }}
|
||||||
|
key: ${{ inputs.cache-key }}
|
||||||
|
fail-on-cache-miss: true
|
||||||
|
|
||||||
|
- uses: lukka/get-cmake@latest
|
||||||
|
with:
|
||||||
|
cmakeVersion: "~4.3.0" # use most recent 4.3.x version
|
||||||
|
useLocalCache: true # <--= Use the local cache (default is 'false').
|
||||||
|
useCloudCache: true
|
||||||
|
|
||||||
|
- name: Get the version and date on Ubuntu and macOS
|
||||||
|
if: runner.os != 'Windows'
|
||||||
|
run: |
|
||||||
|
ver_pure=$(grep 'set(SoftFever_VERSION' version.inc | cut -d '"' -f2)
|
||||||
|
if [[ "${{ github.event_name }}" == "pull_request" ]]; then
|
||||||
|
ver="PR-${{ github.event.number }}"
|
||||||
|
git_commit_hash="${{ github.event.pull_request.head.sha }}"
|
||||||
|
else
|
||||||
|
ver=V$ver_pure
|
||||||
|
git_commit_hash=""
|
||||||
|
fi
|
||||||
|
echo "ver=$ver" >> $GITHUB_ENV
|
||||||
|
echo "ver_pure=$ver_pure" >> $GITHUB_ENV
|
||||||
|
echo "date=$(date +'%Y%m%d')" >> $GITHUB_ENV
|
||||||
|
echo "git_commit_hash=$git_commit_hash" >> $GITHUB_ENV
|
||||||
|
shell: bash
|
||||||
|
|
||||||
|
- name: Get the version and date on Windows
|
||||||
|
if: runner.os == 'Windows'
|
||||||
|
run: |
|
||||||
|
$date = Get-Date -Format 'yyyyMMdd'
|
||||||
|
$ref = "${{ github.ref }}"
|
||||||
|
$eventName = "${{ github.event_name }}"
|
||||||
|
$prNumber = "${{ github.event.number }}"
|
||||||
|
|
||||||
|
if ($eventName -eq 'pull_request') {
|
||||||
|
$ver = "PR" + $prNumber
|
||||||
|
$git_commit_hash = "${{ github.event.pull_request.head.sha }}"
|
||||||
|
} else {
|
||||||
|
$versionContent = Get-Content version.inc -Raw
|
||||||
|
if ($versionContent -match 'set\(SoftFever_VERSION "(.*?)"\)') {
|
||||||
|
$ver = $matches[1]
|
||||||
|
}
|
||||||
|
$ver = "V$ver"
|
||||||
|
$git_commit_hash = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "ver=$ver" | Out-File -Append -FilePath $env:GITHUB_ENV -Encoding utf8
|
||||||
|
echo "date=$date" | Out-File -Append -FilePath $env:GITHUB_ENV -Encoding utf8
|
||||||
|
echo "git_commit_hash=$git_commit_hash" | Out-File -Append -FilePath $env:GITHUB_ENV -Encoding utf8
|
||||||
|
echo "date: ${{ env.date }} version: ${{ env.ver }}"
|
||||||
|
shell: pwsh
|
||||||
|
|
||||||
|
# Mac
|
||||||
|
- name: Install tools mac
|
||||||
|
if: runner.os == 'macOS' && !inputs.macos-combine-only
|
||||||
|
run: |
|
||||||
|
if [ -z "${{ vars.SELF_HOSTED }}" ]; then
|
||||||
|
brew install libtool
|
||||||
|
brew list
|
||||||
|
fi
|
||||||
|
mkdir -p ${{ github.workspace }}/deps/build/${{ inputs.arch }}
|
||||||
|
|
||||||
|
- name: Free disk space
|
||||||
|
if: runner.os == 'macOS' && !inputs.macos-combine-only && !vars.SELF_HOSTED
|
||||||
|
run: |
|
||||||
|
df -hI /dev/disk3s1s1
|
||||||
|
sudo find /Applications -maxdepth 1 -type d -name "Xcode_*.app" ! -name "Xcode_15.4.app" -exec rm -rf {} +
|
||||||
|
sudo rm -rf ~/Library/Developer/CoreSimulator/Caches/*
|
||||||
|
df -hI /dev/disk3s1s1
|
||||||
|
|
||||||
|
- name: Build slicer mac
|
||||||
|
if: runner.os == 'macOS' && !inputs.macos-combine-only
|
||||||
|
working-directory: ${{ github.workspace }}
|
||||||
|
run: |
|
||||||
|
./build_release_macos.sh -s -n -x ${{ !vars.SELF_HOSTED && '-1' || '' }} -a ${{ inputs.arch }} -t 10.15
|
||||||
|
|
||||||
|
- name: Pack macOS app bundle ${{ inputs.arch }}
|
||||||
|
if: runner.os == 'macOS' && !inputs.macos-combine-only
|
||||||
|
working-directory: ${{ github.workspace }}
|
||||||
|
run: |
|
||||||
|
tar -czvf OrcaSlicer_Mac_bundle_${{ inputs.arch }}_${{ github.sha }}.tar.gz -C build/${{ inputs.arch }} OrcaSlicer
|
||||||
|
|
||||||
|
- name: Upload macOS app bundle ${{ inputs.arch }}
|
||||||
|
if: runner.os == 'macOS' && !inputs.macos-combine-only
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: OrcaSlicer_Mac_bundle_${{ inputs.arch }}_${{ github.sha }}
|
||||||
|
path: ${{ github.workspace }}/OrcaSlicer_Mac_bundle_${{ inputs.arch }}_${{ github.sha }}.tar.gz
|
||||||
|
|
||||||
|
- name: Download macOS app bundles
|
||||||
|
if: runner.os == 'macOS' && inputs.macos-combine-only
|
||||||
|
uses: actions/download-artifact@v8
|
||||||
|
with:
|
||||||
|
pattern: OrcaSlicer_Mac_bundle_*_${{ github.sha }}
|
||||||
|
path: ${{ github.workspace }}/mac_bundles
|
||||||
|
|
||||||
|
- name: Extract macOS app bundles
|
||||||
|
if: runner.os == 'macOS' && inputs.macos-combine-only
|
||||||
|
working-directory: ${{ github.workspace }}
|
||||||
|
run: |
|
||||||
|
mkdir -p build/arm64 build/x86_64
|
||||||
|
arm_bundle=$(find "${{ github.workspace }}/mac_bundles/OrcaSlicer_Mac_bundle_arm64_${{ github.sha }}" -name '*.tar.gz' -print -quit)
|
||||||
|
x86_bundle=$(find "${{ github.workspace }}/mac_bundles/OrcaSlicer_Mac_bundle_x86_64_${{ github.sha }}" -name '*.tar.gz' -print -quit)
|
||||||
|
tar -xzvf "$arm_bundle" -C "${{ github.workspace }}/build/arm64"
|
||||||
|
tar -xzvf "$x86_bundle" -C "${{ github.workspace }}/build/x86_64"
|
||||||
|
|
||||||
|
- name: Build universal mac app bundle
|
||||||
|
if: runner.os == 'macOS' && inputs.macos-combine-only
|
||||||
|
working-directory: ${{ github.workspace }}
|
||||||
|
run: |
|
||||||
|
./build_release_macos.sh -u -x ${{ !vars.SELF_HOSTED && '-1' || '' }} -a universal -t 10.15
|
||||||
|
|
||||||
|
- name: Delete intermediate per-arch artifacts
|
||||||
|
if: runner.os == 'macOS' && inputs.macos-combine-only
|
||||||
|
uses: geekyeggo/delete-artifact@v6
|
||||||
|
with:
|
||||||
|
name: |
|
||||||
|
OrcaSlicer_Mac_bundle_arm64_${{ github.sha }}
|
||||||
|
OrcaSlicer_Mac_bundle_x86_64_${{ github.sha }}
|
||||||
|
|
||||||
|
# Thanks to RaySajuuk, it's working now
|
||||||
|
- name: Sign app and notary
|
||||||
|
if: github.repository == 'OrcaSlicer/OrcaSlicer' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release/')) && runner.os == 'macOS' && inputs.macos-combine-only
|
||||||
|
working-directory: ${{ github.workspace }}
|
||||||
|
env:
|
||||||
|
BUILD_CERTIFICATE_BASE64: ${{ secrets.BUILD_CERTIFICATE_BASE64 }}
|
||||||
|
P12_PASSWORD: ${{ secrets.P12_PASSWORD }}
|
||||||
|
KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
|
||||||
|
CERTIFICATE_ID: ${{ secrets.MACOS_CERTIFICATE_ID }}
|
||||||
|
run: |
|
||||||
|
CERTIFICATE_PATH=$RUNNER_TEMP/build_certificate.p12
|
||||||
|
KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
|
||||||
|
echo -n "$BUILD_CERTIFICATE_BASE64" | base64 --decode --output $CERTIFICATE_PATH
|
||||||
|
security create-keychain -p $KEYCHAIN_PASSWORD $KEYCHAIN_PATH
|
||||||
|
security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
|
||||||
|
security unlock-keychain -p $KEYCHAIN_PASSWORD $KEYCHAIN_PATH
|
||||||
|
# Set the temporary keychain as the default to prevent codesign from accessing the locked login keychain
|
||||||
|
security default-keychain -s "$KEYCHAIN_PATH"
|
||||||
|
security import $CERTIFICATE_PATH -P $P12_PASSWORD -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
|
||||||
|
security list-keychain -d user -s $KEYCHAIN_PATH
|
||||||
|
security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k $P12_PASSWORD $KEYCHAIN_PATH
|
||||||
|
codesign --deep --force --verbose --options runtime --timestamp --entitlements ${{ github.workspace }}/scripts/disable_validation.entitlements --sign "$CERTIFICATE_ID" ${{ github.workspace }}/build/universal/OrcaSlicer/OrcaSlicer.app
|
||||||
|
# Sign OrcaSlicer_profile_validator.app if it exists
|
||||||
|
if [ -f "${{ github.workspace }}/build/universal/OrcaSlicer/OrcaSlicer_profile_validator.app/Contents/MacOS/OrcaSlicer_profile_validator" ]; then
|
||||||
|
codesign --deep --force --verbose --options runtime --timestamp --entitlements ${{ github.workspace }}/scripts/disable_validation.entitlements --sign "$CERTIFICATE_ID" ${{ github.workspace }}/build/universal/OrcaSlicer/OrcaSlicer_profile_validator.app
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create main OrcaSlicer DMG without the profile validator helper
|
||||||
|
mkdir -p ${{ github.workspace }}/build/universal/OrcaSlicer_dmg
|
||||||
|
rm -rf ${{ github.workspace }}/build/universal/OrcaSlicer_dmg/*
|
||||||
|
cp -R ${{ github.workspace }}/build/universal/OrcaSlicer/OrcaSlicer.app ${{ github.workspace }}/build/universal/OrcaSlicer_dmg/
|
||||||
|
ln -sfn /Applications ${{ github.workspace }}/build/universal/OrcaSlicer_dmg/Applications
|
||||||
|
hdiutil create -volname "OrcaSlicer" -srcfolder ${{ github.workspace }}/build/universal/OrcaSlicer_dmg -ov -format UDZO OrcaSlicer_Mac_universal_${{ env.ver }}.dmg
|
||||||
|
codesign --deep --force --verbose --options runtime --timestamp --entitlements ${{ github.workspace }}/scripts/disable_validation.entitlements --sign "$CERTIFICATE_ID" OrcaSlicer_Mac_universal_${{ env.ver }}.dmg
|
||||||
|
|
||||||
|
# Create separate OrcaSlicer_profile_validator DMG if the app exists
|
||||||
|
if [ -f "${{ github.workspace }}/build/universal/OrcaSlicer/OrcaSlicer_profile_validator.app/Contents/MacOS/OrcaSlicer_profile_validator" ]; then
|
||||||
|
mkdir -p ${{ github.workspace }}/build/universal/OrcaSlicer_profile_validator_dmg
|
||||||
|
rm -rf ${{ github.workspace }}/build/universal/OrcaSlicer_profile_validator_dmg/*
|
||||||
|
cp -R ${{ github.workspace }}/build/universal/OrcaSlicer/OrcaSlicer_profile_validator.app ${{ github.workspace }}/build/universal/OrcaSlicer_profile_validator_dmg/
|
||||||
|
ln -sfn /Applications ${{ github.workspace }}/build/universal/OrcaSlicer_profile_validator_dmg/Applications
|
||||||
|
hdiutil create -volname "OrcaSlicer Profile Validator" -srcfolder ${{ github.workspace }}/build/universal/OrcaSlicer_profile_validator_dmg -ov -format UDZO OrcaSlicer_profile_validator_Mac_universal_${{ env.ver }}.dmg
|
||||||
|
codesign --deep --force --verbose --options runtime --timestamp --entitlements ${{ github.workspace }}/scripts/disable_validation.entitlements --sign "$CERTIFICATE_ID" OrcaSlicer_profile_validator_Mac_universal_${{ env.ver }}.dmg
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Notarize main DMG
|
||||||
|
xcrun notarytool submit "OrcaSlicer_Mac_universal_${{ env.ver }}.dmg" --apple-id "${{ secrets.APPLE_DEV_ACCOUNT }}" --team-id "${{ secrets.TEAM_ID }}" --password "${{ secrets.APP_PWD }}" --wait
|
||||||
|
xcrun stapler staple OrcaSlicer_Mac_universal_${{ env.ver }}.dmg
|
||||||
|
|
||||||
|
# Notarize profile validator DMG if it exists
|
||||||
|
if [ -f "OrcaSlicer_profile_validator_Mac_universal_${{ env.ver }}.dmg" ]; then
|
||||||
|
xcrun notarytool submit "OrcaSlicer_profile_validator_Mac_universal_${{ env.ver }}.dmg" --apple-id "${{ secrets.APPLE_DEV_ACCOUNT }}" --team-id "${{ secrets.TEAM_ID }}" --password "${{ secrets.APP_PWD }}" --wait
|
||||||
|
xcrun stapler staple OrcaSlicer_profile_validator_Mac_universal_${{ env.ver }}.dmg
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Create DMG without notary
|
||||||
|
if: github.ref != 'refs/heads/main' && runner.os == 'macOS' && inputs.macos-combine-only
|
||||||
|
working-directory: ${{ github.workspace }}
|
||||||
|
run: |
|
||||||
|
mkdir -p ${{ github.workspace }}/build/universal/OrcaSlicer_dmg
|
||||||
|
rm -rf ${{ github.workspace }}/build/universal/OrcaSlicer_dmg/*
|
||||||
|
cp -R ${{ github.workspace }}/build/universal/OrcaSlicer/OrcaSlicer.app ${{ github.workspace }}/build/universal/OrcaSlicer_dmg/
|
||||||
|
ln -sfn /Applications ${{ github.workspace }}/build/universal/OrcaSlicer_dmg/Applications
|
||||||
|
hdiutil create -volname "OrcaSlicer" -srcfolder ${{ github.workspace }}/build/universal/OrcaSlicer_dmg -ov -format UDZO OrcaSlicer_Mac_universal_${{ env.ver }}.dmg
|
||||||
|
|
||||||
|
# Create separate OrcaSlicer_profile_validator DMG if the app exists
|
||||||
|
if [ -f "${{ github.workspace }}/build/universal/OrcaSlicer/OrcaSlicer_profile_validator.app/Contents/MacOS/OrcaSlicer_profile_validator" ]; then
|
||||||
|
mkdir -p ${{ github.workspace }}/build/universal/OrcaSlicer_profile_validator_dmg
|
||||||
|
rm -rf ${{ github.workspace }}/build/universal/OrcaSlicer_profile_validator_dmg/*
|
||||||
|
cp -R ${{ github.workspace }}/build/universal/OrcaSlicer/OrcaSlicer_profile_validator.app ${{ github.workspace }}/build/universal/OrcaSlicer_profile_validator_dmg/
|
||||||
|
ln -sfn /Applications ${{ github.workspace }}/build/universal/OrcaSlicer_profile_validator_dmg/Applications
|
||||||
|
hdiutil create -volname "OrcaSlicer Profile Validator" -srcfolder ${{ github.workspace }}/build/universal/OrcaSlicer_profile_validator_dmg -ov -format UDZO OrcaSlicer_profile_validator_Mac_universal_${{ env.ver }}.dmg
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Upload artifacts mac
|
||||||
|
if: runner.os == 'macOS' && inputs.macos-combine-only
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: OrcaSlicer_Mac_universal_${{ env.ver }}
|
||||||
|
path: ${{ github.workspace }}/OrcaSlicer_Mac_universal_${{ env.ver }}.dmg
|
||||||
|
|
||||||
|
- name: Upload OrcaSlicer_profile_validator DMG mac
|
||||||
|
if: runner.os == 'macOS' && inputs.macos-combine-only && !vars.SELF_HOSTED
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: OrcaSlicer_profile_validator_Mac_universal_DMG_${{ env.ver }}
|
||||||
|
path: ${{ github.workspace }}/OrcaSlicer_profile_validator_Mac_universal_${{ env.ver }}.dmg
|
||||||
|
if-no-files-found: ignore
|
||||||
|
|
||||||
|
- name: Deploy Mac release
|
||||||
|
if: github.repository == 'OrcaSlicer/OrcaSlicer' && github.ref == 'refs/heads/main' && runner.os == 'macOS' && inputs.macos-combine-only && !vars.SELF_HOSTED
|
||||||
|
uses: WebFreak001/deploy-nightly@v3.2.0
|
||||||
|
with:
|
||||||
|
upload_url: https://uploads.github.com/repos/OrcaSlicer/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||||
|
release_id: 137995723
|
||||||
|
asset_path: ${{ github.workspace }}/OrcaSlicer_Mac_universal_${{ env.ver }}.dmg
|
||||||
|
asset_name: OrcaSlicer_Mac_universal_nightly.dmg
|
||||||
|
asset_content_type: application/octet-stream
|
||||||
|
max_releases: 1 # optional, if there are more releases than this matching the asset_name, the oldest ones are going to be deleted
|
||||||
|
|
||||||
|
- name: Deploy Mac OrcaSlicer_profile_validator DMG release
|
||||||
|
if: github.repository == 'OrcaSlicer/OrcaSlicer' && github.ref == 'refs/heads/main' && runner.os == 'macOS' && inputs.macos-combine-only && !vars.SELF_HOSTED
|
||||||
|
uses: WebFreak001/deploy-nightly@v3.2.0
|
||||||
|
with:
|
||||||
|
upload_url: https://uploads.github.com/repos/OrcaSlicer/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||||
|
release_id: 137995723
|
||||||
|
asset_path: ${{ github.workspace }}/OrcaSlicer_profile_validator_Mac_universal_${{ env.ver }}.dmg
|
||||||
|
asset_name: OrcaSlicer_profile_validator_Mac_universal_nightly.dmg
|
||||||
|
asset_content_type: application/octet-stream
|
||||||
|
max_releases: 1
|
||||||
|
|
||||||
|
# Windows
|
||||||
|
- name: setup MSVC
|
||||||
|
if: runner.os == 'Windows'
|
||||||
|
uses: microsoft/setup-msbuild@v3
|
||||||
|
|
||||||
|
- name: Install nsis
|
||||||
|
if: runner.os == 'Windows' && !vars.SELF_HOSTED
|
||||||
|
run: |
|
||||||
|
dir "C:/Program Files (x86)/Windows Kits/10/Include"
|
||||||
|
choco install nsis
|
||||||
|
|
||||||
|
- name: Build slicer Win
|
||||||
|
if: runner.os == 'Windows'
|
||||||
|
working-directory: ${{ github.workspace }}
|
||||||
|
env:
|
||||||
|
WindowsSdkDir: 'C:\Program Files (x86)\Windows Kits\10\'
|
||||||
|
WindowsSDKVersion: '10.0.26100.0\'
|
||||||
|
run: .\build_release_vs.bat slicer
|
||||||
|
|
||||||
|
- name: Create installer Win
|
||||||
|
if: runner.os == 'Windows' && !vars.SELF_HOSTED
|
||||||
|
working-directory: ${{ github.workspace }}/build
|
||||||
|
run: |
|
||||||
|
cpack -G NSIS
|
||||||
|
|
||||||
|
- name: Pack app
|
||||||
|
if: runner.os == 'Windows'
|
||||||
|
working-directory: ${{ github.workspace }}/build
|
||||||
|
shell: cmd
|
||||||
|
run: '"C:/Program Files/7-Zip/7z.exe" a -tzip OrcaSlicer_Windows_${{ env.ver }}_portable.zip ${{ github.workspace }}/build/OrcaSlicer'
|
||||||
|
|
||||||
|
- name: Pack PDB
|
||||||
|
if: runner.os == 'Windows' && !vars.SELF_HOSTED
|
||||||
|
working-directory: ${{ github.workspace }}/build/src/Release
|
||||||
|
shell: cmd
|
||||||
|
run: '"C:/Program Files/7-Zip/7z.exe" a -m0=lzma2 -mx9 Debug_PDB_${{ env.ver }}_for_developers_only.7z *.pdb'
|
||||||
|
|
||||||
|
- name: Upload artifacts Win zip
|
||||||
|
if: runner.os == 'Windows'
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: OrcaSlicer_Windows_${{ env.ver }}_portable
|
||||||
|
path: ${{ github.workspace }}/build/OrcaSlicer
|
||||||
|
|
||||||
|
- name: Upload artifacts Win installer
|
||||||
|
if: runner.os == 'Windows' && !vars.SELF_HOSTED
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: OrcaSlicer_Windows_${{ env.ver }}
|
||||||
|
path: ${{ github.workspace }}/build/OrcaSlicer*.exe
|
||||||
|
|
||||||
|
- name: Upload artifacts Win PDB
|
||||||
|
if: runner.os == 'Windows' && !vars.SELF_HOSTED
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: PDB
|
||||||
|
path: ${{ github.workspace }}/build/src/Release/Debug_PDB_${{ env.ver }}_for_developers_only.7z
|
||||||
|
|
||||||
|
- name: Upload OrcaSlicer_profile_validator Win
|
||||||
|
if: runner.os == 'Windows' && !vars.SELF_HOSTED
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: OrcaSlicer_profile_validator_Windows_${{ env.ver }}
|
||||||
|
path: ${{ github.workspace }}/build/src/Release/OrcaSlicer_profile_validator.exe
|
||||||
|
|
||||||
|
- name: Deploy Windows release portable
|
||||||
|
if: github.repository == 'OrcaSlicer/OrcaSlicer' && github.ref == 'refs/heads/main' && runner.os == 'Windows' && !vars.SELF_HOSTED
|
||||||
|
uses: WebFreak001/deploy-nightly@v3.2.0
|
||||||
|
with:
|
||||||
|
upload_url: https://uploads.github.com/repos/OrcaSlicer/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||||
|
release_id: 137995723
|
||||||
|
asset_path: ${{ github.workspace }}/build/OrcaSlicer_Windows_${{ env.ver }}_portable.zip
|
||||||
|
asset_name: OrcaSlicer_Windows_nightly_portable.zip
|
||||||
|
asset_content_type: application/x-zip-compressed
|
||||||
|
max_releases: 1
|
||||||
|
|
||||||
|
- name: Deploy Windows release installer
|
||||||
|
if: github.repository == 'OrcaSlicer/OrcaSlicer' && github.ref == 'refs/heads/main' && runner.os == 'Windows' && !vars.SELF_HOSTED
|
||||||
|
uses: WebFreak001/deploy-nightly@v3.2.0
|
||||||
|
with:
|
||||||
|
upload_url: https://uploads.github.com/repos/OrcaSlicer/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||||
|
release_id: 137995723
|
||||||
|
asset_path: ${{ github.workspace }}/build/OrcaSlicer_Windows_Installer_${{ env.ver }}.exe
|
||||||
|
asset_name: OrcaSlicer_Windows_Installer_nightly.exe
|
||||||
|
asset_content_type: application/x-msdownload
|
||||||
|
max_releases: 1
|
||||||
|
|
||||||
|
- name: Deploy Windows OrcaSlicer_profile_validator release
|
||||||
|
if: github.repository == 'OrcaSlicer/OrcaSlicer' && github.ref == 'refs/heads/main' && runner.os == 'Windows' && !vars.SELF_HOSTED
|
||||||
|
uses: WebFreak001/deploy-nightly@v3.2.0
|
||||||
|
with:
|
||||||
|
upload_url: https://uploads.github.com/repos/OrcaSlicer/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||||
|
release_id: 137995723
|
||||||
|
asset_path: ${{ github.workspace }}/build/src/Release/OrcaSlicer_profile_validator.exe
|
||||||
|
asset_name: OrcaSlicer_profile_validator_Windows_nightly.exe
|
||||||
|
asset_content_type: application/x-msdownload
|
||||||
|
max_releases: 1
|
||||||
|
|
||||||
|
# Ubuntu
|
||||||
|
- name: Apt-Install Dependencies
|
||||||
|
if: runner.os == 'Linux' && !vars.SELF_HOSTED
|
||||||
|
uses: ./.github/actions/apt-install-deps
|
||||||
|
|
||||||
|
# Tests must built at the same time as the slicer;
|
||||||
|
# if you untangle them feel free to separate them here too
|
||||||
|
- name: Build slicer and tests
|
||||||
|
if: runner.os == 'Linux'
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
./build_linux.sh -istrlL
|
||||||
|
./scripts/check_appimage_libs.sh ./build/package ./build/package/bin/orca-slicer
|
||||||
|
mv -n ./build/OrcaSlicer_Linux_V${{ env.ver_pure }}.AppImage ./build/OrcaSlicer_Linux_AppImage${{ env.ubuntu-ver-str }}_${{ env.ver }}.AppImage
|
||||||
|
chmod +x ./build/OrcaSlicer_Linux_AppImage${{ env.ubuntu-ver-str }}_${{ env.ver }}.AppImage
|
||||||
|
tar -cvpf build_tests.tar build/tests
|
||||||
|
|
||||||
|
# Use tar because upload-artifacts won't always preserve directory structure
|
||||||
|
# and doesn't preserve file permissions
|
||||||
|
- name: Upload Test Artifact
|
||||||
|
if: runner.os == 'Linux'
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: ${{ github.sha }}-tests
|
||||||
|
overwrite: true
|
||||||
|
path: build_tests.tar
|
||||||
|
retention-days: 5
|
||||||
|
if-no-files-found: error
|
||||||
|
|
||||||
|
- name: Build orca_custom_preset_tests
|
||||||
|
if: github.ref == 'refs/heads/main' && runner.os == 'Linux' && !vars.SELF_HOSTED
|
||||||
|
working-directory: ${{ github.workspace }}/build/src/Release
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
./OrcaSlicer_profile_validator -p ${{ github.workspace }}/resources/profiles -g 1
|
||||||
|
cd ${{ github.workspace }}/resources/profiles
|
||||||
|
zip -r orca_custom_preset_tests.zip user/
|
||||||
|
|
||||||
|
- name: Upload artifacts Ubuntu
|
||||||
|
if: ${{ ! env.ACT && runner.os == 'Linux' }}
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: OrcaSlicer_Linux_ubuntu_${{ env.ubuntu-ver }}_${{ env.ver }}
|
||||||
|
path: './build/OrcaSlicer_Linux_AppImage${{ env.ubuntu-ver-str }}_${{ env.ver }}.AppImage'
|
||||||
|
|
||||||
|
- name: Upload OrcaSlicer_profile_validator Ubuntu
|
||||||
|
if: ${{ ! env.ACT && runner.os == 'Linux' && !vars.SELF_HOSTED }}
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: OrcaSlicer_profile_validator_Linux_ubuntu_${{ env.ubuntu-ver }}_${{ env.ver }}
|
||||||
|
path: './build/src/Release/OrcaSlicer_profile_validator'
|
||||||
|
|
||||||
|
- name: Deploy Ubuntu release
|
||||||
|
if: ${{ github.repository == 'OrcaSlicer/OrcaSlicer' && ! env.ACT && github.ref == 'refs/heads/main' && runner.os == 'Linux' && !vars.SELF_HOSTED }}
|
||||||
|
uses: WebFreak001/deploy-nightly@v3.2.0
|
||||||
|
with:
|
||||||
|
upload_url: https://uploads.github.com/repos/OrcaSlicer/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||||
|
release_id: 137995723
|
||||||
|
asset_path: ./build/OrcaSlicer_Linux_AppImage${{ env.ubuntu-ver-str }}_${{ env.ver }}.AppImage
|
||||||
|
asset_name: OrcaSlicer_Linux_AppImage${{ env.ubuntu-ver-str }}_nightly.AppImage
|
||||||
|
asset_content_type: application/octet-stream
|
||||||
|
max_releases: 1 # optional, if there are more releases than this matching the asset_name, the oldest ones are going to be deleted
|
||||||
|
- name: Deploy Ubuntu release
|
||||||
|
if: ${{ github.repository == 'OrcaSlicer/OrcaSlicer' && ! env.ACT && github.ref == 'refs/heads/main' && runner.os == 'Linux' && !vars.SELF_HOSTED }}
|
||||||
|
uses: rickstaa/action-create-tag@v1
|
||||||
|
with:
|
||||||
|
tag: "nightly-builds"
|
||||||
|
tag_exists_error: false
|
||||||
|
force_push_tag: true
|
||||||
|
message: "nightly-builds"
|
||||||
|
|
||||||
|
- name: Deploy Ubuntu OrcaSlicer_profile_validator release
|
||||||
|
if: ${{ github.repository == 'OrcaSlicer/OrcaSlicer' && ! env.ACT && github.ref == 'refs/heads/main' && runner.os == 'Linux' && !vars.SELF_HOSTED }}
|
||||||
|
uses: WebFreak001/deploy-nightly@v3.2.0
|
||||||
|
with:
|
||||||
|
upload_url: https://uploads.github.com/repos/OrcaSlicer/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||||
|
release_id: 137995723
|
||||||
|
asset_path: ./build/src/Release/OrcaSlicer_profile_validator
|
||||||
|
asset_name: OrcaSlicer_profile_validator_Linux${{ env.ubuntu-ver-str }}_nightly
|
||||||
|
asset_content_type: application/octet-stream
|
||||||
|
max_releases: 1
|
||||||
|
|
||||||
|
- name: Deploy orca_custom_preset_tests
|
||||||
|
if: ${{ github.repository == 'OrcaSlicer/OrcaSlicer' && ! env.ACT && github.ref == 'refs/heads/main' && runner.os == 'Linux' && !vars.SELF_HOSTED }}
|
||||||
|
uses: WebFreak001/deploy-nightly@v3.2.0
|
||||||
|
with:
|
||||||
|
upload_url: https://uploads.github.com/repos/OrcaSlicer/OrcaSlicer/releases/137995723/assets{?name,label}
|
||||||
|
release_id: 137995723
|
||||||
|
asset_path: ${{ github.workspace }}/resources/profiles/orca_custom_preset_tests.zip
|
||||||
|
asset_name: orca_custom_preset_tests.zip
|
||||||
|
asset_content_type: application/octet-stream
|
||||||
|
max_releases: 1
|
||||||
167
.github/workflows/build_rpm_fedora.yml
vendored
Normal file
@@ -0,0 +1,167 @@
|
|||||||
|
name: Build RPM (Fedora)
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: build-rpm-fedora-${{ github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
rpm_fedora41:
|
||||||
|
name: RPM (fedora-41)
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
container:
|
||||||
|
image: fedora:41
|
||||||
|
timeout-minutes: 360
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
DIST_ID: fedora41
|
||||||
|
EVENT_TAG: ${{ github.event.release.tag_name }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
lfs: 'false'
|
||||||
|
|
||||||
|
- name: Install system tools
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
dnf install -y \
|
||||||
|
sudo \
|
||||||
|
bash \
|
||||||
|
ca-certificates \
|
||||||
|
cmake \
|
||||||
|
ccache \
|
||||||
|
curl \
|
||||||
|
file \
|
||||||
|
findutils \
|
||||||
|
git \
|
||||||
|
gzip \
|
||||||
|
ninja-build \
|
||||||
|
rpm-build \
|
||||||
|
tar \
|
||||||
|
which
|
||||||
|
|
||||||
|
- name: Compute version
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
tag="${EVENT_TAG:-${GITHUB_REF_NAME:-}}"
|
||||||
|
if [[ "$tag" == v* ]]; then
|
||||||
|
ver="${tag#v}"
|
||||||
|
else
|
||||||
|
ver="git${GITHUB_SHA::7}"
|
||||||
|
fi
|
||||||
|
rpm_ver="$(printf '%s' "$ver" | tr -c 'A-Za-z0-9._' '_')"
|
||||||
|
echo "VER=$ver" >> "$GITHUB_ENV"
|
||||||
|
echo "RPM_VER=$rpm_ver" >> "$GITHUB_ENV"
|
||||||
|
|
||||||
|
- name: Fedora - install Orca build dependencies
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
./build_linux.sh -u
|
||||||
|
|
||||||
|
- name: Fedora - build Orca dependencies
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
./build_linux.sh -drlL
|
||||||
|
|
||||||
|
- name: Fedora - build + install
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
rm -rf build install-dir out
|
||||||
|
mkdir -p out
|
||||||
|
|
||||||
|
cmake -S . -B build -G "Ninja Multi-Config" \
|
||||||
|
-DCMAKE_PREFIX_PATH="${PWD}/deps/build/OrcaSlicer_dep/usr/local" \
|
||||||
|
-DSLIC3R_STATIC=1 \
|
||||||
|
-DSLIC3R_GTK=3 \
|
||||||
|
-DBBL_RELEASE_TO_PUBLIC=1 \
|
||||||
|
-DBBL_INTERNAL_TESTING=0 \
|
||||||
|
-DSLIC3R_PCH=ON \
|
||||||
|
-DORCA_TOOLS=ON \
|
||||||
|
-DCMAKE_INSTALL_PREFIX="${PWD}/install-dir"
|
||||||
|
|
||||||
|
cmake --build build --config Release --target install -j"$(nproc)"
|
||||||
|
|
||||||
|
./scripts/run_gettext.sh
|
||||||
|
mkdir -p install-dir/resources/i18n
|
||||||
|
cp -a resources/i18n/. install-dir/resources/i18n/
|
||||||
|
|
||||||
|
app_bin=""
|
||||||
|
for candidate in \
|
||||||
|
"install-dir/bin/OrcaSlicer" \
|
||||||
|
"install-dir/bin/orca-slicer" \
|
||||||
|
"install-dir/OrcaSlicer" \
|
||||||
|
"install-dir/orca-slicer"; do
|
||||||
|
if [ -x "$candidate" ]; then
|
||||||
|
app_bin="${candidate#install-dir/}"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -z "$app_bin" ]; then
|
||||||
|
echo "ERROR: installed OrcaSlicer binary not found"
|
||||||
|
find install-dir -maxdepth 3 -type f | sort
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "APP_BIN=$app_bin" >> "$GITHUB_ENV"
|
||||||
|
|
||||||
|
- name: Fedora - build RPM
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
rm -rf rpm
|
||||||
|
mkdir -p rpm/BUILD rpm/BUILDROOT rpm/RPMS rpm/SOURCES rpm/SPECS rpm/SRPMS
|
||||||
|
cp -a install-dir rpm/SOURCES/orcaslicer-root
|
||||||
|
|
||||||
|
cat > rpm/SPECS/orcaslicer-bmcu.spec <<SPEC
|
||||||
|
%global debug_package %{nil}
|
||||||
|
Name: orcaslicer-bmcu
|
||||||
|
Version: ${RPM_VER}
|
||||||
|
Release: 1%{?dist}
|
||||||
|
Summary: OrcaSlicer BMCU build
|
||||||
|
License: AGPL-3.0
|
||||||
|
URL: https://github.com/OrcaSlicer/OrcaSlicer
|
||||||
|
BuildArch: x86_64
|
||||||
|
|
||||||
|
%description
|
||||||
|
OrcaSlicer BMCU build installed in /opt/orcaslicer.
|
||||||
|
|
||||||
|
%install
|
||||||
|
rm -rf %{buildroot}
|
||||||
|
mkdir -p %{buildroot}/opt/orcaslicer %{buildroot}/usr/bin
|
||||||
|
cp -a %{_topdir}/SOURCES/orcaslicer-root/. %{buildroot}/opt/orcaslicer/
|
||||||
|
cat > %{buildroot}/usr/bin/orca-slicer-bmcu <<'WRAPPER'
|
||||||
|
#!/bin/sh
|
||||||
|
exec /opt/orcaslicer/${APP_BIN} "$@"
|
||||||
|
WRAPPER
|
||||||
|
chmod 0755 %{buildroot}/usr/bin/orca-slicer-bmcu
|
||||||
|
|
||||||
|
%files
|
||||||
|
/opt/orcaslicer
|
||||||
|
/usr/bin/orca-slicer-bmcu
|
||||||
|
|
||||||
|
%changelog
|
||||||
|
* Wed Apr 22 2026 PJARCZAK CI <ci@invalid> - ${RPM_VER}-1
|
||||||
|
- Automated build
|
||||||
|
SPEC
|
||||||
|
|
||||||
|
rpmbuild --define "_topdir ${PWD}/rpm" -bb rpm/SPECS/orcaslicer-bmcu.spec
|
||||||
|
cp rpm/RPMS/x86_64/*.rpm "out/OrcaSlicer-BMCU_${DIST_ID}_x86_64_${VER}.rpm"
|
||||||
|
|
||||||
|
- name: Fedora - checksums
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
(cd out && sha256sum * > "SHA256SUMS_${DIST_ID}.txt")
|
||||||
|
|
||||||
|
- name: Upload artifacts (RPM Fedora)
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: orcaslicer-bmcu-rpm-${{ env.DIST_ID }}-${{ github.sha }}
|
||||||
|
path: out/
|
||||||
|
if-no-files-found: error
|
||||||
237
.github/workflows/build_windows_bridge.yml
vendored
Normal file
@@ -0,0 +1,237 @@
|
|||||||
|
name: Build Windows with Linux bridge runtime
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
prepare_linux_bridge_runtime:
|
||||||
|
name: Prepare Linux bridge runtime
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
lfs: 'false'
|
||||||
|
|
||||||
|
- uses: lukka/get-cmake@latest
|
||||||
|
with:
|
||||||
|
cmakeVersion: "~4.3.0"
|
||||||
|
useLocalCache: true
|
||||||
|
useCloudCache: true
|
||||||
|
|
||||||
|
- name: Apt-Install Dependencies
|
||||||
|
uses: ./.github/actions/apt-install-deps
|
||||||
|
|
||||||
|
- name: Build Linux deps
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
for attempt in 1 2 3; do
|
||||||
|
echo "Build Linux deps attempt $attempt"
|
||||||
|
if ./build_linux.sh -drlL; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
if [ "$attempt" -lt 3 ]; then
|
||||||
|
echo "Transient dependency download/build failure, retrying after backoff"
|
||||||
|
sleep $((attempt * 20))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
exit 1
|
||||||
|
|
||||||
|
- name: Configure linux bridge host build
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
cmake -S . -B build -G "Ninja Multi-Config" -DORCA_TOOLS=ON
|
||||||
|
|
||||||
|
- name: Build linux host runtime and WSL rootfs
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
cmake --build build --config Release --target pjarczak_bambu_linux_host
|
||||||
|
bash tools/pjarczak_bambu_linux_host/package_linux_host_runtime.sh build
|
||||||
|
bash tools/pjarczak_bambu_runtime/rootfs/build_windows_wsl_rootfs.sh tools/pjarczak_bambu_runtime/rootfs/windows-wsl2-rootfs.tar
|
||||||
|
tar -czvf linux_host_runtime_${{ github.sha }}.tar.gz -C tools/pjarczak_bambu_linux_host/runtime linux-x86_64
|
||||||
|
tar -czvf wsl_rootfs_${{ github.sha }}.tar.gz -C tools/pjarczak_bambu_runtime/rootfs windows-wsl2-rootfs.tar
|
||||||
|
|
||||||
|
- name: Show packaged linux bridge runtime files
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
find tools/pjarczak_bambu_linux_host/runtime/linux-x86_64 -maxdepth 1 -type f | sort
|
||||||
|
|
||||||
|
|
||||||
|
- name: Upload linux host runtime artifact
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: linux_host_runtime_${{ github.sha }}
|
||||||
|
path: ./linux_host_runtime_${{ github.sha }}.tar.gz
|
||||||
|
if-no-files-found: error
|
||||||
|
|
||||||
|
- name: Upload WSL rootfs artifact
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: wsl_rootfs_${{ github.sha }}
|
||||||
|
path: ./wsl_rootfs_${{ github.sha }}.tar.gz
|
||||||
|
if-no-files-found: error
|
||||||
|
|
||||||
|
build_windows:
|
||||||
|
name: Build Windows
|
||||||
|
runs-on: windows-latest
|
||||||
|
needs: prepare_linux_bridge_runtime
|
||||||
|
env:
|
||||||
|
ORCA_UPDATER_SIG_KEY: ${{ secrets.ORCA_UPDATER_SIG_KEY }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
lfs: 'false'
|
||||||
|
|
||||||
|
- uses: lukka/get-cmake@latest
|
||||||
|
with:
|
||||||
|
cmakeVersion: "~4.3.0"
|
||||||
|
useLocalCache: true
|
||||||
|
useCloudCache: true
|
||||||
|
|
||||||
|
- name: Get the version and date on Windows
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$date = Get-Date -Format 'yyyyMMdd'
|
||||||
|
$eventName = "${{ github.event_name }}"
|
||||||
|
$prNumber = "${{ github.event.number }}"
|
||||||
|
|
||||||
|
if ($eventName -eq 'pull_request') {
|
||||||
|
$ver = "PR" + $prNumber
|
||||||
|
} else {
|
||||||
|
$versionContent = Get-Content version.inc -Raw
|
||||||
|
if ($versionContent -match 'set\(SoftFever_VERSION "(.*?)"\)') {
|
||||||
|
$ver = $matches[1]
|
||||||
|
}
|
||||||
|
$ver = "V$ver"
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "ver=$ver" | Out-File -Append -FilePath $env:GITHUB_ENV -Encoding utf8
|
||||||
|
echo "date=$date" | Out-File -Append -FilePath $env:GITHUB_ENV -Encoding utf8
|
||||||
|
|
||||||
|
- name: Download linux host runtime artifact
|
||||||
|
uses: actions/download-artifact@v8
|
||||||
|
with:
|
||||||
|
name: linux_host_runtime_${{ github.sha }}
|
||||||
|
path: ${{ github.workspace }}/linux_host_runtime_artifact
|
||||||
|
|
||||||
|
- name: Extract linux host runtime artifact on Windows
|
||||||
|
working-directory: ${{ github.workspace }}
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
New-Item -ItemType Directory -Force -Path "$env:GITHUB_WORKSPACE\tools\pjarczak_bambu_linux_host\runtime" | Out-Null
|
||||||
|
tar -xzf "$env:GITHUB_WORKSPACE\linux_host_runtime_artifact\linux_host_runtime_${{ github.sha }}.tar.gz" -C "$env:GITHUB_WORKSPACE\tools\pjarczak_bambu_linux_host\runtime"
|
||||||
|
|
||||||
|
- name: Download WSL rootfs artifact
|
||||||
|
uses: actions/download-artifact@v8
|
||||||
|
with:
|
||||||
|
name: wsl_rootfs_${{ github.sha }}
|
||||||
|
path: ${{ github.workspace }}/wsl_rootfs_artifact
|
||||||
|
|
||||||
|
- name: Extract WSL rootfs artifact on Windows
|
||||||
|
working-directory: ${{ github.workspace }}
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
New-Item -ItemType Directory -Force -Path "$env:GITHUB_WORKSPACE\tools\pjarczak_bambu_runtime\rootfs" | Out-Null
|
||||||
|
tar -xzf "$env:GITHUB_WORKSPACE\wsl_rootfs_artifact\wsl_rootfs_${{ github.sha }}.tar.gz" -C "$env:GITHUB_WORKSPACE\tools\pjarczak_bambu_runtime\rootfs"
|
||||||
|
|
||||||
|
- name: setup MSVC
|
||||||
|
uses: microsoft/setup-msbuild@v2
|
||||||
|
|
||||||
|
- name: Install nsis
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
choco install nsis -y
|
||||||
|
|
||||||
|
- name: Build Windows deps
|
||||||
|
working-directory: ${{ github.workspace }}
|
||||||
|
env:
|
||||||
|
WindowsSdkDir: 'C:\Program Files (x86)\Windows Kits\10\'
|
||||||
|
WindowsSDKVersion: '10.0.26100.0\'
|
||||||
|
shell: pwsh
|
||||||
|
run: .\build_release_vs.bat deps
|
||||||
|
|
||||||
|
- name: Build slicer Win
|
||||||
|
working-directory: ${{ github.workspace }}
|
||||||
|
env:
|
||||||
|
WindowsSdkDir: 'C:\Program Files (x86)\Windows Kits\10\'
|
||||||
|
WindowsSDKVersion: '10.0.26100.0\'
|
||||||
|
shell: pwsh
|
||||||
|
run: .\build_release_vs.bat slicer
|
||||||
|
|
||||||
|
|
||||||
|
- name: Ensure WSL is available for runtime validation
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
$wsl = Join-Path $env:WINDIR 'System32\wsl.exe'
|
||||||
|
if (!(Test-Path $wsl)) { throw 'wsl.exe not found' }
|
||||||
|
|
||||||
|
$ready = $false
|
||||||
|
try {
|
||||||
|
& $wsl --status
|
||||||
|
if ($LASTEXITCODE -eq 0) { $ready = $true }
|
||||||
|
} catch {}
|
||||||
|
|
||||||
|
if (-not $ready) {
|
||||||
|
& $wsl --install --no-distribution
|
||||||
|
if ($LASTEXITCODE -ne 0) { throw 'wsl --install --no-distribution failed' }
|
||||||
|
}
|
||||||
|
|
||||||
|
& $wsl --update
|
||||||
|
if ($LASTEXITCODE -ne 0) { throw 'wsl --update failed' }
|
||||||
|
|
||||||
|
& $wsl --status
|
||||||
|
if ($LASTEXITCODE -ne 0) { throw 'WSL is still not ready after install/update' }
|
||||||
|
|
||||||
|
- name: Show packaged Orca runtime files
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
Get-ChildItem -Force "$env:GITHUB_WORKSPACE\build\OrcaSlicer" | Format-Table Name, Length -AutoSize
|
||||||
|
|
||||||
|
- name: Install bundled WSL2 Orca runtime into live plugins dir
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
& "$env:GITHUB_WORKSPACE\build\OrcaSlicer\install_runtime.ps1" -ReplaceExisting
|
||||||
|
|
||||||
|
- name: Show live Orca plugin dir after installer
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
Get-ChildItem -Force "$env:APPDATA\OrcaSlicer\plugins" | Format-Table Name, Length -AutoSize
|
||||||
|
Write-Host "--- cache dir ---"
|
||||||
|
if (Test-Path "$env:APPDATA\OrcaSlicer\ota\plugins") {
|
||||||
|
Get-ChildItem -Force "$env:APPDATA\OrcaSlicer\ota\plugins" | Format-Table Name, Length -AutoSize
|
||||||
|
}
|
||||||
|
|
||||||
|
- name: Validate live Orca plugin dir bootstrap package
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
& "$env:APPDATA\OrcaSlicer\plugins\verify_runtime.ps1" -PackageDir "$env:APPDATA\OrcaSlicer\plugins" -PluginCacheDir "$env:APPDATA\OrcaSlicer\ota\plugins" -AllowMissingLinuxPlugin
|
||||||
|
|
||||||
|
- name: Create installer Win
|
||||||
|
working-directory: ${{ github.workspace }}/build
|
||||||
|
shell: pwsh
|
||||||
|
run: |
|
||||||
|
cpack -G NSIS
|
||||||
|
|
||||||
|
- name: Pack app
|
||||||
|
working-directory: ${{ github.workspace }}/build
|
||||||
|
shell: cmd
|
||||||
|
run: '"C:/Program Files/7-Zip/7z.exe" a -tzip OrcaSlicer_Windows_${{ env.ver }}_portable.zip ${{ github.workspace }}/build/OrcaSlicer'
|
||||||
|
|
||||||
|
- name: Upload artifacts Win portable
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: OrcaSlicer_Windows_${{ env.ver }}_portable
|
||||||
|
path: ${{ github.workspace }}/build/OrcaSlicer_Windows_${{ env.ver }}_portable.zip
|
||||||
|
if-no-files-found: error
|
||||||
|
|
||||||
|
- name: Upload artifacts Win installer
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: OrcaSlicer_Windows_${{ env.ver }}_installer
|
||||||
|
path: ${{ github.workspace }}/build/OrcaSlicer*.exe
|
||||||
|
if-no-files-found: error
|
||||||
44
.github/workflows/check_locale.yml
vendored
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
name: Check locale
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths:
|
||||||
|
- 'localization/**'
|
||||||
|
- ".github/workflows/check_locale.yml"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check_translation:
|
||||||
|
name: Check translation
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
|
- name: Install gettext
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y gettext
|
||||||
|
|
||||||
|
# don't call ./run_gentext.sh as most translators never sync with main branch...
|
||||||
|
- name: Check translation format
|
||||||
|
run: |
|
||||||
|
echo $PWD
|
||||||
|
pot_file="./localization/i18n/OrcaSlicer.pot"
|
||||||
|
for dir in ./localization/i18n/*/
|
||||||
|
do
|
||||||
|
dir=${dir%*/} # remove the trailing "/"
|
||||||
|
lang=${dir##*/} # extract the language identifier
|
||||||
|
|
||||||
|
if [ -f "$dir/OrcaSlicer_${lang}.po" ]; then
|
||||||
|
mkdir -p ./resources/i18n/${lang}/
|
||||||
|
msgfmt --check-format -o ./resources/i18n/${lang}/OrcaSlicer.mo $dir/OrcaSlicer_${lang}.po
|
||||||
|
# Check the exit status of the msgfmt command
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "Error encountered with msgfmt command for language ${lang}."
|
||||||
|
exit 1 # Exit the script with an error status
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
118
.github/workflows/check_profiles.yml
vendored
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
name: Check profiles
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
paths:
|
||||||
|
- 'resources/profiles/**'
|
||||||
|
- ".github/workflows/check_profiles.yml"
|
||||||
|
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
logLevel:
|
||||||
|
description: 'Log level'
|
||||||
|
required: true
|
||||||
|
default: 'warning'
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check_profiles:
|
||||||
|
name: Check profiles
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
|
- name: Run extra JSON check
|
||||||
|
id: extra_json_check
|
||||||
|
continue-on-error: true
|
||||||
|
run: |
|
||||||
|
set +e
|
||||||
|
python3 ./scripts/orca_extra_profile_check.py 2>&1 | tee ${{ runner.temp }}/extra_json_check.log
|
||||||
|
exit ${PIPESTATUS[0]}
|
||||||
|
|
||||||
|
# download
|
||||||
|
- name: Download
|
||||||
|
working-directory: ${{ github.workspace }}
|
||||||
|
run: |
|
||||||
|
curl -LJO https://github.com/SoftFever/Orca_tools/releases/download/1/OrcaSlicer_profile_validator
|
||||||
|
chmod +x ./OrcaSlicer_profile_validator
|
||||||
|
|
||||||
|
# validate profiles
|
||||||
|
- name: validate system profiles
|
||||||
|
id: validate_system
|
||||||
|
continue-on-error: true
|
||||||
|
run: |
|
||||||
|
set +e
|
||||||
|
./OrcaSlicer_profile_validator -p ${{ github.workspace }}/resources/profiles -l 2 2>&1 | tee ${{ runner.temp }}/validate_system.log
|
||||||
|
exit ${PIPESTATUS[0]}
|
||||||
|
|
||||||
|
- name: validate custom presets
|
||||||
|
id: validate_custom
|
||||||
|
continue-on-error: true
|
||||||
|
working-directory: ${{ github.workspace }}
|
||||||
|
run: |
|
||||||
|
set +e
|
||||||
|
curl -LJO https://github.com/OrcaSlicer/OrcaSlicer/releases/download/nightly-builds/orca_custom_preset_tests.zip
|
||||||
|
unzip -q ./orca_custom_preset_tests.zip -d ${{ github.workspace }}/resources/profiles
|
||||||
|
./OrcaSlicer_profile_validator -p ${{ github.workspace }}/resources/profiles -l 2 2>&1 | tee ${{ runner.temp }}/validate_custom.log
|
||||||
|
exit ${PIPESTATUS[0]}
|
||||||
|
|
||||||
|
- name: Prepare comment artifact
|
||||||
|
if: ${{ always() && github.event_name == 'pull_request' && (steps.extra_json_check.outcome == 'failure' || steps.validate_system.outcome == 'failure' || steps.validate_custom.outcome == 'failure') }}
|
||||||
|
run: |
|
||||||
|
mkdir -p ${{ runner.temp }}/profile-check-results
|
||||||
|
|
||||||
|
{
|
||||||
|
echo "## :x: Profile Validation Errors"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
if [ "${{ steps.extra_json_check.outcome }}" = "failure" ]; then
|
||||||
|
echo "### Extra JSON Check Failed"
|
||||||
|
echo ""
|
||||||
|
echo '```'
|
||||||
|
head -c 30000 ${{ runner.temp }}/extra_json_check.log || echo "No output captured"
|
||||||
|
echo '```'
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${{ steps.validate_system.outcome }}" = "failure" ]; then
|
||||||
|
echo "### System Profile Validation Failed"
|
||||||
|
echo ""
|
||||||
|
echo '```'
|
||||||
|
head -c 30000 ${{ runner.temp }}/validate_system.log || echo "No output captured"
|
||||||
|
echo '```'
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${{ steps.validate_custom.outcome }}" = "failure" ]; then
|
||||||
|
echo "### Custom Preset Validation Failed"
|
||||||
|
echo ""
|
||||||
|
echo '```'
|
||||||
|
head -c 30000 ${{ runner.temp }}/validate_custom.log || echo "No output captured"
|
||||||
|
echo '```'
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "---"
|
||||||
|
echo "*Please fix the above errors and push a new commit.*"
|
||||||
|
} > ${{ runner.temp }}/profile-check-results/pr_comment.md
|
||||||
|
|
||||||
|
echo "${{ github.event.pull_request.number }}" > ${{ runner.temp }}/profile-check-results/pr_number.txt
|
||||||
|
|
||||||
|
- name: Upload comment artifact
|
||||||
|
if: ${{ always() && github.event_name == 'pull_request' && (steps.extra_json_check.outcome == 'failure' || steps.validate_system.outcome == 'failure' || steps.validate_custom.outcome == 'failure') }}
|
||||||
|
uses: actions/upload-artifact@v7
|
||||||
|
with:
|
||||||
|
name: profile-check-results
|
||||||
|
path: ${{ runner.temp }}/profile-check-results/
|
||||||
|
retention-days: 1
|
||||||
|
|
||||||
|
- name: Fail if any check failed
|
||||||
|
if: ${{ always() && (steps.extra_json_check.outcome == 'failure' || steps.validate_system.outcome == 'failure' || steps.validate_custom.outcome == 'failure') }}
|
||||||
|
run: |
|
||||||
|
echo "One or more profile checks failed. See above for details."
|
||||||
|
exit 1
|
||||||
46
.github/workflows/check_profiles_comment.yml
vendored
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
name: Post profile check comment
|
||||||
|
|
||||||
|
# NOTE: The workflow name in the 'workflows' filter below must match the 'name'
|
||||||
|
# field in check_profiles.yml exactly. If that name changes, update it here too.
|
||||||
|
on:
|
||||||
|
workflow_run:
|
||||||
|
workflows: ["Check profiles"]
|
||||||
|
types:
|
||||||
|
- completed
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
post_comment:
|
||||||
|
name: Post PR comment
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
if: ${{ github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'failure' }}
|
||||||
|
steps:
|
||||||
|
- name: Download artifact
|
||||||
|
id: download
|
||||||
|
uses: actions/download-artifact@v8
|
||||||
|
continue-on-error: true
|
||||||
|
with:
|
||||||
|
name: profile-check-results
|
||||||
|
run-id: ${{ github.event.workflow_run.id }}
|
||||||
|
github-token: ${{ github.token }}
|
||||||
|
|
||||||
|
- name: Post comment on PR
|
||||||
|
if: ${{ steps.download.outcome == 'success' }}
|
||||||
|
env:
|
||||||
|
GH_TOKEN: ${{ github.token }}
|
||||||
|
GH_REPO: ${{ github.repository }}
|
||||||
|
run: |
|
||||||
|
if [ ! -f pr_number.txt ] || [ ! -f pr_comment.md ]; then
|
||||||
|
echo "No comment artifact found, skipping."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
PR_NUMBER=$(cat pr_number.txt)
|
||||||
|
if ! [[ "$PR_NUMBER" =~ ^[0-9]+$ ]]; then
|
||||||
|
echo "Invalid PR number: $PR_NUMBER"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
gh pr comment "$PR_NUMBER" --body-file pr_comment.md
|
||||||
81
.github/workflows/dedupe-issues.yml
vendored
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
name: Orca Issue Dedupe
|
||||||
|
description: Automatically dedupe GitHub issues using AI
|
||||||
|
on:
|
||||||
|
issues:
|
||||||
|
types: [opened]
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
issue_number:
|
||||||
|
description: 'Issue number to process for duplicate detection'
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
dedupe-issues:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 30
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
issues: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
|
- name: Run Claude Code slash command
|
||||||
|
uses: anthropics/claude-code-base-action@beta
|
||||||
|
with:
|
||||||
|
prompt: "/dedupe ${{ github.repository }}/issues/${{ github.event.issue.number || inputs.issue_number }}"
|
||||||
|
claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
|
||||||
|
claude_args: "--model claude-sonnet-4-5-20250929"
|
||||||
|
claude_env: |
|
||||||
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
- name: Log duplicate comment event to Statsig
|
||||||
|
if: always()
|
||||||
|
env:
|
||||||
|
STATSIG_API_KEY: ${{ secrets.STATSIG_API_KEY }}
|
||||||
|
run: |
|
||||||
|
ISSUE_NUMBER=${{ github.event.issue.number || inputs.issue_number }}
|
||||||
|
REPO=${{ github.repository }}
|
||||||
|
|
||||||
|
if [ -z "$STATSIG_API_KEY" ]; then
|
||||||
|
echo "STATSIG_API_KEY not found, skipping Statsig logging"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Prepare the event payload
|
||||||
|
EVENT_PAYLOAD=$(jq -n \
|
||||||
|
--arg issue_number "$ISSUE_NUMBER" \
|
||||||
|
--arg repo "$REPO" \
|
||||||
|
--arg triggered_by "${{ github.event_name }}" \
|
||||||
|
'{
|
||||||
|
events: [{
|
||||||
|
eventName: "github_duplicate_comment_added",
|
||||||
|
value: 1,
|
||||||
|
metadata: {
|
||||||
|
repository: $repo,
|
||||||
|
issue_number: ($issue_number | tonumber),
|
||||||
|
triggered_by: $triggered_by,
|
||||||
|
workflow_run_id: "${{ github.run_id }}"
|
||||||
|
},
|
||||||
|
time: (now | floor | tostring)
|
||||||
|
}]
|
||||||
|
}')
|
||||||
|
|
||||||
|
# Send to Statsig API
|
||||||
|
echo "Logging duplicate comment event to Statsig for issue #${ISSUE_NUMBER}"
|
||||||
|
|
||||||
|
RESPONSE=$(curl -s -w "\n%{http_code}" -X POST https://events.statsigapi.net/v1/log_event \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-H "STATSIG-API-KEY: ${STATSIG_API_KEY}" \
|
||||||
|
-d "$EVENT_PAYLOAD")
|
||||||
|
|
||||||
|
HTTP_CODE=$(echo "$RESPONSE" | tail -n1)
|
||||||
|
BODY=$(echo "$RESPONSE" | head -n-1)
|
||||||
|
|
||||||
|
if [ "$HTTP_CODE" -eq 200 ] || [ "$HTTP_CODE" -eq 202 ]; then
|
||||||
|
echo "Successfully logged duplicate comment event for issue #${ISSUE_NUMBER}"
|
||||||
|
else
|
||||||
|
echo "Failed to log duplicate comment event for issue #${ISSUE_NUMBER}. HTTP ${HTTP_CODE}: ${BODY}"
|
||||||
|
fi
|
||||||
78
.github/workflows/doxygen-docs.yml
vendored
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
name: Generate Doxygen Documentation
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 0 * * 1' # Every Monday at midnight UTC
|
||||||
|
workflow_dispatch: # Manual trigger
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: ${{ github.workflow }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-and-deploy:
|
||||||
|
name: Build and Deploy Docs
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
timeout-minutes: 60
|
||||||
|
# Only run on main branch of the main repository
|
||||||
|
if: github.repository == 'OrcaSlicer/OrcaSlicer' && github.ref == 'refs/heads/main'
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
steps:
|
||||||
|
- uses: thejerrybao/setup-swap-space@v1
|
||||||
|
with:
|
||||||
|
swap-space-path: /swapfile
|
||||||
|
swap-size-gb: 8
|
||||||
|
remove-existing-swap-files: true
|
||||||
|
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
|
- name: Install Doxygen and Graphviz
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y doxygen graphviz
|
||||||
|
|
||||||
|
- name: Generate documentation
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
# Override DOT_NUM_THREADS to avoid parallel dot race condition bug
|
||||||
|
sed -i 's/^DOT_NUM_THREADS.*/DOT_NUM_THREADS = 1/' .doxygen
|
||||||
|
doxygen .doxygen
|
||||||
|
# Verify documentation was generated
|
||||||
|
if [ ! -f "internal_docs/index.html" ]; then
|
||||||
|
echo "Error: Documentation generation failed - index.html not found"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
- name: Install Rclone
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
sudo -v
|
||||||
|
curl -fsSL https://rclone.org/install.sh | sudo bash
|
||||||
|
|
||||||
|
- name: optimize
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
rm -f internal_docs/Nodes.xml internal_docs/Tokens.xml
|
||||||
|
find internal_docs -name "*.map" -type f -delete || true
|
||||||
|
find internal_docs -name "*.md5" -type f -delete || true
|
||||||
|
|
||||||
|
- name: upload
|
||||||
|
# We configure rclone dynamically using environment variables
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
# Remove existing config if it exists to avoid conflicts
|
||||||
|
rclone config delete cloudflare 2>/dev/null || true
|
||||||
|
rclone config create cloudflare s3 \
|
||||||
|
provider Cloudflare \
|
||||||
|
access_key_id ${{ secrets.R2_ACCESS_KEY_ID }} \
|
||||||
|
secret_access_key ${{ secrets.R2_SECRET_ACCESS_KEY }} \
|
||||||
|
endpoint ${{ secrets.R2_ENDPOINT }}
|
||||||
|
|
||||||
|
rclone sync internal_docs/ cloudflare:orcaslicer-internals \
|
||||||
|
--progress \
|
||||||
|
--transfers 512 \
|
||||||
|
--checkers 512
|
||||||
|
|
||||||
|
echo "Documentation upload completed successfully"
|
||||||
84
.github/workflows/my_build_all.yml
vendored
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
name: My Build All
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
release:
|
||||||
|
types:
|
||||||
|
- published
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: my-build-all-${{ github.event.release.tag_name || github.ref }}
|
||||||
|
cancel-in-progress: true
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build_windows:
|
||||||
|
uses: ./.github/workflows/build_windows_bridge.yml
|
||||||
|
secrets: inherit
|
||||||
|
|
||||||
|
build_linux_portable:
|
||||||
|
uses: ./.github/workflows/build_linux_portable.yml
|
||||||
|
secrets: inherit
|
||||||
|
|
||||||
|
build_linux_appimage:
|
||||||
|
uses: ./.github/workflows/build_linux_appimage.yml
|
||||||
|
secrets: inherit
|
||||||
|
|
||||||
|
build_macos:
|
||||||
|
uses: ./.github/workflows/build_macos_bridge.yml
|
||||||
|
secrets: inherit
|
||||||
|
|
||||||
|
publish_release:
|
||||||
|
name: Publish release assets
|
||||||
|
needs:
|
||||||
|
- build_windows
|
||||||
|
- build_linux_portable
|
||||||
|
- build_linux_appimage
|
||||||
|
- build_macos
|
||||||
|
if: ${{ github.event_name == 'push' || github.event_name == 'release' }}
|
||||||
|
runs-on: ubuntu-24.04
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Download all artifacts
|
||||||
|
uses: actions/download-artifact@v8
|
||||||
|
with:
|
||||||
|
path: release-artifacts
|
||||||
|
|
||||||
|
- name: Flatten release files
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
mkdir -p release-files
|
||||||
|
find release-artifacts -type f -print0 | while IFS= read -r -d '' file; do
|
||||||
|
cp "$file" release-files/"$(basename "$file")"
|
||||||
|
done
|
||||||
|
ls -lah release-files
|
||||||
|
|
||||||
|
- name: Resolve tag
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
EVENT_TAG: ${{ github.event.release.tag_name }}
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
tag="${EVENT_TAG:-${GITHUB_REF_NAME:-}}"
|
||||||
|
if [[ -z "$tag" ]]; then
|
||||||
|
echo "ERROR: tag could not be resolved"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "RELEASE_TAG=$tag" >> "$GITHUB_ENV"
|
||||||
|
|
||||||
|
- name: Create or update GitHub release
|
||||||
|
uses: softprops/action-gh-release@v2
|
||||||
|
with:
|
||||||
|
tag_name: ${{ env.RELEASE_TAG }}
|
||||||
|
generate_release_notes: true
|
||||||
|
overwrite_files: true
|
||||||
|
files: |
|
||||||
|
release-files/*
|
||||||
44
.github/workflows/shellcheck.yml
vendored
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- '**.sh'
|
||||||
|
- 'scripts/linux.d/*'
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- '**.sh'
|
||||||
|
- 'scripts/linux.d/*'
|
||||||
|
schedule:
|
||||||
|
- cron: '55 7 * * *' # run once a day near midnight US Pacific time
|
||||||
|
workflow_dispatch: # allows for manual dispatch
|
||||||
|
|
||||||
|
name: "Shellcheck"
|
||||||
|
permissions: {}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
shellcheck:
|
||||||
|
name: Shellcheck
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Cache shellcheck download
|
||||||
|
id: cache-shellcheck-v0_11
|
||||||
|
uses: actions/cache@v5
|
||||||
|
with:
|
||||||
|
path: ~/shellcheck
|
||||||
|
key: ${{ runner.os }}-shellcheck-v0_11
|
||||||
|
|
||||||
|
- name: Download shellcheck
|
||||||
|
if: steps.cache-shellcheck-v0_11.outputs.cache-hit != 'true'
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
INPUT_VERSION: "v0.11.0"
|
||||||
|
run: |
|
||||||
|
curl -L#o ~/sc.tar.xz "https://github.com/koalaman/shellcheck/releases/download/${INPUT_VERSION}/shellcheck-${INPUT_VERSION}.linux.x86_64.tar.xz"
|
||||||
|
tar -xvf ~/sc.tar.xz -C ~
|
||||||
|
mv ~/shellcheck-"${INPUT_VERSION}"/shellcheck ~/shellcheck
|
||||||
|
|
||||||
|
- uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
fetch-depth: 1
|
||||||
|
|
||||||
|
- name: Shellcheck scripts
|
||||||
|
run: 'find . -not -name \*.md \( -path ./scripts/linux.d/\* -o -name \*.sh \) -print0 | xargs -0 ~/shellcheck'
|
||||||
38
.github/workflows/update-translation.yml
vendored
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
name: Update Translation Catalog
|
||||||
|
on:
|
||||||
|
# schedule:
|
||||||
|
# - cron: 0 0 * * 1
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
update_translation:
|
||||||
|
name: Update translation
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v6
|
||||||
|
|
||||||
|
- name: Setup Python
|
||||||
|
uses: actions/setup-python@v6
|
||||||
|
with:
|
||||||
|
python-version: '3.12'
|
||||||
|
|
||||||
|
- name: Install gettext
|
||||||
|
run: |
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y gettext
|
||||||
|
|
||||||
|
- name: Update translation catalog
|
||||||
|
run: |
|
||||||
|
./scripts/run_gettext.sh --full
|
||||||
|
git add localization/i18n/*
|
||||||
|
|
||||||
|
- name: Commit translation catalog updates
|
||||||
|
uses: qoomon/actions--create-commit@v1
|
||||||
|
id: commit
|
||||||
|
with:
|
||||||
|
message: Update translation catalog
|
||||||
|
skip-empty: true
|
||||||
|
|
||||||
|
- name: Push changes
|
||||||
|
run: git push
|
||||||
14
.github/workflows/winget_updater.yml
vendored
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
name: Publish to WinGet
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types: [ released ]
|
||||||
|
jobs:
|
||||||
|
publish:
|
||||||
|
runs-on: windows-latest
|
||||||
|
steps:
|
||||||
|
- uses: vedantmgoyal9/winget-releaser@main
|
||||||
|
with:
|
||||||
|
identifier: SoftFever.OrcaSlicer
|
||||||
|
version: ${{ github.event.release.tag_name }}
|
||||||
|
token: ${{ secrets.WINGET_TOKEN }}
|
||||||
|
installers-regex: '\.exe$'
|
||||||
51
.gitignore
vendored
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
Build
|
||||||
|
Build.bat
|
||||||
|
/build*/
|
||||||
|
CMakeLists.txt.user
|
||||||
|
**/CMakeLists.txt.autosave
|
||||||
|
deps/build*
|
||||||
|
MYMETA.json
|
||||||
|
MYMETA.yml
|
||||||
|
_build
|
||||||
|
blib
|
||||||
|
xs/buildtmp
|
||||||
|
*.o
|
||||||
|
*.log
|
||||||
|
MANIFEST.bak
|
||||||
|
xs/MANIFEST.bak
|
||||||
|
xs/assertlib*
|
||||||
|
.init_bundle.ini
|
||||||
|
.vs/*
|
||||||
|
local-lib
|
||||||
|
/src/TAGS
|
||||||
|
/.vscode/
|
||||||
|
/.vscode
|
||||||
|
build-linux/*
|
||||||
|
deps/build*/*
|
||||||
|
**/.DS_Store
|
||||||
|
install_*
|
||||||
|
!tools/pjarczak_bambu_runtime/wsl/install_runtime.ps1
|
||||||
|
!tools/pjarczak_bambu_runtime/wsl/install_runtime.cmd
|
||||||
|
build_*/
|
||||||
|
SVG
|
||||||
|
src/OrcaSlicer-doc/
|
||||||
|
.idea/
|
||||||
|
/.cache/
|
||||||
|
*.mo
|
||||||
|
**/process_full/
|
||||||
|
**/machine_full/
|
||||||
|
**/filament_full/
|
||||||
|
/deps/DL_CACHE/
|
||||||
|
/deps/DL_CACHE
|
||||||
|
**/.flatpak-builder/
|
||||||
|
*.no-debug.yml
|
||||||
|
resources/profiles/user/default
|
||||||
|
*.code-workspace
|
||||||
|
deps_src/build/
|
||||||
|
test.js
|
||||||
|
/.cache/
|
||||||
|
.clangd
|
||||||
|
internal_docs/
|
||||||
|
*.flatpak
|
||||||
|
/flatpak-repo/
|
||||||
|
/.idea/
|
||||||
23
AGENTS.md
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# Repository Guidelines
|
||||||
|
|
||||||
|
## Project Structure & Module Organization
|
||||||
|
OrcaSlicer’s C++17 sources live in `src/`, split by feature modules and platform adapters. User assets, icons, and printer presets are in `resources/`; translations stay in `localization/`. Tests sit in `tests/`, grouped by domain (`libslic3r/`, `sla_print/`, etc.) with fixtures under `tests/data/`. CMake helpers reside in `cmake/`, and longer references in `doc/` and `SoftFever_doc/`. Automation scripts belong in `scripts/` and `tools/`. Treat everything in `deps/` and `deps_src/` as vendored snapshots—do not modify without mirroring upstream tags.
|
||||||
|
|
||||||
|
## Build, Test, and Development Commands
|
||||||
|
Use out-of-source builds:
|
||||||
|
- `cmake -S . -B build -DCMAKE_BUILD_TYPE=Release` configures dependencies and generates build files.
|
||||||
|
- `cmake --build build --target OrcaSlicer --config Release` compiles the app; add `--parallel` to speed up.
|
||||||
|
- `cmake --build build --target tests` then `ctest --test-dir build --output-on-failure` runs automated suites.
|
||||||
|
Platform helpers such as `build_linux.sh`, `build_release_macos.sh`, and `build_release_vs2022.bat` wrap the same flow with toolchain flags. Use `build_release_macos.sh -sx` when reproducing macOS build issues, and `scripts/DockerBuild.sh` for reproducible container builds.
|
||||||
|
|
||||||
|
## Coding Style & Naming Conventions
|
||||||
|
`.clang-format` enforces 4-space indents, a 140-column limit, aligned initializers, and brace wrapping for classes and functions. Run `clang-format -i <file>` before committing; the CMake `clang-format` target is available when LLVM tools are on your PATH. Prefer `CamelCase` for classes, `snake_case` for functions and locals, and `SCREAMING_CASE` for constants, matching conventions in `src/`. Keep headers self-contained and align include order with the IWYU pragmas.
|
||||||
|
|
||||||
|
## Testing Guidelines
|
||||||
|
Unit tests rely on Catch2 (`tests/catch2/`). Name specs after the component under test—for example `tests/libslic3r/TestPlanarHole.cpp`—and tag long-running cases so `ctest -L fast` remains useful. Cover new algorithms with deterministic fixtures or sample G-code stored in `tests/data/`. Document manual printer validation or regression slicer checks in your PR when automated coverage is insufficient.
|
||||||
|
|
||||||
|
## Commit & Pull Request Guidelines
|
||||||
|
The history favors concise, sentence-style subject lines with optional issue references, e.g., `Fix grid lines origin for multiple plates (#10724)`. Squash fixups locally before opening a PR. Complete `.github/pull_request_template.md`, include reproduction steps or screenshots for UI changes, and mention impacted presets or translations. Link issues via `Closes #NNNN` when applicable, and call out dependency bumps or profile migrations for maintainer review.
|
||||||
|
|
||||||
|
## Security & Configuration Tips
|
||||||
|
Follow `SECURITY.md` for vulnerability reporting. Keep API tokens and printer credentials out of tracked configs; use `sandboxes/` for experimental settings. When touching third-party code in `deps_src/`, record the upstream commit or release in your PR description and run the relevant platform build script to confirm integration.
|
||||||
234
CLAUDE.md
Normal file
@@ -0,0 +1,234 @@
|
|||||||
|
# CLAUDE.md
|
||||||
|
|
||||||
|
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
OrcaSlicer is an open-source 3D slicer application forked from Bambu Studio, built using C++ with wxWidgets for the GUI and CMake as the build system. The project uses a modular architecture with separate libraries for core slicing functionality, GUI components, and platform-specific code.
|
||||||
|
|
||||||
|
## Build Commands
|
||||||
|
|
||||||
|
### Building on Windows
|
||||||
|
**Always use this command to build the project when testing build issues on Windows.**
|
||||||
|
```bash
|
||||||
|
cmake --build . --config %build_type% --target ALL_BUILD -- -m
|
||||||
|
```
|
||||||
|
|
||||||
|
### Building on macOS
|
||||||
|
**Always use this command to build the project when testing build issues on macOS.**
|
||||||
|
```bash
|
||||||
|
cmake --build build/arm64 --config RelWithDebInfo --target all --
|
||||||
|
```
|
||||||
|
|
||||||
|
### Building on Linux
|
||||||
|
**Always use this command to build the project when testing build issues on Linux.**
|
||||||
|
```bash
|
||||||
|
cmake --build build/arm64 --config RelWithDebInfo --target all --
|
||||||
|
|
||||||
|
```
|
||||||
|
### Build test:
|
||||||
|
|
||||||
|
**Always use this command to build the project when testing build issues on Windows.**
|
||||||
|
```bash
|
||||||
|
cmake --build . --config %build_type% --target ALL_BUILD -- -m
|
||||||
|
```
|
||||||
|
|
||||||
|
### Building on macOS
|
||||||
|
**Always use this command to build the project when testing build issues on macOS.**
|
||||||
|
```bash
|
||||||
|
cmake --build build/arm64 --config RelWithDebInfo --target all --
|
||||||
|
```
|
||||||
|
|
||||||
|
### Building on Linux
|
||||||
|
**Always use this command to build the project when testing build issues on Linux.**
|
||||||
|
```bash
|
||||||
|
cmake --build build --config RelWithDebInfo --target all --
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
### Build System
|
||||||
|
- Uses CMake with minimum version 3.13 (maximum 3.31.x on Windows)
|
||||||
|
- Primary build directory: `build/`
|
||||||
|
- Dependencies are built in `deps/build/`
|
||||||
|
- The build process is split into dependency building and main application building
|
||||||
|
- Windows builds use Visual Studio generators
|
||||||
|
- macOS builds use Xcode by default, Ninja with -x flag
|
||||||
|
- Linux builds use Ninja generator
|
||||||
|
|
||||||
|
### Testing
|
||||||
|
Tests are located in the `tests/` directory and use the Catch2 testing framework. Test structure:
|
||||||
|
- `tests/libslic3r/` - Core library tests (21 test files)
|
||||||
|
- Geometry processing, algorithms, file formats (STL, 3MF, AMF)
|
||||||
|
- Polygon operations, clipper utilities, Voronoi diagrams
|
||||||
|
- `tests/fff_print/` - Fused Filament Fabrication tests (12 test files)
|
||||||
|
- Slicing algorithms, G-code generation, print mechanics
|
||||||
|
- Fill patterns, extrusion, support material
|
||||||
|
- `tests/sla_print/` - Stereolithography tests (4 test files)
|
||||||
|
- SLA-specific printing algorithms, support generation
|
||||||
|
- `tests/libnest2d/` - 2D nesting algorithm tests
|
||||||
|
- `tests/slic3rutils/` - Utility function tests
|
||||||
|
- `tests/sandboxes/` - Experimental/sandbox test code
|
||||||
|
|
||||||
|
Run all tests after building:
|
||||||
|
```bash
|
||||||
|
cd build && ctest
|
||||||
|
```
|
||||||
|
|
||||||
|
Run tests with verbose output:
|
||||||
|
```bash
|
||||||
|
cd build && ctest --output-on-failure
|
||||||
|
```
|
||||||
|
|
||||||
|
Run individual test suites:
|
||||||
|
```bash
|
||||||
|
# From build directory
|
||||||
|
ctest --test-dir ./tests/libslic3r/libslic3r_tests
|
||||||
|
ctest --test-dir ./tests/fff_print/fff_print_tests
|
||||||
|
ctest --test-dir ./tests/sla_print/sla_print_tests
|
||||||
|
# and so on
|
||||||
|
```
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
### Core Libraries
|
||||||
|
- **libslic3r/**: Core slicing engine and algorithms (platform-independent)
|
||||||
|
- Main slicing logic, geometry processing, G-code generation
|
||||||
|
- Key classes: Print, PrintObject, Layer, GCode, Config
|
||||||
|
- Modular design with specialized subdirectories:
|
||||||
|
- `GCode/` - G-code generation, cooling, pressure equalization, thumbnails
|
||||||
|
- `Fill/` - Infill pattern implementations (gyroid, honeycomb, lightning, etc.)
|
||||||
|
- `Support/` - Tree supports and traditional support generation
|
||||||
|
- `Geometry/` - Advanced geometry operations, Voronoi diagrams, medial axis
|
||||||
|
- `Format/` - File I/O for 3MF, AMF, STL, OBJ, STEP formats
|
||||||
|
- `SLA/` - SLA-specific print processing and support generation
|
||||||
|
- `Arachne/` - Advanced wall generation using skeletal trapezoidation
|
||||||
|
|
||||||
|
- **src/slic3r/**: Main application framework and GUI
|
||||||
|
- GUI application built with wxWidgets
|
||||||
|
- Integration between libslic3r core and user interface
|
||||||
|
- Located in `src/slic3r/GUI/` (not shown in this directory but exists)
|
||||||
|
|
||||||
|
### Key Algorithmic Components
|
||||||
|
- **Arachne Wall Generation**: Variable-width perimeter generation using skeletal trapezoidation
|
||||||
|
- **Tree Supports**: Organic support generation algorithm
|
||||||
|
- **Lightning Infill**: Sparse infill optimization for internal structures
|
||||||
|
- **Adaptive Slicing**: Variable layer height based on geometry
|
||||||
|
- **Multi-material**: Multi-extruder and soluble support processing
|
||||||
|
- **G-code Post-processing**: Cooling, fan control, pressure advance, conflict checking
|
||||||
|
|
||||||
|
### File Format Support
|
||||||
|
- **3MF/BBS_3MF**: Native format with extensions for multi-material and metadata
|
||||||
|
- **STL**: Standard tessellation language for 3D models
|
||||||
|
- **AMF**: Additive Manufacturing Format with color/material support
|
||||||
|
- **OBJ**: Wavefront OBJ with material definitions
|
||||||
|
- **STEP**: CAD format support for precise geometry
|
||||||
|
- **G-code**: Output format with extensive post-processing capabilities
|
||||||
|
|
||||||
|
### External Dependencies
|
||||||
|
- **Clipper2**: Advanced 2D polygon clipping and offsetting
|
||||||
|
- **libigl**: Computational geometry library for mesh operations
|
||||||
|
- **TBB**: Intel Threading Building Blocks for parallelization
|
||||||
|
- **wxWidgets**: Cross-platform GUI framework
|
||||||
|
- **OpenGL**: 3D graphics rendering and visualization
|
||||||
|
- **CGAL**: Computational Geometry Algorithms Library (selective use)
|
||||||
|
- **OpenVDB**: Volumetric data structures for advanced operations
|
||||||
|
- **Eigen**: Linear algebra library for mathematical operations
|
||||||
|
|
||||||
|
## File Organization
|
||||||
|
|
||||||
|
### Resources and Configuration
|
||||||
|
- `resources/profiles/` - Printer and material profiles organized by manufacturer
|
||||||
|
- `resources/printers/` - Printer-specific configurations and G-code templates
|
||||||
|
- `resources/images/` - UI icons, logos, calibration images
|
||||||
|
- `resources/calib/` - Calibration test patterns and data
|
||||||
|
- `resources/handy_models/` - Built-in test models (benchy, calibration cubes)
|
||||||
|
|
||||||
|
### Internationalization and Localization
|
||||||
|
- `localization/i18n/` - Source translation files (.pot, .po)
|
||||||
|
- `resources/i18n/` - Runtime language resources
|
||||||
|
- Translation managed via `scripts/run_gettext.sh` / `scripts/run_gettext.bat`
|
||||||
|
|
||||||
|
### Platform-Specific Code
|
||||||
|
- `src/libslic3r/Platform.cpp` - Platform abstractions and utilities
|
||||||
|
- `src/libslic3r/MacUtils.mm` - macOS-specific utilities (Objective-C++)
|
||||||
|
- Windows-specific build scripts and configurations
|
||||||
|
- Linux distribution support scripts in `scripts/linux.d/`
|
||||||
|
|
||||||
|
### Build and Development Tools
|
||||||
|
- `cmake/modules/` - Custom CMake find modules and utilities
|
||||||
|
- `scripts/` - Python utilities for profile generation and validation
|
||||||
|
- `tools/` - Windows build tools (gettext utilities)
|
||||||
|
- `deps/` - External dependency build configurations
|
||||||
|
|
||||||
|
## Development Workflow
|
||||||
|
|
||||||
|
### Code Style and Standards
|
||||||
|
- **C++17 standard** with selective C++20 features
|
||||||
|
- **Naming conventions**: PascalCase for classes, snake_case for functions/variables
|
||||||
|
- **Header guards**: Use `#pragma once`
|
||||||
|
- **Memory management**: Prefer smart pointers, RAII patterns
|
||||||
|
- **Thread safety**: Use TBB for parallelization, be mindful of shared state
|
||||||
|
|
||||||
|
### Common Development Tasks
|
||||||
|
|
||||||
|
#### Adding New Print Settings
|
||||||
|
1. Define setting in `PrintConfig.cpp` with proper bounds and defaults
|
||||||
|
2. Add UI controls in appropriate GUI components
|
||||||
|
3. Update serialization in config save/load
|
||||||
|
4. Add tooltips and help text for user guidance
|
||||||
|
5. Test with different printer profiles
|
||||||
|
|
||||||
|
#### Modifying Slicing Algorithms
|
||||||
|
1. Core algorithms live in `libslic3r/` subdirectories
|
||||||
|
2. Performance-critical code should be profiled and optimized
|
||||||
|
3. Consider multi-threading implications (TBB integration)
|
||||||
|
4. Validate changes don't break existing profiles
|
||||||
|
5. Add regression tests where appropriate
|
||||||
|
|
||||||
|
#### GUI Development
|
||||||
|
1. GUI code resides in `src/slic3r/GUI/` (not visible in current tree)
|
||||||
|
2. Use existing wxWidgets patterns and custom controls
|
||||||
|
3. Support both light and dark themes
|
||||||
|
4. Consider DPI scaling on high-resolution displays
|
||||||
|
5. Maintain cross-platform compatibility
|
||||||
|
|
||||||
|
#### Adding Printer Support
|
||||||
|
1. Create JSON profile in `resources/profiles/[manufacturer].json`
|
||||||
|
2. Add printer-specific start/end G-code templates
|
||||||
|
3. Configure build volume, capabilities, and material compatibility
|
||||||
|
4. Test thoroughly with actual hardware when possible
|
||||||
|
5. Follow existing profile structure and naming conventions
|
||||||
|
|
||||||
|
### Dependencies and Build System
|
||||||
|
- **CMake-based** with separate dependency building phase
|
||||||
|
- **Dependencies** built once in `deps/build/`, then linked to main application
|
||||||
|
- **Cross-platform** considerations important for all changes
|
||||||
|
- **Resource files** embedded at build time, platform-specific handling
|
||||||
|
|
||||||
|
### Performance Considerations
|
||||||
|
- **Slicing algorithms** are CPU-intensive, profile before optimizing
|
||||||
|
- **Memory usage** can be substantial with complex models
|
||||||
|
- **Multi-threading** extensively used via TBB
|
||||||
|
- **File I/O** optimized for large 3MF files with embedded textures
|
||||||
|
- **Real-time preview** requires efficient mesh processing
|
||||||
|
|
||||||
|
## Important Development Notes
|
||||||
|
|
||||||
|
### Codebase Navigation
|
||||||
|
- Use search tools extensively - codebase has 500k+ lines
|
||||||
|
- Key entry points: `src/OrcaSlicer.cpp` for application startup
|
||||||
|
- Core slicing: `libslic3r/Print.cpp` orchestrates the slicing pipeline
|
||||||
|
- Configuration: `PrintConfig.cpp` defines all print/printer/material settings
|
||||||
|
|
||||||
|
### Compatibility and Stability
|
||||||
|
- **Backward compatibility** maintained for project files and profiles
|
||||||
|
- **Cross-platform** support essential (Windows/macOS/Linux)
|
||||||
|
- **File format** changes require careful version handling
|
||||||
|
- **Profile migrations** needed when settings change significantly
|
||||||
|
|
||||||
|
### Quality and Testing
|
||||||
|
- **Regression testing** important due to algorithm complexity
|
||||||
|
- **Performance benchmarks** help catch performance regressions
|
||||||
|
- **Memory leak** detection important for long-running GUI application
|
||||||
|
- **Cross-platform** testing required before releases
|
||||||
1055
CMakeLists.txt
Normal file
661
LICENSE.txt
Normal file
@@ -0,0 +1,661 @@
|
|||||||
|
GNU AFFERO GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 19 November 2007
|
||||||
|
|
||||||
|
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
Preamble
|
||||||
|
|
||||||
|
The GNU Affero General Public License is a free, copyleft license for
|
||||||
|
software and other kinds of works, specifically designed to ensure
|
||||||
|
cooperation with the community in the case of network server software.
|
||||||
|
|
||||||
|
The licenses for most software and other practical works are designed
|
||||||
|
to take away your freedom to share and change the works. By contrast,
|
||||||
|
our General Public Licenses are intended to guarantee your freedom to
|
||||||
|
share and change all versions of a program--to make sure it remains free
|
||||||
|
software for all its users.
|
||||||
|
|
||||||
|
When we speak of free software, we are referring to freedom, not
|
||||||
|
price. Our General Public Licenses are designed to make sure that you
|
||||||
|
have the freedom to distribute copies of free software (and charge for
|
||||||
|
them if you wish), that you receive source code or can get it if you
|
||||||
|
want it, that you can change the software or use pieces of it in new
|
||||||
|
free programs, and that you know you can do these things.
|
||||||
|
|
||||||
|
Developers that use our General Public Licenses protect your rights
|
||||||
|
with two steps: (1) assert copyright on the software, and (2) offer
|
||||||
|
you this License which gives you legal permission to copy, distribute
|
||||||
|
and/or modify the software.
|
||||||
|
|
||||||
|
A secondary benefit of defending all users' freedom is that
|
||||||
|
improvements made in alternate versions of the program, if they
|
||||||
|
receive widespread use, become available for other developers to
|
||||||
|
incorporate. Many developers of free software are heartened and
|
||||||
|
encouraged by the resulting cooperation. However, in the case of
|
||||||
|
software used on network servers, this result may fail to come about.
|
||||||
|
The GNU General Public License permits making a modified version and
|
||||||
|
letting the public access it on a server without ever releasing its
|
||||||
|
source code to the public.
|
||||||
|
|
||||||
|
The GNU Affero General Public License is designed specifically to
|
||||||
|
ensure that, in such cases, the modified source code becomes available
|
||||||
|
to the community. It requires the operator of a network server to
|
||||||
|
provide the source code of the modified version running there to the
|
||||||
|
users of that server. Therefore, public use of a modified version, on
|
||||||
|
a publicly accessible server, gives the public access to the source
|
||||||
|
code of the modified version.
|
||||||
|
|
||||||
|
An older license, called the Affero General Public License and
|
||||||
|
published by Affero, was designed to accomplish similar goals. This is
|
||||||
|
a different license, not a version of the Affero GPL, but Affero has
|
||||||
|
released a new version of the Affero GPL which permits relicensing under
|
||||||
|
this license.
|
||||||
|
|
||||||
|
The precise terms and conditions for copying, distribution and
|
||||||
|
modification follow.
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
0. Definitions.
|
||||||
|
|
||||||
|
"This License" refers to version 3 of the GNU Affero General Public License.
|
||||||
|
|
||||||
|
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||||
|
works, such as semiconductor masks.
|
||||||
|
|
||||||
|
"The Program" refers to any copyrightable work licensed under this
|
||||||
|
License. Each licensee is addressed as "you". "Licensees" and
|
||||||
|
"recipients" may be individuals or organizations.
|
||||||
|
|
||||||
|
To "modify" a work means to copy from or adapt all or part of the work
|
||||||
|
in a fashion requiring copyright permission, other than the making of an
|
||||||
|
exact copy. The resulting work is called a "modified version" of the
|
||||||
|
earlier work or a work "based on" the earlier work.
|
||||||
|
|
||||||
|
A "covered work" means either the unmodified Program or a work based
|
||||||
|
on the Program.
|
||||||
|
|
||||||
|
To "propagate" a work means to do anything with it that, without
|
||||||
|
permission, would make you directly or secondarily liable for
|
||||||
|
infringement under applicable copyright law, except executing it on a
|
||||||
|
computer or modifying a private copy. Propagation includes copying,
|
||||||
|
distribution (with or without modification), making available to the
|
||||||
|
public, and in some countries other activities as well.
|
||||||
|
|
||||||
|
To "convey" a work means any kind of propagation that enables other
|
||||||
|
parties to make or receive copies. Mere interaction with a user through
|
||||||
|
a computer network, with no transfer of a copy, is not conveying.
|
||||||
|
|
||||||
|
An interactive user interface displays "Appropriate Legal Notices"
|
||||||
|
to the extent that it includes a convenient and prominently visible
|
||||||
|
feature that (1) displays an appropriate copyright notice, and (2)
|
||||||
|
tells the user that there is no warranty for the work (except to the
|
||||||
|
extent that warranties are provided), that licensees may convey the
|
||||||
|
work under this License, and how to view a copy of this License. If
|
||||||
|
the interface presents a list of user commands or options, such as a
|
||||||
|
menu, a prominent item in the list meets this criterion.
|
||||||
|
|
||||||
|
1. Source Code.
|
||||||
|
|
||||||
|
The "source code" for a work means the preferred form of the work
|
||||||
|
for making modifications to it. "Object code" means any non-source
|
||||||
|
form of a work.
|
||||||
|
|
||||||
|
A "Standard Interface" means an interface that either is an official
|
||||||
|
standard defined by a recognized standards body, or, in the case of
|
||||||
|
interfaces specified for a particular programming language, one that
|
||||||
|
is widely used among developers working in that language.
|
||||||
|
|
||||||
|
The "System Libraries" of an executable work include anything, other
|
||||||
|
than the work as a whole, that (a) is included in the normal form of
|
||||||
|
packaging a Major Component, but which is not part of that Major
|
||||||
|
Component, and (b) serves only to enable use of the work with that
|
||||||
|
Major Component, or to implement a Standard Interface for which an
|
||||||
|
implementation is available to the public in source code form. A
|
||||||
|
"Major Component", in this context, means a major essential component
|
||||||
|
(kernel, window system, and so on) of the specific operating system
|
||||||
|
(if any) on which the executable work runs, or a compiler used to
|
||||||
|
produce the work, or an object code interpreter used to run it.
|
||||||
|
|
||||||
|
The "Corresponding Source" for a work in object code form means all
|
||||||
|
the source code needed to generate, install, and (for an executable
|
||||||
|
work) run the object code and to modify the work, including scripts to
|
||||||
|
control those activities. However, it does not include the work's
|
||||||
|
System Libraries, or general-purpose tools or generally available free
|
||||||
|
programs which are used unmodified in performing those activities but
|
||||||
|
which are not part of the work. For example, Corresponding Source
|
||||||
|
includes interface definition files associated with source files for
|
||||||
|
the work, and the source code for shared libraries and dynamically
|
||||||
|
linked subprograms that the work is specifically designed to require,
|
||||||
|
such as by intimate data communication or control flow between those
|
||||||
|
subprograms and other parts of the work.
|
||||||
|
|
||||||
|
The Corresponding Source need not include anything that users
|
||||||
|
can regenerate automatically from other parts of the Corresponding
|
||||||
|
Source.
|
||||||
|
|
||||||
|
The Corresponding Source for a work in source code form is that
|
||||||
|
same work.
|
||||||
|
|
||||||
|
2. Basic Permissions.
|
||||||
|
|
||||||
|
All rights granted under this License are granted for the term of
|
||||||
|
copyright on the Program, and are irrevocable provided the stated
|
||||||
|
conditions are met. This License explicitly affirms your unlimited
|
||||||
|
permission to run the unmodified Program. The output from running a
|
||||||
|
covered work is covered by this License only if the output, given its
|
||||||
|
content, constitutes a covered work. This License acknowledges your
|
||||||
|
rights of fair use or other equivalent, as provided by copyright law.
|
||||||
|
|
||||||
|
You may make, run and propagate covered works that you do not
|
||||||
|
convey, without conditions so long as your license otherwise remains
|
||||||
|
in force. You may convey covered works to others for the sole purpose
|
||||||
|
of having them make modifications exclusively for you, or provide you
|
||||||
|
with facilities for running those works, provided that you comply with
|
||||||
|
the terms of this License in conveying all material for which you do
|
||||||
|
not control copyright. Those thus making or running the covered works
|
||||||
|
for you must do so exclusively on your behalf, under your direction
|
||||||
|
and control, on terms that prohibit them from making any copies of
|
||||||
|
your copyrighted material outside their relationship with you.
|
||||||
|
|
||||||
|
Conveying under any other circumstances is permitted solely under
|
||||||
|
the conditions stated below. Sublicensing is not allowed; section 10
|
||||||
|
makes it unnecessary.
|
||||||
|
|
||||||
|
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||||
|
|
||||||
|
No covered work shall be deemed part of an effective technological
|
||||||
|
measure under any applicable law fulfilling obligations under article
|
||||||
|
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||||
|
similar laws prohibiting or restricting circumvention of such
|
||||||
|
measures.
|
||||||
|
|
||||||
|
When you convey a covered work, you waive any legal power to forbid
|
||||||
|
circumvention of technological measures to the extent such circumvention
|
||||||
|
is effected by exercising rights under this License with respect to
|
||||||
|
the covered work, and you disclaim any intention to limit operation or
|
||||||
|
modification of the work as a means of enforcing, against the work's
|
||||||
|
users, your or third parties' legal rights to forbid circumvention of
|
||||||
|
technological measures.
|
||||||
|
|
||||||
|
4. Conveying Verbatim Copies.
|
||||||
|
|
||||||
|
You may convey verbatim copies of the Program's source code as you
|
||||||
|
receive it, in any medium, provided that you conspicuously and
|
||||||
|
appropriately publish on each copy an appropriate copyright notice;
|
||||||
|
keep intact all notices stating that this License and any
|
||||||
|
non-permissive terms added in accord with section 7 apply to the code;
|
||||||
|
keep intact all notices of the absence of any warranty; and give all
|
||||||
|
recipients a copy of this License along with the Program.
|
||||||
|
|
||||||
|
You may charge any price or no price for each copy that you convey,
|
||||||
|
and you may offer support or warranty protection for a fee.
|
||||||
|
|
||||||
|
5. Conveying Modified Source Versions.
|
||||||
|
|
||||||
|
You may convey a work based on the Program, or the modifications to
|
||||||
|
produce it from the Program, in the form of source code under the
|
||||||
|
terms of section 4, provided that you also meet all of these conditions:
|
||||||
|
|
||||||
|
a) The work must carry prominent notices stating that you modified
|
||||||
|
it, and giving a relevant date.
|
||||||
|
|
||||||
|
b) The work must carry prominent notices stating that it is
|
||||||
|
released under this License and any conditions added under section
|
||||||
|
7. This requirement modifies the requirement in section 4 to
|
||||||
|
"keep intact all notices".
|
||||||
|
|
||||||
|
c) You must license the entire work, as a whole, under this
|
||||||
|
License to anyone who comes into possession of a copy. This
|
||||||
|
License will therefore apply, along with any applicable section 7
|
||||||
|
additional terms, to the whole of the work, and all its parts,
|
||||||
|
regardless of how they are packaged. This License gives no
|
||||||
|
permission to license the work in any other way, but it does not
|
||||||
|
invalidate such permission if you have separately received it.
|
||||||
|
|
||||||
|
d) If the work has interactive user interfaces, each must display
|
||||||
|
Appropriate Legal Notices; however, if the Program has interactive
|
||||||
|
interfaces that do not display Appropriate Legal Notices, your
|
||||||
|
work need not make them do so.
|
||||||
|
|
||||||
|
A compilation of a covered work with other separate and independent
|
||||||
|
works, which are not by their nature extensions of the covered work,
|
||||||
|
and which are not combined with it such as to form a larger program,
|
||||||
|
in or on a volume of a storage or distribution medium, is called an
|
||||||
|
"aggregate" if the compilation and its resulting copyright are not
|
||||||
|
used to limit the access or legal rights of the compilation's users
|
||||||
|
beyond what the individual works permit. Inclusion of a covered work
|
||||||
|
in an aggregate does not cause this License to apply to the other
|
||||||
|
parts of the aggregate.
|
||||||
|
|
||||||
|
6. Conveying Non-Source Forms.
|
||||||
|
|
||||||
|
You may convey a covered work in object code form under the terms
|
||||||
|
of sections 4 and 5, provided that you also convey the
|
||||||
|
machine-readable Corresponding Source under the terms of this License,
|
||||||
|
in one of these ways:
|
||||||
|
|
||||||
|
a) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by the
|
||||||
|
Corresponding Source fixed on a durable physical medium
|
||||||
|
customarily used for software interchange.
|
||||||
|
|
||||||
|
b) Convey the object code in, or embodied in, a physical product
|
||||||
|
(including a physical distribution medium), accompanied by a
|
||||||
|
written offer, valid for at least three years and valid for as
|
||||||
|
long as you offer spare parts or customer support for that product
|
||||||
|
model, to give anyone who possesses the object code either (1) a
|
||||||
|
copy of the Corresponding Source for all the software in the
|
||||||
|
product that is covered by this License, on a durable physical
|
||||||
|
medium customarily used for software interchange, for a price no
|
||||||
|
more than your reasonable cost of physically performing this
|
||||||
|
conveying of source, or (2) access to copy the
|
||||||
|
Corresponding Source from a network server at no charge.
|
||||||
|
|
||||||
|
c) Convey individual copies of the object code with a copy of the
|
||||||
|
written offer to provide the Corresponding Source. This
|
||||||
|
alternative is allowed only occasionally and noncommercially, and
|
||||||
|
only if you received the object code with such an offer, in accord
|
||||||
|
with subsection 6b.
|
||||||
|
|
||||||
|
d) Convey the object code by offering access from a designated
|
||||||
|
place (gratis or for a charge), and offer equivalent access to the
|
||||||
|
Corresponding Source in the same way through the same place at no
|
||||||
|
further charge. You need not require recipients to copy the
|
||||||
|
Corresponding Source along with the object code. If the place to
|
||||||
|
copy the object code is a network server, the Corresponding Source
|
||||||
|
may be on a different server (operated by you or a third party)
|
||||||
|
that supports equivalent copying facilities, provided you maintain
|
||||||
|
clear directions next to the object code saying where to find the
|
||||||
|
Corresponding Source. Regardless of what server hosts the
|
||||||
|
Corresponding Source, you remain obligated to ensure that it is
|
||||||
|
available for as long as needed to satisfy these requirements.
|
||||||
|
|
||||||
|
e) Convey the object code using peer-to-peer transmission, provided
|
||||||
|
you inform other peers where the object code and Corresponding
|
||||||
|
Source of the work are being offered to the general public at no
|
||||||
|
charge under subsection 6d.
|
||||||
|
|
||||||
|
A separable portion of the object code, whose source code is excluded
|
||||||
|
from the Corresponding Source as a System Library, need not be
|
||||||
|
included in conveying the object code work.
|
||||||
|
|
||||||
|
A "User Product" is either (1) a "consumer product", which means any
|
||||||
|
tangible personal property which is normally used for personal, family,
|
||||||
|
or household purposes, or (2) anything designed or sold for incorporation
|
||||||
|
into a dwelling. In determining whether a product is a consumer product,
|
||||||
|
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||||
|
product received by a particular user, "normally used" refers to a
|
||||||
|
typical or common use of that class of product, regardless of the status
|
||||||
|
of the particular user or of the way in which the particular user
|
||||||
|
actually uses, or expects or is expected to use, the product. A product
|
||||||
|
is a consumer product regardless of whether the product has substantial
|
||||||
|
commercial, industrial or non-consumer uses, unless such uses represent
|
||||||
|
the only significant mode of use of the product.
|
||||||
|
|
||||||
|
"Installation Information" for a User Product means any methods,
|
||||||
|
procedures, authorization keys, or other information required to install
|
||||||
|
and execute modified versions of a covered work in that User Product from
|
||||||
|
a modified version of its Corresponding Source. The information must
|
||||||
|
suffice to ensure that the continued functioning of the modified object
|
||||||
|
code is in no case prevented or interfered with solely because
|
||||||
|
modification has been made.
|
||||||
|
|
||||||
|
If you convey an object code work under this section in, or with, or
|
||||||
|
specifically for use in, a User Product, and the conveying occurs as
|
||||||
|
part of a transaction in which the right of possession and use of the
|
||||||
|
User Product is transferred to the recipient in perpetuity or for a
|
||||||
|
fixed term (regardless of how the transaction is characterized), the
|
||||||
|
Corresponding Source conveyed under this section must be accompanied
|
||||||
|
by the Installation Information. But this requirement does not apply
|
||||||
|
if neither you nor any third party retains the ability to install
|
||||||
|
modified object code on the User Product (for example, the work has
|
||||||
|
been installed in ROM).
|
||||||
|
|
||||||
|
The requirement to provide Installation Information does not include a
|
||||||
|
requirement to continue to provide support service, warranty, or updates
|
||||||
|
for a work that has been modified or installed by the recipient, or for
|
||||||
|
the User Product in which it has been modified or installed. Access to a
|
||||||
|
network may be denied when the modification itself materially and
|
||||||
|
adversely affects the operation of the network or violates the rules and
|
||||||
|
protocols for communication across the network.
|
||||||
|
|
||||||
|
Corresponding Source conveyed, and Installation Information provided,
|
||||||
|
in accord with this section must be in a format that is publicly
|
||||||
|
documented (and with an implementation available to the public in
|
||||||
|
source code form), and must require no special password or key for
|
||||||
|
unpacking, reading or copying.
|
||||||
|
|
||||||
|
7. Additional Terms.
|
||||||
|
|
||||||
|
"Additional permissions" are terms that supplement the terms of this
|
||||||
|
License by making exceptions from one or more of its conditions.
|
||||||
|
Additional permissions that are applicable to the entire Program shall
|
||||||
|
be treated as though they were included in this License, to the extent
|
||||||
|
that they are valid under applicable law. If additional permissions
|
||||||
|
apply only to part of the Program, that part may be used separately
|
||||||
|
under those permissions, but the entire Program remains governed by
|
||||||
|
this License without regard to the additional permissions.
|
||||||
|
|
||||||
|
When you convey a copy of a covered work, you may at your option
|
||||||
|
remove any additional permissions from that copy, or from any part of
|
||||||
|
it. (Additional permissions may be written to require their own
|
||||||
|
removal in certain cases when you modify the work.) You may place
|
||||||
|
additional permissions on material, added by you to a covered work,
|
||||||
|
for which you have or can give appropriate copyright permission.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, for material you
|
||||||
|
add to a covered work, you may (if authorized by the copyright holders of
|
||||||
|
that material) supplement the terms of this License with terms:
|
||||||
|
|
||||||
|
a) Disclaiming warranty or limiting liability differently from the
|
||||||
|
terms of sections 15 and 16 of this License; or
|
||||||
|
|
||||||
|
b) Requiring preservation of specified reasonable legal notices or
|
||||||
|
author attributions in that material or in the Appropriate Legal
|
||||||
|
Notices displayed by works containing it; or
|
||||||
|
|
||||||
|
c) Prohibiting misrepresentation of the origin of that material, or
|
||||||
|
requiring that modified versions of such material be marked in
|
||||||
|
reasonable ways as different from the original version; or
|
||||||
|
|
||||||
|
d) Limiting the use for publicity purposes of names of licensors or
|
||||||
|
authors of the material; or
|
||||||
|
|
||||||
|
e) Declining to grant rights under trademark law for use of some
|
||||||
|
trade names, trademarks, or service marks; or
|
||||||
|
|
||||||
|
f) Requiring indemnification of licensors and authors of that
|
||||||
|
material by anyone who conveys the material (or modified versions of
|
||||||
|
it) with contractual assumptions of liability to the recipient, for
|
||||||
|
any liability that these contractual assumptions directly impose on
|
||||||
|
those licensors and authors.
|
||||||
|
|
||||||
|
All other non-permissive additional terms are considered "further
|
||||||
|
restrictions" within the meaning of section 10. If the Program as you
|
||||||
|
received it, or any part of it, contains a notice stating that it is
|
||||||
|
governed by this License along with a term that is a further
|
||||||
|
restriction, you may remove that term. If a license document contains
|
||||||
|
a further restriction but permits relicensing or conveying under this
|
||||||
|
License, you may add to a covered work material governed by the terms
|
||||||
|
of that license document, provided that the further restriction does
|
||||||
|
not survive such relicensing or conveying.
|
||||||
|
|
||||||
|
If you add terms to a covered work in accord with this section, you
|
||||||
|
must place, in the relevant source files, a statement of the
|
||||||
|
additional terms that apply to those files, or a notice indicating
|
||||||
|
where to find the applicable terms.
|
||||||
|
|
||||||
|
Additional terms, permissive or non-permissive, may be stated in the
|
||||||
|
form of a separately written license, or stated as exceptions;
|
||||||
|
the above requirements apply either way.
|
||||||
|
|
||||||
|
8. Termination.
|
||||||
|
|
||||||
|
You may not propagate or modify a covered work except as expressly
|
||||||
|
provided under this License. Any attempt otherwise to propagate or
|
||||||
|
modify it is void, and will automatically terminate your rights under
|
||||||
|
this License (including any patent licenses granted under the third
|
||||||
|
paragraph of section 11).
|
||||||
|
|
||||||
|
However, if you cease all violation of this License, then your
|
||||||
|
license from a particular copyright holder is reinstated (a)
|
||||||
|
provisionally, unless and until the copyright holder explicitly and
|
||||||
|
finally terminates your license, and (b) permanently, if the copyright
|
||||||
|
holder fails to notify you of the violation by some reasonable means
|
||||||
|
prior to 60 days after the cessation.
|
||||||
|
|
||||||
|
Moreover, your license from a particular copyright holder is
|
||||||
|
reinstated permanently if the copyright holder notifies you of the
|
||||||
|
violation by some reasonable means, this is the first time you have
|
||||||
|
received notice of violation of this License (for any work) from that
|
||||||
|
copyright holder, and you cure the violation prior to 30 days after
|
||||||
|
your receipt of the notice.
|
||||||
|
|
||||||
|
Termination of your rights under this section does not terminate the
|
||||||
|
licenses of parties who have received copies or rights from you under
|
||||||
|
this License. If your rights have been terminated and not permanently
|
||||||
|
reinstated, you do not qualify to receive new licenses for the same
|
||||||
|
material under section 10.
|
||||||
|
|
||||||
|
9. Acceptance Not Required for Having Copies.
|
||||||
|
|
||||||
|
You are not required to accept this License in order to receive or
|
||||||
|
run a copy of the Program. Ancillary propagation of a covered work
|
||||||
|
occurring solely as a consequence of using peer-to-peer transmission
|
||||||
|
to receive a copy likewise does not require acceptance. However,
|
||||||
|
nothing other than this License grants you permission to propagate or
|
||||||
|
modify any covered work. These actions infringe copyright if you do
|
||||||
|
not accept this License. Therefore, by modifying or propagating a
|
||||||
|
covered work, you indicate your acceptance of this License to do so.
|
||||||
|
|
||||||
|
10. Automatic Licensing of Downstream Recipients.
|
||||||
|
|
||||||
|
Each time you convey a covered work, the recipient automatically
|
||||||
|
receives a license from the original licensors, to run, modify and
|
||||||
|
propagate that work, subject to this License. You are not responsible
|
||||||
|
for enforcing compliance by third parties with this License.
|
||||||
|
|
||||||
|
An "entity transaction" is a transaction transferring control of an
|
||||||
|
organization, or substantially all assets of one, or subdividing an
|
||||||
|
organization, or merging organizations. If propagation of a covered
|
||||||
|
work results from an entity transaction, each party to that
|
||||||
|
transaction who receives a copy of the work also receives whatever
|
||||||
|
licenses to the work the party's predecessor in interest had or could
|
||||||
|
give under the previous paragraph, plus a right to possession of the
|
||||||
|
Corresponding Source of the work from the predecessor in interest, if
|
||||||
|
the predecessor has it or can get it with reasonable efforts.
|
||||||
|
|
||||||
|
You may not impose any further restrictions on the exercise of the
|
||||||
|
rights granted or affirmed under this License. For example, you may
|
||||||
|
not impose a license fee, royalty, or other charge for exercise of
|
||||||
|
rights granted under this License, and you may not initiate litigation
|
||||||
|
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||||
|
any patent claim is infringed by making, using, selling, offering for
|
||||||
|
sale, or importing the Program or any portion of it.
|
||||||
|
|
||||||
|
11. Patents.
|
||||||
|
|
||||||
|
A "contributor" is a copyright holder who authorizes use under this
|
||||||
|
License of the Program or a work on which the Program is based. The
|
||||||
|
work thus licensed is called the contributor's "contributor version".
|
||||||
|
|
||||||
|
A contributor's "essential patent claims" are all patent claims
|
||||||
|
owned or controlled by the contributor, whether already acquired or
|
||||||
|
hereafter acquired, that would be infringed by some manner, permitted
|
||||||
|
by this License, of making, using, or selling its contributor version,
|
||||||
|
but do not include claims that would be infringed only as a
|
||||||
|
consequence of further modification of the contributor version. For
|
||||||
|
purposes of this definition, "control" includes the right to grant
|
||||||
|
patent sublicenses in a manner consistent with the requirements of
|
||||||
|
this License.
|
||||||
|
|
||||||
|
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||||
|
patent license under the contributor's essential patent claims, to
|
||||||
|
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||||
|
propagate the contents of its contributor version.
|
||||||
|
|
||||||
|
In the following three paragraphs, a "patent license" is any express
|
||||||
|
agreement or commitment, however denominated, not to enforce a patent
|
||||||
|
(such as an express permission to practice a patent or covenant not to
|
||||||
|
sue for patent infringement). To "grant" such a patent license to a
|
||||||
|
party means to make such an agreement or commitment not to enforce a
|
||||||
|
patent against the party.
|
||||||
|
|
||||||
|
If you convey a covered work, knowingly relying on a patent license,
|
||||||
|
and the Corresponding Source of the work is not available for anyone
|
||||||
|
to copy, free of charge and under the terms of this License, through a
|
||||||
|
publicly available network server or other readily accessible means,
|
||||||
|
then you must either (1) cause the Corresponding Source to be so
|
||||||
|
available, or (2) arrange to deprive yourself of the benefit of the
|
||||||
|
patent license for this particular work, or (3) arrange, in a manner
|
||||||
|
consistent with the requirements of this License, to extend the patent
|
||||||
|
license to downstream recipients. "Knowingly relying" means you have
|
||||||
|
actual knowledge that, but for the patent license, your conveying the
|
||||||
|
covered work in a country, or your recipient's use of the covered work
|
||||||
|
in a country, would infringe one or more identifiable patents in that
|
||||||
|
country that you have reason to believe are valid.
|
||||||
|
|
||||||
|
If, pursuant to or in connection with a single transaction or
|
||||||
|
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||||
|
covered work, and grant a patent license to some of the parties
|
||||||
|
receiving the covered work authorizing them to use, propagate, modify
|
||||||
|
or convey a specific copy of the covered work, then the patent license
|
||||||
|
you grant is automatically extended to all recipients of the covered
|
||||||
|
work and works based on it.
|
||||||
|
|
||||||
|
A patent license is "discriminatory" if it does not include within
|
||||||
|
the scope of its coverage, prohibits the exercise of, or is
|
||||||
|
conditioned on the non-exercise of one or more of the rights that are
|
||||||
|
specifically granted under this License. You may not convey a covered
|
||||||
|
work if you are a party to an arrangement with a third party that is
|
||||||
|
in the business of distributing software, under which you make payment
|
||||||
|
to the third party based on the extent of your activity of conveying
|
||||||
|
the work, and under which the third party grants, to any of the
|
||||||
|
parties who would receive the covered work from you, a discriminatory
|
||||||
|
patent license (a) in connection with copies of the covered work
|
||||||
|
conveyed by you (or copies made from those copies), or (b) primarily
|
||||||
|
for and in connection with specific products or compilations that
|
||||||
|
contain the covered work, unless you entered into that arrangement,
|
||||||
|
or that patent license was granted, prior to 28 March 2007.
|
||||||
|
|
||||||
|
Nothing in this License shall be construed as excluding or limiting
|
||||||
|
any implied license or other defenses to infringement that may
|
||||||
|
otherwise be available to you under applicable patent law.
|
||||||
|
|
||||||
|
12. No Surrender of Others' Freedom.
|
||||||
|
|
||||||
|
If conditions are imposed on you (whether by court order, agreement or
|
||||||
|
otherwise) that contradict the conditions of this License, they do not
|
||||||
|
excuse you from the conditions of this License. If you cannot convey a
|
||||||
|
covered work so as to satisfy simultaneously your obligations under this
|
||||||
|
License and any other pertinent obligations, then as a consequence you may
|
||||||
|
not convey it at all. For example, if you agree to terms that obligate you
|
||||||
|
to collect a royalty for further conveying from those to whom you convey
|
||||||
|
the Program, the only way you could satisfy both those terms and this
|
||||||
|
License would be to refrain entirely from conveying the Program.
|
||||||
|
|
||||||
|
13. Remote Network Interaction; Use with the GNU General Public License.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, if you modify the
|
||||||
|
Program, your modified version must prominently offer all users
|
||||||
|
interacting with it remotely through a computer network (if your version
|
||||||
|
supports such interaction) an opportunity to receive the Corresponding
|
||||||
|
Source of your version by providing access to the Corresponding Source
|
||||||
|
from a network server at no charge, through some standard or customary
|
||||||
|
means of facilitating copying of software. This Corresponding Source
|
||||||
|
shall include the Corresponding Source for any work covered by version 3
|
||||||
|
of the GNU General Public License that is incorporated pursuant to the
|
||||||
|
following paragraph.
|
||||||
|
|
||||||
|
Notwithstanding any other provision of this License, you have
|
||||||
|
permission to link or combine any covered work with a work licensed
|
||||||
|
under version 3 of the GNU General Public License into a single
|
||||||
|
combined work, and to convey the resulting work. The terms of this
|
||||||
|
License will continue to apply to the part which is the covered work,
|
||||||
|
but the work with which it is combined will remain governed by version
|
||||||
|
3 of the GNU General Public License.
|
||||||
|
|
||||||
|
14. Revised Versions of this License.
|
||||||
|
|
||||||
|
The Free Software Foundation may publish revised and/or new versions of
|
||||||
|
the GNU Affero General Public License from time to time. Such new versions
|
||||||
|
will be similar in spirit to the present version, but may differ in detail to
|
||||||
|
address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the
|
||||||
|
Program specifies that a certain numbered version of the GNU Affero General
|
||||||
|
Public License "or any later version" applies to it, you have the
|
||||||
|
option of following the terms and conditions either of that numbered
|
||||||
|
version or of any later version published by the Free Software
|
||||||
|
Foundation. If the Program does not specify a version number of the
|
||||||
|
GNU Affero General Public License, you may choose any version ever published
|
||||||
|
by the Free Software Foundation.
|
||||||
|
|
||||||
|
If the Program specifies that a proxy can decide which future
|
||||||
|
versions of the GNU Affero General Public License can be used, that proxy's
|
||||||
|
public statement of acceptance of a version permanently authorizes you
|
||||||
|
to choose that version for the Program.
|
||||||
|
|
||||||
|
Later license versions may give you additional or different
|
||||||
|
permissions. However, no additional obligations are imposed on any
|
||||||
|
author or copyright holder as a result of your choosing to follow a
|
||||||
|
later version.
|
||||||
|
|
||||||
|
15. Disclaimer of Warranty.
|
||||||
|
|
||||||
|
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||||
|
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||||
|
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||||
|
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||||
|
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||||
|
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||||
|
|
||||||
|
16. Limitation of Liability.
|
||||||
|
|
||||||
|
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||||
|
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||||
|
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||||
|
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||||
|
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||||
|
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||||
|
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||||
|
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||||
|
SUCH DAMAGES.
|
||||||
|
|
||||||
|
17. Interpretation of Sections 15 and 16.
|
||||||
|
|
||||||
|
If the disclaimer of warranty and limitation of liability provided
|
||||||
|
above cannot be given local legal effect according to their terms,
|
||||||
|
reviewing courts shall apply local law that most closely approximates
|
||||||
|
an absolute waiver of all civil liability in connection with the
|
||||||
|
Program, unless a warranty or assumption of liability accompanies a
|
||||||
|
copy of the Program in return for a fee.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
|
If you develop a new program, and you want it to be of the greatest
|
||||||
|
possible use to the public, the best way to achieve this is to make it
|
||||||
|
free software which everyone can redistribute and change under these terms.
|
||||||
|
|
||||||
|
To do so, attach the following notices to the program. It is safest
|
||||||
|
to attach them to the start of each source file to most effectively
|
||||||
|
state the exclusion of warranty; and each file should have at least
|
||||||
|
the "copyright" line and a pointer to where the full notice is found.
|
||||||
|
|
||||||
|
<one line to give the program's name and a brief idea of what it does.>
|
||||||
|
Copyright (C) <year> <name of author>
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Affero General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU Affero General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
|
If your software can interact with users remotely through a computer
|
||||||
|
network, you should also make sure that it provides a way for users to
|
||||||
|
get its source. For example, if your program is a web application, its
|
||||||
|
interface could display a "Source" link that leads users to an archive
|
||||||
|
of the code. There are many ways you could offer source, and different
|
||||||
|
solutions will be better for different programs; see section 13 for the
|
||||||
|
specific requirements.
|
||||||
|
|
||||||
|
You should also get your employer (if you work as a programmer) or school,
|
||||||
|
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||||
|
For more information on this, and how to apply and follow the GNU AGPL, see
|
||||||
|
<http://www.gnu.org/licenses/>.
|
||||||
42
README.md
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
<div align="center">
|
||||||
|
|
||||||
|
<picture>
|
||||||
|
<img alt="OrcaSlicer logo" src="resources/images/OrcaSlicer.png" width="15%" height="15%">
|
||||||
|
</picture>
|
||||||
|
|
||||||
|
## This version of OrcaSlicer restores full BambuNetwork support for Bambu Lab printers.
|
||||||
|
|
||||||
|
You are not limited to LAN only.
|
||||||
|
It works over the internet just like before, through BambuNetwork, with full functionality for normal use and printing.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
### Windows
|
||||||
|
|
||||||
|
Windows requires WSL 2.
|
||||||
|
|
||||||
|
Before first launch, open Command Prompt or PowerShell as Administrator and run:
|
||||||
|
|
||||||
|
```bat
|
||||||
|
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
|
||||||
|
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
|
||||||
|
```
|
||||||
|
|
||||||
|
Restart Windows, then launch Orca Studio.
|
||||||
|
|
||||||
|
### Linux
|
||||||
|
|
||||||
|
On Linux, a normal installation is enough.
|
||||||
|
|
||||||
|
### macOS
|
||||||
|
|
||||||
|
Work in progress.
|
||||||
|
|
||||||
|
|
||||||
|
## BMCU
|
||||||
|
|
||||||
|
I also encourage you to use BMCU.
|
||||||
|
|
||||||
|
You can find BMCU firmware in my repositories.
|
||||||
|
|
||||||
|
</div>
|
||||||
47
SECURITY.md
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
# Security Policy
|
||||||
|
|
||||||
|
At OrcaSlicer, we are committed to maintaining the security of our ecosystem. Our policy is to ensure that we do not introduce vulnerabilities and that any security issues are addressed promptly and responsibly. We appreciate your help in improving the security of OrcaSlicer and thank you for your responsible disclosure.
|
||||||
|
Reporting Security Bugs
|
||||||
|
|
||||||
|
## To report a security bug, please follow these guidelines:
|
||||||
|
|
||||||
|
* Email Security Bugs:
|
||||||
|
Send an email to the lead maintainer at softfeverever@gmail.com.
|
||||||
|
Include the word "SECURITY" in the subject line of your email.
|
||||||
|
|
||||||
|
* Response Times:
|
||||||
|
The lead maintainer will acknowledge receipt of your email within one week (7 days).
|
||||||
|
A detailed response will follow within 48 hours, outlining the next steps for handling your report.
|
||||||
|
After the initial reply, the security team will keep you informed about the progress toward a fix and any announcements.
|
||||||
|
|
||||||
|
* Information and Collaboration:
|
||||||
|
We may request additional information or guidance as we work on addressing the issue.
|
||||||
|
|
||||||
|
* Handling the Report:
|
||||||
|
OrcaSlicer will confirm the problem and determine the affected versions.
|
||||||
|
We will audit the code to find any similar issues and prepare fixes for all releases still under maintenance.
|
||||||
|
Fixes will be released as quickly as possible.
|
||||||
|
|
||||||
|
* Third-Party Modules:
|
||||||
|
Report security issues in third-party modules to the respective maintainer of those modules.
|
||||||
|
|
||||||
|
## Security Disclosure Guidelines
|
||||||
|
|
||||||
|
When disclosing a vulnerability, please follow these steps to ensure your report is clear and actionable:
|
||||||
|
|
||||||
|
* Provide Detailed Information:
|
||||||
|
Scope: Clearly define the scope of the vulnerability.
|
||||||
|
Potential Impact: Let us know who could be affected by this exploit.
|
||||||
|
Reproduction Steps: Document detailed steps to reproduce the vulnerability.
|
||||||
|
|
||||||
|
Reference OWASP Guidelines:
|
||||||
|
Follow the <a href="https://cheatsheetseries.owasp.org/cheatsheets/Vulnerability_Disclosure_Cheat_Sheet.html">OWASP Vulnerability Disclosure Cheat Sheet</a> for best practices in vulnerability disclosure.
|
||||||
|
|
||||||
|
## Security Recommendations
|
||||||
|
|
||||||
|
To enhance security when using OrcaSlicer, we recommend following these steps:
|
||||||
|
|
||||||
|
* SEE SOMETHING: If you notice anything suspicious or have concerns, please report it.
|
||||||
|
* SAY SOMETHING: If you have any doubts or need assistance, do not hesitate to contact us.
|
||||||
|
|
||||||
|
### Thank you for your commitment to the security of OrcaSlicer. Your efforts help us maintain a safe and reliable ecosystem.
|
||||||
BIN
SoftFever_doc/1.2.5_feature1.png
Normal file
|
After Width: | Height: | Size: 98 KiB |
BIN
SoftFever_doc/1.2.5_feature2.png
Normal file
|
After Width: | Height: | Size: 136 KiB |
BIN
SoftFever_doc/Anker.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
SoftFever_doc/Anycubic.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
SoftFever_doc/BambuLab.png
Normal file
|
After Width: | Height: | Size: 76 KiB |
BIN
SoftFever_doc/Creality.png
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
SoftFever_doc/Prusa.png
Normal file
|
After Width: | Height: | Size: 68 KiB |
BIN
SoftFever_doc/RatRig.png
Normal file
|
After Width: | Height: | Size: 131 KiB |
BIN
SoftFever_doc/Voron_1.png
Normal file
|
After Width: | Height: | Size: 126 KiB |
BIN
SoftFever_doc/Voron_2.png
Normal file
|
After Width: | Height: | Size: 74 KiB |
BIN
SoftFever_doc/accelerations.png
Normal file
|
After Width: | Height: | Size: 211 KiB |
BIN
SoftFever_doc/chamber_temperature.png
Normal file
|
After Width: | Height: | Size: 26 KiB |
BIN
SoftFever_doc/chamber_temperature_custom_gcode.png
Normal file
|
After Width: | Height: | Size: 75 KiB |
BIN
SoftFever_doc/export_gcode.png
Normal file
|
After Width: | Height: | Size: 62 KiB |
BIN
SoftFever_doc/hidden_features.png
Normal file
|
After Width: | Height: | Size: 729 KiB |
BIN
SoftFever_doc/mac_cant_open.png
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
SoftFever_doc/mac_security_setting.png
Normal file
|
After Width: | Height: | Size: 69 KiB |
BIN
SoftFever_doc/machine_limits.png
Normal file
|
After Width: | Height: | Size: 48 KiB |
BIN
SoftFever_doc/print_host.png
Normal file
|
After Width: | Height: | Size: 83 KiB |
BIN
SoftFever_doc/sandwich-mode1.png
Normal file
|
After Width: | Height: | Size: 228 KiB |
BIN
SoftFever_doc/sandwich-mode2.png
Normal file
|
After Width: | Height: | Size: 214 KiB |
BIN
SoftFever_doc/send_to_print.png
Normal file
|
After Width: | Height: | Size: 353 KiB |
BIN
SoftFever_doc/single_wall_first_layer.png
Normal file
|
After Width: | Height: | Size: 217 KiB |
BIN
SoftFever_doc/sponsor_logos/BigTreeTech.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
SoftFever_doc/sponsor_logos/QIDI.png
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
SoftFever_doc/topsurface_flowrate.png
Normal file
|
After Width: | Height: | Size: 305 KiB |
BIN
SoftFever_doc/voron.png
Normal file
|
After Width: | Height: | Size: 158 KiB |
377
build_flatpak.sh
Executable file
@@ -0,0 +1,377 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# OrcaSlicer Flatpak Build Script
|
||||||
|
# This script builds and packages OrcaSlicer as a Flatpak package locally
|
||||||
|
# Based on the GitHub Actions workflow in .github/workflows/build_all.yml
|
||||||
|
|
||||||
|
set -e
|
||||||
|
SECONDS=0
|
||||||
|
|
||||||
|
# Colors for output
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
BLUE='\033[0;34m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# Default values
|
||||||
|
ARCH=$(uname -m)
|
||||||
|
BUILD_DIR="build_flatpak"
|
||||||
|
CLEANUP=false
|
||||||
|
INSTALL_RUNTIME=false
|
||||||
|
JOBS=$(nproc)
|
||||||
|
FORCE_CLEAN=false
|
||||||
|
ENABLE_CCACHE=false
|
||||||
|
DISABLE_ROFILES_FUSE=false
|
||||||
|
NO_DEBUGINFO=true
|
||||||
|
CACHE_DIR=".flatpak-builder"
|
||||||
|
|
||||||
|
# Help function
|
||||||
|
show_help() {
|
||||||
|
echo "Usage: $0 [OPTIONS]"
|
||||||
|
echo ""
|
||||||
|
echo "Build OrcaSlicer as a Flatpak package"
|
||||||
|
echo ""
|
||||||
|
echo "Options:"
|
||||||
|
echo " -a, --arch ARCH Target architecture (x86_64, aarch64) [default: $ARCH]"
|
||||||
|
echo " -d, --build-dir DIR Build directory [default: $BUILD_DIR]"
|
||||||
|
echo " -j, --jobs JOBS Number of parallel build jobs for flatpak-builder and modules [default: $JOBS]"
|
||||||
|
echo " -c, --cleanup Clean build directory before building"
|
||||||
|
echo " -f, --force-clean Force clean build (disables caching)"
|
||||||
|
echo " --ccache Enable ccache for faster rebuilds (requires ccache in SDK)"
|
||||||
|
echo " --disable-rofiles-fuse Disable rofiles-fuse (workaround for FUSE issues)"
|
||||||
|
echo " --with-debuginfo Include debug info (slower builds, needed for Flathub)"
|
||||||
|
echo " --cache-dir DIR Flatpak builder cache directory [default: $CACHE_DIR]"
|
||||||
|
echo " -i, --install-runtime Install required Flatpak runtime and SDK"
|
||||||
|
echo " -h, --help Show this help message"
|
||||||
|
echo ""
|
||||||
|
echo "Examples:"
|
||||||
|
echo " $0 # Build for current architecture with caching enabled"
|
||||||
|
echo " $0 -f # Force clean build (no caching)"
|
||||||
|
echo " $0 --ccache -j 8 # Use ccache and 8 parallel jobs for faster builds"
|
||||||
|
echo " $0 -a x86_64 -c # Build for x86_64 and cleanup first"
|
||||||
|
echo " $0 -i -j 16 --ccache # Install runtime, build with 16 jobs and ccache"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Parse command line arguments
|
||||||
|
while [[ $# -gt 0 ]]; do
|
||||||
|
case $1 in
|
||||||
|
-a|--arch)
|
||||||
|
ARCH="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-d|--build-dir)
|
||||||
|
BUILD_DIR="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-j|--jobs)
|
||||||
|
JOBS="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-c|--cleanup)
|
||||||
|
CLEANUP=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-f|--force-clean)
|
||||||
|
FORCE_CLEAN=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--ccache)
|
||||||
|
ENABLE_CCACHE=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--disable-rofiles-fuse)
|
||||||
|
DISABLE_ROFILES_FUSE=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--with-debuginfo)
|
||||||
|
NO_DEBUGINFO=false
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
--cache-dir)
|
||||||
|
CACHE_DIR="$2"
|
||||||
|
shift 2
|
||||||
|
;;
|
||||||
|
-i|--install-runtime)
|
||||||
|
INSTALL_RUNTIME=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-h|--help)
|
||||||
|
show_help
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo -e "${RED}Error: Unknown option $1${NC}"
|
||||||
|
show_help
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# Validate architecture
|
||||||
|
if [[ "$ARCH" != "x86_64" && "$ARCH" != "aarch64" ]]; then
|
||||||
|
echo -e "${RED}Error: Unsupported architecture '$ARCH'. Supported: x86_64, aarch64${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Validate jobs parameter
|
||||||
|
if ! [[ "$JOBS" =~ ^[1-9][0-9]*$ ]]; then
|
||||||
|
echo -e "${RED}Error: Jobs must be a positive integer, got '$JOBS'${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${BLUE}OrcaSlicer Flatpak Build Script${NC}"
|
||||||
|
echo -e "${BLUE}================================${NC}"
|
||||||
|
echo -e "Architecture: ${GREEN}$ARCH${NC}"
|
||||||
|
echo -e "Build directory: ${GREEN}$BUILD_DIR${NC}"
|
||||||
|
echo -e "Cache directory: ${GREEN}$CACHE_DIR${NC}"
|
||||||
|
echo -e "Parallel jobs: ${GREEN}$JOBS${NC}"
|
||||||
|
if [[ "$FORCE_CLEAN" == true ]]; then
|
||||||
|
echo -e "Cache mode: ${RED}DISABLED (force clean)${NC}"
|
||||||
|
else
|
||||||
|
echo -e "Cache mode: ${GREEN}ENABLED${NC}"
|
||||||
|
fi
|
||||||
|
if [[ "$ENABLE_CCACHE" == true ]]; then
|
||||||
|
echo -e "Ccache: ${GREEN}ENABLED${NC}"
|
||||||
|
else
|
||||||
|
echo -e "Ccache: ${YELLOW}DISABLED${NC}"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Check available disk space (flatpak builds need several GB)
|
||||||
|
AVAILABLE_SPACE=$(df . | awk 'NR==2 {print $4}')
|
||||||
|
REQUIRED_SPACE=$((5 * 1024 * 1024)) # 5GB in KB
|
||||||
|
|
||||||
|
if [[ $AVAILABLE_SPACE -lt $REQUIRED_SPACE ]]; then
|
||||||
|
echo -e "${YELLOW}Warning: Low disk space detected.${NC}"
|
||||||
|
echo -e "Available: $(( AVAILABLE_SPACE / 1024 / 1024 ))GB, Recommended: 5GB+"
|
||||||
|
echo -e "Continue anyway? (y/N)"
|
||||||
|
read -r response
|
||||||
|
if [[ ! "$response" =~ ^[Yy]$ ]]; then
|
||||||
|
echo "Build cancelled by user"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if flatpak is installed
|
||||||
|
if ! command -v flatpak &> /dev/null; then
|
||||||
|
echo -e "${RED}Error: Flatpak is not installed. Please install it first.${NC}"
|
||||||
|
echo "On Ubuntu/Debian: sudo apt install flatpak"
|
||||||
|
echo "On Fedora: sudo dnf install flatpak"
|
||||||
|
echo "On Arch: sudo pacman -S flatpak"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if flatpak-builder is installed
|
||||||
|
if ! command -v flatpak-builder &> /dev/null; then
|
||||||
|
echo -e "${RED}Error: flatpak-builder is not installed. Please install it first.${NC}"
|
||||||
|
echo "On Ubuntu/Debian: sudo apt install flatpak-builder"
|
||||||
|
echo "On Fedora: sudo dnf install flatpak-builder"
|
||||||
|
echo "On Arch: sudo pacman -S flatpak-builder"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check additional build dependencies
|
||||||
|
echo -e "${YELLOW}Checking build dependencies...${NC}"
|
||||||
|
MISSING_DEPS=()
|
||||||
|
|
||||||
|
if ! command -v cmake &> /dev/null; then
|
||||||
|
MISSING_DEPS+=("cmake")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v ninja &> /dev/null && ! command -v make &> /dev/null; then
|
||||||
|
MISSING_DEPS+=("ninja or make")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! command -v pkg-config &> /dev/null; then
|
||||||
|
MISSING_DEPS+=("pkg-config")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ${#MISSING_DEPS[@]} -ne 0 ]; then
|
||||||
|
echo -e "${RED}Error: Missing required build dependencies: ${MISSING_DEPS[*]}${NC}"
|
||||||
|
echo "On Ubuntu/Debian: sudo apt install cmake ninja-build pkg-config"
|
||||||
|
echo "On Fedora: sudo dnf install cmake ninja-build pkgconfig"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${GREEN}All required dependencies found${NC}"
|
||||||
|
|
||||||
|
# Install runtime and SDK if requested
|
||||||
|
if [[ "$INSTALL_RUNTIME" == true ]]; then
|
||||||
|
echo -e "${YELLOW}Installing GNOME runtime and SDK...${NC}"
|
||||||
|
flatpak install --user -y flathub org.gnome.Platform//49
|
||||||
|
flatpak install --user -y flathub org.gnome.Sdk//49
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if required runtime is available
|
||||||
|
if ! flatpak info --user org.gnome.Platform//49 &> /dev/null; then
|
||||||
|
echo -e "${RED}Error: GNOME Platform 49 runtime is not installed.${NC}"
|
||||||
|
echo "Run with -i flag to install it automatically, or install manually:"
|
||||||
|
echo "flatpak install --user flathub org.gnome.Platform//49"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! flatpak info --user org.gnome.Sdk//49 &> /dev/null; then
|
||||||
|
echo -e "${RED}Error: GNOME SDK 49 is not installed.${NC}"
|
||||||
|
echo "Run with -i flag to install it automatically, or install manually:"
|
||||||
|
echo "flatpak install --user flathub org.gnome.Sdk//49"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Get version information
|
||||||
|
echo -e "${YELLOW}Getting version information...${NC}"
|
||||||
|
if [[ -f "version.inc" ]]; then
|
||||||
|
VER_PURE=$(grep 'set(SoftFever_VERSION' version.inc | cut -d '"' -f2)
|
||||||
|
VER="V$VER_PURE"
|
||||||
|
DATE=$(date +'%Y%m%d')
|
||||||
|
echo -e "Version: ${GREEN}$VER${NC}"
|
||||||
|
echo -e "Date: ${GREEN}$DATE${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${RED}Error: version.inc not found${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Cleanup build directory if requested
|
||||||
|
if [[ "$CLEANUP" == true ]]; then
|
||||||
|
echo -e "${YELLOW}Cleaning up flatpak-specific build directories...${NC}"
|
||||||
|
rm -rf deps/build_flatpak build_flatpak
|
||||||
|
|
||||||
|
echo -e "${YELLOW}Cleaning up flatpak build directories...${NC}"
|
||||||
|
rm -rf "$BUILD_DIR"
|
||||||
|
|
||||||
|
# Only clean cache if force-clean is enabled
|
||||||
|
if [[ "$FORCE_CLEAN" == true ]]; then
|
||||||
|
echo -e "${YELLOW}Cleaning up flatpak build cache...${NC}"
|
||||||
|
rm -rf "$CACHE_DIR"
|
||||||
|
else
|
||||||
|
echo -e "${BLUE}Preserving build cache at: $CACHE_DIR${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${BLUE}Note: Host build directories (deps/build, build) are preserved${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Create build directory
|
||||||
|
mkdir -p "$BUILD_DIR"
|
||||||
|
rm -rf "$BUILD_DIR/build-dir"
|
||||||
|
|
||||||
|
# Check if flatpak manifest exists
|
||||||
|
if [[ ! -f "./scripts/flatpak/com.orcaslicer.OrcaSlicer.yml" ]]; then
|
||||||
|
echo -e "${RED}Error: Flatpak manifest not found at scripts/flatpak/com.orcaslicer.OrcaSlicer.yml${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Build the Flatpak
|
||||||
|
echo -e "${YELLOW}Building Flatpak package...${NC}"
|
||||||
|
echo -e "This may take a while (30+ minutes depending on your system)..."
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
BUNDLE_NAME="OrcaSlicer-Linux-flatpak_${VER}_${ARCH}.flatpak"
|
||||||
|
|
||||||
|
# Remove any existing bundle
|
||||||
|
rm -f "$BUNDLE_NAME"
|
||||||
|
|
||||||
|
# Create necessary directories inside repo
|
||||||
|
mkdir -p "$BUILD_DIR/cache" "$BUILD_DIR/flatpak-builder"
|
||||||
|
|
||||||
|
# Set environment variables to match GitHub Actions
|
||||||
|
export FLATPAK_BUILDER_N_JOBS=$JOBS
|
||||||
|
|
||||||
|
echo -e "${BLUE}Running flatpak-builder...${NC}"
|
||||||
|
echo -e "Using $JOBS parallel jobs for flatpak-builder and $FLATPAK_BUILDER_N_JOBS for module builds"
|
||||||
|
|
||||||
|
# Check flatpak-builder version to determine available options
|
||||||
|
FLATPAK_BUILDER_VERSION=$(flatpak-builder --version 2>/dev/null | head -1 | awk '{print $2}' || echo "unknown")
|
||||||
|
echo -e "flatpak-builder version: $FLATPAK_BUILDER_VERSION"
|
||||||
|
|
||||||
|
# Build command with caching support
|
||||||
|
BUILDER_ARGS=(
|
||||||
|
--arch="$ARCH"
|
||||||
|
--user
|
||||||
|
--install-deps-from=flathub
|
||||||
|
--repo="$BUILD_DIR/repo"
|
||||||
|
--verbose
|
||||||
|
--state-dir="$CACHE_DIR"
|
||||||
|
--jobs="$JOBS"
|
||||||
|
--mirror-screenshots-url=https://dl.flathub.org/media/
|
||||||
|
)
|
||||||
|
|
||||||
|
# Add force-clean only if explicitly requested (disables caching)
|
||||||
|
if [[ "$FORCE_CLEAN" == true ]]; then
|
||||||
|
BUILDER_ARGS+=(--force-clean)
|
||||||
|
echo -e "${YELLOW}Using --force-clean (caching disabled)${NC}"
|
||||||
|
else
|
||||||
|
echo -e "${GREEN}Using build cache for faster rebuilds${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Add ccache if enabled
|
||||||
|
if [[ "$ENABLE_CCACHE" == true ]]; then
|
||||||
|
BUILDER_ARGS+=(--ccache)
|
||||||
|
echo -e "${GREEN}Using ccache for compiler caching${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Disable rofiles-fuse if requested (workaround for FUSE issues)
|
||||||
|
if [[ "$DISABLE_ROFILES_FUSE" == true ]]; then
|
||||||
|
BUILDER_ARGS+=(--disable-rofiles-fuse)
|
||||||
|
echo -e "${YELLOW}rofiles-fuse disabled${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Use a temp manifest with no-debuginfo if requested
|
||||||
|
MANIFEST="scripts/flatpak/com.orcaslicer.OrcaSlicer.yml"
|
||||||
|
if [[ "$NO_DEBUGINFO" == true ]]; then
|
||||||
|
MANIFEST="scripts/flatpak/com.orcaslicer.OrcaSlicer.no-debug.yml"
|
||||||
|
sed '/^build-options:/a\ no-debuginfo: true\n strip: true' \
|
||||||
|
scripts/flatpak/com.orcaslicer.OrcaSlicer.yml > "$MANIFEST"
|
||||||
|
echo -e "${YELLOW}Debug info disabled (using temp manifest)${NC}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if ! flatpak-builder \
|
||||||
|
"${BUILDER_ARGS[@]}" \
|
||||||
|
"$BUILD_DIR/build-dir" \
|
||||||
|
"$MANIFEST"; then
|
||||||
|
echo -e "${RED}Error: flatpak-builder failed${NC}"
|
||||||
|
echo -e "${YELLOW}Check the build log above for details${NC}"
|
||||||
|
rm -f "scripts/flatpak/com.orcaslicer.OrcaSlicer.no-debug.yml"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Clean up temp manifest
|
||||||
|
rm -f "scripts/flatpak/com.orcaslicer.OrcaSlicer.no-debug.yml"
|
||||||
|
|
||||||
|
# Create bundle
|
||||||
|
echo -e "${YELLOW}Creating Flatpak bundle...${NC}"
|
||||||
|
if ! flatpak build-bundle \
|
||||||
|
"$BUILD_DIR/repo" \
|
||||||
|
"$BUNDLE_NAME" \
|
||||||
|
com.orcaslicer.OrcaSlicer \
|
||||||
|
--arch="$ARCH"; then
|
||||||
|
echo -e "${RED}Error: Failed to create Flatpak bundle${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Success message
|
||||||
|
echo ""
|
||||||
|
echo -e "${GREEN}✓ Flatpak build completed successfully!${NC}"
|
||||||
|
echo -e "Bundle created: ${GREEN}$BUNDLE_NAME${NC}"
|
||||||
|
echo -e "Size: ${GREEN}$(du -h "$BUNDLE_NAME" | cut -f1)${NC}"
|
||||||
|
if [[ "$FORCE_CLEAN" != true ]]; then
|
||||||
|
echo -e "Build cache: ${GREEN}$CACHE_DIR${NC} (preserved for faster future builds)"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
echo -e "${BLUE}To install the Flatpak:${NC}"
|
||||||
|
echo -e "flatpak install --user $BUNDLE_NAME"
|
||||||
|
echo ""
|
||||||
|
echo -e "${BLUE}To run OrcaSlicer:${NC}"
|
||||||
|
echo -e "flatpak run com.orcaslicer.OrcaSlicer"
|
||||||
|
echo ""
|
||||||
|
echo -e "${BLUE}To uninstall:${NC}"
|
||||||
|
echo -e "flatpak uninstall --user com.orcaslicer.OrcaSlicer"
|
||||||
|
echo ""
|
||||||
|
if [[ "$FORCE_CLEAN" != true ]]; then
|
||||||
|
echo -e "${BLUE}Cache Management:${NC}"
|
||||||
|
echo -e "• Subsequent builds will be faster thanks to caching"
|
||||||
|
echo -e "• To force a clean build: $0 -f"
|
||||||
|
echo -e "• To clean cache manually: rm -rf $CACHE_DIR"
|
||||||
|
fi
|
||||||
|
|
||||||
|
elapsed=$SECONDS
|
||||||
|
printf "\nBuild completed in %dh %dm %ds\n" $((elapsed/3600)) $((elapsed%3600/60)) $((elapsed%60))
|
||||||
579
build_linux.sh
Executable file
@@ -0,0 +1,579 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -e # Exit immediately if a command exits with a non-zero status.
|
||||||
|
SECONDS=0
|
||||||
|
|
||||||
|
SCRIPT_NAME=$(basename "$0")
|
||||||
|
SCRIPT_PATH=$(dirname "$(readlink -f "${0}")")
|
||||||
|
|
||||||
|
pushd "${SCRIPT_PATH}" > /dev/null
|
||||||
|
|
||||||
|
function usage() {
|
||||||
|
echo "Usage: ./${SCRIPT_NAME} [-1][-b][-c][-d][-D][-e][-F][-g][-h][-i][-j N][-p][-r][-s][-t][-u][-l][-L]"
|
||||||
|
echo " -1: limit builds to one core (where possible)"
|
||||||
|
echo " -j N: limit builds to N cores (where possible)"
|
||||||
|
echo " -b: build in Debug mode"
|
||||||
|
echo " -c: force a clean build"
|
||||||
|
echo " -C: enable ANSI-colored compile output (GNU/Clang only)"
|
||||||
|
echo " -d: download and build dependencies in ./deps/ (build prerequisite)"
|
||||||
|
echo " -D: dry run"
|
||||||
|
echo " -e: build in RelWithDebInfo mode"
|
||||||
|
echo " -F: rebuild the cached Docker/Podman runner image from scratch when used with -g"
|
||||||
|
echo " -g: run the requested build steps inside a Docker/Podman Ubuntu 24.04 container similar to the GitHub Actions Linux runner"
|
||||||
|
echo " -h: prints this help text"
|
||||||
|
echo " -i: build the Orca Slicer AppImage (optional)"
|
||||||
|
echo " -p: boost ccache hit rate by disabling precompiled headers (default: ON)"
|
||||||
|
echo " -r: skip RAM and disk checks (low RAM compiling)"
|
||||||
|
echo " -s: build the Orca Slicer (optional)"
|
||||||
|
echo " -t: build tests (optional), requires -s flag"
|
||||||
|
echo " -u: install system dependencies (asks for sudo password; build prerequisite)"
|
||||||
|
echo " -l: use Clang instead of GCC (default: GCC)"
|
||||||
|
echo " -L: use ld.lld as linker (if available)"
|
||||||
|
echo "For a first use, you want to './${SCRIPT_NAME} -u'"
|
||||||
|
echo " and then './${SCRIPT_NAME} -dsi'"
|
||||||
|
echo "For a GitHub Actions-like Linux build locally, use './${SCRIPT_NAME} -g -istrlL'"
|
||||||
|
echo "Use './${SCRIPT_NAME} -gF -istrlL' to rebuild the cached runner image first."
|
||||||
|
echo "Set ORCA_CONTAINER_CLI, ORCA_DOCKER_IMAGE, ORCA_DOCKER_BASE_IMAGE, or ORCA_DOCKER_CMAKE_VERSION to override the container runtime, cached image tag, base image, or CMake version."
|
||||||
|
}
|
||||||
|
|
||||||
|
SLIC3R_PRECOMPILED_HEADERS="ON"
|
||||||
|
|
||||||
|
unset name
|
||||||
|
BUILD_DIR=build
|
||||||
|
BUILD_CONFIG=Release
|
||||||
|
FORWARDED_ARGS=()
|
||||||
|
while getopts ":1j:bcCdDeFghiprstulL" opt ; do
|
||||||
|
case ${opt} in
|
||||||
|
1 )
|
||||||
|
export CMAKE_BUILD_PARALLEL_LEVEL=1
|
||||||
|
FORWARDED_ARGS+=("-1")
|
||||||
|
;;
|
||||||
|
j )
|
||||||
|
export CMAKE_BUILD_PARALLEL_LEVEL=$OPTARG
|
||||||
|
FORWARDED_ARGS+=("-j" "$OPTARG")
|
||||||
|
;;
|
||||||
|
b )
|
||||||
|
BUILD_DIR=build-dbg
|
||||||
|
BUILD_CONFIG=Debug
|
||||||
|
FORWARDED_ARGS+=("-b")
|
||||||
|
;;
|
||||||
|
c )
|
||||||
|
CLEAN_BUILD=1
|
||||||
|
FORWARDED_ARGS+=("-c")
|
||||||
|
;;
|
||||||
|
C )
|
||||||
|
COLORED_OUTPUT="-DCOLORED_OUTPUT=ON"
|
||||||
|
FORWARDED_ARGS+=("-C")
|
||||||
|
;;
|
||||||
|
d )
|
||||||
|
BUILD_DEPS="1"
|
||||||
|
FORWARDED_ARGS+=("-d")
|
||||||
|
;;
|
||||||
|
D )
|
||||||
|
DRY_RUN="1"
|
||||||
|
FORWARDED_ARGS+=("-D")
|
||||||
|
;;
|
||||||
|
e )
|
||||||
|
BUILD_DIR=build-dbginfo
|
||||||
|
BUILD_CONFIG=RelWithDebInfo
|
||||||
|
FORWARDED_ARGS+=("-e")
|
||||||
|
;;
|
||||||
|
F )
|
||||||
|
CLEAN_DOCKER_IMAGE="1"
|
||||||
|
;;
|
||||||
|
g )
|
||||||
|
USE_DOCKER="1"
|
||||||
|
;;
|
||||||
|
h ) usage
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
i )
|
||||||
|
BUILD_IMAGE="1"
|
||||||
|
FORWARDED_ARGS+=("-i")
|
||||||
|
;;
|
||||||
|
p )
|
||||||
|
SLIC3R_PRECOMPILED_HEADERS="OFF"
|
||||||
|
FORWARDED_ARGS+=("-p")
|
||||||
|
;;
|
||||||
|
r )
|
||||||
|
SKIP_RAM_CHECK="1"
|
||||||
|
FORWARDED_ARGS+=("-r")
|
||||||
|
;;
|
||||||
|
s )
|
||||||
|
BUILD_ORCA="1"
|
||||||
|
FORWARDED_ARGS+=("-s")
|
||||||
|
;;
|
||||||
|
t )
|
||||||
|
BUILD_TESTS="1"
|
||||||
|
FORWARDED_ARGS+=("-t")
|
||||||
|
;;
|
||||||
|
u )
|
||||||
|
export UPDATE_LIB="1"
|
||||||
|
FORWARDED_ARGS+=("-u")
|
||||||
|
;;
|
||||||
|
l )
|
||||||
|
USE_CLANG="1"
|
||||||
|
FORWARDED_ARGS+=("-l")
|
||||||
|
;;
|
||||||
|
L )
|
||||||
|
USE_LLD="1"
|
||||||
|
FORWARDED_ARGS+=("-L")
|
||||||
|
;;
|
||||||
|
* )
|
||||||
|
echo "Unknown argument '${opt}', aborting."
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ ${OPTIND} -eq 1 ] ; then
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -n "${CLEAN_DOCKER_IMAGE}" ]] && [[ -z "${USE_DOCKER}" ]] ; then
|
||||||
|
echo "Error: -F requires -g."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
function check_available_memory_and_disk() {
|
||||||
|
FREE_MEM_GB=$(free --gibi --total | grep 'Mem' | rev | cut --delimiter=" " --fields=1 | rev)
|
||||||
|
MIN_MEM_GB=10
|
||||||
|
|
||||||
|
FREE_DISK_KB=$(df --block-size=1K . | tail -1 | awk '{print $4}')
|
||||||
|
MIN_DISK_KB=$((10 * 1024 * 1024))
|
||||||
|
|
||||||
|
if [[ ${FREE_MEM_GB} -le ${MIN_MEM_GB} ]] ; then
|
||||||
|
echo -e "
|
||||||
|
ERROR: Orca Slicer Builder requires at least ${MIN_MEM_GB}G of 'available' mem (system has only ${FREE_MEM_GB}G available)"
|
||||||
|
echo && free --human && echo
|
||||||
|
echo "Invoke with -r to skip RAM and disk checks."
|
||||||
|
exit 2
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ${FREE_DISK_KB} -le ${MIN_DISK_KB} ]] ; then
|
||||||
|
echo -e "
|
||||||
|
ERROR: Orca Slicer Builder requires at least $(echo "${MIN_DISK_KB}" |awk '{ printf "%.1fG
|
||||||
|
", $1/1024/1024; }') (system has only $(echo "${FREE_DISK_KB}" | awk '{ printf "%.1fG
|
||||||
|
", $1/1024/1024; }') disk free)"
|
||||||
|
echo && df --human-readable . && echo
|
||||||
|
echo "Invoke with -r to skip ram and disk checks."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function print_and_run() {
|
||||||
|
cmd=()
|
||||||
|
# Remove empty arguments, leading and trailing spaces
|
||||||
|
for item in "$@" ; do
|
||||||
|
if [[ -n $item ]]; then
|
||||||
|
cmd+=( "$(echo "${item}" | xargs)" )
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "${cmd[@]}"
|
||||||
|
if [[ -z "${DRY_RUN}" ]] ; then
|
||||||
|
"${cmd[@]}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function resolve_container_cli() {
|
||||||
|
if [[ -n "${ORCA_CONTAINER_CLI}" ]] ; then
|
||||||
|
if ! command -v "${ORCA_CONTAINER_CLI}" >/dev/null 2>&1 ; then
|
||||||
|
echo "Error: container runtime '${ORCA_CONTAINER_CLI}' was not found." >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "${ORCA_CONTAINER_CLI}"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if command -v docker >/dev/null 2>&1 ; then
|
||||||
|
echo "docker"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if command -v podman >/dev/null 2>&1 ; then
|
||||||
|
echo "podman"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Error: neither docker nor podman is available. Install one of them or set ORCA_CONTAINER_CLI." >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
function get_docker_runner_image() {
|
||||||
|
local base_image
|
||||||
|
local docker_cmake_version
|
||||||
|
local recipe_hash
|
||||||
|
local sanitized_base_image
|
||||||
|
local sanitized_cmake_version
|
||||||
|
|
||||||
|
if [[ -n "${ORCA_DOCKER_IMAGE}" ]] ; then
|
||||||
|
echo "${ORCA_DOCKER_IMAGE}"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
base_image="${ORCA_DOCKER_BASE_IMAGE:-ubuntu:24.04}"
|
||||||
|
docker_cmake_version="${ORCA_DOCKER_CMAKE_VERSION-4.3.0}"
|
||||||
|
recipe_hash=$(find "${SCRIPT_PATH}/build_linux.sh" "${SCRIPT_PATH}/scripts/linux.d" -type f -print0 | sort -z | xargs -0 cat | sha256sum | cut -c1-12)
|
||||||
|
sanitized_base_image=$(echo "${base_image}" | tr '/:@' '---' | tr -cs 'A-Za-z0-9_.-' '-')
|
||||||
|
sanitized_cmake_version=$(echo "${docker_cmake_version:-system}" | tr -cs 'A-Za-z0-9_.-' '-')
|
||||||
|
echo "orcaslicer-linux-builder:${sanitized_base_image}-cmake-${sanitized_cmake_version}-${recipe_hash}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function docker_runner_dockerfile() {
|
||||||
|
cat <<'EOF'
|
||||||
|
ARG BASE_IMAGE=ubuntu:24.04
|
||||||
|
FROM ${BASE_IMAGE}
|
||||||
|
|
||||||
|
ARG CMAKE_VERSION=4.3.0
|
||||||
|
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
SHELL ["/bin/bash", "-c"]
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y sudo ca-certificates curl tar
|
||||||
|
|
||||||
|
COPY build_linux.sh /tmp/orcaslicer/build_linux.sh
|
||||||
|
COPY scripts/linux.d /tmp/orcaslicer/scripts/linux.d
|
||||||
|
|
||||||
|
WORKDIR /tmp/orcaslicer
|
||||||
|
|
||||||
|
RUN chmod +x ./build_linux.sh
|
||||||
|
RUN ./build_linux.sh -ur
|
||||||
|
RUN if [[ -n "${CMAKE_VERSION}" ]] ; then \
|
||||||
|
case "$(uname -m)" in \
|
||||||
|
x86_64|amd64) cmake_arch="x86_64" ;; \
|
||||||
|
aarch64|arm64) cmake_arch="aarch64" ;; \
|
||||||
|
*) cmake_arch="" ;; \
|
||||||
|
esac ; \
|
||||||
|
if [[ -n "${cmake_arch}" ]] ; then \
|
||||||
|
cmake_root="/opt/cmake-${CMAKE_VERSION}-linux-${cmake_arch}" ; \
|
||||||
|
if ! curl -fsSL "https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-linux-${cmake_arch}.tar.gz" | tar -xz -C /opt ; then \
|
||||||
|
echo "Warning: failed to install CMake ${CMAKE_VERSION}; falling back to the distro cmake package." ; \
|
||||||
|
elif [[ -d "${cmake_root}" ]] ; then \
|
||||||
|
ln -sf "${cmake_root}/bin/"* /usr/local/bin/ ; \
|
||||||
|
fi ; \
|
||||||
|
else \
|
||||||
|
echo "Skipping GitHub Actions CMake install for unsupported architecture $(uname -m)." ; \
|
||||||
|
fi ; \
|
||||||
|
fi
|
||||||
|
RUN rm -rf /var/lib/apt/lists/* /tmp/orcaslicer
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
function ensure_docker_runner_image() {
|
||||||
|
local container_cli
|
||||||
|
local base_image
|
||||||
|
local runner_image
|
||||||
|
local docker_cmake_version
|
||||||
|
local image_exists="0"
|
||||||
|
local force_rebuild="0"
|
||||||
|
local -a build_cmd
|
||||||
|
|
||||||
|
container_cli="$1"
|
||||||
|
runner_image="$2"
|
||||||
|
base_image="${ORCA_DOCKER_BASE_IMAGE:-ubuntu:24.04}"
|
||||||
|
docker_cmake_version="${ORCA_DOCKER_CMAKE_VERSION-4.3.0}"
|
||||||
|
|
||||||
|
if "${container_cli}" image inspect "${runner_image}" >/dev/null 2>&1 ; then
|
||||||
|
image_exists="1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -n "${CLEAN_DOCKER_IMAGE}" ]] ; then
|
||||||
|
force_rebuild="1"
|
||||||
|
if [[ "${image_exists}" == "1" ]] ; then
|
||||||
|
echo "Removing cached container image ${runner_image} ..."
|
||||||
|
if [[ -z "${DRY_RUN}" ]] ; then
|
||||||
|
"${container_cli}" image rm -f "${runner_image}" >/dev/null
|
||||||
|
else
|
||||||
|
printf '%q ' "${container_cli}" image rm -f "${runner_image}"
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
image_exists="0"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "${image_exists}" == "1" ]] ; then
|
||||||
|
echo "Using cached container image ${runner_image}"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
build_cmd=(
|
||||||
|
"${container_cli}" build --pull
|
||||||
|
-t "${runner_image}"
|
||||||
|
--build-arg "BASE_IMAGE=${base_image}"
|
||||||
|
--build-arg "CMAKE_VERSION=${docker_cmake_version}"
|
||||||
|
)
|
||||||
|
if [[ "${force_rebuild}" == "1" ]] ; then
|
||||||
|
build_cmd+=(--no-cache)
|
||||||
|
fi
|
||||||
|
build_cmd+=(-f - "${SCRIPT_PATH}")
|
||||||
|
|
||||||
|
printf '%q ' "${build_cmd[@]}"
|
||||||
|
echo
|
||||||
|
if [[ -n "${DRY_RUN}" ]] ; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
docker_runner_dockerfile | "${build_cmd[@]}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function run_in_docker() {
|
||||||
|
local container_cli
|
||||||
|
local runner_image
|
||||||
|
local container_workspace
|
||||||
|
local host_uid
|
||||||
|
local host_gid
|
||||||
|
local host_user
|
||||||
|
local -a build_args
|
||||||
|
local -a container_env
|
||||||
|
|
||||||
|
container_cli=$(resolve_container_cli)
|
||||||
|
runner_image=$(get_docker_runner_image)
|
||||||
|
host_uid=$(id -u)
|
||||||
|
host_gid=$(id -g)
|
||||||
|
host_user="${USER:-orca}"
|
||||||
|
container_workspace="/__w/OrcaSlicer/OrcaSlicer"
|
||||||
|
build_args=()
|
||||||
|
for item in "${FORWARDED_ARGS[@]}" ; do
|
||||||
|
if [[ "${item}" == "-u" ]] || [[ "${item}" == "-D" ]] ; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
build_args+=("${item}")
|
||||||
|
done
|
||||||
|
|
||||||
|
container_env=(
|
||||||
|
-e "CI=true"
|
||||||
|
-e "GITHUB_ACTIONS=true"
|
||||||
|
-e "GITHUB_WORKSPACE=${container_workspace}"
|
||||||
|
-e "RUNNER_OS=Linux"
|
||||||
|
-e "RUNNER_TEMP=/tmp"
|
||||||
|
-e "HOST_UID=${host_uid}"
|
||||||
|
-e "HOST_GID=${host_gid}"
|
||||||
|
-e "HOST_USER=${host_user}"
|
||||||
|
)
|
||||||
|
if [[ -n "${CMAKE_BUILD_PARALLEL_LEVEL}" ]] ; then
|
||||||
|
container_env+=( -e "CMAKE_BUILD_PARALLEL_LEVEL=${CMAKE_BUILD_PARALLEL_LEVEL}" )
|
||||||
|
fi
|
||||||
|
if [[ -n "${ORCA_UPDATER_SIG_KEY}" ]] ; then
|
||||||
|
container_env+=( -e "ORCA_UPDATER_SIG_KEY=${ORCA_UPDATER_SIG_KEY}" )
|
||||||
|
fi
|
||||||
|
|
||||||
|
ensure_docker_runner_image "${container_cli}" "${runner_image}"
|
||||||
|
|
||||||
|
printf '%q ' "${container_cli}" run --rm -i \
|
||||||
|
-v "${SCRIPT_PATH}:${container_workspace}" \
|
||||||
|
-w "${container_workspace}" \
|
||||||
|
"${container_env[@]}" \
|
||||||
|
"${runner_image}" \
|
||||||
|
bash -s -- "${build_args[@]}"
|
||||||
|
echo
|
||||||
|
if [[ -n "${DRY_RUN}" ]] ; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
"${container_cli}" run --rm -i \
|
||||||
|
-v "${SCRIPT_PATH}:${container_workspace}" \
|
||||||
|
-w "${container_workspace}" \
|
||||||
|
"${container_env[@]}" \
|
||||||
|
"${runner_image}" \
|
||||||
|
bash -s -- "${build_args[@]}" <<'EOF'
|
||||||
|
set -e
|
||||||
|
|
||||||
|
function create_builder_user() {
|
||||||
|
if [[ "${HOST_UID}" == "0" ]] ; then
|
||||||
|
HOST_USER=root
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if getent group "${HOST_GID}" >/dev/null 2>&1 ; then
|
||||||
|
HOST_GROUP=$(getent group "${HOST_GID}" | cut -d: -f1)
|
||||||
|
else
|
||||||
|
HOST_GROUP="orca-builder"
|
||||||
|
if getent group "${HOST_GROUP}" >/dev/null 2>&1 ; then
|
||||||
|
HOST_GROUP="orca-builder-${HOST_GID}"
|
||||||
|
fi
|
||||||
|
groupadd -g "${HOST_GID}" "${HOST_GROUP}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if getent passwd "${HOST_UID}" >/dev/null 2>&1 ; then
|
||||||
|
HOST_USER=$(getent passwd "${HOST_UID}" | cut -d: -f1)
|
||||||
|
usermod -g "${HOST_GROUP}" "${HOST_USER}"
|
||||||
|
elif id -u "${HOST_USER}" >/dev/null 2>&1 ; then
|
||||||
|
usermod -u "${HOST_UID}" -g "${HOST_GROUP}" "${HOST_USER}"
|
||||||
|
else
|
||||||
|
useradd -m -u "${HOST_UID}" -g "${HOST_GROUP}" -s /bin/bash "${HOST_USER}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "${HOST_USER} ALL=(ALL) NOPASSWD:ALL" >/etc/sudoers.d/orcaslicer-builder
|
||||||
|
chmod 0440 /etc/sudoers.d/orcaslicer-builder
|
||||||
|
}
|
||||||
|
|
||||||
|
create_builder_user
|
||||||
|
mkdir -p "${GITHUB_WORKSPACE}/deps/build/destdir"
|
||||||
|
chown -R "${HOST_UID}:${HOST_GID}" "${GITHUB_WORKSPACE}/deps/build"
|
||||||
|
if [[ -d "${GITHUB_WORKSPACE}/build" ]] ; then
|
||||||
|
chown -R "${HOST_UID}:${HOST_GID}" "${GITHUB_WORKSPACE}/build"
|
||||||
|
fi
|
||||||
|
if [[ -d "${GITHUB_WORKSPACE}/build-dbg" ]] ; then
|
||||||
|
chown -R "${HOST_UID}:${HOST_GID}" "${GITHUB_WORKSPACE}/build-dbg"
|
||||||
|
fi
|
||||||
|
if [[ -d "${GITHUB_WORKSPACE}/build-dbginfo" ]] ; then
|
||||||
|
chown -R "${HOST_UID}:${HOST_GID}" "${GITHUB_WORKSPACE}/build-dbginfo"
|
||||||
|
fi
|
||||||
|
|
||||||
|
sudo -H -u "${HOST_USER}" env \
|
||||||
|
CMAKE_BUILD_PARALLEL_LEVEL="${CMAKE_BUILD_PARALLEL_LEVEL-}" \
|
||||||
|
GITHUB_WORKSPACE="${GITHUB_WORKSPACE}" \
|
||||||
|
ORCA_UPDATER_SIG_KEY="${ORCA_UPDATER_SIG_KEY-}" \
|
||||||
|
bash -c '
|
||||||
|
set -e
|
||||||
|
cd "${GITHUB_WORKSPACE}"
|
||||||
|
if [[ "$#" -gt 0 ]] ; then
|
||||||
|
./build_linux.sh "$@"
|
||||||
|
else
|
||||||
|
echo "No build steps were requested after container setup."
|
||||||
|
fi
|
||||||
|
' bash "$@"
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ -n "${USE_DOCKER}" ]] ; then
|
||||||
|
run_in_docker
|
||||||
|
popd > /dev/null # ${SCRIPT_PATH}
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# cmake 4.x compatibility workaround
|
||||||
|
export CMAKE_POLICY_VERSION_MINIMUM=3.5
|
||||||
|
|
||||||
|
DISTRIBUTION=$(awk -F= '/^ID=/ {print $2}' /etc/os-release | tr -d '"')
|
||||||
|
DISTRIBUTION_LIKE=$(awk -F= '/^ID_LIKE=/ {print $2}' /etc/os-release | tr -d '"')
|
||||||
|
# Check for direct distribution match to Ubuntu/Debian
|
||||||
|
if [ "${DISTRIBUTION}" == "ubuntu" ] || [ "${DISTRIBUTION}" == "linuxmint" ] ; then
|
||||||
|
DISTRIBUTION="debian"
|
||||||
|
# Check if distribution is Debian/Ubuntu-like based on ID_LIKE
|
||||||
|
elif [[ "${DISTRIBUTION_LIKE}" == *"debian"* ]] || [[ "${DISTRIBUTION_LIKE}" == *"ubuntu"* ]] ; then
|
||||||
|
DISTRIBUTION="debian"
|
||||||
|
elif [[ "${DISTRIBUTION_LIKE}" == *"arch"* ]] ; then
|
||||||
|
DISTRIBUTION="arch"
|
||||||
|
elif [[ "${DISTRIBUTION_LIKE}" == *"suse"* ]] ; then
|
||||||
|
DISTRIBUTION="suse"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f "./scripts/linux.d/${DISTRIBUTION}" ] ; then
|
||||||
|
echo "Your distribution "${DISTRIBUTION}" is not supported by system-dependency scripts in ./scripts/linux.d/"
|
||||||
|
echo "Please resolve dependencies manually and contribute a script for your distribution to upstream."
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo "resolving system dependencies for distribution "${DISTRIBUTION}" ..."
|
||||||
|
# shellcheck source=/dev/null
|
||||||
|
source "./scripts/linux.d/${DISTRIBUTION}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "FOUND_GTK3_DEV=${FOUND_GTK3_DEV}"
|
||||||
|
if [[ -z "${FOUND_GTK3_DEV}" ]] ; then
|
||||||
|
echo "Error, you must install the dependencies before."
|
||||||
|
echo "Use option -u with sudo"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Changing date in version..."
|
||||||
|
{
|
||||||
|
# change date in version
|
||||||
|
sed --in-place "s/+UNKNOWN/_$(date '+%F')/" version.inc
|
||||||
|
}
|
||||||
|
echo "done"
|
||||||
|
|
||||||
|
|
||||||
|
if [[ -z "${SKIP_RAM_CHECK}" ]] ; then
|
||||||
|
check_available_memory_and_disk
|
||||||
|
fi
|
||||||
|
|
||||||
|
export CMAKE_C_CXX_COMPILER_CLANG=()
|
||||||
|
if [[ -n "${USE_CLANG}" ]] ; then
|
||||||
|
export CMAKE_C_CXX_COMPILER_CLANG=(-DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang++)
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Configure use of ld.lld as the linker when requested
|
||||||
|
export CMAKE_LLD_LINKER_ARGS=()
|
||||||
|
if [[ -n "${USE_LLD}" ]] ; then
|
||||||
|
if command -v ld.lld >/dev/null 2>&1 ; then
|
||||||
|
LLD_BIN=$(command -v ld.lld)
|
||||||
|
export CMAKE_LLD_LINKER_ARGS=(-DCMAKE_LINKER="${LLD_BIN}" -DCMAKE_EXE_LINKER_FLAGS=-fuse-ld=lld -DCMAKE_SHARED_LINKER_FLAGS=-fuse-ld=lld -DCMAKE_MODULE_LINKER_FLAGS=-fuse-ld=lld)
|
||||||
|
else
|
||||||
|
echo "Error: ld.lld not found. Please install the 'lld' package (e.g., sudo apt install lld) or omit -L."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -n "${BUILD_DEPS}" ]] ; then
|
||||||
|
echo "Configuring dependencies..."
|
||||||
|
read -r -a BUILD_ARGS <<< "${DEPS_EXTRA_BUILD_ARGS}"
|
||||||
|
if [[ -n "${CLEAN_BUILD}" ]]
|
||||||
|
then
|
||||||
|
print_and_run rm -fr deps/$BUILD_DIR
|
||||||
|
fi
|
||||||
|
mkdir -p deps/$BUILD_DIR
|
||||||
|
if [[ $BUILD_CONFIG != Release ]] ; then
|
||||||
|
BUILD_ARGS+=(-DCMAKE_BUILD_TYPE="${BUILD_CONFIG}")
|
||||||
|
fi
|
||||||
|
|
||||||
|
print_and_run cmake -S deps -B deps/$BUILD_DIR "${CMAKE_C_CXX_COMPILER_CLANG[@]}" "${CMAKE_LLD_LINKER_ARGS[@]}" -G Ninja "${COLORED_OUTPUT}" "${BUILD_ARGS[@]}"
|
||||||
|
print_and_run cmake --build deps/$BUILD_DIR
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -n "${BUILD_ORCA}" ]] || [[ -n "${BUILD_TESTS}" ]] ; then
|
||||||
|
echo "Configuring OrcaSlicer..."
|
||||||
|
if [[ -n "${CLEAN_BUILD}" ]] ; then
|
||||||
|
print_and_run rm -fr $BUILD_DIR
|
||||||
|
fi
|
||||||
|
read -r -a BUILD_ARGS <<< "${ORCA_EXTRA_BUILD_ARGS}"
|
||||||
|
if [[ $BUILD_CONFIG != Release ]] ; then
|
||||||
|
BUILD_ARGS+=(-DCMAKE_BUILD_TYPE="${BUILD_CONFIG}")
|
||||||
|
fi
|
||||||
|
if [[ -n "${BUILD_TESTS}" ]] ; then
|
||||||
|
BUILD_ARGS+=(-DBUILD_TESTS=ON)
|
||||||
|
fi
|
||||||
|
if [[ -n "${ORCA_UPDATER_SIG_KEY}" ]] ; then
|
||||||
|
BUILD_ARGS+=(-DORCA_UPDATER_SIG_KEY="${ORCA_UPDATER_SIG_KEY}")
|
||||||
|
fi
|
||||||
|
|
||||||
|
print_and_run cmake -S . -B $BUILD_DIR "${CMAKE_C_CXX_COMPILER_CLANG[@]}" "${CMAKE_LLD_LINKER_ARGS[@]}" -G "Ninja Multi-Config" -DSLIC3R_PCH=${SLIC3R_PRECOMPILED_HEADERS} -DORCA_TOOLS=ON "${COLORED_OUTPUT}" "${BUILD_ARGS[@]}"
|
||||||
|
echo "done"
|
||||||
|
if [[ -n "${BUILD_ORCA}" ]]; then
|
||||||
|
echo "Building OrcaSlicer ..."
|
||||||
|
print_and_run cmake --build $BUILD_DIR --config "${BUILD_CONFIG}" --target OrcaSlicer
|
||||||
|
echo "Building OrcaSlicer_profile_validator .."
|
||||||
|
print_and_run cmake --build $BUILD_DIR --config "${BUILD_CONFIG}" --target OrcaSlicer_profile_validator
|
||||||
|
./scripts/run_gettext.sh
|
||||||
|
fi
|
||||||
|
if [[ -n "${BUILD_TESTS}" ]] ; then
|
||||||
|
echo "Building tests ..."
|
||||||
|
print_and_run cmake --build ${BUILD_DIR} --config "${BUILD_CONFIG}" --target tests/all
|
||||||
|
fi
|
||||||
|
echo "done"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -n "${BUILD_IMAGE}" || -n "${BUILD_ORCA}" ]] ; then
|
||||||
|
pushd $BUILD_DIR > /dev/null
|
||||||
|
build_linux_image="./src/build_linux_image.sh"
|
||||||
|
if [[ -e ${build_linux_image} ]] ; then
|
||||||
|
extra_script_args=""
|
||||||
|
if [[ -n "${BUILD_IMAGE}" ]] ; then
|
||||||
|
extra_script_args="-i"
|
||||||
|
fi
|
||||||
|
print_and_run ${build_linux_image} ${extra_script_args} -R "${BUILD_CONFIG}"
|
||||||
|
|
||||||
|
echo "done"
|
||||||
|
fi
|
||||||
|
popd > /dev/null # build
|
||||||
|
fi
|
||||||
|
|
||||||
|
elapsed=$SECONDS
|
||||||
|
printf "
|
||||||
|
Build completed in %dh %dm %ds
|
||||||
|
" $((elapsed/3600)) $((elapsed%3600/60)) $((elapsed%60))
|
||||||
|
|
||||||
|
popd > /dev/null # ${SCRIPT_PATH}
|
||||||
58
build_release.bat
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
set WP=%CD%
|
||||||
|
|
||||||
|
set debug=OFF
|
||||||
|
set debuginfo=OFF
|
||||||
|
if "%1"=="debug" set debug=ON
|
||||||
|
if "%2"=="debug" set debug=ON
|
||||||
|
if "%1"=="debuginfo" set debuginfo=ON
|
||||||
|
if "%2"=="debuginfo" set debuginfo=ON
|
||||||
|
if "%debug%"=="ON" (
|
||||||
|
set build_type=Debug
|
||||||
|
set build_dir=build-dbg
|
||||||
|
) else (
|
||||||
|
if "%debuginfo%"=="ON" (
|
||||||
|
set build_type=RelWithDebInfo
|
||||||
|
set build_dir=build-dbginfo
|
||||||
|
) else (
|
||||||
|
set build_type=Release
|
||||||
|
set build_dir=build
|
||||||
|
)
|
||||||
|
)
|
||||||
|
echo build type set to %build_type%
|
||||||
|
|
||||||
|
cd deps
|
||||||
|
mkdir %build_dir%
|
||||||
|
cd %build_dir%
|
||||||
|
set DEPS=%CD%/OrcaSlicer_dep
|
||||||
|
set "SIG_FLAG="
|
||||||
|
if defined ORCA_UPDATER_SIG_KEY set "SIG_FLAG=-DORCA_UPDATER_SIG_KEY=%ORCA_UPDATER_SIG_KEY%"
|
||||||
|
if "%1"=="slicer" (
|
||||||
|
GOTO :slicer
|
||||||
|
)
|
||||||
|
echo "building deps.."
|
||||||
|
|
||||||
|
echo cmake ../ -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=%build_type%
|
||||||
|
cmake ../ -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=%build_type%
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
cmake --build . --config %build_type% --target deps -- -m
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
|
||||||
|
if "%1"=="deps" exit /b 0
|
||||||
|
|
||||||
|
:slicer
|
||||||
|
echo "building Orca Slicer..."
|
||||||
|
cd %WP%
|
||||||
|
mkdir %build_dir%
|
||||||
|
cd %build_dir%
|
||||||
|
|
||||||
|
echo cmake .. -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=%build_type%
|
||||||
|
cmake .. -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=%build_type% %SIG_FLAG%
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
cmake --build . --config %build_type% --target ALL_BUILD -- -m
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
cd ..
|
||||||
|
call scripts/run_gettext.bat
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
cd %build_dir%
|
||||||
|
cmake --build . --target install --config %build_type%
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
365
build_release_macos.sh
Executable file
@@ -0,0 +1,365 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -e
|
||||||
|
set -o pipefail
|
||||||
|
SECONDS=0
|
||||||
|
|
||||||
|
while getopts ":dpa:snt:xbc:i:1Tuh" opt; do
|
||||||
|
case "${opt}" in
|
||||||
|
d )
|
||||||
|
export BUILD_TARGET="deps"
|
||||||
|
;;
|
||||||
|
p )
|
||||||
|
export PACK_DEPS="1"
|
||||||
|
;;
|
||||||
|
a )
|
||||||
|
export ARCH="$OPTARG"
|
||||||
|
;;
|
||||||
|
s )
|
||||||
|
export BUILD_TARGET="slicer"
|
||||||
|
;;
|
||||||
|
n )
|
||||||
|
export NIGHTLY_BUILD="1"
|
||||||
|
;;
|
||||||
|
t )
|
||||||
|
export OSX_DEPLOYMENT_TARGET="$OPTARG"
|
||||||
|
;;
|
||||||
|
x )
|
||||||
|
export SLICER_CMAKE_GENERATOR="Ninja Multi-Config"
|
||||||
|
export SLICER_BUILD_TARGET="all"
|
||||||
|
export DEPS_CMAKE_GENERATOR="Ninja"
|
||||||
|
;;
|
||||||
|
b )
|
||||||
|
export BUILD_ONLY="1"
|
||||||
|
;;
|
||||||
|
c )
|
||||||
|
export BUILD_CONFIG="$OPTARG"
|
||||||
|
;;
|
||||||
|
i )
|
||||||
|
export CMAKE_IGNORE_PREFIX_PATH="${CMAKE_IGNORE_PREFIX_PATH:+$CMAKE_IGNORE_PREFIX_PATH;}$OPTARG"
|
||||||
|
;;
|
||||||
|
1 )
|
||||||
|
export CMAKE_BUILD_PARALLEL_LEVEL=1
|
||||||
|
;;
|
||||||
|
T )
|
||||||
|
export BUILD_TESTS="1"
|
||||||
|
;;
|
||||||
|
u )
|
||||||
|
export BUILD_TARGET="universal"
|
||||||
|
;;
|
||||||
|
h ) echo "Usage: ./build_release_macos.sh [-d]"
|
||||||
|
echo " -d: Build deps only"
|
||||||
|
echo " -a: Set ARCHITECTURE (arm64 or x86_64 or universal)"
|
||||||
|
echo " -s: Build slicer only"
|
||||||
|
echo " -u: Build universal app only (requires existing arm64 and x86_64 app bundles)"
|
||||||
|
echo " -n: Nightly build"
|
||||||
|
echo " -t: Specify minimum version of the target platform, default is 11.3"
|
||||||
|
echo " -x: Use Ninja Multi-Config CMake generator, default is Xcode"
|
||||||
|
echo " -b: Build without reconfiguring CMake"
|
||||||
|
echo " -c: Set CMake build configuration, default is Release"
|
||||||
|
echo " -i: Add a prefix to ignore during CMake dependency discovery (repeatable), defaults to /opt/local:/usr/local:/opt/homebrew"
|
||||||
|
echo " -1: Use single job for building"
|
||||||
|
echo " -T: Build and run tests"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
* )
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -z "$ARCH" ]; then
|
||||||
|
ARCH="$(uname -m)"
|
||||||
|
export ARCH
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$BUILD_CONFIG" ]; then
|
||||||
|
export BUILD_CONFIG="Release"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$BUILD_TARGET" ]; then
|
||||||
|
export BUILD_TARGET="all"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$SLICER_CMAKE_GENERATOR" ]; then
|
||||||
|
export SLICER_CMAKE_GENERATOR="Xcode"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$SLICER_BUILD_TARGET" ]; then
|
||||||
|
export SLICER_BUILD_TARGET="ALL_BUILD"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$DEPS_CMAKE_GENERATOR" ]; then
|
||||||
|
export DEPS_CMAKE_GENERATOR="Unix Makefiles"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$OSX_DEPLOYMENT_TARGET" ]; then
|
||||||
|
export OSX_DEPLOYMENT_TARGET="11.3"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$CMAKE_IGNORE_PREFIX_PATH" ]; then
|
||||||
|
export CMAKE_IGNORE_PREFIX_PATH="/opt/local:/usr/local:/opt/homebrew"
|
||||||
|
fi
|
||||||
|
|
||||||
|
CMAKE_VERSION=$(cmake --version | head -1 | sed -E 's/[^0-9]*([0-9]+).*/\1/')
|
||||||
|
if [ "$CMAKE_VERSION" -ge 4 ] 2>/dev/null; then
|
||||||
|
export CMAKE_POLICY_VERSION_MINIMUM=3.5
|
||||||
|
export CMAKE_POLICY_COMPAT="-DCMAKE_POLICY_VERSION_MINIMUM=3.5"
|
||||||
|
echo "Detected CMake 4.x, adding compatibility flag (env + cmake arg)"
|
||||||
|
else
|
||||||
|
export CMAKE_POLICY_COMPAT=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Build params:"
|
||||||
|
echo " - ARCH: $ARCH"
|
||||||
|
echo " - BUILD_CONFIG: $BUILD_CONFIG"
|
||||||
|
echo " - BUILD_TARGET: $BUILD_TARGET"
|
||||||
|
echo " - CMAKE_GENERATOR: $SLICER_CMAKE_GENERATOR for Slicer, $DEPS_CMAKE_GENERATOR for deps"
|
||||||
|
echo " - OSX_DEPLOYMENT_TARGET: $OSX_DEPLOYMENT_TARGET"
|
||||||
|
echo " - CMAKE_IGNORE_PREFIX_PATH: $CMAKE_IGNORE_PREFIX_PATH"
|
||||||
|
echo
|
||||||
|
|
||||||
|
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
|
PROJECT_BUILD_DIR="$PROJECT_DIR/build/$ARCH"
|
||||||
|
DEPS_DIR="$PROJECT_DIR/deps"
|
||||||
|
HOST_RUNTIME_DIR="$PROJECT_DIR/tools/pjarczak_bambu_linux_host/runtime/linux-x86_64"
|
||||||
|
HOST_WRAPPER="$PROJECT_DIR/tools/pjarczak_bambu_linux_host/pjarczak-bambu-linux-host-wrapper"
|
||||||
|
MAC_RUNTIME_HELPERS_DIR="$PROJECT_DIR/tools/pjarczak_bambu_runtime/macos"
|
||||||
|
|
||||||
|
export BUILD_DIR_CONFIG_SUBDIR="/$BUILD_CONFIG"
|
||||||
|
|
||||||
|
copy_linux_bridge_runtime_to_app() {
|
||||||
|
local app_path="$1"
|
||||||
|
local install_root="$2"
|
||||||
|
local macos_dir="$app_path/Contents/MacOS"
|
||||||
|
local bridge_dylib="$install_root/libpjarczak_bambu_networking_bridge.dylib"
|
||||||
|
|
||||||
|
if [ ! -f "$HOST_RUNTIME_DIR/pjarczak_bambu_linux_host" ]; then
|
||||||
|
echo "Missing linux host runtime: $HOST_RUNTIME_DIR/pjarczak_bambu_linux_host"
|
||||||
|
echo "Build it first on Linux with:"
|
||||||
|
echo " tools/pjarczak_bambu_linux_host/package_linux_host_runtime.sh"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f "$HOST_RUNTIME_DIR/pjarczak_bambu_linux_host_abi1" ]; then
|
||||||
|
echo "Missing linux host ABI1 runtime: $HOST_RUNTIME_DIR/pjarczak_bambu_linux_host_abi1"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f "$HOST_RUNTIME_DIR/pjarczak_bambu_linux_host_abi0" ]; then
|
||||||
|
echo "Missing linux host ABI0 runtime: $HOST_RUNTIME_DIR/pjarczak_bambu_linux_host_abi0"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f "$HOST_WRAPPER" ]; then
|
||||||
|
echo "Missing mac wrapper: $HOST_WRAPPER"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f "$MAC_RUNTIME_HELPERS_DIR/pjarczak_install_macos_runtime.sh" ]; then
|
||||||
|
echo "Missing mac runtime installer: $MAC_RUNTIME_HELPERS_DIR/pjarczak_install_macos_runtime.sh"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f "$MAC_RUNTIME_HELPERS_DIR/pjarczak_verify_macos_runtime.sh" ]; then
|
||||||
|
echo "Missing mac runtime verifier: $MAC_RUNTIME_HELPERS_DIR/pjarczak_verify_macos_runtime.sh"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f "$MAC_RUNTIME_HELPERS_DIR/pjarczak_lima_instance.txt" ]; then
|
||||||
|
echo "Missing Lima instance file: $MAC_RUNTIME_HELPERS_DIR/pjarczak_lima_instance.txt"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -f "$bridge_dylib" ]; then
|
||||||
|
echo "Missing installed bridge dylib: $bridge_dylib"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
cp -f "$bridge_dylib" "$macos_dir/"
|
||||||
|
find "$HOST_RUNTIME_DIR" -maxdepth 1 -type f -exec cp -f {} "$macos_dir/" \;
|
||||||
|
cp -f "$HOST_WRAPPER" "$macos_dir/"
|
||||||
|
cp -f "$MAC_RUNTIME_HELPERS_DIR/pjarczak_install_macos_runtime.sh" "$macos_dir/install_runtime_macos.sh"
|
||||||
|
cp -f "$MAC_RUNTIME_HELPERS_DIR/pjarczak_verify_macos_runtime.sh" "$macos_dir/verify_runtime_macos.sh"
|
||||||
|
cp -f "$MAC_RUNTIME_HELPERS_DIR/pjarczak_lima_instance.txt" "$macos_dir/"
|
||||||
|
if [ -f "$MAC_RUNTIME_HELPERS_DIR/README_runtime_bridge.txt" ]; then
|
||||||
|
cp -f "$MAC_RUNTIME_HELPERS_DIR/README_runtime_bridge.txt" "$macos_dir/"
|
||||||
|
fi
|
||||||
|
|
||||||
|
chmod +x "$macos_dir/pjarczak_bambu_linux_host"
|
||||||
|
chmod +x "$macos_dir/pjarczak-bambu-linux-host-wrapper"
|
||||||
|
chmod +x "$macos_dir/install_runtime_macos.sh"
|
||||||
|
chmod +x "$macos_dir/verify_runtime_macos.sh"
|
||||||
|
}
|
||||||
|
|
||||||
|
build_deps() {
|
||||||
|
for _ARCH in x86_64 arm64; do
|
||||||
|
if [ "$ARCH" == "universal" ] || [ "$ARCH" == "$_ARCH" ]; then
|
||||||
|
PROJECT_BUILD_DIR="$PROJECT_DIR/build/$_ARCH"
|
||||||
|
DEPS_BUILD_DIR="$DEPS_DIR/build/$_ARCH"
|
||||||
|
DEPS="$DEPS_BUILD_DIR/OrcaSlicer_dep"
|
||||||
|
|
||||||
|
echo "Building deps..."
|
||||||
|
(
|
||||||
|
set -x
|
||||||
|
mkdir -p "$DEPS"
|
||||||
|
cd "$DEPS_BUILD_DIR"
|
||||||
|
if [ "1." != "$BUILD_ONLY". ]; then
|
||||||
|
cmake "${DEPS_DIR}" -G "${DEPS_CMAKE_GENERATOR}" -DCMAKE_BUILD_TYPE="$BUILD_CONFIG" -DCMAKE_OSX_ARCHITECTURES:STRING="${_ARCH}" -DCMAKE_OSX_DEPLOYMENT_TARGET="${OSX_DEPLOYMENT_TARGET}" -DCMAKE_IGNORE_PREFIX_PATH="${CMAKE_IGNORE_PREFIX_PATH}" ${CMAKE_POLICY_COMPAT}
|
||||||
|
fi
|
||||||
|
cmake --build . --config "$BUILD_CONFIG" --target deps
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
pack_deps() {
|
||||||
|
echo "Packing deps..."
|
||||||
|
(
|
||||||
|
set -x
|
||||||
|
cd "$DEPS_DIR"
|
||||||
|
tar -zcvf "OrcaSlicer_dep_mac_${ARCH}_$(date +"%Y%m%d").tar.gz" "build"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
build_slicer() {
|
||||||
|
for _ARCH in x86_64 arm64; do
|
||||||
|
if [ "$ARCH" == "universal" ] || [ "$ARCH" == "$_ARCH" ]; then
|
||||||
|
PROJECT_BUILD_DIR="$PROJECT_DIR/build/$_ARCH"
|
||||||
|
DEPS_BUILD_DIR="$DEPS_DIR/build/$_ARCH"
|
||||||
|
DEPS="$DEPS_BUILD_DIR/OrcaSlicer_dep"
|
||||||
|
|
||||||
|
echo "Building slicer for $_ARCH..."
|
||||||
|
(
|
||||||
|
set -x
|
||||||
|
mkdir -p "$PROJECT_BUILD_DIR"
|
||||||
|
cd "$PROJECT_BUILD_DIR"
|
||||||
|
if [ "1." != "$BUILD_ONLY". ]; then
|
||||||
|
cmake "${PROJECT_DIR}" -G "${SLICER_CMAKE_GENERATOR}" -DORCA_TOOLS=ON ${ORCA_UPDATER_SIG_KEY:+-DORCA_UPDATER_SIG_KEY="$ORCA_UPDATER_SIG_KEY"} ${BUILD_TESTS:+-DBUILD_TESTS=ON} -DCMAKE_BUILD_TYPE="$BUILD_CONFIG" -DCMAKE_OSX_ARCHITECTURES="${_ARCH}" -DCMAKE_OSX_DEPLOYMENT_TARGET="${OSX_DEPLOYMENT_TARGET}" -DCMAKE_IGNORE_PREFIX_PATH="${CMAKE_IGNORE_PREFIX_PATH}" ${CMAKE_POLICY_COMPAT}
|
||||||
|
fi
|
||||||
|
cmake --build . --config "$BUILD_CONFIG" --target "$SLICER_BUILD_TARGET"
|
||||||
|
cmake --install . --config "$BUILD_CONFIG"
|
||||||
|
)
|
||||||
|
|
||||||
|
if [ "1." == "$BUILD_TESTS". ]; then
|
||||||
|
echo "Running tests for $_ARCH..."
|
||||||
|
(
|
||||||
|
set -x
|
||||||
|
cd "$PROJECT_BUILD_DIR"
|
||||||
|
ctest --build-config "$BUILD_CONFIG" --output-on-failure
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Verify localization with gettext..."
|
||||||
|
(
|
||||||
|
cd "$PROJECT_DIR"
|
||||||
|
./scripts/run_gettext.sh
|
||||||
|
)
|
||||||
|
|
||||||
|
echo "Fix macOS app package..."
|
||||||
|
(
|
||||||
|
cd "$PROJECT_BUILD_DIR"
|
||||||
|
mkdir -p OrcaSlicer
|
||||||
|
cd OrcaSlicer
|
||||||
|
rm -rf ./OrcaSlicer.app
|
||||||
|
cp -pR "../src$BUILD_DIR_CONFIG_SUBDIR/OrcaSlicer.app" ./OrcaSlicer.app
|
||||||
|
|
||||||
|
resources_path=$(readlink ./OrcaSlicer.app/Contents/Resources)
|
||||||
|
rm ./OrcaSlicer.app/Contents/Resources
|
||||||
|
cp -R "$resources_path" ./OrcaSlicer.app/Contents/Resources
|
||||||
|
|
||||||
|
find ./OrcaSlicer.app/ -name '.DS_Store' -delete
|
||||||
|
|
||||||
|
if [ -f "../src$BUILD_DIR_CONFIG_SUBDIR/OrcaSlicer_profile_validator.app/Contents/MacOS/OrcaSlicer_profile_validator" ]; then
|
||||||
|
echo "Copying OrcaSlicer_profile_validator.app..."
|
||||||
|
rm -rf ./OrcaSlicer_profile_validator.app
|
||||||
|
cp -pR "../src$BUILD_DIR_CONFIG_SUBDIR/OrcaSlicer_profile_validator.app" ./OrcaSlicer_profile_validator.app
|
||||||
|
find ./OrcaSlicer_profile_validator.app/ -name '.DS_Store' -delete
|
||||||
|
fi
|
||||||
|
|
||||||
|
copy_linux_bridge_runtime_to_app "./OrcaSlicer.app" "$PROJECT_BUILD_DIR/OrcaSlicer"
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
lipo_dir() {
|
||||||
|
local universal_dir="$1"
|
||||||
|
local x86_64_dir="$2"
|
||||||
|
|
||||||
|
while IFS= read -r -d '' f; do
|
||||||
|
local rel="${f#"$universal_dir"/}"
|
||||||
|
local x86="$x86_64_dir/$rel"
|
||||||
|
if [ -f "$x86" ]; then
|
||||||
|
echo " lipo: $rel"
|
||||||
|
lipo -create "$f" "$x86" -output "$f.tmp"
|
||||||
|
mv "$f.tmp" "$f"
|
||||||
|
else
|
||||||
|
echo " warning: no x86_64 counterpart for $rel, keeping arm64 only"
|
||||||
|
fi
|
||||||
|
done < <(find "$universal_dir" -type f -print0 | while IFS= read -r -d '' candidate; do
|
||||||
|
if file "$candidate" | grep -q "Mach-O"; then
|
||||||
|
printf '%s\0' "$candidate"
|
||||||
|
fi
|
||||||
|
done)
|
||||||
|
}
|
||||||
|
|
||||||
|
build_universal() {
|
||||||
|
echo "Building universal binary..."
|
||||||
|
|
||||||
|
PROJECT_BUILD_DIR="$PROJECT_DIR/build/$ARCH"
|
||||||
|
ARM64_APP="$PROJECT_DIR/build/arm64/OrcaSlicer/OrcaSlicer.app"
|
||||||
|
X86_64_APP="$PROJECT_DIR/build/x86_64/OrcaSlicer/OrcaSlicer.app"
|
||||||
|
|
||||||
|
mkdir -p "$PROJECT_BUILD_DIR/OrcaSlicer"
|
||||||
|
UNIVERSAL_APP="$PROJECT_BUILD_DIR/OrcaSlicer/OrcaSlicer.app"
|
||||||
|
rm -rf "$UNIVERSAL_APP"
|
||||||
|
cp -R "$ARM64_APP" "$UNIVERSAL_APP"
|
||||||
|
|
||||||
|
echo "Creating universal binaries for OrcaSlicer.app..."
|
||||||
|
lipo_dir "$UNIVERSAL_APP" "$X86_64_APP"
|
||||||
|
echo "Universal OrcaSlicer.app created at $UNIVERSAL_APP"
|
||||||
|
|
||||||
|
ARM64_VALIDATOR="$PROJECT_DIR/build/arm64/OrcaSlicer/OrcaSlicer_profile_validator.app"
|
||||||
|
X86_64_VALIDATOR="$PROJECT_DIR/build/x86_64/OrcaSlicer/OrcaSlicer_profile_validator.app"
|
||||||
|
if [ -d "$ARM64_VALIDATOR" ] && [ -d "$X86_64_VALIDATOR" ]; then
|
||||||
|
echo "Creating universal binaries for OrcaSlicer_profile_validator.app..."
|
||||||
|
UNIVERSAL_VALIDATOR_APP="$PROJECT_BUILD_DIR/OrcaSlicer/OrcaSlicer_profile_validator.app"
|
||||||
|
rm -rf "$UNIVERSAL_VALIDATOR_APP"
|
||||||
|
cp -R "$ARM64_VALIDATOR" "$UNIVERSAL_VALIDATOR_APP"
|
||||||
|
lipo_dir "$UNIVERSAL_VALIDATOR_APP" "$X86_64_VALIDATOR"
|
||||||
|
echo "Universal OrcaSlicer_profile_validator.app created at $UNIVERSAL_VALIDATOR_APP"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
case "${BUILD_TARGET}" in
|
||||||
|
all)
|
||||||
|
build_deps
|
||||||
|
build_slicer
|
||||||
|
;;
|
||||||
|
deps)
|
||||||
|
build_deps
|
||||||
|
;;
|
||||||
|
slicer)
|
||||||
|
build_slicer
|
||||||
|
;;
|
||||||
|
universal)
|
||||||
|
build_universal
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unknown target: $BUILD_TARGET. Available targets: deps, slicer, universal, all."
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
if [ "$ARCH" = "universal" ] && { [ "$BUILD_TARGET" = "all" ] || [ "$BUILD_TARGET" = "slicer" ]; }; then
|
||||||
|
build_universal
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "1." == "$PACK_DEPS". ]; then
|
||||||
|
pack_deps
|
||||||
|
fi
|
||||||
|
|
||||||
|
elapsed=$SECONDS
|
||||||
|
printf "
|
||||||
|
Build completed in %dh %dm %ds
|
||||||
|
" $((elapsed/3600)) $((elapsed%3600/60)) $((elapsed%60))
|
||||||
355
build_release_vs.bat
Normal file
@@ -0,0 +1,355 @@
|
|||||||
|
@REM OrcaSlicer build script for Windows with VS auto-detect
|
||||||
|
@echo off
|
||||||
|
set WP=%CD%
|
||||||
|
set _START_TIME=%TIME%
|
||||||
|
|
||||||
|
@REM Check for Ninja Multi-Config option (-x)
|
||||||
|
set USE_NINJA=0
|
||||||
|
for %%a in (%*) do (
|
||||||
|
if "%%a"=="-x" set USE_NINJA=1
|
||||||
|
)
|
||||||
|
|
||||||
|
if "%USE_NINJA%"=="1" (
|
||||||
|
echo Using Ninja Multi-Config generator
|
||||||
|
set CMAKE_GENERATOR="Ninja Multi-Config"
|
||||||
|
set VS_VERSION=Ninja
|
||||||
|
goto :generator_ready
|
||||||
|
)
|
||||||
|
|
||||||
|
@REM Detect Visual Studio version using msbuild
|
||||||
|
echo Detecting Visual Studio version using msbuild...
|
||||||
|
|
||||||
|
@REM Try to get MSBuild version - the output format varies by VS version
|
||||||
|
set VS_MAJOR=
|
||||||
|
for /f "tokens=*" %%i in ('msbuild -version 2^>^&1 ^| findstr /r "^[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*"') do (
|
||||||
|
for /f "tokens=1 delims=." %%a in ("%%i") do set VS_MAJOR=%%a
|
||||||
|
set MSBUILD_OUTPUT=%%i
|
||||||
|
goto :version_found
|
||||||
|
)
|
||||||
|
|
||||||
|
@REM Alternative method for newer MSBuild versions
|
||||||
|
if "%VS_MAJOR%"=="" (
|
||||||
|
for /f "tokens=*" %%i in ('msbuild -version 2^>^&1 ^| findstr /r "[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*"') do (
|
||||||
|
for /f "tokens=1 delims=." %%a in ("%%i") do set VS_MAJOR=%%a
|
||||||
|
set MSBUILD_OUTPUT=%%i
|
||||||
|
goto :version_found
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
:version_found
|
||||||
|
echo MSBuild version detected: %MSBUILD_OUTPUT%
|
||||||
|
echo Major version: %VS_MAJOR%
|
||||||
|
|
||||||
|
if "%VS_MAJOR%"=="" (
|
||||||
|
echo Error: Could not determine Visual Studio version from msbuild
|
||||||
|
echo Please ensure Visual Studio and MSBuild are properly installed
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
if "%VS_MAJOR%"=="16" (
|
||||||
|
set VS_VERSION=2019
|
||||||
|
set CMAKE_GENERATOR="Visual Studio 16 2019"
|
||||||
|
) else if "%VS_MAJOR%"=="17" (
|
||||||
|
set VS_VERSION=2022
|
||||||
|
set CMAKE_GENERATOR="Visual Studio 17 2022"
|
||||||
|
) else if "%VS_MAJOR%"=="18" (
|
||||||
|
set VS_VERSION=2026
|
||||||
|
set CMAKE_GENERATOR="Visual Studio 18 2026"
|
||||||
|
) else (
|
||||||
|
echo Error: Unsupported Visual Studio version: %VS_MAJOR%
|
||||||
|
echo Supported versions: VS2019 ^(16.x^), VS2022 ^(17.x^), VS2026 ^(18.x^)
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
echo Detected Visual Studio %VS_VERSION% (version %VS_MAJOR%)
|
||||||
|
echo Using CMake generator: %CMAKE_GENERATOR%
|
||||||
|
|
||||||
|
:generator_ready
|
||||||
|
|
||||||
|
@REM Pack deps
|
||||||
|
if "%1"=="pack" (
|
||||||
|
setlocal ENABLEDELAYEDEXPANSION
|
||||||
|
cd %WP%/deps/build
|
||||||
|
for /f "tokens=2-4 delims=/ " %%a in ('date /t') do set build_date=%%c%%b%%a
|
||||||
|
echo packing deps: OrcaSlicer_dep_win64_!build_date!_vs!VS_VERSION!.zip
|
||||||
|
|
||||||
|
%WP%/tools/7z.exe a OrcaSlicer_dep_win64_!build_date!_vs!VS_VERSION!.zip OrcaSlicer_dep
|
||||||
|
goto :done
|
||||||
|
)
|
||||||
|
|
||||||
|
set debug=OFF
|
||||||
|
set debuginfo=OFF
|
||||||
|
if "%1"=="debug" set debug=ON
|
||||||
|
if "%2"=="debug" set debug=ON
|
||||||
|
if "%1"=="debuginfo" set debuginfo=ON
|
||||||
|
if "%2"=="debuginfo" set debuginfo=ON
|
||||||
|
if "%debug%"=="ON" (
|
||||||
|
set build_type=Debug
|
||||||
|
set build_dir=build-dbg
|
||||||
|
) else (
|
||||||
|
if "%debuginfo%"=="ON" (
|
||||||
|
set build_type=RelWithDebInfo
|
||||||
|
set build_dir=build-dbginfo
|
||||||
|
) else (
|
||||||
|
set build_type=Release
|
||||||
|
set build_dir=build
|
||||||
|
)
|
||||||
|
)
|
||||||
|
echo build type set to %build_type%
|
||||||
|
|
||||||
|
setlocal DISABLEDELAYEDEXPANSION
|
||||||
|
cd deps
|
||||||
|
mkdir %build_dir%
|
||||||
|
cd %build_dir%
|
||||||
|
set "SIG_FLAG="
|
||||||
|
if defined ORCA_UPDATER_SIG_KEY set "SIG_FLAG=-DORCA_UPDATER_SIG_KEY=%ORCA_UPDATER_SIG_KEY%"
|
||||||
|
|
||||||
|
if "%1"=="slicer" (
|
||||||
|
GOTO :slicer
|
||||||
|
)
|
||||||
|
echo "building deps.."
|
||||||
|
|
||||||
|
echo on
|
||||||
|
REM Set minimum CMake policy to avoid <3.5 errors
|
||||||
|
set CMAKE_POLICY_VERSION_MINIMUM=3.5
|
||||||
|
if "%USE_NINJA%"=="1" (
|
||||||
|
cmake ../ -G %CMAKE_GENERATOR% -DCMAKE_BUILD_TYPE=%build_type%
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
cmake --build . --config %build_type% --target deps
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
) else (
|
||||||
|
cmake ../ -G %CMAKE_GENERATOR% -A x64 -DCMAKE_BUILD_TYPE=%build_type%
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
cmake --build . --config %build_type% --target deps -- -m
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
)
|
||||||
|
@echo off
|
||||||
|
|
||||||
|
if "%1"=="deps" goto :done
|
||||||
|
|
||||||
|
:slicer
|
||||||
|
call :check_linux_bridge_runtime_inputs
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
|
||||||
|
echo "building Orca Slicer..."
|
||||||
|
cd %WP%
|
||||||
|
mkdir %build_dir%
|
||||||
|
cd %build_dir%
|
||||||
|
|
||||||
|
echo on
|
||||||
|
set CMAKE_POLICY_VERSION_MINIMUM=3.5
|
||||||
|
if "%USE_NINJA%"=="1" (
|
||||||
|
cmake .. -G %CMAKE_GENERATOR% -DORCA_TOOLS=ON %SIG_FLAG% -DCMAKE_BUILD_TYPE=%build_type%
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
cmake --build . --config %build_type% --target ALL_BUILD
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
) else (
|
||||||
|
cmake .. -G %CMAKE_GENERATOR% -A x64 -DORCA_TOOLS=ON %SIG_FLAG% -DCMAKE_BUILD_TYPE=%build_type%
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
cmake --build . --config %build_type% --target ALL_BUILD -- -m
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
)
|
||||||
|
@echo off
|
||||||
|
cd ..
|
||||||
|
call scripts/run_gettext.bat
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
cd %build_dir%
|
||||||
|
cmake --build . --target install --config %build_type%
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
call :copy_linux_bridge_runtime
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
|
||||||
|
:done
|
||||||
|
@echo off
|
||||||
|
for /f "tokens=1-3 delims=:.," %%a in ("%_START_TIME: =0%") do set /a "_start_s=(1%%a-100)*3600 + (1%%b-100)*60 + (1%%c-100)"
|
||||||
|
for /f "tokens=1-3 delims=:.," %%a in ("%TIME: =0%") do set /a "_end_s=(1%%a-100)*3600 + (1%%b-100)*60 + (1%%c-100)"
|
||||||
|
set /a "_elapsed=_end_s - _start_s"
|
||||||
|
if %_elapsed% lss 0 set /a "_elapsed+=86400"
|
||||||
|
set /a "_hours=_elapsed / 3600"
|
||||||
|
set /a "_remainder=_elapsed - _hours * 3600"
|
||||||
|
set /a "_mins=_remainder / 60"
|
||||||
|
set /a "_secs=_remainder - _mins * 60"
|
||||||
|
echo.
|
||||||
|
echo Build completed in %_hours%h %_mins%m %_secs%s
|
||||||
|
exit /b 0
|
||||||
|
|
||||||
|
:resolve_rootfs_tar
|
||||||
|
if defined PJARCZAK_ROOTFS_TAR exit /b 0
|
||||||
|
|
||||||
|
if defined PJARCZAK_WSL_ROOTFS_TAR (
|
||||||
|
if exist "%PJARCZAK_WSL_ROOTFS_TAR%" (
|
||||||
|
set "PJARCZAK_ROOTFS_TAR=%PJARCZAK_WSL_ROOTFS_TAR%"
|
||||||
|
exit /b 0
|
||||||
|
)
|
||||||
|
echo Missing file from PJARCZAK_WSL_ROOTFS_TAR: %PJARCZAK_WSL_ROOTFS_TAR%
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
if exist "%WP%\tools\pjarczak_bambu_runtime\rootfs\windows-wsl2-rootfs.tar" (
|
||||||
|
set "PJARCZAK_ROOTFS_TAR=%WP%\tools\pjarczak_bambu_runtime\rootfs\windows-wsl2-rootfs.tar"
|
||||||
|
exit /b 0
|
||||||
|
)
|
||||||
|
|
||||||
|
if exist "%WP%\tools\pjarczak_bambu_runtime\windows-wsl2-rootfs.tar" (
|
||||||
|
set "PJARCZAK_ROOTFS_TAR=%WP%\tools\pjarczak_bambu_runtime\windows-wsl2-rootfs.tar"
|
||||||
|
exit /b 0
|
||||||
|
)
|
||||||
|
|
||||||
|
echo Missing windows-wsl2-rootfs.tar
|
||||||
|
echo Expected one of:
|
||||||
|
echo %WP%\tools\pjarczak_bambu_runtime\rootfs\windows-wsl2-rootfs.tar
|
||||||
|
echo %WP%\tools\pjarczak_bambu_runtime\windows-wsl2-rootfs.tar
|
||||||
|
echo Or set PJARCZAK_WSL_ROOTFS_TAR to an absolute path.
|
||||||
|
exit /b 1
|
||||||
|
|
||||||
|
:check_linux_bridge_runtime_inputs
|
||||||
|
set "HOST_RUNTIME_DIR=%WP%\tools\pjarczak_bambu_linux_host\runtime\linux-x86_64"
|
||||||
|
|
||||||
|
call :resolve_rootfs_tar
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
|
||||||
|
if not exist "%HOST_RUNTIME_DIR%\pjarczak_bambu_linux_host" (
|
||||||
|
echo Missing linux host runtime: %HOST_RUNTIME_DIR%\pjarczak_bambu_linux_host
|
||||||
|
echo Build it first on Linux with:
|
||||||
|
echo tools\pjarczak_bambu_linux_host\package_linux_host_runtime.sh
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
if not exist "%HOST_RUNTIME_DIR%\pjarczak_bambu_linux_host_abi1" (
|
||||||
|
echo Missing linux host ABI1 runtime: %HOST_RUNTIME_DIR%\pjarczak_bambu_linux_host_abi1
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
if not exist "%HOST_RUNTIME_DIR%\pjarczak_bambu_linux_host_abi0" (
|
||||||
|
echo Missing linux host ABI0 runtime: %HOST_RUNTIME_DIR%\pjarczak_bambu_linux_host_abi0
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
if not exist "%HOST_RUNTIME_DIR%\ca-certificates.crt" (
|
||||||
|
echo Missing CA bundle for linux bridge runtime: %HOST_RUNTIME_DIR%\ca-certificates.crt
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
if not exist "%HOST_RUNTIME_DIR%\slicer_base64.cer" (
|
||||||
|
echo Missing slicer certificate for linux bridge runtime: %HOST_RUNTIME_DIR%\slicer_base64.cer
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
echo Linux bridge preflight OK
|
||||||
|
echo host runtime: %HOST_RUNTIME_DIR%
|
||||||
|
echo rootfs tar: %PJARCZAK_ROOTFS_TAR%
|
||||||
|
exit /b 0
|
||||||
|
|
||||||
|
:copy_linux_bridge_runtime
|
||||||
|
set "INSTALL_DIR=%WP%\%build_dir%\OrcaSlicer"
|
||||||
|
set "HOST_RUNTIME_DIR=%WP%\tools\pjarczak_bambu_linux_host\runtime\linux-x86_64"
|
||||||
|
|
||||||
|
if not defined PJARCZAK_ROOTFS_TAR (
|
||||||
|
call :resolve_rootfs_tar
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
if not exist "%HOST_RUNTIME_DIR%\pjarczak_bambu_linux_host" (
|
||||||
|
echo Missing linux host runtime: %HOST_RUNTIME_DIR%\pjarczak_bambu_linux_host
|
||||||
|
echo Build it first on Linux with:
|
||||||
|
echo tools\pjarczak_bambu_linux_host\package_linux_host_runtime.sh
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
if not exist "%HOST_RUNTIME_DIR%\pjarczak_bambu_linux_host_abi1" (
|
||||||
|
echo Missing linux host ABI1 runtime: %HOST_RUNTIME_DIR%\pjarczak_bambu_linux_host_abi1
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
if not exist "%HOST_RUNTIME_DIR%\pjarczak_bambu_linux_host_abi0" (
|
||||||
|
echo Missing linux host ABI0 runtime: %HOST_RUNTIME_DIR%\pjarczak_bambu_linux_host_abi0
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
if not exist "%HOST_RUNTIME_DIR%\ca-certificates.crt" (
|
||||||
|
echo Missing CA bundle for linux bridge runtime: %HOST_RUNTIME_DIR%\ca-certificates.crt
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
if not exist "%HOST_RUNTIME_DIR%\slicer_base64.cer" (
|
||||||
|
echo Missing slicer certificate for linux bridge runtime: %HOST_RUNTIME_DIR%\slicer_base64.cer
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
if not exist "%INSTALL_DIR%" (
|
||||||
|
echo Missing install directory: %INSTALL_DIR%
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
if not exist "%INSTALL_DIR%\pjarczak_bambu_networking_bridge.dll" (
|
||||||
|
if exist "%WP%\%build_dir%\pjarczak_bambu_networking_bridge.dll" (
|
||||||
|
copy /Y "%WP%\%build_dir%\pjarczak_bambu_networking_bridge.dll" "%INSTALL_DIR%\pjarczak_bambu_networking_bridge.dll" >nul
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
if not exist "%INSTALL_DIR%\pjarczak_bambu_networking_bridge.dll" (
|
||||||
|
if exist "%WP%\%build_dir%\src\%build_type%\pjarczak_bambu_networking_bridge.dll" (
|
||||||
|
copy /Y "%WP%\%build_dir%\src\%build_type%\pjarczak_bambu_networking_bridge.dll" "%INSTALL_DIR%\pjarczak_bambu_networking_bridge.dll" >nul
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
if not exist "%INSTALL_DIR%\pjarczak_bambu_networking_bridge.dll" (
|
||||||
|
echo Missing bridge DLL in install output: %INSTALL_DIR%\pjarczak_bambu_networking_bridge.dll
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
xcopy "%HOST_RUNTIME_DIR%\*" "%INSTALL_DIR%\\" /I /Y >nul
|
||||||
|
if errorlevel 4 (
|
||||||
|
echo Failed to copy flat linux host runtime files into %INSTALL_DIR%
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
copy /Y "%PJARCZAK_ROOTFS_TAR%" "%INSTALL_DIR%\windows-wsl2-rootfs.tar" >nul
|
||||||
|
if errorlevel 1 (
|
||||||
|
echo Failed to copy windows-wsl2-rootfs.tar into %INSTALL_DIR%
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
copy /Y "%WP%\tools\pjarczak_bambu_runtime\wsl\pjarczak_wsl_run_host.sh" "%INSTALL_DIR%\pjarczak_wsl_run_host.sh" >nul
|
||||||
|
if errorlevel 1 (
|
||||||
|
echo Failed to copy pjarczak_wsl_run_host.sh into %INSTALL_DIR%
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
copy /Y "%WP%\tools\pjarczak_bambu_runtime\wsl\install_runtime.ps1" "%INSTALL_DIR%\install_runtime.ps1" >nul
|
||||||
|
if errorlevel 1 (
|
||||||
|
echo Failed to copy install_runtime.ps1 into %INSTALL_DIR%
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
copy /Y "%WP%\tools\pjarczak_bambu_runtime\wsl\install_runtime.cmd" "%INSTALL_DIR%\install_runtime.cmd" >nul
|
||||||
|
if errorlevel 1 (
|
||||||
|
echo Failed to copy install_runtime.cmd into %INSTALL_DIR%
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
copy /Y "%WP%\tools\pjarczak_bambu_runtime\wsl\verify_runtime.ps1" "%INSTALL_DIR%\verify_runtime.ps1" >nul
|
||||||
|
if errorlevel 1 (
|
||||||
|
echo Failed to copy verify_runtime.ps1 into %INSTALL_DIR%
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
copy /Y "%WP%\tools\pjarczak_bambu_runtime\wsl\pjarczak_wsl_distro.txt" "%INSTALL_DIR%\pjarczak_wsl_distro.txt" >nul
|
||||||
|
if errorlevel 1 (
|
||||||
|
echo Failed to copy pjarczak_wsl_distro.txt into %INSTALL_DIR%
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
copy /Y "%WP%\tools\pjarczak_bambu_runtime\wsl\pjarczak_plugin_cache_subdir.txt" "%INSTALL_DIR%\pjarczak_plugin_cache_subdir.txt" >nul
|
||||||
|
if errorlevel 1 (
|
||||||
|
echo Failed to copy pjarczak_plugin_cache_subdir.txt into %INSTALL_DIR%
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
copy /Y "%WP%\tools\pjarczak_bambu_runtime\release\assemble_windows_runtime_bundle.ps1" "%INSTALL_DIR%\assemble_windows_runtime_bundle.ps1" >nul
|
||||||
|
if errorlevel 1 (
|
||||||
|
echo Failed to copy assemble_windows_runtime_bundle.ps1 into %INSTALL_DIR%
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
exit /b 0
|
||||||
77
build_release_vs2022.bat
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
@REM OrcaSlicer build script for Windows
|
||||||
|
@echo off
|
||||||
|
set WP=%CD%
|
||||||
|
|
||||||
|
@REM Pack deps
|
||||||
|
if "%1"=="pack" (
|
||||||
|
setlocal ENABLEDELAYEDEXPANSION
|
||||||
|
cd %WP%/deps/build
|
||||||
|
for /f "tokens=2-4 delims=/ " %%a in ('date /t') do set build_date=%%c%%b%%a
|
||||||
|
echo packing deps: OrcaSlicer_dep_win64_!build_date!_vs2022.zip
|
||||||
|
|
||||||
|
%WP%/tools/7z.exe a OrcaSlicer_dep_win64_!build_date!_vs2022.zip OrcaSlicer_dep
|
||||||
|
exit /b 0
|
||||||
|
)
|
||||||
|
|
||||||
|
set debug=OFF
|
||||||
|
set debuginfo=OFF
|
||||||
|
if "%1"=="debug" set debug=ON
|
||||||
|
if "%2"=="debug" set debug=ON
|
||||||
|
if "%1"=="debuginfo" set debuginfo=ON
|
||||||
|
if "%2"=="debuginfo" set debuginfo=ON
|
||||||
|
if "%debug%"=="ON" (
|
||||||
|
set build_type=Debug
|
||||||
|
set build_dir=build-dbg
|
||||||
|
) else (
|
||||||
|
if "%debuginfo%"=="ON" (
|
||||||
|
set build_type=RelWithDebInfo
|
||||||
|
set build_dir=build-dbginfo
|
||||||
|
) else (
|
||||||
|
set build_type=Release
|
||||||
|
set build_dir=build
|
||||||
|
)
|
||||||
|
)
|
||||||
|
echo build type set to %build_type%
|
||||||
|
|
||||||
|
setlocal DISABLEDELAYEDEXPANSION
|
||||||
|
cd deps
|
||||||
|
mkdir %build_dir%
|
||||||
|
cd %build_dir%
|
||||||
|
set "SIG_FLAG="
|
||||||
|
if defined ORCA_UPDATER_SIG_KEY set "SIG_FLAG=-DORCA_UPDATER_SIG_KEY=%ORCA_UPDATER_SIG_KEY%"
|
||||||
|
|
||||||
|
if "%1"=="slicer" (
|
||||||
|
GOTO :slicer
|
||||||
|
)
|
||||||
|
echo "building deps.."
|
||||||
|
|
||||||
|
echo on
|
||||||
|
REM Set minimum CMake policy to avoid <3.5 errors
|
||||||
|
set CMAKE_POLICY_VERSION_MINIMUM=3.5
|
||||||
|
cmake ../ -G "Visual Studio 17 2022" -A x64 -DCMAKE_BUILD_TYPE=%build_type%
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
cmake --build . --config %build_type% --target deps -- -m
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
@echo off
|
||||||
|
|
||||||
|
if "%1"=="deps" exit /b 0
|
||||||
|
|
||||||
|
:slicer
|
||||||
|
echo "building Orca Slicer..."
|
||||||
|
cd %WP%
|
||||||
|
mkdir %build_dir%
|
||||||
|
cd %build_dir%
|
||||||
|
|
||||||
|
echo on
|
||||||
|
set CMAKE_POLICY_VERSION_MINIMUM=3.5
|
||||||
|
cmake .. -G "Visual Studio 17 2022" -A x64 -DORCA_TOOLS=ON %SIG_FLAG% -DCMAKE_BUILD_TYPE=%build_type%
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
cmake --build . --config %build_type% --target ALL_BUILD -- -m
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
@echo off
|
||||||
|
cd ..
|
||||||
|
call scripts/run_gettext.bat
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
|
cd %build_dir%
|
||||||
|
cmake --build . --target install --config %build_type%
|
||||||
|
if errorlevel 1 exit /b 1
|
||||||
106
cmake/modules/CheckAtomic.cmake
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
# atomic builtins are required for threading support.
|
||||||
|
|
||||||
|
INCLUDE(CheckCXXSourceCompiles)
|
||||||
|
INCLUDE(CheckLibraryExists)
|
||||||
|
|
||||||
|
# Sometimes linking against libatomic is required for atomic ops, if
|
||||||
|
# the platform doesn't support lock-free atomics.
|
||||||
|
|
||||||
|
function(check_working_cxx_atomics varname)
|
||||||
|
set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++11")
|
||||||
|
CHECK_CXX_SOURCE_COMPILES("
|
||||||
|
#include <atomic>
|
||||||
|
std::atomic<int> x;
|
||||||
|
int main() {
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
" ${varname})
|
||||||
|
set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
|
||||||
|
endfunction(check_working_cxx_atomics)
|
||||||
|
|
||||||
|
function(check_working_cxx_atomics64 varname)
|
||||||
|
set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
|
||||||
|
set(CMAKE_REQUIRED_FLAGS "-std=c++11 ${CMAKE_REQUIRED_FLAGS}")
|
||||||
|
CHECK_CXX_SOURCE_COMPILES("
|
||||||
|
#include <atomic>
|
||||||
|
#include <cstdint>
|
||||||
|
std::atomic<uint64_t> x (0);
|
||||||
|
int main() {
|
||||||
|
uint64_t i = x.load(std::memory_order_relaxed);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
" ${varname})
|
||||||
|
set(CMAKE_REQUIRED_FLAGS ${OLD_CMAKE_REQUIRED_FLAGS})
|
||||||
|
endfunction(check_working_cxx_atomics64)
|
||||||
|
|
||||||
|
|
||||||
|
# This isn't necessary on MSVC, so avoid command-line switch annoyance
|
||||||
|
# by only running on GCC-like hosts.
|
||||||
|
if (LLVM_COMPILER_IS_GCC_COMPATIBLE)
|
||||||
|
# First check if atomics work without the library.
|
||||||
|
check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITHOUT_LIB)
|
||||||
|
# If not, check if the library exists, and atomics work with it.
|
||||||
|
if(NOT HAVE_CXX_ATOMICS_WITHOUT_LIB)
|
||||||
|
check_library_exists(atomic __atomic_fetch_add_4 "" HAVE_LIBATOMIC)
|
||||||
|
if( HAVE_LIBATOMIC )
|
||||||
|
list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic")
|
||||||
|
check_working_cxx_atomics(HAVE_CXX_ATOMICS_WITH_LIB)
|
||||||
|
if (NOT HAVE_CXX_ATOMICS_WITH_LIB)
|
||||||
|
message(FATAL_ERROR "Host compiler must support std::atomic!")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "Host compiler appears to require libatomic, but cannot find it.")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Check for 64 bit atomic operations.
|
||||||
|
if(MSVC)
|
||||||
|
set(HAVE_CXX_ATOMICS64_WITHOUT_LIB True)
|
||||||
|
else()
|
||||||
|
check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITHOUT_LIB)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# If not, check if the library exists, and atomics work with it.
|
||||||
|
if(NOT HAVE_CXX_ATOMICS64_WITHOUT_LIB)
|
||||||
|
check_library_exists(atomic __atomic_load_8 "" HAVE_CXX_LIBATOMICS64)
|
||||||
|
if(HAVE_CXX_LIBATOMICS64)
|
||||||
|
list(APPEND CMAKE_REQUIRED_LIBRARIES "atomic")
|
||||||
|
check_working_cxx_atomics64(HAVE_CXX_ATOMICS64_WITH_LIB)
|
||||||
|
if (NOT HAVE_CXX_ATOMICS64_WITH_LIB)
|
||||||
|
message(FATAL_ERROR "Host compiler must support 64-bit std::atomic!")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "Host compiler appears to require libatomic for 64-bit operations, but cannot find it.")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
## TODO: This define is only used for the legacy atomic operations in
|
||||||
|
## llvm's Atomic.h, which should be replaced. Other code simply
|
||||||
|
## assumes C++11 <atomic> works.
|
||||||
|
CHECK_CXX_SOURCE_COMPILES("
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#include <windows.h>
|
||||||
|
#endif
|
||||||
|
int main() {
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
volatile LONG val = 1;
|
||||||
|
MemoryBarrier();
|
||||||
|
InterlockedCompareExchange(&val, 0, 1);
|
||||||
|
InterlockedIncrement(&val);
|
||||||
|
InterlockedDecrement(&val);
|
||||||
|
#else
|
||||||
|
volatile unsigned long val = 1;
|
||||||
|
__sync_synchronize();
|
||||||
|
__sync_val_compare_and_swap(&val, 1, 0);
|
||||||
|
__sync_add_and_fetch(&val, 1);
|
||||||
|
__sync_sub_and_fetch(&val, 1);
|
||||||
|
#endif
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
" LLVM_HAS_ATOMICS)
|
||||||
|
|
||||||
|
if( NOT LLVM_HAS_ATOMICS )
|
||||||
|
message(STATUS "Warning: LLVM will be built thread-unsafe because atomic builtins are missing")
|
||||||
|
endif()
|
||||||
109
cmake/modules/FindAlienWx.cmake
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
# Find the wxWidgets module based on the information provided by the Perl Alien::wxWidgets module.
|
||||||
|
|
||||||
|
# Check for the Perl & PerlLib modules
|
||||||
|
include(LibFindMacros)
|
||||||
|
libfind_package(AlienWx Perl)
|
||||||
|
libfind_package(AlienWx PerlLibs)
|
||||||
|
|
||||||
|
if (AlienWx_DEBUG)
|
||||||
|
message(STATUS " AlienWx_FIND_COMPONENTS=${AlienWx_FIND_COMPONENTS}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Execute an Alien::Wx module to find the relevant information regarding
|
||||||
|
# the wxWidgets used by the Perl interpreter.
|
||||||
|
# Perl specific stuff
|
||||||
|
set(AlienWx_TEMP_INCLUDE ${CMAKE_CURRENT_BINARY_DIR}/AlienWx_TEMP_INCLUDE.txt)
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${PERL_EXECUTABLE} -e "
|
||||||
|
# Import Perl modules.
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Text::ParseWords;
|
||||||
|
|
||||||
|
BEGIN {
|
||||||
|
# CMake sets the environment variables CC and CXX to the detected C compiler.
|
||||||
|
# There is an issue with the Perl ExtUtils::CBuilder, which does not handle whitespaces
|
||||||
|
# in the paths correctly on Windows, so we rather drop the CMake auto-detected paths.
|
||||||
|
delete \$ENV{CC};
|
||||||
|
delete \$ENV{CXX};
|
||||||
|
}
|
||||||
|
|
||||||
|
use Alien::wxWidgets;
|
||||||
|
use ExtUtils::CppGuess;
|
||||||
|
|
||||||
|
# Test for a Visual Studio compiler
|
||||||
|
my \$cpp_guess = ExtUtils::CppGuess->new;
|
||||||
|
my \$mswin = \$^O eq 'MSWin32';
|
||||||
|
my \$msvc = \$cpp_guess->is_msvc;
|
||||||
|
|
||||||
|
# List of wxWidgets components to be used.
|
||||||
|
my @components = split /;/, '${AlienWx_FIND_COMPONENTS}';
|
||||||
|
|
||||||
|
# Query the available data from Alien::wxWidgets.
|
||||||
|
my \$version = Alien::wxWidgets->version;
|
||||||
|
my \$config = Alien::wxWidgets->config;
|
||||||
|
my \$compiler = Alien::wxWidgets->compiler;
|
||||||
|
my \$linker = Alien::wxWidgets->linker;
|
||||||
|
my \$include_path = ' ' . Alien::wxWidgets->include_path;
|
||||||
|
my \$defines = ' ' . Alien::wxWidgets->defines;
|
||||||
|
my \$cflags = Alien::wxWidgets->c_flags;
|
||||||
|
my \$linkflags = Alien::wxWidgets->link_flags;
|
||||||
|
my \$libraries = ' ' . Alien::wxWidgets->libraries(@components);
|
||||||
|
my \$gui_toolkit = Alien::wxWidgets->config->{toolkit};
|
||||||
|
#my @libraries = Alien::wxWidgets->link_libraries(@components);
|
||||||
|
#my @implib = Alien::wxWidgets->import_libraries(@components);
|
||||||
|
#my @shrlib = Alien::wxWidgets->shared_libraries(@components);
|
||||||
|
#my @keys = Alien::wxWidgets->library_keys; # 'gl', 'adv', ...
|
||||||
|
#my \$library_path = Alien::wxWidgets->shared_library_path;
|
||||||
|
#my \$key = Alien::wxWidgets->key;
|
||||||
|
#my \$prefix = Alien::wxWidgets->prefix;
|
||||||
|
|
||||||
|
my \$filename = '${AlienWx_TEMP_INCLUDE}';
|
||||||
|
open(my $fh, '>', \$filename) or die \"Could not open file '\$filename' \$!\";
|
||||||
|
|
||||||
|
# Convert a space separated lists to CMake semicolon separated lists,
|
||||||
|
# escape the backslashes,
|
||||||
|
# export the resulting list to a temp file.
|
||||||
|
sub cmake_set_var {
|
||||||
|
my (\$varname, \$content) = @_;
|
||||||
|
# Remove line separators.
|
||||||
|
\$content =~ s/\\r|\\n//g;
|
||||||
|
# Escape the path separators.
|
||||||
|
\$content =~ s/\\\\/\\\\\\\\\\\\\\\\/g;
|
||||||
|
my @words = shellwords(\$content);
|
||||||
|
print \$fh \"set(AlienWx_\$varname \\\"\" . join(';', @words) . \"\\\")\\n\";
|
||||||
|
}
|
||||||
|
cmake_set_var('VERSION', \$version);
|
||||||
|
\$include_path =~ s/ -I/ /g;
|
||||||
|
cmake_set_var('INCLUDE_DIRS', \$include_path);
|
||||||
|
\$libraries =~ s/ -L/ -LIBPATH:/g if \$msvc;
|
||||||
|
cmake_set_var('LIBRARIES', \$libraries);
|
||||||
|
#cmake_set_var('LIBRARY_DIRS', );
|
||||||
|
#\$defines =~ s/ -D/ /g;
|
||||||
|
cmake_set_var('DEFINITIONS', \$defines);
|
||||||
|
#cmake_set_var('DEFINITIONS_DEBUG', );
|
||||||
|
cmake_set_var('CXX_FLAGS', \$cflags);
|
||||||
|
cmake_set_var('GUI_TOOLKIT', \$gui_toolkit);
|
||||||
|
close \$fh;
|
||||||
|
")
|
||||||
|
include(${AlienWx_TEMP_INCLUDE})
|
||||||
|
file(REMOVE ${AlienWx_TEMP_INCLUDE})
|
||||||
|
unset(AlienWx_TEMP_INCLUDE)
|
||||||
|
|
||||||
|
if (AlienWx_DEBUG)
|
||||||
|
message(STATUS " AlienWx_VERSION = ${AlienWx_VERSION}")
|
||||||
|
message(STATUS " AlienWx_INCLUDE_DIRS = ${AlienWx_INCLUDE_DIRS}")
|
||||||
|
message(STATUS " AlienWx_LIBRARIES = ${AlienWx_LIBRARIES}")
|
||||||
|
message(STATUS " AlienWx_LIBRARY_DIRS = ${AlienWx_LIBRARY_DIRS}")
|
||||||
|
message(STATUS " AlienWx_DEFINITIONS = ${AlienWx_DEFINITIONS}")
|
||||||
|
message(STATUS " AlienWx_DEFINITIONS_DEBUG = ${AlienWx_DEFINITIONS_DEBUG}")
|
||||||
|
message(STATUS " AlienWx_CXX_FLAGS = ${AlienWx_CXX_FLAGS}")
|
||||||
|
message(STATUS " AlienWx_GUI_TOOLKIT = ${AlienWx_GUI_TOOLKIT}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
|
||||||
|
find_package_handle_standard_args(AlienWx
|
||||||
|
REQUIRED_VARS AlienWx_INCLUDE_DIRS AlienWx_LIBRARIES
|
||||||
|
# HANDLE_COMPONENTS
|
||||||
|
VERSION_VAR AlienWx_VERSION)
|
||||||
111
cmake/modules/FindCURL.cmake
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
||||||
|
# file Copyright.txt or https://cmake.org/licensing for details.
|
||||||
|
|
||||||
|
#.rst:
|
||||||
|
# FindCURL
|
||||||
|
# --------
|
||||||
|
#
|
||||||
|
# Find the native CURL headers and libraries.
|
||||||
|
#
|
||||||
|
# IMPORTED Targets
|
||||||
|
# ^^^^^^^^^^^^^^^^
|
||||||
|
#
|
||||||
|
# This module defines :prop_tgt:`IMPORTED` target ``CURL::libcurl``, if
|
||||||
|
# curl has been found.
|
||||||
|
#
|
||||||
|
# Result Variables
|
||||||
|
# ^^^^^^^^^^^^^^^^
|
||||||
|
#
|
||||||
|
# This module defines the following variables:
|
||||||
|
#
|
||||||
|
# ``CURL_FOUND``
|
||||||
|
# True if curl found.
|
||||||
|
#
|
||||||
|
# ``CURL_INCLUDE_DIRS``
|
||||||
|
# where to find curl/curl.h, etc.
|
||||||
|
#
|
||||||
|
# ``CURL_LIBRARIES``
|
||||||
|
# List of libraries when using curl.
|
||||||
|
#
|
||||||
|
# ``CURL_VERSION_STRING``
|
||||||
|
# The version of curl found.
|
||||||
|
|
||||||
|
# Look for the header file.
|
||||||
|
find_path(CURL_INCLUDE_DIR NAMES curl/curl.h)
|
||||||
|
mark_as_advanced(CURL_INCLUDE_DIR)
|
||||||
|
|
||||||
|
if(NOT CURL_LIBRARY)
|
||||||
|
# Look for the library (sorted from most current/relevant entry to least).
|
||||||
|
find_library(CURL_LIBRARY_RELEASE NAMES
|
||||||
|
curl
|
||||||
|
# Windows MSVC prebuilts:
|
||||||
|
curllib
|
||||||
|
libcurl_imp
|
||||||
|
curllib_static
|
||||||
|
# Windows older "Win32 - MSVC" prebuilts (libcurl.lib, e.g. libcurl-7.15.5-win32-msvc.zip):
|
||||||
|
libcurl
|
||||||
|
# Static library on Windows
|
||||||
|
libcurl_a
|
||||||
|
)
|
||||||
|
mark_as_advanced(CURL_LIBRARY_RELEASE)
|
||||||
|
|
||||||
|
find_library(CURL_LIBRARY_DEBUG NAMES
|
||||||
|
# Windows MSVC CMake builds in debug configuration on vcpkg:
|
||||||
|
libcurl-d_imp
|
||||||
|
libcurl-d
|
||||||
|
# Static library on Windows, compiled in debug mode
|
||||||
|
libcurl_a_debug
|
||||||
|
)
|
||||||
|
mark_as_advanced(CURL_LIBRARY_DEBUG)
|
||||||
|
|
||||||
|
include(${CMAKE_CURRENT_LIST_DIR}/SelectLibraryConfigurations_SLIC3R.cmake)
|
||||||
|
select_library_configurations_SLIC3R(CURL)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CURL_INCLUDE_DIR)
|
||||||
|
foreach(_curl_version_header curlver.h curl.h)
|
||||||
|
if(EXISTS "${CURL_INCLUDE_DIR}/curl/${_curl_version_header}")
|
||||||
|
file(STRINGS "${CURL_INCLUDE_DIR}/curl/${_curl_version_header}" curl_version_str REGEX "^#define[\t ]+LIBCURL_VERSION[\t ]+\".*\"")
|
||||||
|
|
||||||
|
string(REGEX REPLACE "^#define[\t ]+LIBCURL_VERSION[\t ]+\"([^\"]*)\".*" "\\1" CURL_VERSION_STRING "${curl_version_str}")
|
||||||
|
unset(curl_version_str)
|
||||||
|
break()
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs_SLIC3R.cmake)
|
||||||
|
FIND_PACKAGE_HANDLE_STANDARD_ARGS_SLIC3R(CURL
|
||||||
|
REQUIRED_VARS CURL_LIBRARY CURL_INCLUDE_DIR
|
||||||
|
VERSION_VAR CURL_VERSION_STRING)
|
||||||
|
|
||||||
|
if(CURL_FOUND)
|
||||||
|
set(CURL_LIBRARIES ${CURL_LIBRARY})
|
||||||
|
set(CURL_INCLUDE_DIRS ${CURL_INCLUDE_DIR})
|
||||||
|
|
||||||
|
if(NOT TARGET CURL::libcurl)
|
||||||
|
add_library(CURL::libcurl UNKNOWN IMPORTED)
|
||||||
|
set_target_properties(CURL::libcurl PROPERTIES
|
||||||
|
INTERFACE_INCLUDE_DIRECTORIES "${CURL_INCLUDE_DIRS}")
|
||||||
|
|
||||||
|
if(EXISTS "${CURL_LIBRARY}")
|
||||||
|
set_target_properties(CURL::libcurl PROPERTIES
|
||||||
|
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
|
||||||
|
IMPORTED_LOCATION "${CURL_LIBRARY}")
|
||||||
|
endif()
|
||||||
|
if(CURL_LIBRARY_RELEASE)
|
||||||
|
set_property(TARGET CURL::libcurl APPEND PROPERTY
|
||||||
|
IMPORTED_CONFIGURATIONS RELEASE)
|
||||||
|
set_target_properties(CURL::libcurl PROPERTIES
|
||||||
|
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
|
||||||
|
IMPORTED_LOCATION_RELEASE "${CURL_LIBRARY_RELEASE}")
|
||||||
|
endif()
|
||||||
|
if(CURL_LIBRARY_DEBUG)
|
||||||
|
set_property(TARGET CURL::libcurl APPEND PROPERTY
|
||||||
|
IMPORTED_CONFIGURATIONS DEBUG)
|
||||||
|
set_target_properties(CURL::libcurl PROPERTIES
|
||||||
|
IMPORTED_LINK_INTERFACE_LANGUAGES "C"
|
||||||
|
IMPORTED_LOCATION_DEBUG "${CURL_LIBRARY_DEBUG}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
59
cmake/modules/FindDBus.cmake
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
# - Try to find DBus
|
||||||
|
# Once done, this will define
|
||||||
|
#
|
||||||
|
# DBUS_FOUND - system has DBus
|
||||||
|
# DBUS_INCLUDE_DIRS - the DBus include directories
|
||||||
|
# DBUS_LIBRARIES - link these to use DBus
|
||||||
|
#
|
||||||
|
# Copyright (C) 2012 Raphael Kubo da Costa <rakuco@webkit.org>
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions
|
||||||
|
# are met:
|
||||||
|
# 1. Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND ITS CONTRIBUTORS ``AS
|
||||||
|
# IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ITS
|
||||||
|
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
FIND_PACKAGE(PkgConfig)
|
||||||
|
PKG_CHECK_MODULES(PC_DBUS QUIET dbus-1)
|
||||||
|
|
||||||
|
FIND_LIBRARY(DBUS_LIBRARIES
|
||||||
|
NAMES dbus-1
|
||||||
|
HINTS ${PC_DBUS_LIBDIR}
|
||||||
|
${PC_DBUS_LIBRARY_DIRS}
|
||||||
|
)
|
||||||
|
|
||||||
|
FIND_PATH(DBUS_INCLUDE_DIR
|
||||||
|
NAMES dbus/dbus.h
|
||||||
|
HINTS ${PC_DBUS_INCLUDEDIR}
|
||||||
|
${PC_DBUS_INCLUDE_DIRS}
|
||||||
|
)
|
||||||
|
|
||||||
|
GET_FILENAME_COMPONENT(_DBUS_LIBRARY_DIR ${DBUS_LIBRARIES} PATH)
|
||||||
|
FIND_PATH(DBUS_ARCH_INCLUDE_DIR
|
||||||
|
NAMES dbus/dbus-arch-deps.h
|
||||||
|
HINTS ${PC_DBUS_INCLUDEDIR}
|
||||||
|
${PC_DBUS_INCLUDE_DIRS}
|
||||||
|
${_DBUS_LIBRARY_DIR}
|
||||||
|
${DBUS_INCLUDE_DIR}
|
||||||
|
PATH_SUFFIXES include
|
||||||
|
)
|
||||||
|
|
||||||
|
SET(DBUS_INCLUDE_DIRS ${DBUS_INCLUDE_DIR} ${DBUS_ARCH_INCLUDE_DIR})
|
||||||
|
|
||||||
|
INCLUDE(FindPackageHandleStandardArgs)
|
||||||
|
FIND_PACKAGE_HANDLE_STANDARD_ARGS(DBus REQUIRED_VARS DBUS_INCLUDE_DIRS DBUS_LIBRARIES)
|
||||||
26
cmake/modules/FindDraco.cmake
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
set(_q "")
|
||||||
|
if(${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY)
|
||||||
|
set(_q QUIET)
|
||||||
|
set(_quietly TRUE)
|
||||||
|
endif()
|
||||||
|
find_package(${CMAKE_FIND_PACKAGE_NAME} ${${CMAKE_FIND_PACKAGE_NAME}_FIND_VERSION} CONFIG ${_q})
|
||||||
|
|
||||||
|
if (NOT ${CMAKE_FIND_PACKAGE_NAME}_FOUND)
|
||||||
|
include(CheckIncludeFileCXX)
|
||||||
|
add_library(draco INTERFACE)
|
||||||
|
target_include_directories(draco INTERFACE include)
|
||||||
|
|
||||||
|
if (_quietly)
|
||||||
|
set(CMAKE_REQUIRED_QUIET ON)
|
||||||
|
endif()
|
||||||
|
CHECK_INCLUDE_FILE_CXX("draco/draco_features.h" HAVE_DRACO_H)
|
||||||
|
|
||||||
|
if (NOT HAVE_DRACO_H)
|
||||||
|
if (${CMAKE_FIND_PACKAGE_NAME}_FIND_REQUIRED)
|
||||||
|
message(FATAL_ERROR "Draco library not found. Please install the dependency.")
|
||||||
|
elseif(NOT _quietly)
|
||||||
|
message(WARNING "Draco library not found.")
|
||||||
|
endif()
|
||||||
|
endif ()
|
||||||
|
endif()
|
||||||
|
|
||||||
86
cmake/modules/FindEigen3.cmake
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
# - Try to find Eigen3 lib
|
||||||
|
#
|
||||||
|
# This module supports requiring a minimum version, e.g. you can do
|
||||||
|
# find_package(Eigen3 3.1.2)
|
||||||
|
# to require version 3.1.2 or newer of Eigen3.
|
||||||
|
#
|
||||||
|
# Once done this will define
|
||||||
|
#
|
||||||
|
# EIGEN3_FOUND - system has eigen lib with correct version
|
||||||
|
# EIGEN3_INCLUDE_DIR - the eigen include directory
|
||||||
|
# EIGEN3_VERSION - eigen version
|
||||||
|
|
||||||
|
# Copyright (c) 2006, 2007 Montel Laurent, <montel@kde.org>
|
||||||
|
# Copyright (c) 2008, 2009 Gael Guennebaud, <g.gael@free.fr>
|
||||||
|
# Copyright (c) 2009 Benoit Jacob <jacob.benoit.1@gmail.com>
|
||||||
|
# Redistribution and use is allowed according to the terms of the 2-clause BSD license.
|
||||||
|
|
||||||
|
if(NOT Eigen3_FIND_VERSION)
|
||||||
|
if(NOT Eigen3_FIND_VERSION_MAJOR)
|
||||||
|
set(Eigen3_FIND_VERSION_MAJOR 2)
|
||||||
|
endif(NOT Eigen3_FIND_VERSION_MAJOR)
|
||||||
|
if(NOT Eigen3_FIND_VERSION_MINOR)
|
||||||
|
set(Eigen3_FIND_VERSION_MINOR 91)
|
||||||
|
endif(NOT Eigen3_FIND_VERSION_MINOR)
|
||||||
|
if(NOT Eigen3_FIND_VERSION_PATCH)
|
||||||
|
set(Eigen3_FIND_VERSION_PATCH 0)
|
||||||
|
endif(NOT Eigen3_FIND_VERSION_PATCH)
|
||||||
|
|
||||||
|
set(Eigen3_FIND_VERSION "${Eigen3_FIND_VERSION_MAJOR}.${Eigen3_FIND_VERSION_MINOR}.${Eigen3_FIND_VERSION_PATCH}")
|
||||||
|
endif(NOT Eigen3_FIND_VERSION)
|
||||||
|
|
||||||
|
macro(_eigen3_check_version)
|
||||||
|
file(READ "${EIGEN3_INCLUDE_DIR}/Eigen/src/Core/util/Macros.h" _eigen3_version_header)
|
||||||
|
|
||||||
|
string(REGEX MATCH "define[ \t]+EIGEN_WORLD_VERSION[ \t]+([0-9]+)" _eigen3_world_version_match "${_eigen3_version_header}")
|
||||||
|
set(EIGEN3_WORLD_VERSION "${CMAKE_MATCH_1}")
|
||||||
|
string(REGEX MATCH "define[ \t]+EIGEN_MAJOR_VERSION[ \t]+([0-9]+)" _eigen3_major_version_match "${_eigen3_version_header}")
|
||||||
|
set(EIGEN3_MAJOR_VERSION "${CMAKE_MATCH_1}")
|
||||||
|
string(REGEX MATCH "define[ \t]+EIGEN_MINOR_VERSION[ \t]+([0-9]+)" _eigen3_minor_version_match "${_eigen3_version_header}")
|
||||||
|
set(EIGEN3_MINOR_VERSION "${CMAKE_MATCH_1}")
|
||||||
|
|
||||||
|
set(EIGEN3_VERSION ${EIGEN3_WORLD_VERSION}.${EIGEN3_MAJOR_VERSION}.${EIGEN3_MINOR_VERSION})
|
||||||
|
if(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION})
|
||||||
|
set(EIGEN3_VERSION_OK FALSE)
|
||||||
|
else(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION})
|
||||||
|
set(EIGEN3_VERSION_OK TRUE)
|
||||||
|
endif(${EIGEN3_VERSION} VERSION_LESS ${Eigen3_FIND_VERSION})
|
||||||
|
|
||||||
|
if(NOT EIGEN3_VERSION_OK)
|
||||||
|
|
||||||
|
message(STATUS "Eigen3 version ${EIGEN3_VERSION} found in ${EIGEN3_INCLUDE_DIR}, "
|
||||||
|
"but at least version ${Eigen3_FIND_VERSION} is required")
|
||||||
|
endif(NOT EIGEN3_VERSION_OK)
|
||||||
|
endmacro(_eigen3_check_version)
|
||||||
|
|
||||||
|
if (EIGEN3_INCLUDE_DIR)
|
||||||
|
|
||||||
|
# in cache already
|
||||||
|
_eigen3_check_version()
|
||||||
|
set(EIGEN3_FOUND ${EIGEN3_VERSION_OK})
|
||||||
|
|
||||||
|
else (EIGEN3_INCLUDE_DIR)
|
||||||
|
|
||||||
|
# specific additional paths for some OS
|
||||||
|
if (WIN32)
|
||||||
|
set(EIGEN_ADDITIONAL_SEARCH_PATHS ${EIGEN_ADDITIONAL_SEARCH_PATHS} "C:/Program Files/Eigen/include" "C:/Program Files (x86)/Eigen/include")
|
||||||
|
endif(WIN32)
|
||||||
|
|
||||||
|
find_path(EIGEN3_INCLUDE_DIR NAMES signature_of_eigen3_matrix_library
|
||||||
|
PATHS
|
||||||
|
${CMAKE_INSTALL_PREFIX}/include
|
||||||
|
${EIGEN_ADDITIONAL_SEARCH_PATHS}
|
||||||
|
${KDE4_INCLUDE_DIR}
|
||||||
|
PATH_SUFFIXES eigen3 eigen
|
||||||
|
)
|
||||||
|
|
||||||
|
if(EIGEN3_INCLUDE_DIR)
|
||||||
|
_eigen3_check_version()
|
||||||
|
endif(EIGEN3_INCLUDE_DIR)
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(Eigen3 DEFAULT_MSG EIGEN3_INCLUDE_DIR EIGEN3_VERSION_OK)
|
||||||
|
|
||||||
|
mark_as_advanced(EIGEN3_INCLUDE_DIR)
|
||||||
|
|
||||||
|
endif(EIGEN3_INCLUDE_DIR)
|
||||||
357
cmake/modules/FindGLEW.cmake
Normal file
@@ -0,0 +1,357 @@
|
|||||||
|
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
||||||
|
# file Copyright.txt or https://cmake.org/licensing for details.
|
||||||
|
|
||||||
|
# PrusaSlicer specifics:
|
||||||
|
# This file is backported from CMake 3.15 distribution to behave uniformly
|
||||||
|
# across all versions of CMake. It explicitly adds GLEW_STATIC compile
|
||||||
|
# definition to static targets which is needed to prevent link errors.
|
||||||
|
|
||||||
|
#[=======================================================================[.rst:
|
||||||
|
FindGLEW
|
||||||
|
--------
|
||||||
|
|
||||||
|
Find the OpenGL Extension Wrangler Library (GLEW)
|
||||||
|
|
||||||
|
Input Variables
|
||||||
|
^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
The following variables may be set to influence this module’s behavior:
|
||||||
|
|
||||||
|
``GLEW_USE_STATIC_LIBS``
|
||||||
|
to find and create :prop_tgt:`IMPORTED` target for static linkage.
|
||||||
|
|
||||||
|
``GLEW_VERBOSE``
|
||||||
|
to output a detailed log of this module.
|
||||||
|
|
||||||
|
Imported Targets
|
||||||
|
^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
This module defines the following :ref:`Imported Targets <Imported Targets>`:
|
||||||
|
|
||||||
|
|
||||||
|
``GLEW::glew``
|
||||||
|
The GLEW shared library.
|
||||||
|
``GLEW::glew_s``
|
||||||
|
The GLEW static library, if ``GLEW_USE_STATIC_LIBS`` is set to ``TRUE``.
|
||||||
|
``GLEW::GLEW``
|
||||||
|
Duplicates either ``GLEW::glew`` or ``GLEW::glew_s`` based on availability.
|
||||||
|
|
||||||
|
Result Variables
|
||||||
|
^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
This module defines the following variables:
|
||||||
|
|
||||||
|
``GLEW_INCLUDE_DIRS``
|
||||||
|
include directories for GLEW
|
||||||
|
``GLEW_LIBRARIES``
|
||||||
|
libraries to link against GLEW
|
||||||
|
``GLEW_SHARED_LIBRARIES``
|
||||||
|
libraries to link against shared GLEW
|
||||||
|
``GLEW_STATIC_LIBRARIES``
|
||||||
|
libraries to link against static GLEW
|
||||||
|
``GLEW_FOUND``
|
||||||
|
true if GLEW has been found and can be used
|
||||||
|
``GLEW_VERSION``
|
||||||
|
GLEW version
|
||||||
|
``GLEW_VERSION_MAJOR``
|
||||||
|
GLEW major version
|
||||||
|
``GLEW_VERSION_MINOR``
|
||||||
|
GLEW minor version
|
||||||
|
``GLEW_VERSION_MICRO``
|
||||||
|
GLEW micro version
|
||||||
|
|
||||||
|
#]=======================================================================]
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
|
||||||
|
|
||||||
|
if(APPLE)
|
||||||
|
find_package(OpenGL QUIET)
|
||||||
|
|
||||||
|
if(OpenGL_FOUND)
|
||||||
|
if(GLEW_VERBOSE)
|
||||||
|
message(STATUS "FindGLEW: Found OpenGL Framework.")
|
||||||
|
message(STATUS "FindGLEW: OPENGL_LIBRARIES: ${OPENGL_LIBRARIES}")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
if(GLEW_VERBOSE)
|
||||||
|
message(STATUS "FindGLEW: could not find GLEW library.")
|
||||||
|
endif()
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
function(__glew_set_find_library_suffix shared_or_static)
|
||||||
|
if((UNIX AND NOT APPLE) AND "${shared_or_static}" MATCHES "SHARED")
|
||||||
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ".so")
|
||||||
|
elseif((UNIX AND NOT APPLE) AND "${shared_or_static}" MATCHES "STATIC")
|
||||||
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
||||||
|
elseif(APPLE AND "${shared_or_static}" MATCHES "SHARED")
|
||||||
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ".dylib;.so")
|
||||||
|
elseif(APPLE AND "${shared_or_static}" MATCHES "STATIC")
|
||||||
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
||||||
|
elseif(WIN32 AND "${shared_or_static}" MATCHES "SHARED")
|
||||||
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib")
|
||||||
|
elseif(WIN32 AND "${shared_or_static}" MATCHES "STATIC")
|
||||||
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib;.a;.dll.a")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(CMAKE_FIND_LIBRARY_SUFFIXES "${CMAKE_FIND_LIBRARY_SUFFIXES}" PARENT_SCOPE)
|
||||||
|
if(GLEW_VERBOSE)
|
||||||
|
message(STATUS "FindGLEW: CMAKE_FIND_LIBRARY_SUFFIXES for ${shared_or_static}: ${CMAKE_FIND_LIBRARY_SUFFIXES}")
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
|
||||||
|
if(GLEW_VERBOSE)
|
||||||
|
if(DEFINED GLEW_USE_STATIC_LIBS)
|
||||||
|
message(STATUS "FindGLEW: GLEW_USE_STATIC_LIBS: ${GLEW_USE_STATIC_LIBS}.")
|
||||||
|
else()
|
||||||
|
message(STATUS "FindGLEW: GLEW_USE_STATIC_LIBS is undefined. Treated as FALSE.")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_path(GLEW_INCLUDE_DIR GL/glew.h)
|
||||||
|
mark_as_advanced(GLEW_INCLUDE_DIR)
|
||||||
|
|
||||||
|
set(GLEW_INCLUDE_DIRS ${GLEW_INCLUDE_DIR})
|
||||||
|
|
||||||
|
if(GLEW_VERBOSE)
|
||||||
|
message(STATUS "FindGLEW: GLEW_INCLUDE_DIR: ${GLEW_INCLUDE_DIR}")
|
||||||
|
message(STATUS "FindGLEW: GLEW_INCLUDE_DIRS: ${GLEW_INCLUDE_DIRS}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if("${CMAKE_GENERATOR_PLATFORM}" MATCHES "x64" OR "${CMAKE_GENERATOR}" MATCHES "Win64")
|
||||||
|
set(_arch "x64")
|
||||||
|
else()
|
||||||
|
set(_arch "Win32")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
set(__GLEW_CURRENT_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
|
||||||
|
|
||||||
|
__glew_set_find_library_suffix(SHARED)
|
||||||
|
|
||||||
|
find_library(GLEW_SHARED_LIBRARY_RELEASE
|
||||||
|
NAMES GLEW glew glew32
|
||||||
|
PATH_SUFFIXES lib lib64 libx32 lib/Release/${_arch}
|
||||||
|
PATHS ENV GLEW_ROOT)
|
||||||
|
|
||||||
|
find_library(GLEW_SHARED_LIBRARY_DEBUG
|
||||||
|
NAMES GLEWd glewd glew32d
|
||||||
|
PATH_SUFFIXES lib lib64
|
||||||
|
PATHS ENV GLEW_ROOT)
|
||||||
|
|
||||||
|
|
||||||
|
__glew_set_find_library_suffix(STATIC)
|
||||||
|
|
||||||
|
find_library(GLEW_STATIC_LIBRARY_RELEASE
|
||||||
|
NAMES GLEW glew glew32s
|
||||||
|
PATH_SUFFIXES lib lib64 libx32 lib/Release/${_arch}
|
||||||
|
PATHS ENV GLEW_ROOT)
|
||||||
|
|
||||||
|
find_library(GLEW_STATIC_LIBRARY_DEBUG
|
||||||
|
NAMES GLEWds GLEWd glewd glewds glew32ds
|
||||||
|
PATH_SUFFIXES lib lib64
|
||||||
|
PATHS ENV GLEW_ROOT)
|
||||||
|
|
||||||
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ${__GLEW_CURRENT_FIND_LIBRARY_SUFFIXES})
|
||||||
|
unset(__GLEW_CURRENT_FIND_LIBRARY_SUFFIXES)
|
||||||
|
|
||||||
|
include(SelectLibraryConfigurations)
|
||||||
|
|
||||||
|
select_library_configurations(GLEW_SHARED)
|
||||||
|
select_library_configurations(GLEW_STATIC)
|
||||||
|
|
||||||
|
if(NOT GLEW_USE_STATIC_LIBS)
|
||||||
|
set(GLEW_LIBRARIES ${GLEW_SHARED_LIBRARY})
|
||||||
|
else()
|
||||||
|
set(GLEW_LIBRARIES ${GLEW_STATIC_LIBRARY})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
if(GLEW_VERBOSE)
|
||||||
|
message(STATUS "FindGLEW: GLEW_SHARED_LIBRARY_RELEASE: ${GLEW_SHARED_LIBRARY_RELEASE}")
|
||||||
|
message(STATUS "FindGLEW: GLEW_STATIC_LIBRARY_RELEASE: ${GLEW_STATIC_LIBRARY_RELEASE}")
|
||||||
|
message(STATUS "FindGLEW: GLEW_SHARED_LIBRARY_DEBUG: ${GLEW_SHARED_LIBRARY_DEBUG}")
|
||||||
|
message(STATUS "FindGLEW: GLEW_STATIC_LIBRARY_DEBUG: ${GLEW_STATIC_LIBRARY_DEBUG}")
|
||||||
|
message(STATUS "FindGLEW: GLEW_SHARED_LIBRARY: ${GLEW_SHARED_LIBRARY}")
|
||||||
|
message(STATUS "FindGLEW: GLEW_STATIC_LIBRARY: ${GLEW_STATIC_LIBRARY}")
|
||||||
|
message(STATUS "FindGLEW: GLEW_LIBRARIES: ${GLEW_LIBRARIES}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
# Read version from GL/glew.h file
|
||||||
|
if(EXISTS "${GLEW_INCLUDE_DIR}/GL/glew.h")
|
||||||
|
file(STRINGS "${GLEW_INCLUDE_DIR}/GL/glew.h" _contents REGEX "^VERSION_.+ [0-9]+")
|
||||||
|
if(_contents)
|
||||||
|
string(REGEX REPLACE ".*VERSION_MAJOR[ \t]+([0-9]+).*" "\\1" GLEW_VERSION_MAJOR "${_contents}")
|
||||||
|
string(REGEX REPLACE ".*VERSION_MINOR[ \t]+([0-9]+).*" "\\1" GLEW_VERSION_MINOR "${_contents}")
|
||||||
|
string(REGEX REPLACE ".*VERSION_MICRO[ \t]+([0-9]+).*" "\\1" GLEW_VERSION_MICRO "${_contents}")
|
||||||
|
set(GLEW_VERSION "${GLEW_VERSION_MAJOR}.${GLEW_VERSION_MINOR}.${GLEW_VERSION_MICRO}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(GLEW_VERBOSE)
|
||||||
|
message(STATUS "FindGLEW: GLEW_VERSION_MAJOR: ${GLEW_VERSION_MAJOR}")
|
||||||
|
message(STATUS "FindGLEW: GLEW_VERSION_MINOR: ${GLEW_VERSION_MINOR}")
|
||||||
|
message(STATUS "FindGLEW: GLEW_VERSION_MICRO: ${GLEW_VERSION_MICRO}")
|
||||||
|
message(STATUS "FindGLEW: GLEW_VERSION: ${GLEW_VERSION}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
find_package_handle_standard_args(GLEW
|
||||||
|
REQUIRED_VARS GLEW_INCLUDE_DIRS GLEW_LIBRARIES
|
||||||
|
VERSION_VAR GLEW_VERSION)
|
||||||
|
|
||||||
|
if(NOT GLEW_FOUND)
|
||||||
|
if(GLEW_VERBOSE)
|
||||||
|
message(STATUS "FindGLEW: could not find GLEW library.")
|
||||||
|
endif()
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
if(NOT TARGET GLEW::glew AND NOT GLEW_USE_STATIC_LIBS)
|
||||||
|
if(GLEW_VERBOSE)
|
||||||
|
message(STATUS "FindGLEW: Creating GLEW::glew imported target.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_library(GLEW::glew UNKNOWN IMPORTED)
|
||||||
|
|
||||||
|
set_target_properties(GLEW::glew
|
||||||
|
PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}")
|
||||||
|
|
||||||
|
if(APPLE)
|
||||||
|
if(CMAKE_VERSION VERSION_GREATER_EQUAL "4.0")
|
||||||
|
set_target_properties(GLEW::glew
|
||||||
|
PROPERTIES INTERFACE_LINK_LIBRARIES "-framework OpenGL")
|
||||||
|
else()
|
||||||
|
set_target_properties(GLEW::glew
|
||||||
|
PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(GLEW_SHARED_LIBRARY_RELEASE)
|
||||||
|
set_property(TARGET GLEW::glew
|
||||||
|
APPEND
|
||||||
|
PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
|
||||||
|
|
||||||
|
set_target_properties(GLEW::glew
|
||||||
|
PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_SHARED_LIBRARY_RELEASE}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(GLEW_SHARED_LIBRARY_DEBUG)
|
||||||
|
set_property(TARGET GLEW::glew
|
||||||
|
APPEND
|
||||||
|
PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
|
||||||
|
|
||||||
|
set_target_properties(GLEW::glew
|
||||||
|
PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_SHARED_LIBRARY_DEBUG}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
elseif(NOT TARGET GLEW::glew_s AND GLEW_USE_STATIC_LIBS)
|
||||||
|
if(GLEW_VERBOSE)
|
||||||
|
message(STATUS "FindGLEW: Creating GLEW::glew_s imported target.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_library(GLEW::glew_s UNKNOWN IMPORTED)
|
||||||
|
|
||||||
|
set_target_properties(GLEW::glew_s
|
||||||
|
PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}")
|
||||||
|
|
||||||
|
set_target_properties(GLEW::glew_s PROPERTIES INTERFACE_COMPILE_DEFINITIONS GLEW_STATIC)
|
||||||
|
|
||||||
|
if(APPLE)
|
||||||
|
if(CMAKE_VERSION VERSION_GREATER_EQUAL "4.0")
|
||||||
|
set_target_properties(GLEW::glew_s
|
||||||
|
PROPERTIES INTERFACE_LINK_LIBRARIES "-framework OpenGL")
|
||||||
|
else()
|
||||||
|
set_target_properties(GLEW::glew_s
|
||||||
|
PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(GLEW_STATIC_LIBRARY_RELEASE)
|
||||||
|
set_property(TARGET GLEW::glew_s
|
||||||
|
APPEND
|
||||||
|
PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
|
||||||
|
|
||||||
|
set_target_properties(GLEW::glew_s
|
||||||
|
PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_STATIC_LIBRARY_RELEASE}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(GLEW_STATIC_LIBRARY_DEBUG)
|
||||||
|
set_property(TARGET GLEW::glew_s
|
||||||
|
APPEND
|
||||||
|
PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
|
||||||
|
|
||||||
|
set_target_properties(GLEW::glew_s
|
||||||
|
PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_STATIC_LIBRARY_DEBUG}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT TARGET GLEW::GLEW)
|
||||||
|
if(GLEW_VERBOSE)
|
||||||
|
message(STATUS "FindGLEW: Creating GLEW::GLEW imported target.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_library(GLEW::GLEW UNKNOWN IMPORTED)
|
||||||
|
|
||||||
|
set_target_properties(GLEW::GLEW
|
||||||
|
PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${GLEW_INCLUDE_DIRS}")
|
||||||
|
|
||||||
|
if(APPLE)
|
||||||
|
if(CMAKE_VERSION VERSION_GREATER_EQUAL "4.0")
|
||||||
|
set_target_properties(GLEW::GLEW
|
||||||
|
PROPERTIES INTERFACE_LINK_LIBRARIES "-framework OpenGL")
|
||||||
|
else()
|
||||||
|
set_target_properties(GLEW::GLEW
|
||||||
|
PROPERTIES INTERFACE_LINK_LIBRARIES OpenGL::GL)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(TARGET GLEW::glew)
|
||||||
|
if(GLEW_SHARED_LIBRARY_RELEASE)
|
||||||
|
set_property(TARGET GLEW::GLEW
|
||||||
|
APPEND
|
||||||
|
PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
|
||||||
|
|
||||||
|
set_target_properties(GLEW::GLEW
|
||||||
|
PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_SHARED_LIBRARY_RELEASE}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(GLEW_SHARED_LIBRARY_DEBUG)
|
||||||
|
set_property(TARGET GLEW::GLEW
|
||||||
|
APPEND
|
||||||
|
PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
|
||||||
|
|
||||||
|
set_target_properties(GLEW::GLEW
|
||||||
|
PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_SHARED_LIBRARY_DEBUG}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
elseif(TARGET GLEW::glew_s)
|
||||||
|
if(GLEW_STATIC_LIBRARY_RELEASE)
|
||||||
|
set_property(TARGET GLEW::GLEW
|
||||||
|
APPEND
|
||||||
|
PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
|
||||||
|
|
||||||
|
set_target_properties(GLEW::GLEW
|
||||||
|
PROPERTIES IMPORTED_LOCATION_RELEASE "${GLEW_STATIC_LIBRARY_RELEASE}"
|
||||||
|
INTERFACE_COMPILE_DEFINITIONS GLEW_STATIC)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(GLEW_STATIC_LIBRARY_DEBUG AND GLEW_USE_STATIC_LIBS)
|
||||||
|
set_property(TARGET GLEW::GLEW
|
||||||
|
APPEND
|
||||||
|
PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
|
||||||
|
|
||||||
|
set_target_properties(GLEW::GLEW
|
||||||
|
PROPERTIES IMPORTED_LOCATION_DEBUG "${GLEW_STATIC_LIBRARY_DEBUG}"
|
||||||
|
INTERFACE_COMPILE_DEFINITIONS GLEW_STATIC)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
elseif(GLEW_VERBOSE)
|
||||||
|
message(WARNING "FindGLEW: no `GLEW::glew` or `GLEW::glew_s` target was created. Something went wrong in FindGLEW target creation.")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
51
cmake/modules/FindGTK3.cmake
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
# - Try to find GTK+ 3
|
||||||
|
# Once done, this will define
|
||||||
|
#
|
||||||
|
# GTK3_FOUND - system has GTK+ 3.
|
||||||
|
# GTK3_INCLUDE_DIRS - the GTK+ 3. include directories
|
||||||
|
# GTK3_LIBRARIES - link these to use GTK+ 3.
|
||||||
|
#
|
||||||
|
# Copyright (C) 2012 Raphael Kubo da Costa <rakuco@webkit.org>
|
||||||
|
# Copyright (C) 2013 Igalia S.L.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions
|
||||||
|
# are met:
|
||||||
|
# 1. Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND ITS CONTRIBUTORS ``AS
|
||||||
|
# IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||||
|
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ITS
|
||||||
|
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||||
|
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||||
|
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||||
|
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
find_package(PkgConfig)
|
||||||
|
pkg_check_modules(GTK3 QUIET gtk+-3.0)
|
||||||
|
set(VERSION_OK TRUE)
|
||||||
|
if (GTK3_VERSION)
|
||||||
|
if (GTK3_FIND_VERSION_EXACT)
|
||||||
|
if (NOT("${GTK3_FIND_VERSION}" VERSION_EQUAL "${GTK3_VERSION}"))
|
||||||
|
set(VERSION_OK FALSE)
|
||||||
|
endif ()
|
||||||
|
else ()
|
||||||
|
if ("${GTK3_VERSION}" VERSION_LESS "${GTK3_FIND_VERSION}")
|
||||||
|
set(VERSION_OK FALSE)
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
# Check for GDK Wayland support
|
||||||
|
include(CheckSymbolExists)
|
||||||
|
set(CMAKE_REQUIRED_INCLUDES ${GTK3_INCLUDE_DIRS})
|
||||||
|
check_symbol_exists(GDK_WINDOWING_WAYLAND "gdk/gdk.h" wxHAVE_GDK_WAYLAND)
|
||||||
|
check_symbol_exists(GDK_WINDOWING_X11 "gdk/gdk.h" wxHAVE_GDK_X11)
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTK3 DEFAULT_MSG GTK3_INCLUDE_DIRS GTK3_LIBRARIES VERSION_OK)
|
||||||
36
cmake/modules/FindNLopt.cmake
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
#///////////////////////////////////////////////////////////////////////////
|
||||||
|
#//-------------------------------------------------------------------------
|
||||||
|
#//
|
||||||
|
#// Description:
|
||||||
|
#// cmake module for finding NLopt installation
|
||||||
|
#//
|
||||||
|
#// Example usage:
|
||||||
|
#// find_package(NLopt 1.4 REQUIRED)
|
||||||
|
#//
|
||||||
|
#//
|
||||||
|
#//-------------------------------------------------------------------------
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
|
||||||
|
unset(_q)
|
||||||
|
if (NLopt_FIND_QUIETLY)
|
||||||
|
set(_q QUIET)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
find_package(NLopt ${NLopt_VERSION} CONFIG ${_q})
|
||||||
|
find_package_handle_standard_args(NLopt CONFIG_MODE)
|
||||||
|
|
||||||
|
# report result
|
||||||
|
if(NLopt_FOUND AND NOT _q)
|
||||||
|
get_filename_component(NLOPT_LIBRARY_DIRS ${NLOPT_LIBRARY_DIRS} ABSOLUTE)
|
||||||
|
get_filename_component(NLOPT_INCLUDE_DIRS ${NLOPT_INCLUDE_DIRS} ABSOLUTE)
|
||||||
|
|
||||||
|
message(STATUS "Found NLopt in '${NLOPT_LIBRARY_DIRS}'.")
|
||||||
|
message(STATUS "Using NLopt include directory '${NLOPT_INCLUDE_DIRS}'.")
|
||||||
|
|
||||||
|
get_target_property(_configs NLopt::nlopt IMPORTED_CONFIGURATIONS)
|
||||||
|
foreach (_config ${_configs})
|
||||||
|
get_target_property(_lib NLopt::nlopt IMPORTED_LOCATION_${_config})
|
||||||
|
message(STATUS "Found NLopt ${_config} library: ${_lib}")
|
||||||
|
endforeach ()
|
||||||
|
endif()
|
||||||
589
cmake/modules/FindOpenVDB.cmake
Normal file
@@ -0,0 +1,589 @@
|
|||||||
|
# Copyright (c) DreamWorks Animation LLC
|
||||||
|
#
|
||||||
|
# All rights reserved. This software is distributed under the
|
||||||
|
# Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
|
||||||
|
#
|
||||||
|
# Redistributions of source code must retain the above copyright
|
||||||
|
# and license notice and the following restrictions and disclaimer.
|
||||||
|
#
|
||||||
|
# * Neither the name of DreamWorks Animation nor the names of
|
||||||
|
# its contributors may be used to endorse or promote products derived
|
||||||
|
# from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
|
||||||
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
# IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
|
||||||
|
# LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
|
||||||
|
#
|
||||||
|
#[=======================================================================[.rst:
|
||||||
|
|
||||||
|
FindOpenVDB
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Find OpenVDB include dirs, libraries and settings
|
||||||
|
|
||||||
|
Use this module by invoking find_package with the form::
|
||||||
|
|
||||||
|
find_package(OpenVDB
|
||||||
|
[version] [EXACT] # Minimum or EXACT version
|
||||||
|
[REQUIRED] # Fail with error if OpenVDB is not found
|
||||||
|
[COMPONENTS <libs>...] # OpenVDB libraries by their canonical name
|
||||||
|
# e.g. "openvdb" for "libopenvdb"
|
||||||
|
)
|
||||||
|
|
||||||
|
IMPORTED Targets
|
||||||
|
^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
``OpenVDB::openvdb``
|
||||||
|
The core openvdb library target.
|
||||||
|
|
||||||
|
Result Variables
|
||||||
|
^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
This will define the following variables:
|
||||||
|
|
||||||
|
``OpenVDB_FOUND``
|
||||||
|
True if the system has the OpenVDB library.
|
||||||
|
``OpenVDB_VERSION``
|
||||||
|
The version of the OpenVDB library which was found.
|
||||||
|
``OpenVDB_INCLUDE_DIRS``
|
||||||
|
Include directories needed to use OpenVDB.
|
||||||
|
``OpenVDB_LIBRARIES``
|
||||||
|
Libraries needed to link to OpenVDB.
|
||||||
|
``OpenVDB_LIBRARY_DIRS``
|
||||||
|
OpenVDB library directories.
|
||||||
|
``OpenVDB_DEFINITIONS``
|
||||||
|
Definitions to use when compiling code that uses OpenVDB.
|
||||||
|
``OpenVDB_{COMPONENT}_FOUND``
|
||||||
|
True if the system has the named OpenVDB component.
|
||||||
|
``OpenVDB_USES_BLOSC``
|
||||||
|
True if the OpenVDB Library has been built with blosc support
|
||||||
|
``OpenVDB_USES_LOG4CPLUS``
|
||||||
|
True if the OpenVDB Library has been built with log4cplus support
|
||||||
|
``OpenVDB_USES_EXR``
|
||||||
|
True if the OpenVDB Library has been built with openexr support
|
||||||
|
``OpenVDB_ABI``
|
||||||
|
Set if this module was able to determine the ABI number the located
|
||||||
|
OpenVDB Library was built against. Unset otherwise.
|
||||||
|
|
||||||
|
Cache Variables
|
||||||
|
^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
The following cache variables may also be set:
|
||||||
|
|
||||||
|
``OpenVDB_INCLUDE_DIR``
|
||||||
|
The directory containing ``openvdb/version.h``.
|
||||||
|
``OpenVDB_{COMPONENT}_LIBRARY``
|
||||||
|
Individual component libraries for OpenVDB
|
||||||
|
|
||||||
|
Hints
|
||||||
|
^^^^^
|
||||||
|
|
||||||
|
Instead of explicitly setting the cache variables, the following variables
|
||||||
|
may be provided to tell this module where to look.
|
||||||
|
|
||||||
|
``OPENVDB_ROOT``
|
||||||
|
Preferred installation prefix.
|
||||||
|
``OPENVDB_INCLUDEDIR``
|
||||||
|
Preferred include directory e.g. <prefix>/include
|
||||||
|
``OPENVDB_LIBRARYDIR``
|
||||||
|
Preferred library directory e.g. <prefix>/lib
|
||||||
|
``SYSTEM_LIBRARY_PATHS``
|
||||||
|
Paths appended to all include and lib searches.
|
||||||
|
|
||||||
|
#]=======================================================================]
|
||||||
|
|
||||||
|
# If an explicit openvdb module path was specified, that will be used
|
||||||
|
if (OPENVDB_FIND_MODULE_PATH)
|
||||||
|
set(_module_path_bak ${CMAKE_MODULE_PATH})
|
||||||
|
set(CMAKE_MODULE_PATH ${OPENVDB_FIND_MODULE_PATH})
|
||||||
|
find_package(
|
||||||
|
OpenVDB ${OpenVDB_FIND_VERSION} QUIET
|
||||||
|
COMPONENTS
|
||||||
|
${OpenVDB_FIND_COMPONENTS}
|
||||||
|
)
|
||||||
|
|
||||||
|
set(CMAKE_MODULE_PATH ${_module_path_bak})
|
||||||
|
if (OpenVDB_FOUND)
|
||||||
|
return()
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (NOT OpenVDB_FIND_QUIETLY)
|
||||||
|
message(STATUS "Using bundled find module for OpenVDB")
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
# ###########################################################################
|
||||||
|
|
||||||
|
cmake_minimum_required(VERSION 3.13)
|
||||||
|
# Monitoring <PackageName>_ROOT variables
|
||||||
|
if(POLICY CMP0074)
|
||||||
|
cmake_policy(SET CMP0074 NEW)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(OpenVDB_FIND_QUIETLY)
|
||||||
|
set (_quiet "QUIET")
|
||||||
|
else()
|
||||||
|
set (_quiet "")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(OpenVDB_FIND_REQUIRED)
|
||||||
|
set (_required "REQUIRED")
|
||||||
|
else()
|
||||||
|
set (_required "")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Include utility functions for version information
|
||||||
|
include(${CMAKE_CURRENT_LIST_DIR}/OpenVDBUtils.cmake)
|
||||||
|
|
||||||
|
mark_as_advanced(
|
||||||
|
OpenVDB_INCLUDE_DIR
|
||||||
|
OpenVDB_LIBRARY
|
||||||
|
)
|
||||||
|
|
||||||
|
set(_OPENVDB_COMPONENT_LIST
|
||||||
|
openvdb
|
||||||
|
)
|
||||||
|
|
||||||
|
if(OpenVDB_FIND_COMPONENTS)
|
||||||
|
set(OPENVDB_COMPONENTS_PROVIDED TRUE)
|
||||||
|
set(_IGNORED_COMPONENTS "")
|
||||||
|
foreach(COMPONENT ${OpenVDB_FIND_COMPONENTS})
|
||||||
|
if(NOT ${COMPONENT} IN_LIST _OPENVDB_COMPONENT_LIST)
|
||||||
|
list(APPEND _IGNORED_COMPONENTS ${COMPONENT})
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
if(_IGNORED_COMPONENTS)
|
||||||
|
message(STATUS "Ignoring unknown components of OpenVDB:")
|
||||||
|
foreach(COMPONENT ${_IGNORED_COMPONENTS})
|
||||||
|
message(STATUS " ${COMPONENT}")
|
||||||
|
endforeach()
|
||||||
|
list(REMOVE_ITEM OpenVDB_FIND_COMPONENTS ${_IGNORED_COMPONENTS})
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
set(OPENVDB_COMPONENTS_PROVIDED FALSE)
|
||||||
|
set(OpenVDB_FIND_COMPONENTS ${_OPENVDB_COMPONENT_LIST})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Append OPENVDB_ROOT or $ENV{OPENVDB_ROOT} if set (prioritize the direct cmake var)
|
||||||
|
set(_OPENVDB_ROOT_SEARCH_DIR "")
|
||||||
|
|
||||||
|
# Additionally try and use pkconfig to find OpenVDB
|
||||||
|
|
||||||
|
find_package(PkgConfig ${_quiet} )
|
||||||
|
pkg_check_modules(PC_OpenVDB QUIET OpenVDB)
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------
|
||||||
|
# Search for OpenVDB include DIR
|
||||||
|
# ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
set(_OPENVDB_INCLUDE_SEARCH_DIRS "")
|
||||||
|
list(APPEND _OPENVDB_INCLUDE_SEARCH_DIRS
|
||||||
|
${OPENVDB_INCLUDEDIR}
|
||||||
|
${_OPENVDB_ROOT_SEARCH_DIR}
|
||||||
|
${PC_OpenVDB_INCLUDE_DIRS}
|
||||||
|
${SYSTEM_LIBRARY_PATHS}
|
||||||
|
)
|
||||||
|
|
||||||
|
# Look for a standard OpenVDB header file.
|
||||||
|
find_path(OpenVDB_INCLUDE_DIR openvdb/version.h
|
||||||
|
PATHS ${_OPENVDB_INCLUDE_SEARCH_DIRS}
|
||||||
|
PATH_SUFFIXES include
|
||||||
|
)
|
||||||
|
|
||||||
|
OPENVDB_VERSION_FROM_HEADER("${OpenVDB_INCLUDE_DIR}/openvdb/version.h"
|
||||||
|
VERSION OpenVDB_VERSION
|
||||||
|
MAJOR OpenVDB_MAJOR_VERSION
|
||||||
|
MINOR OpenVDB_MINOR_VERSION
|
||||||
|
PATCH OpenVDB_PATCH_VERSION
|
||||||
|
)
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------
|
||||||
|
# Search for OPENVDB lib DIR
|
||||||
|
# ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
set(_OPENVDB_LIBRARYDIR_SEARCH_DIRS "")
|
||||||
|
|
||||||
|
# Append to _OPENVDB_LIBRARYDIR_SEARCH_DIRS in priority order
|
||||||
|
|
||||||
|
list(APPEND _OPENVDB_LIBRARYDIR_SEARCH_DIRS
|
||||||
|
${OPENVDB_LIBRARYDIR}
|
||||||
|
${_OPENVDB_ROOT_SEARCH_DIR}
|
||||||
|
${PC_OpenVDB_LIBRARY_DIRS}
|
||||||
|
${SYSTEM_LIBRARY_PATHS}
|
||||||
|
)
|
||||||
|
|
||||||
|
# Build suffix directories
|
||||||
|
|
||||||
|
set(OPENVDB_PATH_SUFFIXES
|
||||||
|
lib64
|
||||||
|
lib
|
||||||
|
)
|
||||||
|
|
||||||
|
# Static library setup
|
||||||
|
if(UNIX AND OPENVDB_USE_STATIC_LIBS)
|
||||||
|
set(_OPENVDB_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
|
||||||
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(OpenVDB_LIB_COMPONENTS "")
|
||||||
|
set(OpenVDB_DEBUG_SUFFIX "d" CACHE STRING "Suffix for the debug libraries")
|
||||||
|
|
||||||
|
# get_property(_is_multi GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
||||||
|
set(_is_multi FALSE)
|
||||||
|
|
||||||
|
foreach(COMPONENT ${OpenVDB_FIND_COMPONENTS})
|
||||||
|
set(LIB_NAME ${COMPONENT})
|
||||||
|
|
||||||
|
find_library(OpenVDB_${COMPONENT}_LIBRARY_RELEASE ${LIB_NAME} lib${LIB_NAME}
|
||||||
|
PATHS ${_OPENVDB_LIBRARYDIR_SEARCH_DIRS}
|
||||||
|
PATH_SUFFIXES ${OPENVDB_PATH_SUFFIXES}
|
||||||
|
)
|
||||||
|
|
||||||
|
find_library(OpenVDB_${COMPONENT}_LIBRARY_DEBUG ${LIB_NAME}${OpenVDB_DEBUG_SUFFIX} lib${LIB_NAME}${OpenVDB_DEBUG_SUFFIX}
|
||||||
|
PATHS ${_OPENVDB_LIBRARYDIR_SEARCH_DIRS}
|
||||||
|
PATH_SUFFIXES ${OPENVDB_PATH_SUFFIXES}
|
||||||
|
)
|
||||||
|
|
||||||
|
if (_is_multi)
|
||||||
|
list(APPEND OpenVDB_LIB_COMPONENTS ${OpenVDB_${COMPONENT}_LIBRARY_RELEASE})
|
||||||
|
if (OpenVDB_${COMPONENT}_LIBRARY_DEBUG)
|
||||||
|
list(APPEND OpenVDB_LIB_COMPONENTS ${OpenVDB_${COMPONENT}_LIBRARY_DEBUG})
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
list(FIND CMAKE_CONFIGURATION_TYPES "Debug" _has_debug)
|
||||||
|
|
||||||
|
if(OpenVDB_${COMPONENT}_LIBRARY_RELEASE AND (NOT MSVC OR _has_debug LESS 0 OR OpenVDB_${COMPONENT}_LIBRARY_DEBUG))
|
||||||
|
set(OpenVDB_${COMPONENT}_FOUND TRUE)
|
||||||
|
else()
|
||||||
|
set(OpenVDB_${COMPONENT}_FOUND FALSE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(OpenVDB_${COMPONENT}_LIBRARY ${OpenVDB_${COMPONENT}_LIBRARY_RELEASE})
|
||||||
|
else ()
|
||||||
|
string(TOUPPER "${CMAKE_BUILD_TYPE}" _BUILD_TYPE)
|
||||||
|
|
||||||
|
set(OpenVDB_${COMPONENT}_LIBRARY ${OpenVDB_${COMPONENT}_LIBRARY_${_BUILD_TYPE}})
|
||||||
|
|
||||||
|
if (NOT OpenVDB_${COMPONENT}_LIBRARY)
|
||||||
|
set(OpenVDB_${COMPONENT}_LIBRARY ${OpenVDB_${COMPONENT}_LIBRARY_RELEASE})
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
list(APPEND OpenVDB_LIB_COMPONENTS ${OpenVDB_${COMPONENT}_LIBRARY})
|
||||||
|
|
||||||
|
if(OpenVDB_${COMPONENT}_LIBRARY)
|
||||||
|
set(OpenVDB_${COMPONENT}_FOUND TRUE)
|
||||||
|
else()
|
||||||
|
set(OpenVDB_${COMPONENT}_FOUND FALSE)
|
||||||
|
endif()
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
if(UNIX AND OPENVDB_USE_STATIC_LIBS)
|
||||||
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ${_OPENVDB_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
|
||||||
|
unset(_OPENVDB_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------
|
||||||
|
# Cache and set OPENVDB_FOUND
|
||||||
|
# ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(OpenVDB
|
||||||
|
FOUND_VAR OpenVDB_FOUND
|
||||||
|
REQUIRED_VARS
|
||||||
|
OpenVDB_INCLUDE_DIR
|
||||||
|
OpenVDB_LIB_COMPONENTS
|
||||||
|
VERSION_VAR OpenVDB_VERSION
|
||||||
|
HANDLE_COMPONENTS
|
||||||
|
)
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------
|
||||||
|
# Determine ABI number
|
||||||
|
# ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Set the ABI number the library was built against. Uses vdb_print
|
||||||
|
find_program(OPENVDB_PRINT vdb_print PATHS ${OpenVDB_INCLUDE_DIR} )
|
||||||
|
|
||||||
|
OPENVDB_ABI_VERSION_FROM_PRINT(
|
||||||
|
"${OPENVDB_PRINT}"
|
||||||
|
ABI OpenVDB_ABI
|
||||||
|
)
|
||||||
|
|
||||||
|
if(NOT OpenVDB_FIND_QUIETLY)
|
||||||
|
if(NOT OpenVDB_ABI)
|
||||||
|
message(WARNING "Unable to determine OpenVDB ABI version from OpenVDB "
|
||||||
|
"installation. The library major version \"${OpenVDB_MAJOR_VERSION}\" "
|
||||||
|
"will be inferred. If this is not correct, use "
|
||||||
|
"add_definitions(-DOPENVDB_ABI_VERSION_NUMBER=N)"
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
message(STATUS "OpenVDB ABI Version: ${OpenVDB_ABI}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------
|
||||||
|
# Handle OpenVDB dependencies
|
||||||
|
# ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Add standard dependencies
|
||||||
|
|
||||||
|
macro(just_fail msg)
|
||||||
|
set(OpenVDB_FOUND FALSE)
|
||||||
|
if(OpenVDB_FIND_REQUIRED)
|
||||||
|
message(FATAL_ERROR ${msg})
|
||||||
|
elseif(NOT OpenVDB_FIND_QUIETLY)
|
||||||
|
message(WARNING ${msg})
|
||||||
|
endif()
|
||||||
|
return()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
find_package(IlmBase QUIET)
|
||||||
|
if(NOT IlmBase_FOUND)
|
||||||
|
pkg_check_modules(IlmBase QUIET IlmBase)
|
||||||
|
endif()
|
||||||
|
if (IlmBase_FOUND AND NOT TARGET IlmBase::Half)
|
||||||
|
message(STATUS "Falling back to IlmBase found by pkg-config...")
|
||||||
|
|
||||||
|
find_library(IlmHalf_LIBRARY NAMES Half)
|
||||||
|
if(IlmHalf_LIBRARY-NOTFOUND OR NOT IlmBase_INCLUDE_DIRS)
|
||||||
|
just_fail("IlmBase::Half can not be found!")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
add_library(IlmBase::Half UNKNOWN IMPORTED)
|
||||||
|
set_target_properties(IlmBase::Half PROPERTIES
|
||||||
|
IMPORTED_LOCATION "${IlmHalf_LIBRARY}"
|
||||||
|
INTERFACE_INCLUDE_DIRECTORIES "${IlmBase_INCLUDE_DIRS}")
|
||||||
|
elseif(NOT IlmBase_FOUND)
|
||||||
|
just_fail("IlmBase::Half can not be found!")
|
||||||
|
endif()
|
||||||
|
find_package(TBB ${_quiet} ${_required} COMPONENTS tbb)
|
||||||
|
find_package(ZLIB ${_quiet} ${_required})
|
||||||
|
find_package(Boost ${_quiet} ${_required} COMPONENTS iostreams system )
|
||||||
|
|
||||||
|
# Use GetPrerequisites to see which libraries this OpenVDB lib has linked to
|
||||||
|
# which we can query for optional deps. This basically runs ldd/otoll/objdump
|
||||||
|
# etc to track deps. We could use a vdb_config binary tools here to improve
|
||||||
|
# this process
|
||||||
|
|
||||||
|
include(GetPrerequisites)
|
||||||
|
|
||||||
|
set(_EXCLUDE_SYSTEM_PREREQUISITES 1)
|
||||||
|
set(_RECURSE_PREREQUISITES 0)
|
||||||
|
set(_OPENVDB_PREREQUISITE_LIST)
|
||||||
|
|
||||||
|
if(NOT OPENVDB_USE_STATIC_LIBS)
|
||||||
|
get_prerequisites(${OpenVDB_openvdb_LIBRARY}
|
||||||
|
_OPENVDB_PREREQUISITE_LIST
|
||||||
|
${_EXCLUDE_SYSTEM_PREREQUISITES}
|
||||||
|
${_RECURSE_PREREQUISITES}
|
||||||
|
""
|
||||||
|
"${SYSTEM_LIBRARY_PATHS}"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
unset(_EXCLUDE_SYSTEM_PREREQUISITES)
|
||||||
|
unset(_RECURSE_PREREQUISITES)
|
||||||
|
|
||||||
|
# As the way we resolve optional libraries relies on library file names, use
|
||||||
|
# the configuration options from the main CMakeLists.txt to allow users
|
||||||
|
# to manually identify the requirements of OpenVDB builds if they know them.
|
||||||
|
|
||||||
|
set(OpenVDB_USES_BLOSC ${USE_BLOSC})
|
||||||
|
set(OpenVDB_USES_LOG4CPLUS ${USE_LOG4CPLUS})
|
||||||
|
set(OpenVDB_USES_ILM ${USE_EXR})
|
||||||
|
set(OpenVDB_USES_EXR ${USE_EXR})
|
||||||
|
|
||||||
|
# Search for optional dependencies
|
||||||
|
|
||||||
|
foreach(PREREQUISITE ${_OPENVDB_PREREQUISITE_LIST})
|
||||||
|
set(_HAS_DEP)
|
||||||
|
get_filename_component(PREREQUISITE ${PREREQUISITE} NAME)
|
||||||
|
|
||||||
|
string(FIND ${PREREQUISITE} "blosc" _HAS_DEP)
|
||||||
|
if(NOT ${_HAS_DEP} EQUAL -1)
|
||||||
|
set(OpenVDB_USES_BLOSC ON)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
string(FIND ${PREREQUISITE} "log4cplus" _HAS_DEP)
|
||||||
|
if(NOT ${_HAS_DEP} EQUAL -1)
|
||||||
|
set(OpenVDB_USES_LOG4CPLUS ON)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
string(FIND ${PREREQUISITE} "IlmImf" _HAS_DEP)
|
||||||
|
if(NOT ${_HAS_DEP} EQUAL -1)
|
||||||
|
set(OpenVDB_USES_ILM ON)
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
unset(_OPENVDB_PREREQUISITE_LIST)
|
||||||
|
unset(_HAS_DEP)
|
||||||
|
|
||||||
|
if(OpenVDB_USES_BLOSC)
|
||||||
|
find_package(Blosc QUIET)
|
||||||
|
if(NOT Blosc_FOUND OR NOT TARGET Blosc::blosc)
|
||||||
|
message(STATUS "find_package could not find Blosc. Using fallback blosc search...")
|
||||||
|
find_path(Blosc_INCLUDE_DIR blosc.h)
|
||||||
|
find_library(Blosc_LIBRARY NAMES blosc)
|
||||||
|
if (Blosc_INCLUDE_DIR AND Blosc_LIBRARY)
|
||||||
|
set(Blosc_FOUND TRUE)
|
||||||
|
add_library(Blosc::blosc UNKNOWN IMPORTED)
|
||||||
|
set_target_properties(Blosc::blosc PROPERTIES
|
||||||
|
IMPORTED_LOCATION "${Blosc_LIBRARY}"
|
||||||
|
INTERFACE_INCLUDE_DIRECTORIES ${Blosc_INCLUDE_DIR})
|
||||||
|
elseif()
|
||||||
|
just_fail("Blosc library can not be found!")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(OpenVDB_USES_LOG4CPLUS)
|
||||||
|
find_package(Log4cplus ${_quiet} ${_required})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(OpenVDB_USES_ILM)
|
||||||
|
find_package(IlmBase ${_quiet} ${_required})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(OpenVDB_USES_EXR)
|
||||||
|
find_package(OpenEXR ${_quiet} ${_required})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(UNIX)
|
||||||
|
find_package(Threads ${_quiet} ${_required})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Set deps. Note that the order here is important. If we're building against
|
||||||
|
# Houdini 17.5 we must include OpenEXR and IlmBase deps first to ensure the
|
||||||
|
# users chosen namespaced headers are correctly prioritized. Otherwise other
|
||||||
|
# include paths from shared installs (including houdini) may pull in the wrong
|
||||||
|
# headers
|
||||||
|
|
||||||
|
set(_OPENVDB_VISIBLE_DEPENDENCIES
|
||||||
|
Boost::iostreams
|
||||||
|
Boost::system
|
||||||
|
IlmBase::Half
|
||||||
|
)
|
||||||
|
|
||||||
|
set(_OPENVDB_DEFINITIONS)
|
||||||
|
if(OpenVDB_ABI)
|
||||||
|
list(APPEND _OPENVDB_DEFINITIONS "-DOPENVDB_ABI_VERSION_NUMBER=${OpenVDB_ABI}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(OpenVDB_USES_EXR)
|
||||||
|
list(APPEND _OPENVDB_VISIBLE_DEPENDENCIES
|
||||||
|
IlmBase::IlmThread
|
||||||
|
IlmBase::Iex
|
||||||
|
IlmBase::Imath
|
||||||
|
OpenEXR::IlmImf
|
||||||
|
)
|
||||||
|
list(APPEND _OPENVDB_DEFINITIONS "-DOPENVDB_TOOLS_RAYTRACER_USE_EXR")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(OpenVDB_USES_LOG4CPLUS)
|
||||||
|
list(APPEND _OPENVDB_VISIBLE_DEPENDENCIES Log4cplus::log4cplus)
|
||||||
|
list(APPEND _OPENVDB_DEFINITIONS "-DOPENVDB_USE_LOG4CPLUS")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
list(APPEND _OPENVDB_VISIBLE_DEPENDENCIES
|
||||||
|
TBB::tbb
|
||||||
|
)
|
||||||
|
if(UNIX)
|
||||||
|
list(APPEND _OPENVDB_VISIBLE_DEPENDENCIES
|
||||||
|
Threads::Threads
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(_OPENVDB_HIDDEN_DEPENDENCIES)
|
||||||
|
|
||||||
|
if(OpenVDB_USES_BLOSC)
|
||||||
|
if(OPENVDB_USE_STATIC_LIBS)
|
||||||
|
list(APPEND _OPENVDB_VISIBLE_DEPENDENCIES $<LINK_ONLY:Blosc::blosc>)
|
||||||
|
else()
|
||||||
|
list(APPEND _OPENVDB_HIDDEN_DEPENDENCIES Blosc::blosc)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(OPENVDB_USE_STATIC_LIBS)
|
||||||
|
list(APPEND _OPENVDB_VISIBLE_DEPENDENCIES $<LINK_ONLY:ZLIB::ZLIB>)
|
||||||
|
else()
|
||||||
|
list(APPEND _OPENVDB_HIDDEN_DEPENDENCIES ZLIB::ZLIB)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------
|
||||||
|
# Configure imported target
|
||||||
|
# ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
set(OpenVDB_LIBRARIES
|
||||||
|
${OpenVDB_LIB_COMPONENTS}
|
||||||
|
)
|
||||||
|
set(OpenVDB_INCLUDE_DIRS ${OpenVDB_INCLUDE_DIR})
|
||||||
|
|
||||||
|
set(OpenVDB_DEFINITIONS)
|
||||||
|
list(APPEND OpenVDB_DEFINITIONS "${PC_OpenVDB_CFLAGS_OTHER}")
|
||||||
|
list(APPEND OpenVDB_DEFINITIONS "${_OPENVDB_DEFINITIONS}")
|
||||||
|
list(REMOVE_DUPLICATES OpenVDB_DEFINITIONS)
|
||||||
|
|
||||||
|
set(OpenVDB_LIBRARY_DIRS "")
|
||||||
|
foreach(LIB ${OpenVDB_LIB_COMPONENTS})
|
||||||
|
get_filename_component(_OPENVDB_LIBDIR ${LIB} DIRECTORY)
|
||||||
|
list(APPEND OpenVDB_LIBRARY_DIRS ${_OPENVDB_LIBDIR})
|
||||||
|
endforeach()
|
||||||
|
list(REMOVE_DUPLICATES OpenVDB_LIBRARY_DIRS)
|
||||||
|
|
||||||
|
foreach(COMPONENT ${OpenVDB_FIND_COMPONENTS})
|
||||||
|
if(NOT TARGET OpenVDB::${COMPONENT})
|
||||||
|
if (${COMPONENT} STREQUAL openvdb)
|
||||||
|
include (${CMAKE_CURRENT_LIST_DIR}/CheckAtomic.cmake)
|
||||||
|
set(_LINK_LIBS ${_OPENVDB_VISIBLE_DEPENDENCIES} ${CMAKE_REQUIRED_LIBRARIES})
|
||||||
|
else ()
|
||||||
|
set(_LINK_LIBS _OPENVDB_VISIBLE_DEPENDENCIES)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
add_library(OpenVDB::${COMPONENT} UNKNOWN IMPORTED)
|
||||||
|
set_target_properties(OpenVDB::${COMPONENT} PROPERTIES
|
||||||
|
INTERFACE_COMPILE_OPTIONS "${OpenVDB_DEFINITIONS}"
|
||||||
|
INTERFACE_INCLUDE_DIRECTORIES "${OpenVDB_INCLUDE_DIR}"
|
||||||
|
IMPORTED_LINK_DEPENDENT_LIBRARIES "${_OPENVDB_HIDDEN_DEPENDENCIES}" # non visible deps
|
||||||
|
INTERFACE_LINK_LIBRARIES "${_LINK_LIBS}" # visible deps (headers)
|
||||||
|
INTERFACE_COMPILE_FEATURES cxx_std_11
|
||||||
|
IMPORTED_LOCATION "${OpenVDB_${COMPONENT}_LIBRARY}"
|
||||||
|
)
|
||||||
|
|
||||||
|
if (_is_multi)
|
||||||
|
set_target_properties(OpenVDB::${COMPONENT} PROPERTIES
|
||||||
|
IMPORTED_LOCATION_RELEASE "${OpenVDB_${COMPONENT}_LIBRARY_RELEASE}"
|
||||||
|
)
|
||||||
|
|
||||||
|
if (MSVC OR OpenVDB_${COMPONENT}_LIBRARY_DEBUG)
|
||||||
|
set_target_properties(OpenVDB::${COMPONENT} PROPERTIES
|
||||||
|
IMPORTED_LOCATION_DEBUG "${OpenVDB_${COMPONENT}_LIBRARY_DEBUG}"
|
||||||
|
)
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (OPENVDB_USE_STATIC_LIBS)
|
||||||
|
set_target_properties(OpenVDB::${COMPONENT} PROPERTIES
|
||||||
|
INTERFACE_COMPILE_DEFINITIONS "OPENVDB_STATICLIB;OPENVDB_OPENEXR_STATICLIB"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
if(OpenVDB_FOUND AND NOT OpenVDB_FIND_QUIETLY)
|
||||||
|
message(STATUS "OpenVDB libraries: ${OpenVDB_LIBRARIES}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
unset(_OPENVDB_DEFINITIONS)
|
||||||
|
unset(_OPENVDB_VISIBLE_DEPENDENCIES)
|
||||||
|
unset(_OPENVDB_HIDDEN_DEPENDENCIES)
|
||||||
392
cmake/modules/FindPackageHandleStandardArgs_SLIC3R.cmake
Normal file
@@ -0,0 +1,392 @@
|
|||||||
|
# Modified from the CMake github master,
|
||||||
|
# required by the bundled FindCURL.cmake
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
||||||
|
# file Copyright.txt or https://cmake.org/licensing for details.
|
||||||
|
|
||||||
|
#[=======================================================================[.rst:
|
||||||
|
FindPackageHandleStandardArgs
|
||||||
|
-----------------------------
|
||||||
|
|
||||||
|
This module provides a function intended to be used in :ref:`Find Modules`
|
||||||
|
implementing :command:`find_package(<PackageName>)` calls. It handles the
|
||||||
|
``REQUIRED``, ``QUIET`` and version-related arguments of ``find_package``.
|
||||||
|
It also sets the ``<PackageName>_FOUND`` variable. The package is
|
||||||
|
considered found if all variables listed contain valid results, e.g.
|
||||||
|
valid filepaths.
|
||||||
|
|
||||||
|
.. command:: find_package_handle_standard_args
|
||||||
|
|
||||||
|
There are two signatures::
|
||||||
|
|
||||||
|
find_package_handle_standard_args(<PackageName>
|
||||||
|
(DEFAULT_MSG|<custom-failure-message>)
|
||||||
|
<required-var>...
|
||||||
|
)
|
||||||
|
|
||||||
|
find_package_handle_standard_args(<PackageName>
|
||||||
|
[FOUND_VAR <result-var>]
|
||||||
|
[REQUIRED_VARS <required-var>...]
|
||||||
|
[VERSION_VAR <version-var>]
|
||||||
|
[HANDLE_COMPONENTS]
|
||||||
|
[CONFIG_MODE]
|
||||||
|
[FAIL_MESSAGE <custom-failure-message>]
|
||||||
|
)
|
||||||
|
|
||||||
|
The ``<PackageName>_FOUND`` variable will be set to ``TRUE`` if all
|
||||||
|
the variables ``<required-var>...`` are valid and any optional
|
||||||
|
constraints are satisfied, and ``FALSE`` otherwise. A success or
|
||||||
|
failure message may be displayed based on the results and on
|
||||||
|
whether the ``REQUIRED`` and/or ``QUIET`` option was given to
|
||||||
|
the :command:`find_package` call.
|
||||||
|
|
||||||
|
The options are:
|
||||||
|
|
||||||
|
``(DEFAULT_MSG|<custom-failure-message>)``
|
||||||
|
In the simple signature this specifies the failure message.
|
||||||
|
Use ``DEFAULT_MSG`` to ask for a default message to be computed
|
||||||
|
(recommended). Not valid in the full signature.
|
||||||
|
|
||||||
|
``FOUND_VAR <result-var>``
|
||||||
|
Obsolete. Specifies either ``<PackageName>_FOUND`` or
|
||||||
|
``<PACKAGENAME>_FOUND`` as the result variable. This exists only
|
||||||
|
for compatibility with older versions of CMake and is now ignored.
|
||||||
|
Result variables of both names are always set for compatibility.
|
||||||
|
|
||||||
|
``REQUIRED_VARS <required-var>...``
|
||||||
|
Specify the variables which are required for this package.
|
||||||
|
These may be named in the generated failure message asking the
|
||||||
|
user to set the missing variable values. Therefore these should
|
||||||
|
typically be cache entries such as ``FOO_LIBRARY`` and not output
|
||||||
|
variables like ``FOO_LIBRARIES``.
|
||||||
|
|
||||||
|
``VERSION_VAR <version-var>``
|
||||||
|
Specify the name of a variable that holds the version of the package
|
||||||
|
that has been found. This version will be checked against the
|
||||||
|
(potentially) specified required version given to the
|
||||||
|
:command:`find_package` call, including its ``EXACT`` option.
|
||||||
|
The default messages include information about the required
|
||||||
|
version and the version which has been actually found, both
|
||||||
|
if the version is ok or not.
|
||||||
|
|
||||||
|
``HANDLE_COMPONENTS``
|
||||||
|
Enable handling of package components. In this case, the command
|
||||||
|
will report which components have been found and which are missing,
|
||||||
|
and the ``<PackageName>_FOUND`` variable will be set to ``FALSE``
|
||||||
|
if any of the required components (i.e. not the ones listed after
|
||||||
|
the ``OPTIONAL_COMPONENTS`` option of :command:`find_package`) are
|
||||||
|
missing.
|
||||||
|
|
||||||
|
``CONFIG_MODE``
|
||||||
|
Specify that the calling find module is a wrapper around a
|
||||||
|
call to ``find_package(<PackageName> NO_MODULE)``. This implies
|
||||||
|
a ``VERSION_VAR`` value of ``<PackageName>_VERSION``. The command
|
||||||
|
will automatically check whether the package configuration file
|
||||||
|
was found.
|
||||||
|
|
||||||
|
``FAIL_MESSAGE <custom-failure-message>``
|
||||||
|
Specify a custom failure message instead of using the default
|
||||||
|
generated message. Not recommended.
|
||||||
|
|
||||||
|
Example for the simple signature:
|
||||||
|
|
||||||
|
.. code-block:: cmake
|
||||||
|
|
||||||
|
find_package_handle_standard_args(LibXml2 DEFAULT_MSG
|
||||||
|
LIBXML2_LIBRARY LIBXML2_INCLUDE_DIR)
|
||||||
|
|
||||||
|
The ``LibXml2`` package is considered to be found if both
|
||||||
|
``LIBXML2_LIBRARY`` and ``LIBXML2_INCLUDE_DIR`` are valid.
|
||||||
|
Then also ``LibXml2_FOUND`` is set to ``TRUE``. If it is not found
|
||||||
|
and ``REQUIRED`` was used, it fails with a
|
||||||
|
:command:`message(FATAL_ERROR)`, independent whether ``QUIET`` was
|
||||||
|
used or not. If it is found, success will be reported, including
|
||||||
|
the content of the first ``<required-var>``. On repeated CMake runs,
|
||||||
|
the same message will not be printed again.
|
||||||
|
|
||||||
|
Example for the full signature:
|
||||||
|
|
||||||
|
.. code-block:: cmake
|
||||||
|
|
||||||
|
find_package_handle_standard_args(LibArchive
|
||||||
|
REQUIRED_VARS LibArchive_LIBRARY LibArchive_INCLUDE_DIR
|
||||||
|
VERSION_VAR LibArchive_VERSION)
|
||||||
|
|
||||||
|
In this case, the ``LibArchive`` package is considered to be found if
|
||||||
|
both ``LibArchive_LIBRARY`` and ``LibArchive_INCLUDE_DIR`` are valid.
|
||||||
|
Also the version of ``LibArchive`` will be checked by using the version
|
||||||
|
contained in ``LibArchive_VERSION``. Since no ``FAIL_MESSAGE`` is given,
|
||||||
|
the default messages will be printed.
|
||||||
|
|
||||||
|
Another example for the full signature:
|
||||||
|
|
||||||
|
.. code-block:: cmake
|
||||||
|
|
||||||
|
find_package(Automoc4 QUIET NO_MODULE HINTS /opt/automoc4)
|
||||||
|
find_package_handle_standard_args(Automoc4 CONFIG_MODE)
|
||||||
|
|
||||||
|
In this case, a ``FindAutmoc4.cmake`` module wraps a call to
|
||||||
|
``find_package(Automoc4 NO_MODULE)`` and adds an additional search
|
||||||
|
directory for ``automoc4``. Then the call to
|
||||||
|
``find_package_handle_standard_args`` produces a proper success/failure
|
||||||
|
message.
|
||||||
|
#]=======================================================================]
|
||||||
|
|
||||||
|
include(${CMAKE_CURRENT_LIST_DIR}/FindPackageMessage_SLIC3R.cmake)
|
||||||
|
|
||||||
|
# internal helper macro
|
||||||
|
macro(_FPHSA_FAILURE_MESSAGE _msg)
|
||||||
|
if (${_NAME}_FIND_REQUIRED)
|
||||||
|
message(FATAL_ERROR "${_msg}")
|
||||||
|
else ()
|
||||||
|
if (NOT ${_NAME}_FIND_QUIETLY)
|
||||||
|
message(STATUS "${_msg}")
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
|
||||||
|
# internal helper macro to generate the failure message when used in CONFIG_MODE:
|
||||||
|
macro(_FPHSA_HANDLE_FAILURE_CONFIG_MODE)
|
||||||
|
# <PackageName>_CONFIG is set, but FOUND is false, this means that some other of the REQUIRED_VARS was not found:
|
||||||
|
if(${_NAME}_CONFIG)
|
||||||
|
_FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: missing:${MISSING_VARS} (found ${${_NAME}_CONFIG} ${VERSION_MSG})")
|
||||||
|
else()
|
||||||
|
# If _CONSIDERED_CONFIGS is set, the config-file has been found, but no suitable version.
|
||||||
|
# List them all in the error message:
|
||||||
|
if(${_NAME}_CONSIDERED_CONFIGS)
|
||||||
|
set(configsText "")
|
||||||
|
list(LENGTH ${_NAME}_CONSIDERED_CONFIGS configsCount)
|
||||||
|
math(EXPR configsCount "${configsCount} - 1")
|
||||||
|
foreach(currentConfigIndex RANGE ${configsCount})
|
||||||
|
list(GET ${_NAME}_CONSIDERED_CONFIGS ${currentConfigIndex} filename)
|
||||||
|
list(GET ${_NAME}_CONSIDERED_VERSIONS ${currentConfigIndex} version)
|
||||||
|
string(APPEND configsText " ${filename} (version ${version})\n")
|
||||||
|
endforeach()
|
||||||
|
if (${_NAME}_NOT_FOUND_MESSAGE)
|
||||||
|
string(APPEND configsText " Reason given by package: ${${_NAME}_NOT_FOUND_MESSAGE}\n")
|
||||||
|
endif()
|
||||||
|
_FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE} ${VERSION_MSG}, checked the following files:\n${configsText}")
|
||||||
|
|
||||||
|
else()
|
||||||
|
# Simple case: No Config-file was found at all:
|
||||||
|
_FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: found neither ${_NAME}Config.cmake nor ${_NAME_LOWER}-config.cmake ${VERSION_MSG}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
|
||||||
|
function(FIND_PACKAGE_HANDLE_STANDARD_ARGS_SLIC3R _NAME _FIRST_ARG)
|
||||||
|
|
||||||
|
# Set up the arguments for `cmake_parse_arguments`.
|
||||||
|
set(options CONFIG_MODE HANDLE_COMPONENTS)
|
||||||
|
set(oneValueArgs FAIL_MESSAGE VERSION_VAR FOUND_VAR)
|
||||||
|
set(multiValueArgs REQUIRED_VARS)
|
||||||
|
|
||||||
|
# Check whether we are in 'simple' or 'extended' mode:
|
||||||
|
set(_KEYWORDS_FOR_EXTENDED_MODE ${options} ${oneValueArgs} ${multiValueArgs} )
|
||||||
|
list(FIND _KEYWORDS_FOR_EXTENDED_MODE "${_FIRST_ARG}" INDEX)
|
||||||
|
|
||||||
|
if(${INDEX} EQUAL -1)
|
||||||
|
set(FPHSA_FAIL_MESSAGE ${_FIRST_ARG})
|
||||||
|
set(FPHSA_REQUIRED_VARS ${ARGN})
|
||||||
|
set(FPHSA_VERSION_VAR)
|
||||||
|
else()
|
||||||
|
cmake_parse_arguments(FPHSA "${options}" "${oneValueArgs}" "${multiValueArgs}" ${_FIRST_ARG} ${ARGN})
|
||||||
|
|
||||||
|
if(FPHSA_UNPARSED_ARGUMENTS)
|
||||||
|
message(FATAL_ERROR "Unknown keywords given to FIND_PACKAGE_HANDLE_STANDARD_ARGS(): \"${FPHSA_UNPARSED_ARGUMENTS}\"")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT FPHSA_FAIL_MESSAGE)
|
||||||
|
set(FPHSA_FAIL_MESSAGE "DEFAULT_MSG")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# In config-mode, we rely on the variable <PackageName>_CONFIG, which is set by find_package()
|
||||||
|
# when it successfully found the config-file, including version checking:
|
||||||
|
if(FPHSA_CONFIG_MODE)
|
||||||
|
list(INSERT FPHSA_REQUIRED_VARS 0 ${_NAME}_CONFIG)
|
||||||
|
list(REMOVE_DUPLICATES FPHSA_REQUIRED_VARS)
|
||||||
|
set(FPHSA_VERSION_VAR ${_NAME}_VERSION)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT FPHSA_REQUIRED_VARS)
|
||||||
|
message(FATAL_ERROR "No REQUIRED_VARS specified for FIND_PACKAGE_HANDLE_STANDARD_ARGS()")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# now that we collected all arguments, process them
|
||||||
|
|
||||||
|
if("x${FPHSA_FAIL_MESSAGE}" STREQUAL "xDEFAULT_MSG")
|
||||||
|
set(FPHSA_FAIL_MESSAGE "Could NOT find ${_NAME}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
list(GET FPHSA_REQUIRED_VARS 0 _FIRST_REQUIRED_VAR)
|
||||||
|
|
||||||
|
string(TOUPPER ${_NAME} _NAME_UPPER)
|
||||||
|
string(TOLOWER ${_NAME} _NAME_LOWER)
|
||||||
|
|
||||||
|
if(FPHSA_FOUND_VAR)
|
||||||
|
if(FPHSA_FOUND_VAR MATCHES "^${_NAME}_FOUND$" OR FPHSA_FOUND_VAR MATCHES "^${_NAME_UPPER}_FOUND$")
|
||||||
|
set(_FOUND_VAR ${FPHSA_FOUND_VAR})
|
||||||
|
else()
|
||||||
|
message(FATAL_ERROR "The argument for FOUND_VAR is \"${FPHSA_FOUND_VAR}\", but only \"${_NAME}_FOUND\" and \"${_NAME_UPPER}_FOUND\" are valid names.")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
set(_FOUND_VAR ${_NAME_UPPER}_FOUND)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# collect all variables which were not found, so they can be printed, so the
|
||||||
|
# user knows better what went wrong (#6375)
|
||||||
|
set(MISSING_VARS "")
|
||||||
|
set(DETAILS "")
|
||||||
|
# check if all passed variables are valid
|
||||||
|
set(FPHSA_FOUND_${_NAME} TRUE)
|
||||||
|
foreach(_CURRENT_VAR ${FPHSA_REQUIRED_VARS})
|
||||||
|
if(NOT ${_CURRENT_VAR})
|
||||||
|
set(FPHSA_FOUND_${_NAME} FALSE)
|
||||||
|
string(APPEND MISSING_VARS " ${_CURRENT_VAR}")
|
||||||
|
else()
|
||||||
|
string(APPEND DETAILS "[${${_CURRENT_VAR}}]")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
if(FPHSA_FOUND_${_NAME})
|
||||||
|
set(${_NAME}_FOUND TRUE)
|
||||||
|
set(${_NAME_UPPER}_FOUND TRUE)
|
||||||
|
else()
|
||||||
|
set(${_NAME}_FOUND FALSE)
|
||||||
|
set(${_NAME_UPPER}_FOUND FALSE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# component handling
|
||||||
|
unset(FOUND_COMPONENTS_MSG)
|
||||||
|
unset(MISSING_COMPONENTS_MSG)
|
||||||
|
|
||||||
|
if(FPHSA_HANDLE_COMPONENTS)
|
||||||
|
foreach(comp ${${_NAME}_FIND_COMPONENTS})
|
||||||
|
if(${_NAME}_${comp}_FOUND)
|
||||||
|
|
||||||
|
if(NOT DEFINED FOUND_COMPONENTS_MSG)
|
||||||
|
set(FOUND_COMPONENTS_MSG "found components: ")
|
||||||
|
endif()
|
||||||
|
string(APPEND FOUND_COMPONENTS_MSG " ${comp}")
|
||||||
|
|
||||||
|
else()
|
||||||
|
|
||||||
|
if(NOT DEFINED MISSING_COMPONENTS_MSG)
|
||||||
|
set(MISSING_COMPONENTS_MSG "missing components: ")
|
||||||
|
endif()
|
||||||
|
string(APPEND MISSING_COMPONENTS_MSG " ${comp}")
|
||||||
|
|
||||||
|
if(${_NAME}_FIND_REQUIRED_${comp})
|
||||||
|
set(${_NAME}_FOUND FALSE)
|
||||||
|
string(APPEND MISSING_VARS " ${comp}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
set(COMPONENT_MSG "${FOUND_COMPONENTS_MSG} ${MISSING_COMPONENTS_MSG}")
|
||||||
|
string(APPEND DETAILS "[c${COMPONENT_MSG}]")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# version handling:
|
||||||
|
set(VERSION_MSG "")
|
||||||
|
set(VERSION_OK TRUE)
|
||||||
|
|
||||||
|
# check with DEFINED here as the requested or found version may be "0"
|
||||||
|
if (DEFINED ${_NAME}_FIND_VERSION)
|
||||||
|
if(DEFINED ${FPHSA_VERSION_VAR})
|
||||||
|
set(_FOUND_VERSION ${${FPHSA_VERSION_VAR}})
|
||||||
|
|
||||||
|
if(${_NAME}_FIND_VERSION_EXACT) # exact version required
|
||||||
|
# count the dots in the version string
|
||||||
|
string(REGEX REPLACE "[^.]" "" _VERSION_DOTS "${_FOUND_VERSION}")
|
||||||
|
# add one dot because there is one dot more than there are components
|
||||||
|
string(LENGTH "${_VERSION_DOTS}." _VERSION_DOTS)
|
||||||
|
if (_VERSION_DOTS GREATER ${_NAME}_FIND_VERSION_COUNT)
|
||||||
|
# Because of the C++ implementation of find_package() ${_NAME}_FIND_VERSION_COUNT
|
||||||
|
# is at most 4 here. Therefore a simple lookup table is used.
|
||||||
|
if (${_NAME}_FIND_VERSION_COUNT EQUAL 1)
|
||||||
|
set(_VERSION_REGEX "[^.]*")
|
||||||
|
elseif (${_NAME}_FIND_VERSION_COUNT EQUAL 2)
|
||||||
|
set(_VERSION_REGEX "[^.]*\\.[^.]*")
|
||||||
|
elseif (${_NAME}_FIND_VERSION_COUNT EQUAL 3)
|
||||||
|
set(_VERSION_REGEX "[^.]*\\.[^.]*\\.[^.]*")
|
||||||
|
else ()
|
||||||
|
set(_VERSION_REGEX "[^.]*\\.[^.]*\\.[^.]*\\.[^.]*")
|
||||||
|
endif ()
|
||||||
|
string(REGEX REPLACE "^(${_VERSION_REGEX})\\..*" "\\1" _VERSION_HEAD "${_FOUND_VERSION}")
|
||||||
|
unset(_VERSION_REGEX)
|
||||||
|
if (NOT ${_NAME}_FIND_VERSION VERSION_EQUAL _VERSION_HEAD)
|
||||||
|
set(VERSION_MSG "Found unsuitable version \"${_FOUND_VERSION}\", but required is exact version \"${${_NAME}_FIND_VERSION}\"")
|
||||||
|
set(VERSION_OK FALSE)
|
||||||
|
else ()
|
||||||
|
set(VERSION_MSG "(found suitable exact version \"${_FOUND_VERSION}\")")
|
||||||
|
endif ()
|
||||||
|
unset(_VERSION_HEAD)
|
||||||
|
else ()
|
||||||
|
if (NOT ${_NAME}_FIND_VERSION VERSION_EQUAL _FOUND_VERSION)
|
||||||
|
set(VERSION_MSG "Found unsuitable version \"${_FOUND_VERSION}\", but required is exact version \"${${_NAME}_FIND_VERSION}\"")
|
||||||
|
set(VERSION_OK FALSE)
|
||||||
|
else ()
|
||||||
|
set(VERSION_MSG "(found suitable exact version \"${_FOUND_VERSION}\")")
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
unset(_VERSION_DOTS)
|
||||||
|
|
||||||
|
else() # minimum version specified:
|
||||||
|
if (${_NAME}_FIND_VERSION VERSION_GREATER _FOUND_VERSION)
|
||||||
|
set(VERSION_MSG "Found unsuitable version \"${_FOUND_VERSION}\", but required is at least \"${${_NAME}_FIND_VERSION}\"")
|
||||||
|
set(VERSION_OK FALSE)
|
||||||
|
else ()
|
||||||
|
set(VERSION_MSG "(found suitable version \"${_FOUND_VERSION}\", minimum required is \"${${_NAME}_FIND_VERSION}\")")
|
||||||
|
endif ()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
else()
|
||||||
|
|
||||||
|
# if the package was not found, but a version was given, add that to the output:
|
||||||
|
if(${_NAME}_FIND_VERSION_EXACT)
|
||||||
|
set(VERSION_MSG "(Required is exact version \"${${_NAME}_FIND_VERSION}\")")
|
||||||
|
else()
|
||||||
|
set(VERSION_MSG "(Required is at least version \"${${_NAME}_FIND_VERSION}\")")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
endif()
|
||||||
|
else ()
|
||||||
|
# Check with DEFINED as the found version may be 0.
|
||||||
|
if(DEFINED ${FPHSA_VERSION_VAR})
|
||||||
|
set(VERSION_MSG "(found version \"${${FPHSA_VERSION_VAR}}\")")
|
||||||
|
endif()
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if(VERSION_OK)
|
||||||
|
string(APPEND DETAILS "[v${${FPHSA_VERSION_VAR}}(${${_NAME}_FIND_VERSION})]")
|
||||||
|
else()
|
||||||
|
set(${_NAME}_FOUND FALSE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
# print the result:
|
||||||
|
if (${_NAME}_FOUND)
|
||||||
|
FIND_PACKAGE_MESSAGE_SLIC3R(${_NAME} "Found ${_NAME}: ${${_FIRST_REQUIRED_VAR}} ${VERSION_MSG} ${COMPONENT_MSG}" "${DETAILS}")
|
||||||
|
else ()
|
||||||
|
|
||||||
|
if(FPHSA_CONFIG_MODE)
|
||||||
|
_FPHSA_HANDLE_FAILURE_CONFIG_MODE()
|
||||||
|
else()
|
||||||
|
if(NOT VERSION_OK)
|
||||||
|
_FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE}: ${VERSION_MSG} (found ${${_FIRST_REQUIRED_VAR}})")
|
||||||
|
else()
|
||||||
|
_FPHSA_FAILURE_MESSAGE("${FPHSA_FAIL_MESSAGE} (missing:${MISSING_VARS}) ${VERSION_MSG}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
set(${_NAME}_FOUND ${${_NAME}_FOUND} PARENT_SCOPE)
|
||||||
|
set(${_NAME_UPPER}_FOUND ${${_NAME}_FOUND} PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
54
cmake/modules/FindPackageMessage_SLIC3R.cmake
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
# Modified from the CMake github master.
|
||||||
|
# required by the bundled FindCURL.cmake
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
||||||
|
# file Copyright.txt or https://cmake.org/licensing for details.
|
||||||
|
|
||||||
|
#.rst:
|
||||||
|
# FindPackageMessage
|
||||||
|
# ------------------
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# FIND_PACKAGE_MESSAGE(<name> "message for user" "find result details")
|
||||||
|
#
|
||||||
|
# This macro is intended to be used in FindXXX.cmake modules files. It
|
||||||
|
# will print a message once for each unique find result. This is useful
|
||||||
|
# for telling the user where a package was found. The first argument
|
||||||
|
# specifies the name (XXX) of the package. The second argument
|
||||||
|
# specifies the message to display. The third argument lists details
|
||||||
|
# about the find result so that if they change the message will be
|
||||||
|
# displayed again. The macro also obeys the QUIET argument to the
|
||||||
|
# find_package command.
|
||||||
|
#
|
||||||
|
# Example:
|
||||||
|
#
|
||||||
|
# ::
|
||||||
|
#
|
||||||
|
# if(X11_FOUND)
|
||||||
|
# FIND_PACKAGE_MESSAGE(X11 "Found X11: ${X11_X11_LIB}"
|
||||||
|
# "[${X11_X11_LIB}][${X11_INCLUDE_DIR}]")
|
||||||
|
# else()
|
||||||
|
# ...
|
||||||
|
# endif()
|
||||||
|
|
||||||
|
function(FIND_PACKAGE_MESSAGE_SLIC3R pkg msg details)
|
||||||
|
# Avoid printing a message repeatedly for the same find result.
|
||||||
|
if(NOT ${pkg}_FIND_QUIETLY)
|
||||||
|
string(REPLACE "\n" "" details "${details}")
|
||||||
|
set(DETAILS_VAR FIND_PACKAGE_MESSAGE_DETAILS_${pkg})
|
||||||
|
if(NOT "${details}" STREQUAL "${${DETAILS_VAR}}")
|
||||||
|
# The message has not yet been printed.
|
||||||
|
message(STATUS "${msg}")
|
||||||
|
|
||||||
|
# Save the find details in the cache to avoid printing the same
|
||||||
|
# message again.
|
||||||
|
set("${DETAILS_VAR}" "${details}"
|
||||||
|
CACHE INTERNAL "Details about finding ${pkg}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
88
cmake/modules/FindPerlEmbed.cmake
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
# Find the dependencies for linking with the Perl runtime library.
|
||||||
|
|
||||||
|
# Check for the Perl & PerlLib modules
|
||||||
|
include(LibFindMacros)
|
||||||
|
libfind_package(PerlEmbed Perl)
|
||||||
|
libfind_package(PerlEmbed PerlLibs)
|
||||||
|
|
||||||
|
# Execute an Alien::Wx module to find the relevant information regarding
|
||||||
|
# the wxWidgets used by the Perl interpreter.
|
||||||
|
# Perl specific stuff
|
||||||
|
set(PerlEmbed_TEMP_INCLUDE ${CMAKE_CURRENT_BINARY_DIR}/PerlEmbed_TEMP_INCLUDE.txt)
|
||||||
|
execute_process(
|
||||||
|
COMMAND ${PERL_EXECUTABLE} -MExtUtils::Embed -e "
|
||||||
|
# Import Perl modules.
|
||||||
|
use strict;
|
||||||
|
use warnings;
|
||||||
|
use Config;
|
||||||
|
use Text::ParseWords;
|
||||||
|
use ExtUtils::CppGuess;
|
||||||
|
|
||||||
|
# Test for a Visual Studio compiler
|
||||||
|
my \$cpp_guess = ExtUtils::CppGuess->new;
|
||||||
|
my \$mswin = \$^O eq 'MSWin32';
|
||||||
|
my \$msvc = \$cpp_guess->is_msvc;
|
||||||
|
|
||||||
|
# Query the available data from Alien::wxWidgets.
|
||||||
|
my \$ccflags;
|
||||||
|
my \$ldflags;
|
||||||
|
{ local *STDOUT; open STDOUT, '>', \\\$ccflags; ccflags; }
|
||||||
|
{ local *STDOUT; open STDOUT, '>', \\\$ldflags; ldopts; }
|
||||||
|
\$ccflags = ' ' . \$ccflags;
|
||||||
|
\$ldflags = ' ' . \$ldflags;
|
||||||
|
|
||||||
|
my \$filename = '${PerlEmbed_TEMP_INCLUDE}';
|
||||||
|
open(my $fh, '>', \$filename) or die \"Could not open file '\$filename' \$!\";
|
||||||
|
|
||||||
|
# Convert a space separated lists to CMake semicolon separated lists,
|
||||||
|
# escape the backslashes,
|
||||||
|
# export the resulting list to a temp file.
|
||||||
|
sub cmake_set_var {
|
||||||
|
my (\$varname, \$content) = @_;
|
||||||
|
# Remove line separators.
|
||||||
|
\$content =~ s/\\r|\\n//g;
|
||||||
|
# Escape the path separators.
|
||||||
|
\$content =~ s/\\\\/\\\\\\\\\\\\\\\\/g;
|
||||||
|
my @words = shellwords(\$content);
|
||||||
|
print \$fh \"set(PerlEmbed_\$varname \\\"\" . join(';', @words) . \"\\\")\\n\";
|
||||||
|
}
|
||||||
|
cmake_set_var('ARCHNAME', \$Config{archname});
|
||||||
|
cmake_set_var('CCFLAGS', \$ccflags);
|
||||||
|
\$ldflags =~ s/ -L/ -LIBPATH:/g if \$msvc;
|
||||||
|
cmake_set_var('LD', \$Config{ld});
|
||||||
|
cmake_set_var('LDFLAGS', \$ldflags);
|
||||||
|
cmake_set_var('CCCDLFLAGS', \$Config{cccdlflags});
|
||||||
|
cmake_set_var('LDDLFLAGS', \$Config{lddlflags});
|
||||||
|
cmake_set_var('DLEXT', \$Config{dlext});
|
||||||
|
close \$fh;
|
||||||
|
")
|
||||||
|
include(${PerlEmbed_TEMP_INCLUDE})
|
||||||
|
file(REMOVE ${PerlEmbed_TEMP_INCLUDE})
|
||||||
|
unset(PerlEmbed_TEMP_INCLUDE)
|
||||||
|
|
||||||
|
if (PerlEmbed_DEBUG)
|
||||||
|
# First show the configuration extracted by FindPerl & FindPerlLibs:
|
||||||
|
message(STATUS " PERL_INCLUDE_PATH = ${PERL_INCLUDE_PATH}")
|
||||||
|
message(STATUS " PERL_LIBRARY = ${PERL_LIBRARY}")
|
||||||
|
message(STATUS " PERL_EXECUTABLE = ${PERL_EXECUTABLE}")
|
||||||
|
message(STATUS " PERL_SITESEARCH = ${PERL_SITESEARCH}")
|
||||||
|
message(STATUS " PERL_SITELIB = ${PERL_SITELIB}")
|
||||||
|
message(STATUS " PERL_VENDORARCH = ${PERL_VENDORARCH}")
|
||||||
|
message(STATUS " PERL_VENDORLIB = ${PERL_VENDORLIB}")
|
||||||
|
message(STATUS " PERL_ARCHLIB = ${PERL_ARCHLIB}")
|
||||||
|
message(STATUS " PERL_PRIVLIB = ${PERL_PRIVLIB}")
|
||||||
|
message(STATUS " PERL_EXTRA_C_FLAGS = ${PERL_EXTRA_C_FLAGS}")
|
||||||
|
# Second show the configuration extracted by this module (FindPerlEmbed):
|
||||||
|
message(STATUS " PerlEmbed_ARCHNAME = ${PerlEmbed_ARCHNAME}")
|
||||||
|
message(STATUS " PerlEmbed_CCFLAGS = ${PerlEmbed_CCFLAGS}")
|
||||||
|
message(STATUS " PerlEmbed_CCCDLFLAGS = ${PerlEmbed_CCCDLFLAGS}")
|
||||||
|
message(STATUS " LD = ${PerlEmbed_LD}")
|
||||||
|
message(STATUS " PerlEmbed_LDFLAGS = ${PerlEmbed_LDFLAGS}")
|
||||||
|
message(STATUS " PerlEmbed_LDDLFLAGS = ${PerlEmbed_LDDLFLAGS}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
|
||||||
|
find_package_handle_standard_args(PerlEmbed
|
||||||
|
REQUIRED_VARS PerlEmbed_CCFLAGS PerlEmbed_LDFLAGS
|
||||||
|
VERSION_VAR PERL_VERSION)
|
||||||
20
cmake/modules/FindTBB.cmake
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# ported from PrusaSlicer
|
||||||
|
set(_q "")
|
||||||
|
if(${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY)
|
||||||
|
set(_q QUIET)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
|
||||||
|
find_package(${CMAKE_FIND_PACKAGE_NAME} ${${CMAKE_FIND_PACKAGE_NAME}_FIND_VERSION} CONFIG ${_q})
|
||||||
|
|
||||||
|
if(NOT ${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY)
|
||||||
|
if (NOT ${CMAKE_FIND_PACKAGE_NAME}_FOUND)
|
||||||
|
message(STATUS "Falling back to MODULE search for ${CMAKE_FIND_PACKAGE_NAME}...")
|
||||||
|
else()
|
||||||
|
message(STATUS "${CMAKE_FIND_PACKAGE_NAME} found in ${${CMAKE_FIND_PACKAGE_NAME}_DIR}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (NOT ${CMAKE_FIND_PACKAGE_NAME}_FOUND)
|
||||||
|
include(${CMAKE_CURRENT_LIST_DIR}/FindTBB.cmake.in)
|
||||||
|
endif ()
|
||||||
332
cmake/modules/FindTBB.cmake.in
Normal file
@@ -0,0 +1,332 @@
|
|||||||
|
# The MIT License (MIT)
|
||||||
|
#
|
||||||
|
# Copyright (c) 2015 Justus Calvin
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
# of this software and associated documentation files (the "Software"), to deal
|
||||||
|
# in the Software without restriction, including without limitation the rights
|
||||||
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
# copies of the Software, and to permit persons to whom the Software is
|
||||||
|
# furnished to do so, subject to the following conditions:
|
||||||
|
#
|
||||||
|
# The above copyright notice and this permission notice shall be included in all
|
||||||
|
# copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
# SOFTWARE.
|
||||||
|
|
||||||
|
#
|
||||||
|
# FindTBB
|
||||||
|
# -------
|
||||||
|
#
|
||||||
|
# Find TBB include directories and libraries.
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
#
|
||||||
|
# find_package(TBB [major[.minor]] [EXACT]
|
||||||
|
# [QUIET] [REQUIRED]
|
||||||
|
# [[COMPONENTS] [components...]]
|
||||||
|
# [OPTIONAL_COMPONENTS components...])
|
||||||
|
#
|
||||||
|
# where the allowed components are tbbmalloc and tbb_preview. Users may modify
|
||||||
|
# the behavior of this module with the following variables:
|
||||||
|
#
|
||||||
|
# * TBB_ROOT_DIR - The base directory the of TBB installation.
|
||||||
|
# * TBB_INCLUDE_DIR - The directory that contains the TBB headers files.
|
||||||
|
# * TBB_LIBRARY - The directory that contains the TBB library files.
|
||||||
|
# * TBB_<library>_LIBRARY - The path of the TBB the corresponding TBB library.
|
||||||
|
# These libraries, if specified, override the
|
||||||
|
# corresponding library search results, where <library>
|
||||||
|
# may be tbb, tbb_debug, tbbmalloc, tbbmalloc_debug,
|
||||||
|
# tbb_preview, or tbb_preview_debug.
|
||||||
|
# * TBB_USE_DEBUG_BUILD - The debug version of tbb libraries, if present, will
|
||||||
|
# be used instead of the release version.
|
||||||
|
# * TBB_STATIC - Static linking of libraries with a _static suffix.
|
||||||
|
# For example, on Windows a tbb_static.lib will be searched for
|
||||||
|
# instead of tbb.lib.
|
||||||
|
#
|
||||||
|
# Users may modify the behavior of this module with the following environment
|
||||||
|
# variables:
|
||||||
|
#
|
||||||
|
# * TBB_INSTALL_DIR
|
||||||
|
# * TBBROOT
|
||||||
|
# * LIBRARY_PATH
|
||||||
|
#
|
||||||
|
# This module will set the following variables:
|
||||||
|
#
|
||||||
|
# * TBB_FOUND - Set to false, or undefined, if we haven’t found, or
|
||||||
|
# don’t want to use TBB.
|
||||||
|
# * TBB_<component>_FOUND - If False, optional <component> part of TBB system is
|
||||||
|
# not available.
|
||||||
|
# * TBB_VERSION - The full version string
|
||||||
|
# * TBB_VERSION_MAJOR - The major version
|
||||||
|
# * TBB_VERSION_MINOR - The minor version
|
||||||
|
# * TBB_INTERFACE_VERSION - The interface version number defined in
|
||||||
|
# tbb/tbb_stddef.h.
|
||||||
|
# * TBB_<library>_LIBRARY_RELEASE - The path of the TBB release version of
|
||||||
|
# <library>, where <library> may be tbb, tbb_debug,
|
||||||
|
# tbbmalloc, tbbmalloc_debug, tbb_preview, or
|
||||||
|
# tbb_preview_debug.
|
||||||
|
# * TBB_<library>_LIBRARY_DEGUG - The path of the TBB release version of
|
||||||
|
# <library>, where <library> may be tbb, tbb_debug,
|
||||||
|
# tbbmalloc, tbbmalloc_debug, tbb_preview, or
|
||||||
|
# tbb_preview_debug.
|
||||||
|
#
|
||||||
|
# The following variables should be used to build and link with TBB:
|
||||||
|
#
|
||||||
|
# * TBB_INCLUDE_DIRS - The include directory for TBB.
|
||||||
|
# * TBB_LIBRARIES - The libraries to link against to use TBB.
|
||||||
|
# * TBB_LIBRARIES_RELEASE - The release libraries to link against to use TBB.
|
||||||
|
# * TBB_LIBRARIES_DEBUG - The debug libraries to link against to use TBB.
|
||||||
|
# * TBB_DEFINITIONS - Definitions to use when compiling code that uses
|
||||||
|
# TBB.
|
||||||
|
# * TBB_DEFINITIONS_RELEASE - Definitions to use when compiling release code that
|
||||||
|
# uses TBB.
|
||||||
|
# * TBB_DEFINITIONS_DEBUG - Definitions to use when compiling debug code that
|
||||||
|
# uses TBB.
|
||||||
|
#
|
||||||
|
# This module will also create the "tbb" target that may be used when building
|
||||||
|
# executables and libraries.
|
||||||
|
|
||||||
|
unset(TBB_FOUND CACHE)
|
||||||
|
unset(TBB_INCLUDE_DIRS CACHE)
|
||||||
|
unset(TBB_LIBRARIES)
|
||||||
|
unset(TBB_LIBRARIES_DEBUG)
|
||||||
|
unset(TBB_LIBRARIES_RELEASE)
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
|
||||||
|
find_package(Threads QUIET REQUIRED)
|
||||||
|
|
||||||
|
if(NOT TBB_FOUND)
|
||||||
|
|
||||||
|
##################################
|
||||||
|
# Check the build type
|
||||||
|
##################################
|
||||||
|
|
||||||
|
if(NOT DEFINED TBB_USE_DEBUG_BUILD)
|
||||||
|
if(CMAKE_BUILD_TYPE MATCHES "(Debug|DEBUG|debug)")
|
||||||
|
set(TBB_BUILD_TYPE DEBUG)
|
||||||
|
else()
|
||||||
|
set(TBB_BUILD_TYPE RELEASE)
|
||||||
|
endif()
|
||||||
|
elseif(TBB_USE_DEBUG_BUILD)
|
||||||
|
set(TBB_BUILD_TYPE DEBUG)
|
||||||
|
else()
|
||||||
|
set(TBB_BUILD_TYPE RELEASE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
##################################
|
||||||
|
# Set the TBB search directories
|
||||||
|
##################################
|
||||||
|
|
||||||
|
# Define search paths based on user input and environment variables
|
||||||
|
set(TBB_SEARCH_DIR ${TBB_ROOT_DIR} $ENV{TBB_INSTALL_DIR} $ENV{TBBROOT})
|
||||||
|
|
||||||
|
# Define the search directories based on the current platform
|
||||||
|
if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
||||||
|
set(TBB_DEFAULT_SEARCH_DIR "C:/Program Files/Intel/TBB"
|
||||||
|
"C:/Program Files (x86)/Intel/TBB")
|
||||||
|
|
||||||
|
# Set the target architecture
|
||||||
|
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
||||||
|
set(TBB_ARCHITECTURE "intel64")
|
||||||
|
else()
|
||||||
|
set(TBB_ARCHITECTURE "ia32")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Set the TBB search library path search suffix based on the version of VC
|
||||||
|
if(WINDOWS_STORE)
|
||||||
|
set(TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc11_ui")
|
||||||
|
elseif(MSVC14)
|
||||||
|
set(TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc14")
|
||||||
|
elseif(MSVC12)
|
||||||
|
set(TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc12")
|
||||||
|
elseif(MSVC11)
|
||||||
|
set(TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc11")
|
||||||
|
elseif(MSVC10)
|
||||||
|
set(TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc10")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Add the library path search suffix for the VC independent version of TBB
|
||||||
|
list(APPEND TBB_LIB_PATH_SUFFIX "lib/${TBB_ARCHITECTURE}/vc_mt")
|
||||||
|
|
||||||
|
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
|
||||||
|
# OS X
|
||||||
|
set(TBB_DEFAULT_SEARCH_DIR "/opt/intel/tbb")
|
||||||
|
|
||||||
|
# TODO: Check to see which C++ library is being used by the compiler.
|
||||||
|
if(NOT ${CMAKE_SYSTEM_VERSION} VERSION_LESS 13.0)
|
||||||
|
# The default C++ library on OS X 10.9 and later is libc++
|
||||||
|
set(TBB_LIB_PATH_SUFFIX "lib/libc++" "lib")
|
||||||
|
else()
|
||||||
|
set(TBB_LIB_PATH_SUFFIX "lib")
|
||||||
|
endif()
|
||||||
|
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||||||
|
# Linux
|
||||||
|
set(TBB_DEFAULT_SEARCH_DIR "/opt/intel/tbb")
|
||||||
|
|
||||||
|
# TODO: Check compiler version to see the suffix should be <arch>/gcc4.1 or
|
||||||
|
# <arch>/gcc4.1. For now, assume that the compiler is more recent than
|
||||||
|
# gcc 4.4.x or later.
|
||||||
|
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
|
||||||
|
set(TBB_LIB_PATH_SUFFIX "lib/intel64/gcc4.4")
|
||||||
|
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^i.86$")
|
||||||
|
set(TBB_LIB_PATH_SUFFIX "lib/ia32/gcc4.4")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
##################################
|
||||||
|
# Find the TBB include dir
|
||||||
|
##################################
|
||||||
|
|
||||||
|
find_path(TBB_INCLUDE_DIRS tbb/tbb.h
|
||||||
|
HINTS ${TBB_INCLUDE_DIR} ${TBB_SEARCH_DIR}
|
||||||
|
PATHS ${TBB_DEFAULT_SEARCH_DIR}
|
||||||
|
PATH_SUFFIXES include)
|
||||||
|
|
||||||
|
##################################
|
||||||
|
# Set version strings
|
||||||
|
##################################
|
||||||
|
|
||||||
|
if(TBB_INCLUDE_DIRS)
|
||||||
|
file(READ "${TBB_INCLUDE_DIRS}/tbb/tbb_stddef.h" _tbb_version_file)
|
||||||
|
string(REGEX REPLACE ".*#define TBB_VERSION_MAJOR ([0-9]+).*" "\\1"
|
||||||
|
TBB_VERSION_MAJOR "${_tbb_version_file}")
|
||||||
|
string(REGEX REPLACE ".*#define TBB_VERSION_MINOR ([0-9]+).*" "\\1"
|
||||||
|
TBB_VERSION_MINOR "${_tbb_version_file}")
|
||||||
|
string(REGEX REPLACE ".*#define TBB_INTERFACE_VERSION ([0-9]+).*" "\\1"
|
||||||
|
TBB_INTERFACE_VERSION "${_tbb_version_file}")
|
||||||
|
set(TBB_VERSION "${TBB_VERSION_MAJOR}.${TBB_VERSION_MINOR}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
##################################
|
||||||
|
# Find TBB components
|
||||||
|
##################################
|
||||||
|
|
||||||
|
if(TBB_VERSION VERSION_LESS 4.3)
|
||||||
|
set(TBB_SEARCH_COMPOMPONENTS tbb_preview tbbmalloc tbb)
|
||||||
|
else()
|
||||||
|
set(TBB_SEARCH_COMPOMPONENTS tbb_preview tbbmalloc_proxy tbbmalloc tbb)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(TBB_STATIC)
|
||||||
|
set(TBB_STATIC_SUFFIX "_static")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Find each component
|
||||||
|
foreach(_comp ${TBB_SEARCH_COMPOMPONENTS})
|
||||||
|
if(";${TBB_FIND_COMPONENTS};tbb;" MATCHES ";${_comp};")
|
||||||
|
|
||||||
|
unset(TBB_${_comp}_LIBRARY_DEBUG CACHE)
|
||||||
|
unset(TBB_${_comp}_LIBRARY_RELEASE CACHE)
|
||||||
|
|
||||||
|
# Search for the libraries
|
||||||
|
find_library(TBB_${_comp}_LIBRARY_RELEASE ${_comp}${TBB_STATIC_SUFFIX}
|
||||||
|
HINTS ${TBB_LIBRARY} ${TBB_SEARCH_DIR}
|
||||||
|
PATHS ${TBB_DEFAULT_SEARCH_DIR} ENV LIBRARY_PATH
|
||||||
|
PATH_SUFFIXES ${TBB_LIB_PATH_SUFFIX})
|
||||||
|
|
||||||
|
find_library(TBB_${_comp}_LIBRARY_DEBUG ${_comp}${TBB_STATIC_SUFFIX}_debug
|
||||||
|
HINTS ${TBB_LIBRARY} ${TBB_SEARCH_DIR}
|
||||||
|
PATHS ${TBB_DEFAULT_SEARCH_DIR} ENV LIBRARY_PATH
|
||||||
|
PATH_SUFFIXES ${TBB_LIB_PATH_SUFFIX})
|
||||||
|
|
||||||
|
if(TBB_${_comp}_LIBRARY_DEBUG)
|
||||||
|
list(APPEND TBB_LIBRARIES_DEBUG "${TBB_${_comp}_LIBRARY_DEBUG}")
|
||||||
|
endif()
|
||||||
|
if(TBB_${_comp}_LIBRARY_RELEASE)
|
||||||
|
list(APPEND TBB_LIBRARIES_RELEASE "${TBB_${_comp}_LIBRARY_RELEASE}")
|
||||||
|
endif()
|
||||||
|
if(TBB_${_comp}_LIBRARY_${TBB_BUILD_TYPE} AND NOT TBB_${_comp}_LIBRARY)
|
||||||
|
set(TBB_${_comp}_LIBRARY "${TBB_${_comp}_LIBRARY_${TBB_BUILD_TYPE}}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(TBB_${_comp}_LIBRARY AND EXISTS "${TBB_${_comp}_LIBRARY}")
|
||||||
|
set(TBB_${_comp}_FOUND TRUE)
|
||||||
|
else()
|
||||||
|
set(TBB_${_comp}_FOUND FALSE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Mark internal variables as advanced
|
||||||
|
mark_as_advanced(TBB_${_comp}_LIBRARY_RELEASE)
|
||||||
|
mark_as_advanced(TBB_${_comp}_LIBRARY_DEBUG)
|
||||||
|
mark_as_advanced(TBB_${_comp}_LIBRARY)
|
||||||
|
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
##################################
|
||||||
|
# Set compile flags and libraries
|
||||||
|
##################################
|
||||||
|
|
||||||
|
set(TBB_DEFINITIONS_RELEASE "")
|
||||||
|
set(TBB_DEFINITIONS_DEBUG "TBB_USE_DEBUG=1")
|
||||||
|
|
||||||
|
if(TBB_LIBRARIES_${TBB_BUILD_TYPE})
|
||||||
|
set(TBB_LIBRARIES "${TBB_LIBRARIES_${TBB_BUILD_TYPE}}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(NOT MSVC AND NOT TBB_LIBRARIES)
|
||||||
|
set(TBB_LIBRARIES ${TBB_LIBRARIES_RELEASE})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(TBB_DEFINITIONS "")
|
||||||
|
if (MSVC AND TBB_STATIC)
|
||||||
|
set(TBB_DEFINITIONS __TBB_NO_IMPLICIT_LINKAGE)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
unset (TBB_STATIC_SUFFIX)
|
||||||
|
|
||||||
|
find_package_handle_standard_args(TBB
|
||||||
|
REQUIRED_VARS TBB_INCLUDE_DIRS TBB_LIBRARIES
|
||||||
|
FAIL_MESSAGE "TBB library cannot be found. Consider set TBBROOT environment variable."
|
||||||
|
HANDLE_COMPONENTS
|
||||||
|
VERSION_VAR TBB_VERSION)
|
||||||
|
|
||||||
|
##################################
|
||||||
|
# Create targets
|
||||||
|
##################################
|
||||||
|
|
||||||
|
if(NOT CMAKE_VERSION VERSION_LESS 3.0 AND TBB_FOUND AND NOT TARGET TBB::tbb)
|
||||||
|
add_library(TBB::tbb UNKNOWN IMPORTED)
|
||||||
|
set_target_properties(TBB::tbb PROPERTIES
|
||||||
|
INTERFACE_COMPILE_DEFINITIONS "${TBB_DEFINITIONS}"
|
||||||
|
INTERFACE_LINK_LIBRARIES "Threads::Threads;${CMAKE_DL_LIBS}"
|
||||||
|
INTERFACE_INCLUDE_DIRECTORIES ${TBB_INCLUDE_DIRS}
|
||||||
|
IMPORTED_LOCATION ${TBB_LIBRARIES})
|
||||||
|
if(TBB_LIBRARIES_RELEASE AND TBB_LIBRARIES_DEBUG)
|
||||||
|
set_target_properties(TBB::tbb PROPERTIES
|
||||||
|
INTERFACE_COMPILE_DEFINITIONS "${TBB_DEFINITIONS};$<$<OR:$<CONFIG:Release>,$<CONFIG:RelWithDebInfo>>:${TBB_DEFINITIONS_RELEASE}>;$<$<CONFIG:Debug>:${TBB_DEFINITIONS_DEBUG}>"
|
||||||
|
IMPORTED_LOCATION_DEBUG ${TBB_LIBRARIES_DEBUG}
|
||||||
|
IMPORTED_LOCATION_RELWITHDEBINFO ${TBB_LIBRARIES_RELEASE}
|
||||||
|
IMPORTED_LOCATION_RELEASE ${TBB_LIBRARIES_RELEASE}
|
||||||
|
IMPORTED_LOCATION_MINSIZEREL ${TBB_LIBRARIES_RELEASE}
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
mark_as_advanced(TBB_INCLUDE_DIRS TBB_LIBRARIES)
|
||||||
|
|
||||||
|
unset(TBB_ARCHITECTURE)
|
||||||
|
unset(TBB_BUILD_TYPE)
|
||||||
|
unset(TBB_LIB_PATH_SUFFIX)
|
||||||
|
unset(TBB_DEFAULT_SEARCH_DIR)
|
||||||
|
|
||||||
|
if(TBB_DEBUG)
|
||||||
|
message(STATUS " TBB_FOUND = ${TBB_FOUND}")
|
||||||
|
message(STATUS " TBB_INCLUDE_DIRS = ${TBB_INCLUDE_DIRS}")
|
||||||
|
message(STATUS " TBB_DEFINITIONS = ${TBB_DEFINITIONS}")
|
||||||
|
message(STATUS " TBB_LIBRARIES = ${TBB_LIBRARIES}")
|
||||||
|
message(STATUS " TBB_DEFINITIONS_DEBUG = ${TBB_DEFINITIONS_DEBUG}")
|
||||||
|
message(STATUS " TBB_LIBRARIES_DEBUG = ${TBB_LIBRARIES_DEBUG}")
|
||||||
|
message(STATUS " TBB_DEFINITIONS_RELEASE = ${TBB_DEFINITIONS_RELEASE}")
|
||||||
|
message(STATUS " TBB_LIBRARIES_RELEASE = ${TBB_LIBRARIES_RELEASE}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
endif()
|
||||||
26
cmake/modules/Findcereal.cmake
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
set(_q "")
|
||||||
|
if(${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY)
|
||||||
|
set(_q QUIET)
|
||||||
|
set(_quietly TRUE)
|
||||||
|
endif()
|
||||||
|
find_package(${CMAKE_FIND_PACKAGE_NAME} ${${CMAKE_FIND_PACKAGE_NAME}_FIND_VERSION} CONFIG ${_q})
|
||||||
|
|
||||||
|
if (NOT ${CMAKE_FIND_PACKAGE_NAME}_FOUND)
|
||||||
|
# Fall-back solution to find the Cereal serialization library header file
|
||||||
|
include(CheckIncludeFileCXX)
|
||||||
|
add_library(cereal INTERFACE)
|
||||||
|
target_include_directories(cereal INTERFACE include)
|
||||||
|
|
||||||
|
if (_quietly)
|
||||||
|
set(CMAKE_REQUIRED_QUIET ON)
|
||||||
|
endif()
|
||||||
|
CHECK_INCLUDE_FILE_CXX("cereal/cereal.hpp" HAVE_CEREAL_H)
|
||||||
|
|
||||||
|
if (NOT HAVE_CEREAL_H)
|
||||||
|
if (${CMAKE_FIND_PACKAGE_NAME}_FIND_REQUIRED)
|
||||||
|
message(FATAL_ERROR "Cereal library not found. Please install the dependency.")
|
||||||
|
elseif(NOT _quietly)
|
||||||
|
message(WARNING "Cereal library not found.")
|
||||||
|
endif()
|
||||||
|
endif ()
|
||||||
|
endif()
|
||||||
41
cmake/modules/Findlibnoise.cmake
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
find_path(LIBNOISE_INCLUDE_DIR libnoise/noise.h)
|
||||||
|
find_library(LIBNOISE_LIBRARY_RELEASE NAMES libnoise libnoise_static liblibnoise_static)
|
||||||
|
find_library(LIBNOISE_LIBRARY_DEBUG NAMES libnoised libnoise_staticd liblibnoise_staticd)
|
||||||
|
|
||||||
|
set(libnoise_LIB_FOUND FALSE)
|
||||||
|
if (LIBNOISE_LIBRARY_RELEASE OR LIBNOISE_LIBRARY_DEBUG)
|
||||||
|
set(libnoise_LIB_FOUND TRUE)
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
include(FindPackageHandleStandardArgs)
|
||||||
|
find_package_handle_standard_args(libnoise DEFAULT_MSG
|
||||||
|
libnoise_LIB_FOUND
|
||||||
|
LIBNOISE_INCLUDE_DIR
|
||||||
|
)
|
||||||
|
|
||||||
|
if(libnoise_FOUND)
|
||||||
|
add_library(noise::noise STATIC IMPORTED)
|
||||||
|
|
||||||
|
set_target_properties(noise::noise PROPERTIES
|
||||||
|
INTERFACE_INCLUDE_DIRECTORIES "${LIBNOISE_INCLUDE_DIR}"
|
||||||
|
)
|
||||||
|
if (NOT libnoise_FIND_QUIETLY)
|
||||||
|
message(STATUS "Found libnoise include directory: ${LIBNOISE_INCLUDE_DIR}")
|
||||||
|
if (LIBNOISE_LIBRARY_RELEASE)
|
||||||
|
message(STATUS "Found libnoise RELEASE library: ${LIBNOISE_LIBRARY_RELEASE}")
|
||||||
|
endif ()
|
||||||
|
if (LIBNOISE_LIBRARY_DEBUG)
|
||||||
|
message(STATUS "Found libnoise DEBUG library: ${LIBNOISE_LIBRARY_DEBUG}")
|
||||||
|
endif ()
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (LIBNOISE_LIBRARY_RELEASE)
|
||||||
|
set_property(TARGET noise::noise APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
|
||||||
|
set_target_properties(noise::noise PROPERTIES IMPORTED_LOCATION_RELEASE ${LIBNOISE_LIBRARY_RELEASE})
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
if (LIBNOISE_LIBRARY_DEBUG)
|
||||||
|
set_property(TARGET noise::noise APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
|
||||||
|
set_target_properties(noise::noise PROPERTIES IMPORTED_LOCATION_DEBUG ${LIBNOISE_LIBRARY_DEBUG})
|
||||||
|
endif ()
|
||||||
|
endif()
|
||||||
265
cmake/modules/LibFindMacros.cmake
Normal file
@@ -0,0 +1,265 @@
|
|||||||
|
# Version 2.2
|
||||||
|
# Public Domain, originally written by Lasse Kärkkäinen <tronic>
|
||||||
|
# Maintained at https://github.com/Tronic/cmake-modules
|
||||||
|
# Please send your improvements as pull requests on Github.
|
||||||
|
|
||||||
|
# Find another package and make it a dependency of the current package.
|
||||||
|
# This also automatically forwards the "REQUIRED" argument.
|
||||||
|
# Usage: libfind_package(<prefix> <another package> [extra args to find_package])
|
||||||
|
macro (libfind_package PREFIX PKG)
|
||||||
|
set(${PREFIX}_args ${PKG} ${ARGN})
|
||||||
|
if (${PREFIX}_FIND_REQUIRED)
|
||||||
|
set(${PREFIX}_args ${${PREFIX}_args} REQUIRED)
|
||||||
|
endif()
|
||||||
|
find_package(${${PREFIX}_args})
|
||||||
|
set(${PREFIX}_DEPENDENCIES ${${PREFIX}_DEPENDENCIES};${PKG})
|
||||||
|
unset(${PREFIX}_args)
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
# A simple wrapper to make pkg-config searches a bit easier.
|
||||||
|
# Works the same as CMake's internal pkg_check_modules but is always quiet.
|
||||||
|
macro (libfind_pkg_check_modules)
|
||||||
|
find_package(PkgConfig QUIET)
|
||||||
|
if (PKG_CONFIG_FOUND)
|
||||||
|
pkg_check_modules(${ARGN} QUIET)
|
||||||
|
endif()
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
# Avoid useless copy&pasta by doing what most simple libraries do anyway:
|
||||||
|
# pkg-config, find headers, find library.
|
||||||
|
# Usage: libfind_pkg_detect(<prefix> <pkg-config args> FIND_PATH <name> [other args] FIND_LIBRARY <name> [other args])
|
||||||
|
# E.g. libfind_pkg_detect(SDL2 sdl2 FIND_PATH SDL.h PATH_SUFFIXES SDL2 FIND_LIBRARY SDL2)
|
||||||
|
function (libfind_pkg_detect PREFIX)
|
||||||
|
# Parse arguments
|
||||||
|
set(argname pkgargs)
|
||||||
|
foreach (i ${ARGN})
|
||||||
|
if ("${i}" STREQUAL "FIND_PATH")
|
||||||
|
set(argname pathargs)
|
||||||
|
elseif ("${i}" STREQUAL "FIND_LIBRARY")
|
||||||
|
set(argname libraryargs)
|
||||||
|
else()
|
||||||
|
set(${argname} ${${argname}} ${i})
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
if (NOT pkgargs)
|
||||||
|
message(FATAL_ERROR "libfind_pkg_detect requires at least a pkg_config package name to be passed.")
|
||||||
|
endif()
|
||||||
|
# Find library
|
||||||
|
libfind_pkg_check_modules(${PREFIX}_PKGCONF ${pkgargs})
|
||||||
|
if (pathargs)
|
||||||
|
find_path(${PREFIX}_INCLUDE_DIR NAMES ${pathargs} HINTS ${${PREFIX}_PKGCONF_INCLUDE_DIRS})
|
||||||
|
endif()
|
||||||
|
if (libraryargs)
|
||||||
|
find_library(${PREFIX}_LIBRARY NAMES ${libraryargs} HINTS ${${PREFIX}_PKGCONF_LIBRARY_DIRS})
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# Extracts a version #define from a version.h file, output stored to <PREFIX>_VERSION.
|
||||||
|
# Usage: libfind_version_header(Foobar foobar/version.h FOOBAR_VERSION_STR)
|
||||||
|
# Fourth argument "QUIET" may be used for silently testing different define names.
|
||||||
|
# This function does nothing if the version variable is already defined.
|
||||||
|
function (libfind_version_header PREFIX VERSION_H DEFINE_NAME)
|
||||||
|
# Skip processing if we already have a version or if the include dir was not found
|
||||||
|
if (${PREFIX}_VERSION OR NOT ${PREFIX}_INCLUDE_DIR)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
set(quiet ${${PREFIX}_FIND_QUIETLY})
|
||||||
|
# Process optional arguments
|
||||||
|
foreach(arg ${ARGN})
|
||||||
|
if (arg STREQUAL "QUIET")
|
||||||
|
set(quiet TRUE)
|
||||||
|
else()
|
||||||
|
message(AUTHOR_WARNING "Unknown argument ${arg} to libfind_version_header ignored.")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
# Read the header and parse for version number
|
||||||
|
set(filename "${${PREFIX}_INCLUDE_DIR}/${VERSION_H}")
|
||||||
|
if (NOT EXISTS ${filename})
|
||||||
|
if (NOT quiet)
|
||||||
|
message(AUTHOR_WARNING "Unable to find ${${PREFIX}_INCLUDE_DIR}/${VERSION_H}")
|
||||||
|
endif()
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
file(READ "${filename}" header)
|
||||||
|
string(REGEX REPLACE ".*#[ \t]*define[ \t]*${DEFINE_NAME}[ \t]*\"([^\n]*)\".*" "\\1" match "${header}")
|
||||||
|
# No regex match?
|
||||||
|
if (match STREQUAL header)
|
||||||
|
if (NOT quiet)
|
||||||
|
message(AUTHOR_WARNING "Unable to find \#define ${DEFINE_NAME} \"<version>\" from ${${PREFIX}_INCLUDE_DIR}/${VERSION_H}")
|
||||||
|
endif()
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
# Export the version string
|
||||||
|
set(${PREFIX}_VERSION "${match}" PARENT_SCOPE)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
# Do the final processing once the paths have been detected.
|
||||||
|
# If include dirs are needed, ${PREFIX}_PROCESS_INCLUDES should be set to contain
|
||||||
|
# all the variables, each of which contain one include directory.
|
||||||
|
# Ditto for ${PREFIX}_PROCESS_LIBS and library files.
|
||||||
|
# Will set ${PREFIX}_FOUND, ${PREFIX}_INCLUDE_DIRS and ${PREFIX}_LIBRARIES.
|
||||||
|
# Also handles errors in case library detection was required, etc.
|
||||||
|
function (libfind_process PREFIX)
|
||||||
|
# Skip processing if already processed during this configuration run
|
||||||
|
if (${PREFIX}_FOUND)
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(found TRUE) # Start with the assumption that the package was found
|
||||||
|
|
||||||
|
# Did we find any files? Did we miss includes? These are for formatting better error messages.
|
||||||
|
set(some_files FALSE)
|
||||||
|
set(missing_headers FALSE)
|
||||||
|
|
||||||
|
# Shorthands for some variables that we need often
|
||||||
|
set(quiet ${${PREFIX}_FIND_QUIETLY})
|
||||||
|
set(required ${${PREFIX}_FIND_REQUIRED})
|
||||||
|
set(exactver ${${PREFIX}_FIND_VERSION_EXACT})
|
||||||
|
set(findver "${${PREFIX}_FIND_VERSION}")
|
||||||
|
set(version "${${PREFIX}_VERSION}")
|
||||||
|
|
||||||
|
# Lists of config option names (all, includes, libs)
|
||||||
|
unset(configopts)
|
||||||
|
set(includeopts ${${PREFIX}_PROCESS_INCLUDES})
|
||||||
|
set(libraryopts ${${PREFIX}_PROCESS_LIBS})
|
||||||
|
|
||||||
|
# Process deps to add to
|
||||||
|
foreach (i ${PREFIX} ${${PREFIX}_DEPENDENCIES})
|
||||||
|
if (DEFINED ${i}_INCLUDE_OPTS OR DEFINED ${i}_LIBRARY_OPTS)
|
||||||
|
# The package seems to export option lists that we can use, woohoo!
|
||||||
|
list(APPEND includeopts ${${i}_INCLUDE_OPTS})
|
||||||
|
list(APPEND libraryopts ${${i}_LIBRARY_OPTS})
|
||||||
|
else()
|
||||||
|
# If plural forms don't exist or they equal singular forms
|
||||||
|
if ((NOT DEFINED ${i}_INCLUDE_DIRS AND NOT DEFINED ${i}_LIBRARIES) OR
|
||||||
|
({i}_INCLUDE_DIR STREQUAL ${i}_INCLUDE_DIRS AND ${i}_LIBRARY STREQUAL ${i}_LIBRARIES))
|
||||||
|
# Singular forms can be used
|
||||||
|
if (DEFINED ${i}_INCLUDE_DIR)
|
||||||
|
list(APPEND includeopts ${i}_INCLUDE_DIR)
|
||||||
|
endif()
|
||||||
|
if (DEFINED ${i}_LIBRARY)
|
||||||
|
list(APPEND libraryopts ${i}_LIBRARY)
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
# Oh no, we don't know the option names
|
||||||
|
message(FATAL_ERROR "We couldn't determine config variable names for ${i} includes and libs. Aieeh!")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
if (includeopts)
|
||||||
|
list(REMOVE_DUPLICATES includeopts)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if (libraryopts)
|
||||||
|
list(REMOVE_DUPLICATES libraryopts)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
string(REGEX REPLACE ".*[ ;]([^ ;]*(_INCLUDE_DIRS|_LIBRARIES))" "\\1" tmp "${includeopts} ${libraryopts}")
|
||||||
|
if (NOT tmp STREQUAL "${includeopts} ${libraryopts}")
|
||||||
|
message(AUTHOR_WARNING "Plural form ${tmp} found in config options of ${PREFIX}. This works as before but is now deprecated. Please only use singular forms INCLUDE_DIR and LIBRARY, and update your find scripts for LibFindMacros > 2.0 automatic dependency system (most often you can simply remove the PROCESS variables entirely).")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Include/library names separated by spaces (notice: not CMake lists)
|
||||||
|
unset(includes)
|
||||||
|
unset(libs)
|
||||||
|
|
||||||
|
# Process all includes and set found false if any are missing
|
||||||
|
foreach (i ${includeopts})
|
||||||
|
list(APPEND configopts ${i})
|
||||||
|
if (NOT "${${i}}" STREQUAL "${i}-NOTFOUND")
|
||||||
|
list(APPEND includes "${${i}}")
|
||||||
|
else()
|
||||||
|
set(found FALSE)
|
||||||
|
set(missing_headers TRUE)
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
# Process all libraries and set found false if any are missing
|
||||||
|
foreach (i ${libraryopts})
|
||||||
|
list(APPEND configopts ${i})
|
||||||
|
if (NOT "${${i}}" STREQUAL "${i}-NOTFOUND")
|
||||||
|
list(APPEND libs "${${i}}")
|
||||||
|
else()
|
||||||
|
set (found FALSE)
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
# Version checks
|
||||||
|
if (found AND findver)
|
||||||
|
if (NOT version)
|
||||||
|
message(WARNING "The find module for ${PREFIX} does not provide version information, so we'll just assume that it is OK. Please fix the module or remove package version requirements to get rid of this warning.")
|
||||||
|
elseif (version VERSION_LESS findver OR (exactver AND NOT version VERSION_EQUAL findver))
|
||||||
|
set(found FALSE)
|
||||||
|
set(version_unsuitable TRUE)
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# If all-OK, hide all config options, export variables, print status and exit
|
||||||
|
if (found)
|
||||||
|
foreach (i ${configopts})
|
||||||
|
mark_as_advanced(${i})
|
||||||
|
endforeach()
|
||||||
|
if (NOT quiet)
|
||||||
|
message(STATUS "Found ${PREFIX} ${${PREFIX}_VERSION}")
|
||||||
|
if (LIBFIND_DEBUG)
|
||||||
|
message(STATUS " ${PREFIX}_DEPENDENCIES=${${PREFIX}_DEPENDENCIES}")
|
||||||
|
message(STATUS " ${PREFIX}_INCLUDE_OPTS=${includeopts}")
|
||||||
|
message(STATUS " ${PREFIX}_INCLUDE_DIRS=${includes}")
|
||||||
|
message(STATUS " ${PREFIX}_LIBRARY_OPTS=${libraryopts}")
|
||||||
|
message(STATUS " ${PREFIX}_LIBRARIES=${libs}")
|
||||||
|
endif()
|
||||||
|
set (${PREFIX}_INCLUDE_OPTS ${includeopts} PARENT_SCOPE)
|
||||||
|
set (${PREFIX}_LIBRARY_OPTS ${libraryopts} PARENT_SCOPE)
|
||||||
|
set (${PREFIX}_INCLUDE_DIRS ${includes} PARENT_SCOPE)
|
||||||
|
set (${PREFIX}_LIBRARIES ${libs} PARENT_SCOPE)
|
||||||
|
set (${PREFIX}_FOUND TRUE PARENT_SCOPE)
|
||||||
|
endif()
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Format messages for debug info and the type of error
|
||||||
|
set(vars "Relevant CMake configuration variables:\n")
|
||||||
|
foreach (i ${configopts})
|
||||||
|
mark_as_advanced(CLEAR ${i})
|
||||||
|
set(val ${${i}})
|
||||||
|
if ("${val}" STREQUAL "${i}-NOTFOUND")
|
||||||
|
set (val "<not found>")
|
||||||
|
elseif (val AND NOT EXISTS ${val})
|
||||||
|
set (val "${val} (does not exist)")
|
||||||
|
else()
|
||||||
|
set(some_files TRUE)
|
||||||
|
endif()
|
||||||
|
set(vars "${vars} ${i}=${val}\n")
|
||||||
|
endforeach()
|
||||||
|
set(vars "${vars}You may use CMake GUI, cmake -D or ccmake to modify the values. Delete CMakeCache.txt to discard all values and force full re-detection if necessary.\n")
|
||||||
|
if (version_unsuitable)
|
||||||
|
set(msg "${PREFIX} ${${PREFIX}_VERSION} was found but")
|
||||||
|
if (exactver)
|
||||||
|
set(msg "${msg} only version ${findver} is acceptable.")
|
||||||
|
else()
|
||||||
|
set(msg "${msg} version ${findver} is the minimum requirement.")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
if (missing_headers)
|
||||||
|
set(msg "We could not find development headers for ${PREFIX}. Do you have the necessary dev package installed?")
|
||||||
|
elseif (some_files)
|
||||||
|
set(msg "We only found some files of ${PREFIX}, not all of them. Perhaps your installation is incomplete or maybe we just didn't look in the right place?")
|
||||||
|
if(findver)
|
||||||
|
set(msg "${msg} This could also be caused by incompatible version (if it helps, at least ${PREFIX} ${findver} should work).")
|
||||||
|
endif()
|
||||||
|
else()
|
||||||
|
set(msg "We were unable to find package ${PREFIX}.")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Fatal error out if REQUIRED
|
||||||
|
if (required)
|
||||||
|
set(msg "REQUIRED PACKAGE NOT FOUND\n${msg} This package is REQUIRED and you need to install it or adjust CMake configuration in order to continue building ${CMAKE_PROJECT_NAME}.")
|
||||||
|
message(FATAL_ERROR "${msg}\n${vars}")
|
||||||
|
endif()
|
||||||
|
# Otherwise just print a nasty warning
|
||||||
|
if (NOT quiet)
|
||||||
|
message(WARNING "WARNING: MISSING PACKAGE\n${msg} This package is NOT REQUIRED and you may ignore this warning but by doing so you may miss some functionality of ${CMAKE_PROJECT_NAME}. \n${vars}")
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
143
cmake/modules/MacOSXBundleInfo.plist.in
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleDevelopmentRegion</key>
|
||||||
|
<string>English</string>
|
||||||
|
<key>CFBundleExecutable</key>
|
||||||
|
<string>${MACOSX_BUNDLE_EXECUTABLE_NAME}</string>
|
||||||
|
<key>CFBundleGetInfoString</key>
|
||||||
|
<string>${MACOSX_BUNDLE_INFO_STRING}</string>
|
||||||
|
<key>CFBundleIconFile</key>
|
||||||
|
<string>${MACOSX_BUNDLE_ICON_FILE}</string>
|
||||||
|
<key>CFBundleIdentifier</key>
|
||||||
|
<string>com.orcaslicer.OrcaSlicer</string>
|
||||||
|
<key>CFBundleInfoDictionaryVersion</key>
|
||||||
|
<string>6.0</string>
|
||||||
|
<key>CFBundleLongVersionString</key>
|
||||||
|
<string>${MACOSX_BUNDLE_LONG_VERSION_STRING}</string>
|
||||||
|
<key>CFBundleName</key>
|
||||||
|
<string>${MACOSX_BUNDLE_BUNDLE_NAME}</string>
|
||||||
|
<key>CFBundlePackageType</key>
|
||||||
|
<string>APPL</string>
|
||||||
|
<key>CFBundleShortVersionString</key>
|
||||||
|
<string>${MACOSX_BUNDLE_SHORT_VERSION_STRING}</string>
|
||||||
|
<key>CFBundleSignature</key>
|
||||||
|
<string>????</string>
|
||||||
|
<key>CFBundleVersion</key>
|
||||||
|
<string>${MACOSX_BUNDLE_BUNDLE_VERSION}</string>
|
||||||
|
<key>ATSApplicationFontsPath</key>
|
||||||
|
<string>fonts/</string>
|
||||||
|
<key>CFBundleURLTypes</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleURLName</key>
|
||||||
|
<string>OrcaSlicer Downloads</string>
|
||||||
|
<key>CFBundleURLSchemes</key>
|
||||||
|
<array>
|
||||||
|
<string>orcaslicer</string>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleDocumentTypes</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleTypeExtensions</key>
|
||||||
|
<array>
|
||||||
|
<string>stl</string>
|
||||||
|
<string>STL</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeIconFile</key>
|
||||||
|
<string>images/stl.icns</string>
|
||||||
|
<key>CFBundleTypeName</key>
|
||||||
|
<string>STL</string>
|
||||||
|
<key>CFBundleTypeRole</key>
|
||||||
|
<string>Viewer</string>
|
||||||
|
<key>LISsAppleDefaultForType</key>
|
||||||
|
<true/>
|
||||||
|
<key>LSHandlerRank</key>
|
||||||
|
<string>Alternate</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleTypeExtensions</key>
|
||||||
|
<array>
|
||||||
|
<string>obj</string>
|
||||||
|
<string>OBJ</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeIconFile</key>
|
||||||
|
<string>images/OrcaSlicer.icns</string>
|
||||||
|
<key>CFBundleTypeName</key>
|
||||||
|
<string>STL</string>
|
||||||
|
<key>CFBundleTypeRole</key>
|
||||||
|
<string>Viewer</string>
|
||||||
|
<key>LISsAppleDefaultForType</key>
|
||||||
|
<true/>
|
||||||
|
<key>LSHandlerRank</key>
|
||||||
|
<string>Alternate</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleTypeExtensions</key>
|
||||||
|
<array>
|
||||||
|
<string>amf</string>
|
||||||
|
<string>AMF</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeIconFile</key>
|
||||||
|
<string>images/OrcaSlicer.icns</string>
|
||||||
|
<key>CFBundleTypeName</key>
|
||||||
|
<string>AMF</string>
|
||||||
|
<key>CFBundleTypeRole</key>
|
||||||
|
<string>Viewer</string>
|
||||||
|
<key>LISsAppleDefaultForType</key>
|
||||||
|
<true/>
|
||||||
|
<key>LSHandlerRank</key>
|
||||||
|
<string>Alternate</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleTypeExtensions</key>
|
||||||
|
<array>
|
||||||
|
<string>3mf</string>
|
||||||
|
<string>3MF</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeIconFile</key>
|
||||||
|
<string>images/OrcaSlicer.icns</string>
|
||||||
|
<key>CFBundleTypeName</key>
|
||||||
|
<string>3MF</string>
|
||||||
|
<key>CFBundleTypeRole</key>
|
||||||
|
<string>Viewer</string>
|
||||||
|
<key>LISsAppleDefaultForType</key>
|
||||||
|
<true/>
|
||||||
|
<key>LSHandlerRank</key>
|
||||||
|
<string>Alternate</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CFBundleTypeExtensions</key>
|
||||||
|
<array>
|
||||||
|
<string>gcode</string>
|
||||||
|
<string>GCODE</string>
|
||||||
|
</array>
|
||||||
|
<key>CFBundleTypeIconFile</key>
|
||||||
|
<string>images/gcode.icns</string>
|
||||||
|
<key>CFBundleTypeName</key>
|
||||||
|
<string>GCODE</string>
|
||||||
|
<key>CFBundleTypeRole</key>
|
||||||
|
<string>Viewer</string>
|
||||||
|
<key>LISsAppleDefaultForType</key>
|
||||||
|
<true/>
|
||||||
|
<key>LSHandlerRank</key>
|
||||||
|
<string>Alternate</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>CSResourcesFileMapped</key>
|
||||||
|
<true/>
|
||||||
|
<key>NSHumanReadableCopyright</key>
|
||||||
|
<string>${MACOSX_BUNDLE_COPYRIGHT}</string>
|
||||||
|
<key>NSAppTransportSecurity</key>
|
||||||
|
<dict>
|
||||||
|
<!-- Disable App Transport Security. Resolves https://github.com/OrcaSlicer/OrcaSlicer/issues/791 -->
|
||||||
|
<key>NSAllowsArbitraryLoads</key>
|
||||||
|
<true/>
|
||||||
|
<key>NSAllowsArbitraryLoadsInWebContent</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
||||||
172
cmake/modules/OpenVDBUtils.cmake
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
# Copyright (c) DreamWorks Animation LLC
|
||||||
|
#
|
||||||
|
# All rights reserved. This software is distributed under the
|
||||||
|
# Mozilla Public License 2.0 ( http://www.mozilla.org/MPL/2.0/ )
|
||||||
|
#
|
||||||
|
# Redistributions of source code must retain the above copyright
|
||||||
|
# and license notice and the following restrictions and disclaimer.
|
||||||
|
#
|
||||||
|
# * Neither the name of DreamWorks Animation nor the names of
|
||||||
|
# its contributors may be used to endorse or promote products derived
|
||||||
|
# from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||||
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||||
|
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||||
|
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY INDIRECT, INCIDENTAL,
|
||||||
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||||
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
# IN NO EVENT SHALL THE COPYRIGHT HOLDERS' AND CONTRIBUTORS' AGGREGATE
|
||||||
|
# LIABILITY FOR ALL CLAIMS REGARDLESS OF THEIR BASIS EXCEED US$250.00.
|
||||||
|
#
|
||||||
|
#[=======================================================================[.rst:
|
||||||
|
|
||||||
|
OpenVDBUtils.cmake
|
||||||
|
------------------
|
||||||
|
|
||||||
|
A utility CMake file which provides helper functions for configuring an
|
||||||
|
OpenVDB installation.
|
||||||
|
|
||||||
|
Use this module by invoking include with the form::
|
||||||
|
|
||||||
|
include ( OpenVDBUtils )
|
||||||
|
|
||||||
|
|
||||||
|
The following functions are provided:
|
||||||
|
|
||||||
|
``OPENVDB_VERSION_FROM_HEADER``
|
||||||
|
|
||||||
|
OPENVDB_VERSION_FROM_HEADER ( <header_path>
|
||||||
|
VERSION [<version>]
|
||||||
|
MAJOR [<version>]
|
||||||
|
MINOR [<version>]
|
||||||
|
PATCH [<version>] )
|
||||||
|
|
||||||
|
Parse the provided version file to retrieve the current OpenVDB
|
||||||
|
version information. The file is expected to be a version.h file
|
||||||
|
as found in the following path of an OpenVDB repository:
|
||||||
|
openvdb/version.h
|
||||||
|
|
||||||
|
If the file does not exist, variables are unmodified.
|
||||||
|
|
||||||
|
``OPENVDB_ABI_VERSION_FROM_PRINT``
|
||||||
|
|
||||||
|
OPENVDB_ABI_VERSION_FROM_PRINT ( <vdb_print>
|
||||||
|
[QUIET]
|
||||||
|
ABI [<version>] )
|
||||||
|
|
||||||
|
Retrieve the ABI version that an installation of OpenVDB was compiled
|
||||||
|
for using the provided vdb_print binary. Parses the result of:
|
||||||
|
vdb_print --version
|
||||||
|
|
||||||
|
If the binary does not exist or fails to launch, variables are
|
||||||
|
unmodified.
|
||||||
|
|
||||||
|
#]=======================================================================]
|
||||||
|
|
||||||
|
|
||||||
|
function(OPENVDB_VERSION_FROM_HEADER OPENVDB_VERSION_FILE)
|
||||||
|
cmake_parse_arguments(_VDB "" "VERSION;MAJOR;MINOR;PATCH" "" ${ARGN})
|
||||||
|
|
||||||
|
if(NOT EXISTS ${OPENVDB_VERSION_FILE})
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
file(STRINGS "${OPENVDB_VERSION_FILE}" openvdb_version_str
|
||||||
|
REGEX "^#define[\t ]+OPENVDB_LIBRARY_MAJOR_VERSION_NUMBER[\t ]+.*"
|
||||||
|
)
|
||||||
|
string(REGEX REPLACE "^.*OPENVDB_LIBRARY_MAJOR_VERSION_NUMBER[\t ]+([0-9]*).*$" "\\1"
|
||||||
|
_OpenVDB_MAJOR_VERSION "${openvdb_version_str}"
|
||||||
|
)
|
||||||
|
|
||||||
|
file(STRINGS "${OPENVDB_VERSION_FILE}" openvdb_version_str
|
||||||
|
REGEX "^#define[\t ]+OPENVDB_LIBRARY_MINOR_VERSION_NUMBER[\t ]+.*"
|
||||||
|
)
|
||||||
|
string(REGEX REPLACE "^.*OPENVDB_LIBRARY_MINOR_VERSION_NUMBER[\t ]+([0-9]*).*$" "\\1"
|
||||||
|
_OpenVDB_MINOR_VERSION "${openvdb_version_str}"
|
||||||
|
)
|
||||||
|
|
||||||
|
file(STRINGS "${OPENVDB_VERSION_FILE}" openvdb_version_str
|
||||||
|
REGEX "^#define[\t ]+OPENVDB_LIBRARY_PATCH_VERSION_NUMBER[\t ]+.*"
|
||||||
|
)
|
||||||
|
string(REGEX REPLACE "^.*OPENVDB_LIBRARY_PATCH_VERSION_NUMBER[\t ]+([0-9]*).*$" "\\1"
|
||||||
|
_OpenVDB_PATCH_VERSION "${openvdb_version_str}"
|
||||||
|
)
|
||||||
|
unset(openvdb_version_str)
|
||||||
|
|
||||||
|
if(_VDB_VERSION)
|
||||||
|
set(${_VDB_VERSION}
|
||||||
|
${_OpenVDB_MAJOR_VERSION}.${_OpenVDB_MINOR_VERSION}.${_OpenVDB_PATCH_VERSION}
|
||||||
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
if(_VDB_MAJOR)
|
||||||
|
set(${_VDB_MAJOR} ${_OpenVDB_MAJOR_VERSION} PARENT_SCOPE)
|
||||||
|
endif()
|
||||||
|
if(_VDB_MINOR)
|
||||||
|
set(${_VDB_MINOR} ${_OpenVDB_MINOR_VERSION} PARENT_SCOPE)
|
||||||
|
endif()
|
||||||
|
if(_VDB_PATCH)
|
||||||
|
set(${_VDB_PATCH} ${_OpenVDB_PATCH_VERSION} PARENT_SCOPE)
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
########################################################################
|
||||||
|
|
||||||
|
|
||||||
|
function(OPENVDB_ABI_VERSION_FROM_PRINT OPENVDB_PRINT)
|
||||||
|
cmake_parse_arguments(_VDB "QUIET" "ABI" "" ${ARGN})
|
||||||
|
|
||||||
|
if(NOT EXISTS ${OPENVDB_PRINT})
|
||||||
|
if(NOT OpenVDB_FIND_QUIETLY)
|
||||||
|
message(WARNING "vdb_print not found! ${OPENVDB_PRINT}")
|
||||||
|
endif()
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(_VDB_PRINT_VERSION_STRING "")
|
||||||
|
set(_VDB_PRINT_RETURN_STATUS "")
|
||||||
|
|
||||||
|
if(${_VDB_QUIET})
|
||||||
|
execute_process(COMMAND ${OPENVDB_PRINT} "--version"
|
||||||
|
RESULT_VARIABLE _VDB_PRINT_RETURN_STATUS
|
||||||
|
OUTPUT_VARIABLE _VDB_PRINT_VERSION_STRING
|
||||||
|
ERROR_QUIET
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
execute_process(COMMAND ${OPENVDB_PRINT} "--version"
|
||||||
|
RESULT_VARIABLE _VDB_PRINT_RETURN_STATUS
|
||||||
|
OUTPUT_VARIABLE _VDB_PRINT_VERSION_STRING
|
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(${_VDB_PRINT_RETURN_STATUS})
|
||||||
|
if(NOT OpenVDB_FIND_QUIETLY)
|
||||||
|
message(WARNING "vdb_print returned with status ${_VDB_PRINT_RETURN_STATUS}")
|
||||||
|
endif()
|
||||||
|
return()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(_OpenVDB_ABI)
|
||||||
|
if (_VDB_PRINT_VERSION_STRING)
|
||||||
|
string(REGEX REPLACE ".*abi([0-9]*).*" "\\1" _OpenVDB_ABI ${_VDB_PRINT_VERSION_STRING})
|
||||||
|
endif ()
|
||||||
|
if(${_OpenVDB_ABI} STREQUAL ${_VDB_PRINT_VERSION_STRING})
|
||||||
|
set(_OpenVDB_ABI "")
|
||||||
|
endif()
|
||||||
|
unset(_VDB_PRINT_RETURN_STATUS)
|
||||||
|
unset(_VDB_PRINT_VERSION_STRING)
|
||||||
|
|
||||||
|
if(_VDB_ABI)
|
||||||
|
set(${_VDB_ABI} ${_OpenVDB_ABI} PARENT_SCOPE)
|
||||||
|
endif()
|
||||||
|
endfunction()
|
||||||
269
cmake/modules/PrecompiledHeader.cmake
Normal file
@@ -0,0 +1,269 @@
|
|||||||
|
# Function for setting up precompiled headers. Usage:
|
||||||
|
#
|
||||||
|
# add_library/executable(target
|
||||||
|
# pchheader.c pchheader.cpp pchheader.h)
|
||||||
|
#
|
||||||
|
# add_precompiled_header(target pchheader.h
|
||||||
|
# [FORCEINCLUDE]
|
||||||
|
# [SOURCE_C pchheader.c]
|
||||||
|
# [SOURCE_CXX pchheader.cpp])
|
||||||
|
#
|
||||||
|
# Options:
|
||||||
|
#
|
||||||
|
# FORCEINCLUDE: Add compiler flags to automatically include the
|
||||||
|
# pchheader.h from every source file. Works with both GCC and
|
||||||
|
# MSVC. This is recommended.
|
||||||
|
#
|
||||||
|
# SOURCE_C/CXX: Specifies the .c/.cpp source file that includes
|
||||||
|
# pchheader.h for generating the pre-compiled header
|
||||||
|
# output. Defaults to pchheader.c. Only required for MSVC.
|
||||||
|
#
|
||||||
|
# Caveats:
|
||||||
|
#
|
||||||
|
# * Its not currently possible to use the same precompiled-header in
|
||||||
|
# more than a single target in the same directory (No way to set
|
||||||
|
# the source file properties differently for each target).
|
||||||
|
#
|
||||||
|
# * MSVC: A source file with the same name as the header must exist
|
||||||
|
# and be included in the target (E.g. header.cpp). Name of file
|
||||||
|
# can be changed using the SOURCE_CXX/SOURCE_C options.
|
||||||
|
#
|
||||||
|
# License:
|
||||||
|
#
|
||||||
|
# Copyright (C) 2009-2017 Lars Christensen <larsch@belunktum.dk>
|
||||||
|
#
|
||||||
|
# Permission is hereby granted, free of charge, to any person
|
||||||
|
# obtaining a copy of this software and associated documentation files
|
||||||
|
# (the 'Software') deal in the Software without restriction,
|
||||||
|
# including without limitation the rights to use, copy, modify, merge,
|
||||||
|
# publish, distribute, sublicense, and/or sell copies of the Software,
|
||||||
|
# and to permit persons to whom the Software is furnished to do so,
|
||||||
|
# subject to the following conditions:
|
||||||
|
#
|
||||||
|
# The above copyright notice and this permission notice shall be
|
||||||
|
# included in all copies or substantial portions of the Software.
|
||||||
|
#
|
||||||
|
# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||||
|
# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
|
# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
# SOFTWARE.
|
||||||
|
|
||||||
|
|
||||||
|
# Use the new builtin CMake function if possible or fall back to the old one.
|
||||||
|
if (CMAKE_VERSION VERSION_LESS 3.16)
|
||||||
|
|
||||||
|
include(CMakeParseArguments)
|
||||||
|
|
||||||
|
macro(combine_arguments _variable)
|
||||||
|
set(_result "")
|
||||||
|
foreach(_element ${${_variable}})
|
||||||
|
set(_result "${_result} \"${_element}\"")
|
||||||
|
endforeach()
|
||||||
|
string(STRIP "${_result}" _result)
|
||||||
|
set(${_variable} "${_result}")
|
||||||
|
endmacro()
|
||||||
|
|
||||||
|
function(export_all_flags _filename)
|
||||||
|
set(_include_directories "$<TARGET_PROPERTY:${_target},INCLUDE_DIRECTORIES>")
|
||||||
|
set(_compile_definitions "$<TARGET_PROPERTY:${_target},COMPILE_DEFINITIONS>")
|
||||||
|
set(_compile_flags "$<TARGET_PROPERTY:${_target},COMPILE_FLAGS>")
|
||||||
|
set(_compile_options "$<TARGET_PROPERTY:${_target},COMPILE_OPTIONS>")
|
||||||
|
|
||||||
|
#handle config-specific cxx flags
|
||||||
|
string(TOUPPER ${CMAKE_BUILD_TYPE} _config)
|
||||||
|
set(_build_cxx_flags ${CMAKE_CXX_FLAGS_${_config}})
|
||||||
|
|
||||||
|
#handle fpie option
|
||||||
|
get_target_property(_fpie ${_target} POSITION_INDEPENDENT_CODE)
|
||||||
|
if (_fpie AND CMAKE_POSITION_INDEPENDENT_CODE)
|
||||||
|
list(APPEND _compile_options ${CMAKE_CXX_COMPILE_OPTIONS_PIC})
|
||||||
|
endif()
|
||||||
|
|
||||||
|
#handle compiler standard (GCC only)
|
||||||
|
if(CMAKE_COMPILER_IS_GNUCXX)
|
||||||
|
get_target_property(_cxx_standard ${_target} CXX_STANDARD)
|
||||||
|
if ((NOT "${_cxx_standard}" STREQUAL NOTFOUND) AND (NOT "${_cxx_standard}" STREQUAL ""))
|
||||||
|
get_target_property(_cxx_extensions ${_target} CXX_EXTENSIONS)
|
||||||
|
get_property(_exists TARGET ${_target} PROPERTY CXX_EXTENSIONS SET)
|
||||||
|
if (NOT _exists OR ${_cxx_extensions})
|
||||||
|
list(APPEND _compile_options "-std=gnu++${_cxx_standard}")
|
||||||
|
else()
|
||||||
|
list(APPEND _compile_options "-std=c++${_cxx_standard}")
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(_include_directories "$<$<BOOL:${_include_directories}>:-I$<JOIN:${_include_directories},\n-I>\n>")
|
||||||
|
set(_compile_definitions "$<$<BOOL:${_compile_definitions}>:-D$<JOIN:${_compile_definitions},\n-D>\n>")
|
||||||
|
set(_compile_flags "$<$<BOOL:${_compile_flags}>:$<JOIN:${_compile_flags},\n>\n>")
|
||||||
|
set(_compile_options "$<$<BOOL:${_compile_options}>:$<JOIN:${_compile_options},\n>\n>")
|
||||||
|
set(_cxx_flags "$<$<BOOL:${CMAKE_CXX_FLAGS}>:${CMAKE_CXX_FLAGS}\n>$<$<BOOL:${_build_cxx_flags}>:${_build_cxx_flags}\n>")
|
||||||
|
file(GENERATE OUTPUT "${_filename}" CONTENT "${_compile_definitions}${_include_directories}${_compile_flags}${_compile_options}${_cxx_flags}\n")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(add_precompiled_header _target _input)
|
||||||
|
|
||||||
|
message(STATUS "Adding precompiled header ${_input} to target ${_target} with legacy method. "
|
||||||
|
"Update your cmake instance to use the native PCH functions.")
|
||||||
|
|
||||||
|
cmake_parse_arguments(_PCH "FORCEINCLUDE" "SOURCE_CXX;SOURCE_C" "" ${ARGN})
|
||||||
|
|
||||||
|
get_filename_component(_input_we ${_input} NAME_WE)
|
||||||
|
get_filename_component(_input_full ${_input} ABSOLUTE)
|
||||||
|
file(TO_NATIVE_PATH "${_input_full}" _input_fullpath)
|
||||||
|
|
||||||
|
if(NOT _PCH_SOURCE_CXX)
|
||||||
|
set(_PCH_SOURCE_CXX "${_input_we}.cpp")
|
||||||
|
endif()
|
||||||
|
if(NOT _PCH_SOURCE_C)
|
||||||
|
set(_PCH_SOURCE_C "${_input_we}.c")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(MSVC)
|
||||||
|
set(_pch_cxx_pch "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/cxx_${_input_we}.pch")
|
||||||
|
set(_pch_c_pch "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/c_${_input_we}.pch")
|
||||||
|
|
||||||
|
get_target_property(sources ${_target} SOURCES)
|
||||||
|
foreach(_source ${sources})
|
||||||
|
set(_pch_compile_flags "")
|
||||||
|
if(_source MATCHES \\.\(cc|cxx|cpp|c\)$)
|
||||||
|
if(_source MATCHES \\.\(cpp|cxx|cc\)$)
|
||||||
|
set(_pch_header "${_input}")
|
||||||
|
set(_pch "${_pch_cxx_pch}")
|
||||||
|
else()
|
||||||
|
set(_pch_header "${_input}")
|
||||||
|
set(_pch "${_pch_c_pch}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(_source STREQUAL "${_PCH_SOURCE_CXX}")
|
||||||
|
set(_pch_compile_flags "${_pch_compile_flags} \"/Fp${_pch_cxx_pch}\" \"/Yc${_input}\"")
|
||||||
|
set(_pch_source_cxx_found TRUE)
|
||||||
|
set_source_files_properties("${_source}" PROPERTIES OBJECT_OUTPUTS "${_pch_cxx_pch}")
|
||||||
|
elseif(_source STREQUAL "${_PCH_SOURCE_C}")
|
||||||
|
set(_pch_compile_flags "${_pch_compile_flags} \"/Fp${_pch_c_pch}\" \"/Yc${_input}\"")
|
||||||
|
set(_pch_source_c_found TRUE)
|
||||||
|
set_source_files_properties("${_source}" PROPERTIES OBJECT_OUTPUTS "${_pch_c_pch}")
|
||||||
|
else()
|
||||||
|
if(_source MATCHES \\.\(cpp|cxx|cc\)$)
|
||||||
|
set(_pch_compile_flags "${_pch_compile_flags} \"/Fp${_pch_cxx_pch}\" \"/Yu${_input_fullpath}\"")
|
||||||
|
set(_pch_source_cxx_needed TRUE)
|
||||||
|
set_source_files_properties("${_source}" PROPERTIES OBJECT_DEPENDS "${_pch_cxx_pch}")
|
||||||
|
else()
|
||||||
|
set(_pch_compile_flags "${_pch_compile_flags} \"/Fp${_pch_c_pch}\" \"/Yu${_input_fullpath}\"")
|
||||||
|
set(_pch_source_c_needed TRUE)
|
||||||
|
set_source_files_properties("${_source}" PROPERTIES OBJECT_DEPENDS "${_pch_c_pch}")
|
||||||
|
endif()
|
||||||
|
if(_PCH_FORCEINCLUDE)
|
||||||
|
set(_pch_compile_flags "${_pch_compile_flags} /FI${_input_fullpath}")
|
||||||
|
endif(_PCH_FORCEINCLUDE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
get_source_file_property(_object_depends "${_source}" OBJECT_DEPENDS)
|
||||||
|
if(NOT _object_depends)
|
||||||
|
set(_object_depends)
|
||||||
|
endif()
|
||||||
|
if(_PCH_FORCEINCLUDE)
|
||||||
|
list(APPEND _object_depends "${CMAKE_CURRENT_SOURCE_DIR}/${_pch_header}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set_source_files_properties(${_source} PROPERTIES
|
||||||
|
COMPILE_FLAGS "${_pch_compile_flags}"
|
||||||
|
OBJECT_DEPENDS "${_object_depends}")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
if(_pch_source_cxx_needed AND NOT _pch_source_cxx_found)
|
||||||
|
message(FATAL_ERROR "A source file ${_PCH_SOURCE_CXX} for ${_input} is required for MSVC builds. Can be set with the SOURCE_CXX option.")
|
||||||
|
endif()
|
||||||
|
if(_pch_source_c_needed AND NOT _pch_source_c_found)
|
||||||
|
message(FATAL_ERROR "A source file ${_PCH_SOURCE_C} for ${_input} is required for MSVC builds. Can be set with the SOURCE_C option.")
|
||||||
|
endif()
|
||||||
|
endif(MSVC)
|
||||||
|
|
||||||
|
if(CMAKE_COMPILER_IS_GNUCXX)
|
||||||
|
get_filename_component(_name ${_input} NAME)
|
||||||
|
set(_pch_header "${CMAKE_CURRENT_SOURCE_DIR}/${_input}")
|
||||||
|
set(_pch_binary_dir "${CMAKE_CURRENT_BINARY_DIR}/${_target}_pch")
|
||||||
|
set(_pchfile "${_pch_binary_dir}/${_input}")
|
||||||
|
set(_outdir "${CMAKE_CURRENT_BINARY_DIR}/${_target}_pch/${_name}.gch")
|
||||||
|
file(MAKE_DIRECTORY "${_outdir}")
|
||||||
|
set(_output_cxx "${_outdir}/.c++")
|
||||||
|
set(_output_c "${_outdir}/.c")
|
||||||
|
|
||||||
|
set(_pch_flags_file "${_pch_binary_dir}/compile_flags.rsp")
|
||||||
|
export_all_flags("${_pch_flags_file}")
|
||||||
|
set(_compiler_FLAGS "@${_pch_flags_file}")
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT "${_pchfile}"
|
||||||
|
COMMAND "${CMAKE_COMMAND}" -E copy "${_pch_header}" "${_pchfile}"
|
||||||
|
DEPENDS "${_pch_header}"
|
||||||
|
COMMENT "Updating ${_name}")
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT "${_output_cxx}"
|
||||||
|
COMMAND "${CMAKE_CXX_COMPILER}" ${_compiler_FLAGS} -x c++-header -o "${_output_cxx}" "${_pchfile}"
|
||||||
|
DEPENDS "${_pchfile}" "${_pch_flags_file}"
|
||||||
|
COMMENT "Precompiling ${_name} for ${_target} (C++)")
|
||||||
|
add_custom_command(
|
||||||
|
OUTPUT "${_output_c}"
|
||||||
|
COMMAND "${CMAKE_C_COMPILER}" ${_compiler_FLAGS} -x c-header -o "${_output_c}" "${_pchfile}"
|
||||||
|
DEPENDS "${_pchfile}" "${_pch_flags_file}"
|
||||||
|
COMMENT "Precompiling ${_name} for ${_target} (C)")
|
||||||
|
|
||||||
|
get_property(_sources TARGET ${_target} PROPERTY SOURCES)
|
||||||
|
foreach(_source ${_sources})
|
||||||
|
set(_pch_compile_flags "")
|
||||||
|
|
||||||
|
if(_source MATCHES \\.\(cc|cxx|cpp|c\)$)
|
||||||
|
get_source_file_property(_pch_compile_flags "${_source}" COMPILE_FLAGS)
|
||||||
|
if(NOT _pch_compile_flags)
|
||||||
|
set(_pch_compile_flags)
|
||||||
|
endif()
|
||||||
|
separate_arguments(_pch_compile_flags)
|
||||||
|
list(APPEND _pch_compile_flags -Winvalid-pch)
|
||||||
|
if(_PCH_FORCEINCLUDE)
|
||||||
|
list(APPEND _pch_compile_flags -include "${_pchfile}")
|
||||||
|
else(_PCH_FORCEINCLUDE)
|
||||||
|
list(APPEND _pch_compile_flags "-I${_pch_binary_dir}")
|
||||||
|
endif(_PCH_FORCEINCLUDE)
|
||||||
|
|
||||||
|
get_source_file_property(_object_depends "${_source}" OBJECT_DEPENDS)
|
||||||
|
if(NOT _object_depends)
|
||||||
|
set(_object_depends)
|
||||||
|
endif()
|
||||||
|
list(APPEND _object_depends "${_pchfile}")
|
||||||
|
if(_source MATCHES \\.\(cc|cxx|cpp\)$)
|
||||||
|
list(APPEND _object_depends "${_output_cxx}")
|
||||||
|
else()
|
||||||
|
list(APPEND _object_depends "${_output_c}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
combine_arguments(_pch_compile_flags)
|
||||||
|
set_source_files_properties(${_source} PROPERTIES
|
||||||
|
COMPILE_FLAGS "${_pch_compile_flags}"
|
||||||
|
OBJECT_DEPENDS "${_object_depends}")
|
||||||
|
endif()
|
||||||
|
endforeach()
|
||||||
|
endif(CMAKE_COMPILER_IS_GNUCXX)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
else ()
|
||||||
|
|
||||||
|
function(add_precompiled_header _target _input)
|
||||||
|
message(STATUS "Adding precompiled header ${_input} to target ${_target}.")
|
||||||
|
target_precompile_headers(${_target} PRIVATE ${_input})
|
||||||
|
|
||||||
|
get_target_property(_sources ${_target} SOURCES)
|
||||||
|
list(FILTER _sources INCLUDE REGEX ".*\\.mm?")
|
||||||
|
|
||||||
|
if (_sources)
|
||||||
|
message(STATUS "PCH skipping sources: ${_sources}")
|
||||||
|
endif ()
|
||||||
|
|
||||||
|
set_source_files_properties(${_sources} PROPERTIES SKIP_PRECOMPILE_HEADERS ON)
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
endif (CMAKE_VERSION VERSION_LESS 3.16)
|
||||||
77
cmake/modules/SelectLibraryConfigurations_SLIC3R.cmake
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
# Modified from the CMake github master.
|
||||||
|
# required by the bundled FindCURL.cmake
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
||||||
|
# file Copyright.txt or https://cmake.org/licensing for details.
|
||||||
|
|
||||||
|
#.rst:
|
||||||
|
# SelectLibraryConfigurations
|
||||||
|
# ---------------------------
|
||||||
|
#
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# select_library_configurations( basename )
|
||||||
|
#
|
||||||
|
# This macro takes a library base name as an argument, and will choose
|
||||||
|
# good values for basename_LIBRARY, basename_LIBRARIES,
|
||||||
|
# basename_LIBRARY_DEBUG, and basename_LIBRARY_RELEASE depending on what
|
||||||
|
# has been found and set. If only basename_LIBRARY_RELEASE is defined,
|
||||||
|
# basename_LIBRARY will be set to the release value, and
|
||||||
|
# basename_LIBRARY_DEBUG will be set to basename_LIBRARY_DEBUG-NOTFOUND.
|
||||||
|
# If only basename_LIBRARY_DEBUG is defined, then basename_LIBRARY will
|
||||||
|
# take the debug value, and basename_LIBRARY_RELEASE will be set to
|
||||||
|
# basename_LIBRARY_RELEASE-NOTFOUND.
|
||||||
|
#
|
||||||
|
# If the generator supports configuration types, then basename_LIBRARY
|
||||||
|
# and basename_LIBRARIES will be set with debug and optimized flags
|
||||||
|
# specifying the library to be used for the given configuration. If no
|
||||||
|
# build type has been set or the generator in use does not support
|
||||||
|
# configuration types, then basename_LIBRARY and basename_LIBRARIES will
|
||||||
|
# take only the release value, or the debug value if the release one is
|
||||||
|
# not set.
|
||||||
|
|
||||||
|
# This macro was adapted from the FindQt4 CMake module and is maintained by Will
|
||||||
|
# Dicharry <wdicharry@stellarscience.com>.
|
||||||
|
|
||||||
|
macro( select_library_configurations_SLIC3R basename )
|
||||||
|
if(NOT ${basename}_LIBRARY_RELEASE)
|
||||||
|
set(${basename}_LIBRARY_RELEASE "${basename}_LIBRARY_RELEASE-NOTFOUND" CACHE FILEPATH "Path to a library.")
|
||||||
|
endif()
|
||||||
|
if(NOT ${basename}_LIBRARY_DEBUG)
|
||||||
|
set(${basename}_LIBRARY_DEBUG "${basename}_LIBRARY_DEBUG-NOTFOUND" CACHE FILEPATH "Path to a library.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
get_property(_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
||||||
|
if( ${basename}_LIBRARY_DEBUG AND ${basename}_LIBRARY_RELEASE AND
|
||||||
|
NOT ${basename}_LIBRARY_DEBUG STREQUAL ${basename}_LIBRARY_RELEASE AND
|
||||||
|
( _isMultiConfig OR CMAKE_BUILD_TYPE ) )
|
||||||
|
# if the generator is multi-config or if CMAKE_BUILD_TYPE is set for
|
||||||
|
# single-config generators, set optimized and debug libraries
|
||||||
|
set( ${basename}_LIBRARY "" )
|
||||||
|
foreach( _libname IN LISTS ${basename}_LIBRARY_RELEASE )
|
||||||
|
list( APPEND ${basename}_LIBRARY optimized "${_libname}" )
|
||||||
|
endforeach()
|
||||||
|
foreach( _libname IN LISTS ${basename}_LIBRARY_DEBUG )
|
||||||
|
list( APPEND ${basename}_LIBRARY debug "${_libname}" )
|
||||||
|
endforeach()
|
||||||
|
elseif( ${basename}_LIBRARY_RELEASE )
|
||||||
|
set( ${basename}_LIBRARY ${${basename}_LIBRARY_RELEASE} )
|
||||||
|
elseif( ${basename}_LIBRARY_DEBUG )
|
||||||
|
set( ${basename}_LIBRARY ${${basename}_LIBRARY_DEBUG} )
|
||||||
|
else()
|
||||||
|
set( ${basename}_LIBRARY "${basename}_LIBRARY-NOTFOUND")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set( ${basename}_LIBRARIES "${${basename}_LIBRARY}" )
|
||||||
|
|
||||||
|
if( ${basename}_LIBRARY )
|
||||||
|
set( ${basename}_FOUND TRUE )
|
||||||
|
endif()
|
||||||
|
|
||||||
|
mark_as_advanced( ${basename}_LIBRARY_RELEASE
|
||||||
|
${basename}_LIBRARY_DEBUG
|
||||||
|
)
|
||||||
|
endmacro()
|
||||||