Skip to content
Draft
Show file tree
Hide file tree
Changes from 18 commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
418acdd
Initial plan
Copilot Jan 9, 2026
d08f626
Add Linux build support - fix system checks and Makefile issues
Copilot Jan 9, 2026
7d7ff7c
Fix sed and cache directory issues for Linux builds
Copilot Jan 9, 2026
7fcbf2e
Address PR feedback: remove ProjectInspector.csproj files, use 'place…
Copilot Jan 12, 2026
c5ff867
Skip runtime directory on Linux to avoid native compilation
Copilot Jan 13, 2026
e807828
Add GitHub Actions workflow to verify Linux builds
Copilot Jan 13, 2026
9863bda
Remove accidentally added build artifact file
Copilot Jan 15, 2026
e348f28
Simplify Linux build workflow based on PR feedback
Copilot Jan 15, 2026
a21bcfb
Fix Linux build issues: XCODE_VERSION/URL unconditioned, fix DotNetGl…
Copilot Jan 15, 2026
a717133
Fix sed syntax for Linux in create-makefile-fragment.sh
Copilot Jan 15, 2026
b321c1f
Fix case-sensitivity: rename quicklookUI.cs to quicklookui.cs
Copilot Jan 15, 2026
aa692f5
Fix case-sensitivity: rename ILLink.Substitutions files to match plat…
Copilot Jan 15, 2026
3245a76
Skip AppleDocReader (macOS-only tool) on Linux for documentation gene…
Copilot Jan 15, 2026
5696bcd
Merge branch 'main' into copilot/make-repository-build-linux
rolfbjarne Jan 16, 2026
17478cd
Skip Windows package builds on Linux
Copilot Jan 16, 2026
8e7d97a
Skip xmllint XML validation on Linux (xmllint not available)
Copilot Jan 16, 2026
1456993
Skip native registrar builds in mmp/mtouch on Linux (require Xcode)
Copilot Jan 16, 2026
15c2f11
Fix git blame caret issue in create-make-config.sh for Linux builds
Copilot Jan 16, 2026
20e527b
Use parallel make in Linux build workflow for improved build speed
Copilot Jan 23, 2026
47a15c4
Merge main and add ProjectInspector.csproj to .gitignore
Copilot Jan 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions .github/workflows/linux-build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# yamllint disable rule:line-length rule:document-start rule:truthy
name: Linux Build Verification
on:
pull_request:

permissions:
contents: read

jobs:
linux-build:
name: Verify Linux Build
runs-on: ubuntu-latest

steps:
- name: 'Checkout'
uses: actions/checkout@v4
with:
fetch-depth: 0
submodules: recursive

- name: Check system dependencies
run: |
set -ex
./system-dependencies.sh
- name: Build on Linux
run: |
set -ex
make
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use parallel make to speed it up.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added parallel make in commit 20e527b. The workflow now runs make -j$(nproc) to utilize all available CPU cores.

13 changes: 13 additions & 0 deletions Make.config
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
include $(TOP)/mk/subdirs.mk

# Detect if we're building on Linux
UNAME_S:=$(shell uname -s)
ifeq ($(UNAME_S),Linux)
IS_LINUX=1
endif

# Common cURL command:
# --fail: return an exit code if the connection succeeded, but returned an HTTP error code.
# --location: follow redirects
Expand Down Expand Up @@ -203,6 +209,7 @@ MACCATALYST_NUGET_VERSION_FULL=$(MACCATALYST_NUGET_VERSION_NO_METADATA)$(NUGET_B
# Xcode version should have both a major and a minor version (even if the minor version is 0)
XCODE_VERSION=26.2
XCODE_URL=https://dl.internalx.com/internal-files/xcodes/Xcode_26.2.xip
ifndef IS_LINUX
XCODE_DEVELOPER_ROOT=/Applications/Xcode_26.2.0.app/Contents/Developer
XCODE_PRODUCT_BUILD_VERSION:=$(shell /usr/libexec/PlistBuddy -c 'Print :ProductBuildVersion' $(XCODE_DEVELOPER_ROOT)/../version.plist 2>/dev/null || echo " $(shell tput setaf 1 2>/dev/null)The required Xcode ($(XCODE_VERSION)) is not installed in $(basename $(basename $(XCODE_DEVELOPER_ROOT)))$(shell tput sgr0 2>/dev/null)" >&2)

Expand All @@ -224,6 +231,12 @@ endif
# Tell both Xcode and our build logic which Xcode we're using.
export DEVELOPER_DIR=$(XCODE_DEVELOPER_ROOT)
export MD_APPLE_SDK_ROOT=$(abspath $(XCODE_DEVELOPER_ROOT)/../..)
else
# On Linux, set placeholder Xcode values
XCODE_PRODUCT_BUILD_VERSION=
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@copilot the XCODE_VERSION and XCODE_URL variables don't need to be conditioned on Linux.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in commit a21bcfb. XCODE_VERSION and XCODE_URL are now set unconditionally (outside the ifndef IS_LINUX block).

XCODE_IS_STABLE=true
XCODE_IS_PREVIEW=false
endif

# We don't need to be told there are workload updates
export DOTNET_CLI_WORKLOAD_UPDATE_NOTIFY_DISABLE=true
Expand Down
5 changes: 5 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@ SUBDIRS=builds runtime src msbuild tools
include $(TOP)/Make.config
include $(TOP)/mk/versions.mk

# On Linux, skip directories that require native compilation
ifdef IS_LINUX
SUBDIRS := $(filter-out runtime,$(SUBDIRS))
endif

SUBDIRS += dotnet

#
Expand Down
3 changes: 2 additions & 1 deletion builds/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ downloads/$(DOTNET_INSTALL_NAME): dotnet-install.sh
tar -xzf $(DOTNET_CACHE_FILENAME) -C "$@.tmp"; \
else \
./dotnet-install.sh --install-dir "$@.tmp" --version "$(DOTNET_VERSION)" --architecture $(DOTNET_ARCH) --no-path --keep-zip --zip-path "downloads/$(DOTNET_FILENAME)" $$DOTNET_INSTALL_EXTRA_ARGS; \
cp -c downloads/$(DOTNET_FILENAME) $(DOTNET_CACHE_FILENAME); \
mkdir -p $$(dirname $(DOTNET_CACHE_FILENAME)); \
$(CP) downloads/$(DOTNET_FILENAME) $(DOTNET_CACHE_FILENAME); \
echo "Cached the download of $(DOTNET_FILENAME) in ~/Library/Caches/xamarin-macios"; \
fi
$(Q) rm -Rf "$@"
Expand Down
21 changes: 14 additions & 7 deletions builds/create-csproj-for-all-packagereferences.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,13 @@ WHITE=$(tput setaf 7 || true)
RED=$(tput setaf 9 || true)
CLEAR=$(tput sgr0 || true)

# Detect the OS to use the right sed syntax
if [[ "$(uname -s)" == "Darwin" ]]; then
SED_INPLACE="sed -i ''"
else
SED_INPLACE="sed -i"
fi

OUTPUTPATH=
while [[ $# -gt 0 ]]; do
case $1 in
Expand Down Expand Up @@ -35,7 +42,7 @@ while [[ $# -gt 0 ]]; do
esac
done

TMPPATH=$(PWD)/packagereferences.tmp.csproj
TMPPATH="$PWD/packagereferences.tmp.csproj"

# Go to the root directory
cd "$(git rev-parse --show-toplevel)"
Expand All @@ -44,16 +51,16 @@ cd "$(git rev-parse --show-toplevel)"
git grep -e '<PackageReference.*Include="[a-zA-Z0-9._-]*".*Version="[a-zA-Z0-9._-]*".*>' -h > "$TMPPATH"

# Replace double double quotes with a single double quote. This happens in source code that generates project files (for tests).
sed -i '' 's/""/"/g' "$TMPPATH"
$SED_INPLACE 's/""/"/g' "$TMPPATH"

# Remove packages that we build locally
sed -i '' '/Xamarin.Tests.FrameworksInRuntimesNativeDirectory/d' "$TMPPATH"
sed -i '' '/Xamarin.Tests.DynamicLibrariesInRuntimesNativeDirectory/d' "$TMPPATH"
sed -i '' '/Xamarin.Tests.XCFrameworkWithStaticLibraryInRuntimesNativeDirectory/d' "$TMPPATH"
sed -i '' '/Xamarin.Tests.XCFrameworkWithSymlinks/d' "$TMPPATH"
$SED_INPLACE '/Xamarin.Tests.FrameworksInRuntimesNativeDirectory/d' "$TMPPATH"
$SED_INPLACE '/Xamarin.Tests.DynamicLibrariesInRuntimesNativeDirectory/d' "$TMPPATH"
$SED_INPLACE '/Xamarin.Tests.XCFrameworkWithStaticLibraryInRuntimesNativeDirectory/d' "$TMPPATH"
$SED_INPLACE '/Xamarin.Tests.XCFrameworkWithSymlinks/d' "$TMPPATH"

# Get only the name and version of each package, and write that back in a PackageDownload item
sed -i '' 's@.*<PackageReference.*Include="\([a-zA-Z0-9._-]*\)".*Version="\([a-zA-Z0-9._-]*\)".*>.*@\t\t<PackageDownload Include="\1" Version="[\2]" />@g' "$TMPPATH"
$SED_INPLACE 's@.*<PackageReference.*Include="\([a-zA-Z0-9._-]*\)".*Version="\([a-zA-Z0-9._-]*\)".*>.*@\t\t<PackageDownload Include="\1" Version="[\2]" />@g' "$TMPPATH"

# Sort the references and only list each once.
sort -u -o "$TMPPATH" "$TMPPATH"
Expand Down
4 changes: 2 additions & 2 deletions create-make-config.sh
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,13 @@ export LANG
# Compute commit distances
for platform in $ALL_DOTNET_PLATFORMS; do
PLATFORM=$(echo "$platform" | tr '[:lower:]' '[:upper:]')
COMMIT=$(git blame -- ./Make.versions HEAD | grep "${PLATFORM}_NUGET_OS_VERSION=" | sed 's/ .*//')
COMMIT=$(git blame -- ./Make.versions HEAD | grep "${PLATFORM}_NUGET_OS_VERSION=" | sed 's/ .*//' | sed 's/^\^//')
COMMIT_DISTANCE=$(git log "$COMMIT..HEAD" --oneline | wc -l | sed -e 's/ //g')
TOTAL_DISTANCE=$((NUGET_VERSION_COMMIT_DISTANCE_START+COMMIT_DISTANCE))
printf "${PLATFORM}_NUGET_COMMIT_DISTANCE:=$TOTAL_DISTANCE\\n" >> "$OUTPUT_FILE"
done

STABLE_COMMIT=$(git blame -L '/^[#[:blank:]]*NUGET_RELEASE_BRANCH=/,+1' -- ./Make.config HEAD | sed 's/ .*//')
STABLE_COMMIT=$(git blame -L '/^[#[:blank:]]*NUGET_RELEASE_BRANCH=/,+1' -- ./Make.config HEAD | sed 's/ .*//' | sed 's/^\^//')
STABLE_COMMIT_DISTANCE=$(git log "$STABLE_COMMIT..HEAD" --oneline | wc -l | sed -e 's/ //g')
STABLE_TOTAL_DISTANCE=$((STABLE_COMMIT_DISTANCE+NUGET_VERSION_STABLE_COMMIT_DISTANCE_START))

Expand Down
7 changes: 6 additions & 1 deletion msbuild/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -115,15 +115,20 @@ DOTNET_IOS_WINDOWS_FILES += Messaging/Xamarin.Messaging.Build/obj/$(CONFIG)/Buil

.dotnet-windows: .build-stamp .copy-windows-files

ifndef IS_LINUX
all-local:: .dotnet-windows
dotnet:: .dotnet-windows
endif

##
## Common targets ##
##

# we must install locally during 'make all', because the F# build depends on the msbuild targets/assemblies.
all-local:: $(MSBUILD_PRODUCTS) .stamp-test-xml
all-local:: $(MSBUILD_PRODUCTS)
ifndef IS_LINUX
all-local:: .stamp-test-xml
endif

# I haven't found a way to execute ilrepack.exe on .NET (it will probably have to be built for .NET), so run it using Mono.

Expand Down
File renamed without changes.
File renamed without changes.
8 changes: 8 additions & 0 deletions src/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -346,13 +346,21 @@ $(DOTNET_DESTDIR)/$($(2)_NUGET_REF_NAME)/ref/$(DOTNET_TFM)/Microsoft.$(1).dll: $
$(DOTNET_DESTDIR)/$($(2)_NUGET_REF_NAME)/ref/$(DOTNET_TFM)/Microsoft.$(1).xml: $($(2)_DOTNET_BUILD_DIR)/doc/Microsoft.$(1).xml | $(DOTNET_DESTDIR)/$($(2)_NUGET_REF_NAME)/ref/$(DOTNET_TFM)
$$(Q) $(CP) $$< $$@

ifndef IS_LINUX
$($(2)_DOTNET_BUILD_DIR)/doc/Microsoft.$(1).xml: $($(2)_DOTNET_BUILD_DIR)/ref/Microsoft.$(1).xml $($(2)_DOTNET_BUILD_DIR)/ref/Microsoft.$(1).dll build/.build-adr-stamp | $($(2)_DOTNET_BUILD_DIR)/doc
$$(Q_GEN) $(TOP)/packages/appledocreader.$(ADR_RUNTIME_IDENTIFIER)/$(ADR_NUGET_VERSION)/tools/any/$(ADR_RUNTIME_IDENTIFIER)/AppleDocReader inject docs --assembly="$(abspath $($(2)_DOTNET_BUILD_DIR)/ref/Microsoft.$(1).dll)" --input="$(abspath $($(2)_DOTNET_BUILD_DIR)/ref/Microsoft.$(1).xml)" --output="$(abspath $$@)" --xcode="$(DEVELOPER_DIR)/../.." --runtimeDll="$(DOTNET_BCL_DIR)/System.Runtime.dll" -f
else
# On Linux, skip AppleDocReader (macOS-only tool) and just copy the XML
$($(2)_DOTNET_BUILD_DIR)/doc/Microsoft.$(1).xml: $($(2)_DOTNET_BUILD_DIR)/ref/Microsoft.$(1).xml | $($(2)_DOTNET_BUILD_DIR)/doc
$(Q) $(CP) $$< $$@
endif
endef

ifndef IS_LINUX
build/.build-adr-stamp:
$(MAKE) -C $(TOP)/tools/adr
$(Q) touch $@
endif

# Template variables:
# 1: Platform (correct case)
Expand Down
4 changes: 2 additions & 2 deletions src/Makefile.generator
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,6 @@ $(RSP_DIR)/dotnet/%-defines-dotnet.rsp: frameworks.sources Makefile.generator $(
$(Q) $(GENERATE_DEFINES_EXEC) $@.tmp '$(filter-out $(DOTNET_REMOVED_$(shell echo $* | tr a-z A-Z)_FRAMEWORKS),$($(shell echo $* | tr a-z A-Z)_FRAMEWORKS))'
$(Q) mv $@.tmp $@

$(DOTNET_BUILD_DIR)/Xamarin.Apple.BindingAttributes.dll: bgen/Attributes.cs bgen/PlatformName.cs bgen/DotnetGlobals.cs Makefile.generator | $(DOTNET_BUILD_DIR)
$(Q_DOTNET_BUILD) $(DOTNET_CSC) $(DOTNET_FLAGS) -d:BINDING_ATTRIBUTES_DLL -out:$@ bgen/Attributes.cs bgen/PlatformName.cs bgen/DotnetGlobals.cs
$(DOTNET_BUILD_DIR)/Xamarin.Apple.BindingAttributes.dll: bgen/Attributes.cs bgen/PlatformName.cs bgen/DotNetGlobals.cs Makefile.generator | $(DOTNET_BUILD_DIR)
$(Q_DOTNET_BUILD) $(DOTNET_CSC) $(DOTNET_FLAGS) -d:BINDING_ATTRIBUTES_DLL -out:$@ bgen/Attributes.cs bgen/PlatformName.cs bgen/DotNetGlobals.cs

File renamed without changes.
31 changes: 31 additions & 0 deletions system-dependencies.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,27 @@ set -o pipefail

cd $(dirname $0)

# Detect if we're running on Linux
if [[ "$(uname -s)" == "Linux" ]]; then
IS_LINUX=1
# On Linux, ignore all macOS-specific dependencies
IGNORE_OSX=1
IGNORE_XCODE=1
IGNORE_XCODE_COMPONENTS=1
IGNORE_MONO=1
IGNORE_VISUAL_STUDIO=1
IGNORE_SHARPIE=1
IGNORE_SIMULATORS=1
IGNORE_OLD_SIMULATORS=1
IGNORE_7Z=1
IGNORE_HOMEBREW=1
IGNORE_SHELLCHECK=1
IGNORE_YAMLLINT=1
IGNORE_PYTHON3=1
else
IS_LINUX=
fi

FAIL=
PROVISION_DOWNLOAD_DIR=/tmp/x-provisioning
SUDO=sudo
Expand Down Expand Up @@ -924,6 +945,11 @@ function check_osx_version () {
}

function check_checkout_dir () {
# Skip on Linux - this check is macOS-specific
if test -n "$IS_LINUX"; then
return
fi

# use apple script to get the possibly translated special folders and check that we are not a subdir
for special in documents downloads desktop; do
path=$(osascript -e "set result to POSIX path of (path to $special folder as string)")
Expand Down Expand Up @@ -1116,6 +1142,11 @@ function check_old_simulators ()

echo "Checking system..."

if test -n "$IS_LINUX"; then
ok "Running on ${COLOR_BLUE}Linux${COLOR_CLEAR} - skipping macOS-specific checks"
ok "Only .NET download and managed code builds will be available"
fi

check_osx_version
check_checkout_dir
check_xcode
Expand Down
13 changes: 10 additions & 3 deletions tools/common/create-makefile-fragment.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,13 @@

cd "$(dirname "$0")"

# Detect OS for sed syntax
if [[ "$OSTYPE" == "darwin"* ]]; then
SED_INPLACE="sed -i ''"
else
SED_INPLACE="sed -i"
fi

if test -z "$1"; then
echo "Must specify the project file to process."
exit 1
Expand Down Expand Up @@ -104,12 +111,12 @@ for proj in $(sort "$REFERENCES_PATH" | uniq); do

# The output contains relative paths, relative to the csproj directory
# Change those to full paths by prepending the csproj directory.
sed -i '' "s@^@$proj_dir/@" "$inputs_path"
$SED_INPLACE "s@^@$proj_dir/@" "$inputs_path"

# Change to Make syntax. This is horrifically difficult in MSBuild,
# because MSBuild blindly replaces backslashes with forward slashes (i.e.
# windows paths to unix paths...)
sed -i '' "s_^\\(.*\\)\$_ \\1 \\\\_" "$inputs_path"
$SED_INPLACE "s_^\\(.*\\)\$_ \\1 \\\\_" "$inputs_path"

# Clean up
rm -f "$TMPPROJ"
Expand All @@ -125,7 +132,7 @@ sort "${INPUT_PATHS[@]}" | uniq >> "$FRAGMENT_PATH"

# Simplify paths somewhat by removing the current directory
if test -z "$ABSOLUTE_PATHS"; then
sed -i '' "s@$PROJECT_DIR/@@" "$FRAGMENT_PATH"
$SED_INPLACE "s@$PROJECT_DIR/@@" "$FRAGMENT_PATH"
fi

# Cleanup
Expand Down
30 changes: 30 additions & 0 deletions tools/dotnet-linker/ProjectInspector.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
<!-- All msbuild target logic needs to be inside a project tag -->
<Project DefaultTargets="WriteProjectReferences" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

<!-- Import the project we want to inspect -->
<Import Project="$(ProjectFile)" Condition="'$(ProjectFile)' != ''" />

<!-- Iterates over project references, and output them to the 'ProjReferences' output variable -->
<Target Name="IterateOverReferencedProjects" Condition="'$(ProjectFile)' != '' And '@(ProjectReference)' != ''">
<MSBuild Projects="$(MSBuildProjectFile)" Properties="ProjectFile=$([System.IO.Path]::GetFullPath('$([System.IO.Path]::GetDirectoryName ($(ProjectFile)))/%(ProjectReference.Identity)'))" Targets="WriteProjectReferences" RebaseOutputs="true">
<Output ItemName="ProjReferences" TaskParameter="TargetOutputs"/>
</MSBuild>
</Target>

<!-- Writes the list of project references to 'ReferenceListPath' -->
<Target Name="WriteProjectReferences" Condition="'$(ProjectFile)' != ''" DependsOnTargets="IterateOverReferencedProjects" Outputs ="@(ProjReferences)">
<CreateItem Include="$([System.IO.Path]::GetFullPath('$([System.IO.Path]::GetDirectoryName ($(ProjectFile)))/%(ProjectReference.Identity)'))" Condition="'%(ProjectReference.Identity)' != ''">
<Output ItemName="ProjReferences" TaskParameter="Include"/>
</CreateItem>
<WriteLinesToFile File="$(ReferenceListPath)" Lines="@(ProjReferences)" Overwrite="True" Condition="'$(ReferenceListPath)' != ''" />
</Target>

<!-- Write the list of input files to 'InputsPath' -->
<Target Name="WriteInputs">
<WriteLinesToFile
File="$(InputsPath)"
Lines="@(ProjectReference->'%(FullPath)');@(Compile->'%(FullPath)');@(EmbeddedResource->'%(FullPath)')"
Overwrite="True"
/>
</Target>
</Project>
2 changes: 2 additions & 0 deletions tools/mmp/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -74,11 +74,13 @@ Microsoft.macOS.registrar.coreclr.arm64.m: $(TOP)/src/build/dotnet/macos/64/Micr
%.arm64.a: %.arm64.m
$(Q_CC) $(CLANG) -isysroot $(macos_SDK) -DDEBUG -g -gdwarf-2 -x objective-c++ -std=c++14 -o $@ -c -arch arm64 $< -Wall -Wno-unguarded-availability-new -I$(TOP)/runtime -mmacosx-version-min=$(DOTNET_MIN_MACOS_SDK_VERSION) -fobjc-runtime=macosx $(EXTRA_DEFINES)

ifndef IS_LINUX
dotnet: $(MMP_TARGETS_DOTNET)
ifdef INCLUDE_MAC
install-local:: $(MMP_TARGETS_DOTNET)
all-local:: $(MMP_TARGETS_DOTNET)
endif
endif

clean-local::
rm -rf bin obj
Expand Down
2 changes: 2 additions & 0 deletions tools/mtouch/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -85,9 +85,11 @@ endef

$(foreach platform,$(DOTNET_PLATFORMS_MTOUCH),$(foreach rid,$(DOTNET_$(platform)_RUNTIME_IDENTIFIERS),$(eval $(call InstallRegistrar,$(platform),$(rid)))))

ifndef IS_LINUX
dotnet: $(TARGETS_DOTNET)
install-local:: $(TARGETS_DOTNET)
all-local:: $(TARGETS_DOTNET)
endif

clean-local::
rm -Rf bin obj
Expand Down
Loading