Merge remote-tracking branch 'origin/release/0.1.0' into develop

# Conflicts:
#	build/Version.props
This commit is contained in:
chinboy
2025-07-21 23:56:18 +08:00
25 changed files with 1967 additions and 84 deletions
@@ -0,0 +1,60 @@
name: AtomUI.Native Release Pipeline
on:
workflow_dispatch:
inputs:
TargetBranch:
description: 'Target branch to build'
type: string
default: 'develop'
BuildConfiguration:
description: 'Build configuration'
type: string
default: 'Release'
PublishToNuget:
description: 'Publish to nuget.org'
type: boolean
default: false
env:
SOURCE_DIR: ${{ github.workspace }}
NATIVE_LIB_SRC_DIR: ${{ github.workspace }}/nativelibs
BUILD_DIR: ${{ github.workspace }}/build
BASE_OUTPUT_DIR: ${{ github.workspace }}/output
MAC_OUTPUT_DIR: ${{ github.workspace }}/osx
LINUX_OUTPUT_DIR: ${{ github.workspace }}/linux
WIN_ARM64_OUTPUT_DIR: ${{ github.workspace }}/win_arm64
LOCAL_NUGET_DIR: ${{ github.workspace }}/nuget
jobs:
BuildAtomUINativeLinux:
name: Build AtomUINative for Linux X86_64
runs-on: qinware-ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4.2.2
with:
ref: ${{ inputs.TargetBranch }}
- name: Install dependencies
run: |
sudo apt update
sudo apt install -y build-essential libxcb1-dev libxcb-shape0-dev
wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | \
gpg --dearmor - | \
sudo tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ noble main" | \
sudo tee /etc/apt/sources.list.d/kitware.list >/dev/null
sudo apt update
sudo apt install -y cmake
cmake --version
sudo apt install clang
clang --version
- name: Build for x86_64
run: |
cmake -B $env:BUILD_DIR -S $env:NATIVE_LIB_SRC_DIR -DCMAKE_INSTALL_PREFIX="$env:LINUX_OUTPUT_DIR" -DCMAKE_BUILD_TYPE=${{ inputs.BuildConfiguration }}
cmake --build $env:BUILD_DIR
cmake --install $env:BUILD_DIR --config ${{ inputs.BuildConfiguration }}
- name: Upload linux x86_64 artifact
id: artifact
uses: actions/upload-artifact@v4.6.2
with:
name: AtomUINativeLinux
path: ${{ env.LINUX_OUTPUT_DIR }}
+64
View File
@@ -21,11 +21,13 @@ env:
BASE_OUTPUT_DIR: ${{ github.workspace }}/output
MAC_OUTPUT_DIR: ${{ github.workspace }}/osx
LINUX_OUTPUT_DIR: ${{ github.workspace }}/linux
WIN_ARM64_OUTPUT_DIR: ${{ github.workspace }}/win_arm64
LOCAL_NUGET_DIR: ${{ github.workspace }}/nuget
jobs:
BuildAtomUINativeMacOS:
name: Build AtomUINative for macOS
runs-on: macos-latest
if: ${{ false }}
steps:
- name: Checkout code
uses: actions/checkout@v4.2.2
@@ -63,6 +65,7 @@ jobs:
BuildAtomUINativeLinux:
name: Build AtomUINative for Linux
runs-on: qinware-ubuntu-latest
if: ${{ false }}
steps:
- name: Checkout code
uses: actions/checkout@v4.2.2
@@ -91,10 +94,71 @@ jobs:
with:
name: AtomUINativeLinux
path: ${{ env.LINUX_OUTPUT_DIR }}
BuildAtomUINativeWindowsArm64:
name: Build AtomUINative for Windows Arm64
runs-on: windows-11-arm
steps:
- name: Checkout code
uses: actions/checkout@v4.2.2
with:
ref: ${{ inputs.TargetBranch }}
- name: Setup MSYS2 environment
shell: pwsh
run: |
$systemPath="C:/"
$msysPath = "C:/msys64"
# Download and install Msys2 for ARM64
$installerUrl = "https://github.com/msys2/msys2-installer/releases/download/2025-06-22/msys2-base-x86_64-20250622.tar.xz"
$installerPath = "$env:TEMP\msys2-arm64.tar.xz"
# Download the installer
Invoke-WebRequest -Uri $installerUrl -OutFile $installerPath
# Extract Msys2
$tarPath = "$env:TEMP\msys2-arm64.tar"
# Extract using 7-Zip (available on GitHub runners)
& 7z e "$installerPath" -o"$env:TEMP" -y
& 7z x "$tarPath" -o"$systemPath" -y
$bashPath = Join-Path $msysPath "usr\bin\bash.exe"
# Initialize Msys2
& $bashPath -lc "pacman-key --init"
& $bashPath -lc "pacman-key --populate msys2"
# 更新系统 (分两步执行更可靠)
& $bashPath -lc "pacman -Syuu --noconfirm --needed --noprogressbar"
& $bashPath -lc "pacman -Su --noconfirm --needed --noprogressbar"
$env:MSYSTEM = "CLANGARM64"
$env:MSYSTEM_CARCH = "aarch64"
$env:MSYSTEM_CHOST = "aarch64-w64-mingw32"
$env:MSYSTEM_PREFIX = "/clangarm64"
$env:CHERE_INVOKING = "1"
$env:PATH = "$msysPath/clangarm64/bin;$msysPath/usr/bin;$env:PATH"
# Update PATH for subsequent steps
Add-Content $env:GITHUB_PATH "$msysPath/clangarm64/bin"
Add-Content $env:GITHUB_PATH "$msysPath/usr/bin"
Write-Host "Msys2 installed and initialized successfully"
# Install required packages
& "$bashPath" -lc "pacman -S mingw-w64-clang-aarch64-clang --noconfirm"
& "$bashPath" -lc "pacman -S mingw-w64-clang-aarch64-cmake --noconfirm"
- name: Build for Windows Arm64
run: |
New-Item -Path "$env:BUILD_DIR" -ItemType Directory -Force
cmake -B "$env:BUILD_DIR" -S "$env:NATIVE_LIB_SRC_DIR" -DCMAKE_INSTALL_PREFIX="$env:WIN_ARM64_OUTPUT_DIR" -DCMAKE_BUILD_TYPE=${{ inputs.BuildConfiguration }} -G Ninja
cmake --build "$env:BUILD_DIR"
cmake --install "$env:BUILD_DIR" --config ${{ inputs.BuildConfiguration }}
BuildAtomUINuget:
name: Build AtomUI NuGet packages
runs-on: windows-latest
if: ${{ false }}
needs:
- BuildAtomUINativeMacOS
- BuildAtomUINativeLinux
-6
View File
@@ -31,8 +31,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build", "Build", "{5EB2524C
build\AtomUINativePackageInfo.props = build\AtomUINativePackageInfo.props
EndProjectSection
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AtomUI.Native", "src\AtomUI.Native\AtomUI.Native.csproj", "{90F1E4BC-4513-450E-B2B8-C64A779C8A0D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AtomUI", "packages\AtomUI\AtomUI.csproj", "{EF9E3D8A-7D43-42A4-839E-5B20553B1B72}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AtomUI.Generator", "src\AtomUI.Generator\AtomUI.Generator.csproj", "{2AAAF06F-B1D1-4B3F-885A-F0C329F31C78}"
@@ -69,10 +67,6 @@ Global
{796AC3CF-7A12-4183-9096-291738A62292}.Debug|Any CPU.Build.0 = Debug|Any CPU
{796AC3CF-7A12-4183-9096-291738A62292}.Release|Any CPU.ActiveCfg = Release|Any CPU
{796AC3CF-7A12-4183-9096-291738A62292}.Release|Any CPU.Build.0 = Release|Any CPU
{90F1E4BC-4513-450E-B2B8-C64A779C8A0D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{90F1E4BC-4513-450E-B2B8-C64A779C8A0D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{90F1E4BC-4513-450E-B2B8-C64A779C8A0D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{90F1E4BC-4513-450E-B2B8-C64A779C8A0D}.Release|Any CPU.Build.0 = Release|Any CPU
{EF9E3D8A-7D43-42A4-839E-5B20553B1B72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EF9E3D8A-7D43-42A4-839E-5B20553B1B72}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EF9E3D8A-7D43-42A4-839E-5B20553B1B72}.Release|Any CPU.ActiveCfg = Release|Any CPU
+4
View File
@@ -29,6 +29,10 @@
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.10.0-3.final"/>
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="3.11.0-beta1.24219.2"/>
</ItemGroup>
<ItemGroup>
<PackageVersion Include="AtomUI.Native" Version="$(AtomUINativeVersion)"/>
</ItemGroup>
<ItemGroup Condition=" '$(Configuration)' == 'Release' ">
<PackageVersion Include="AtomUI" Version="$(AtomUIVersion)"/>
+1
View File
@@ -3,6 +3,7 @@
<NoWarn>$(NoWarn);CS7035</NoWarn>
<AvaloniaVersion>11.3.2</AvaloniaVersion>
<AtomUIVersion>0.1.0</AtomUIVersion>
<AtomUINativeVersion>0.1.0</AtomUINativeVersion>
</PropertyGroup>
<PropertyGroup>
+88
View File
@@ -0,0 +1,88 @@
# This source file is part of the atomui project
#
# Copyright (c) 2017 - 2022 qinware, All rights reserved.
# Copyright (c) 2017 - 2022 chinboy <chinware@163.com>
#
# See https://qinware.com/LICENSE.txt for license information
#
# Created by chinboy on 2025/01/10.
cmake_minimum_required(VERSION 3.28)
set(CMAKE_DISABLE_IN_SOURCE_BUILD YES)
project(nativelibs)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
set(CMAKE_C_STANDARD 11)
set(CMAKE_OSX_DEPLOYMENT_TARGET 11) # 目前先支持到 11
set_property(GLOBAL PROPERTY JOB_POOLS "${CMAKE_JOB_POOLS}")
# setup some important path
set(ATOMUI_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") # --src-root
set(ATOMUI_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}") # --prefix
set(ATOMUI_CMAKE_MODULES_DIR "${ATOMUI_SOURCE_DIR}/cmake/modules")
set(ATOMUI_INCLUDE_DIR "${ATOMUI_SOURCE_DIR}/include")
set(ATOMUI_BINARY_INCLUDE_DIR "${CMAKE_CURRENT_BINARY_DIR}/include") # --includedir
set(ATOMUI_TEST_DIR "${ATOMUI_SOURCE_DIR}/tests")
set(ATOMUI_TEST_BIN_DIR "tests/bin")
set(ATOMUI_SYSTEM_NAME ${CMAKE_HOST_SYSTEM_NAME})
string(TOLOWER ${ATOMUI_SYSTEM_NAME} ATOMUI_SYSTEM_NORMAL_NAME)
# Add path for custom CMake modules.
list(APPEND CMAKE_MODULE_PATH
"${CMAKE_CURRENT_SOURCE_DIR}/cmake"
"${ATOMUI_CMAKE_MODULES_DIR}"
)
include(MetaInfo)
include(FeatureSummary)
project(${ATOMUI_PACKAGE_NAME} LANGUAGES C CXX
VERSION ${ATOMUI_VERSION_MAJOR}.${ATOMUI_VERSION_MINOR}.${ATOMUI_VERSION_PATCH})
if(NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Debug CACHE STRING "Build type" FORCE)
endif()
if (CMAKE_BUILD_TYPE STREQUAL "Debug")
set(ATOMUI_DEBUG_BUILD ON)
endif()
if (${CMAKE_HOST_SYSTEM_NAME} STREQUAL Linux)
set(LINUX ON)
endif()
string(TOLOWER ${CMAKE_BUILD_TYPE} ATOMUI_BUILD_TYPE)
if (CMAKE_BUILD_TYPE AND
NOT ATOMUI_BUILD_TYPE MATCHES "^(debug|release|relwithdebinfo|minsizerel)$")
message(FATAL_ERROR "Invalid value for CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
endif()
option(ATOMUI_WITH_DEBUG_CMAKE "Enabled CMake project debugging functionality (e.g. source file disk checking)" OFF)
option(ATOMUI_BUILD_UNITTESTS "Generate build targets for the atomui library unittests." ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
include(Utils)
include(HandleRequirePackages)
include(HandleAppPath)
include(TargetUtils)
include(TestUtils)
include_directories(${ATOMUI_SOURCE_DIR}
${ATOMUI_INCLUDE_DIR}
${ATOMUI_INCLUDE_DIR}/atomui
${ATOMUI_BINARY_INCLUDE_DIR}
${ATOMUI_BINARY_INCLUDE_DIR}/atomui
${CMAKE_CURRENT_BINARY_DIR})
if (ATOMUI_BUILD_UNITTESTS)
enable_testing()
endif()
add_subdirectory(include/atomui)
add_subdirectory(src)
include(SummaryOutput)
@@ -0,0 +1,173 @@
# This source file is part of the atomui project
#
# Copyright (c) 2017 - 2022 qinware, All rights reserved.
# Copyright (c) 2017 - 2022 chinboy <chinware@163.com>
#
# See https://qinware.com/LICENSE.txt for license information
#
# Created by chinboy on 2025/01/10.
include(CMakeParseArguments)
include(Utils)
# Populate the variable 'args' in the parent scope with a keyword
# argument list. We read the variables options, ${k}_keyword, and
# ACCT_${k} from the parent scope, for each ${k} in the list of
# keyword names other than COMMAND accepted by
# add_custom_command_target.
#
# ${k}_keyword must expand to ${k} if ${k} was passed to
# add_custom_command_target, and be empty otherwise.
#
# ACCT_${k} must expand to the list of arguments to
# add_custom_command_target marked by ${k}, and be empty otherwise.
#
function(_make_acct_argument_list)
set(args)
foreach(k ${ARGN})
if(${k} IN_LIST options)
list(APPEND args ${${k}_keyword})
else()
list(APPEND args ${${k}_keyword} ${ACCT_${k}})
endif()
endforeach()
set(args ${args} PARENT_SCOPE)
endfunction()
# Add a custom command/target pair. Use this instead of
# add_custom_command because it provides proper dependency tracking
# when used with parallel builds and the 'Unix Makefiles' generator.
# See https://www.cmake.org/Bug/view.php?id=10082
#
# The CMake documentation for add_custom_command quoth,
#
# "Do not list the output in more than one independent target that
# may build in parallel or the two instances of the rule may
# conflict (instead use add_custom_target to drive the command and
# make the other targets depend on that one)."
#
# This function implements the suggested pattern.
#
# add_custom_command_target(
# dependency_out_var_name
#
# COMMAND command1 [ARGS] [args1...]
# [COMMAND command2 [ARGS] [args2...] ...]
#
# OUTPUT output1 [output2 ...]
# [MAIN_DEPENDENCY depend]
# [DEPENDS [depends...]]
# [IMPLICIT_DEPENDS <lang1> depend1
# [<lang2> depend2] ...]
# [WORKING_DIRECTORY dir]
# [COMMENT comment] [VERBATIM] [APPEND]
# [ALL]
# [SOURCES src1 [src2...]])
#
# dependency_out_var_name is the name of a variable, to be set in the
# parent scope with the name of a target that all targets using the
# OUTPUT should depend on. For example:
#
# add_custom_command_target(
# TheDependency
# COMMAND echo "int main() {}" ">" z.c
# OUTPUT z.c
# VERBATIM
# DEPENDS z.c.gyb)
#
# add_executable(exe1 z.c)
# add_dependencies(exe1 ${TheDependency})
# add_executable(exe2 z.c)
# add_dependencies(exe2 ${TheDependency})
#
# **Note1**: all COMMAND arguments must immediately follow
# dependency_out_var_name or this function will misbehave.
#
# **Note2**: any subdirectories that define targets dependent on
# OUTPUT ${o} should invoke:
#
# set_source_files_properties(${o} PROPERTIES GENERATED true)
#
# All arguments other than ALL, SOURCES, and dependency_out_var_name
# are forwarded to add_custom_command; arguments ALL, SOURCES, and
# WORKING_DIRECTORY are forwarded to add_custom_target. See the
# documentation of those functions for a description of all arguments.
#
# How This Function Works
#
# CMake offers one way to add new build rules: add_custom_command.
# Most people, however, overlook its actual semantics.
# add_custom_command does *not* create a target. The CMake
# documentation declareth,
#
# "A target created in the same directory (CMakeLists.txt file) that
# specifies any output of the custom command as a source file is
# given a rule to generate the file using the command at build
# time."
#
# Therefore, when two targets built in parallel depend on an output of
# the same custom command, they may race to rebuild that output.
# Hilarity ensues. You might not notice this effect depending on the
# generator you use, but it happens with 'Unix Makefiles'.
#
# By injecting a target into the dependency graph between the custom
# command output and any targets that depend on that output, we force
# the output to be built before starting on any of its dependent
# targets.
function(add_custom_command_target dependency_out_var_name)
# Parse the arguments. We don't look for COMMAND arguments because
# they don't follow the pattern supported by cmake_parse_arguments.
# As a result, they end up in ACCT_UNPARSED_ARGUMENTS and are
# forwarded verbatim.
set(options ALL VERBATIM APPEND IDEMPOTENT EXCLUDE_FROM_ALL)
set(single_value_args
MAIN_DEPENDENCY WORKING_DIRECTORY COMMENT CUSTOM_TARGET_NAME)
set(multi_value_args OUTPUT DEPENDS IMPLICIT_DEPENDS SOURCES)
cmake_parse_arguments(
ACCT # prefix
"${options}" "${single_value_args}" "${multi_value_args}" ${ARGN})
set(ACCT_COMMANDS ${ACCT_UNPARSED_ARGUMENTS})
if("${ACCT_CUSTOM_TARGET_NAME}" STREQUAL "")
# CMake doesn't allow '/' characters in filenames, so replace them with '-'
list(GET ACCT_OUTPUT 0 output_filename)
string(REPLACE "${CMAKE_BINARY_DIR}/" "" target_name "${output_filename}")
string(REPLACE "${CMAKE_SOURCE_DIR}/" "" target_name "${target_name}")
string(REPLACE "${CMAKE_CFG_INTDIR}/" "" target_name "${target_name}")
string(REPLACE "/" "-" target_name "${target_name}")
else()
set(target_name "${ACCT_CUSTOM_TARGET_NAME}")
endif()
if((NOT ACCT_IDEMPOTENT) OR (ACCT_IDEMPOTENT AND NOT TARGET "${target_name}"))
# For each keyword argument k that was passed to this function, set
# ${k}_keyword to ${k}. That will allow us to use the incantation
# '${${k}_keyword} ${ACCT_${k}}' to forward the arguments on.
foreach(var ${options} ${single_value_args} ${multi_value_args})
atomui_translate_flag(ACCT_${var} ${var} ${var}_keyword)
endforeach()
_make_acct_argument_list(
OUTPUT MAIN_DEPENDENCY DEPENDS
IMPLICIT_DEPENDS WORKING_DIRECTORY COMMENT VERBATIM APPEND)
add_custom_command(${ACCT_COMMANDS} ${args})
_make_acct_argument_list(ALL WORKING_DIRECTORY SOURCES)
add_custom_target(
"${target_name}" ${args}
DEPENDS ${ACCT_OUTPUT}
COMMENT "${ACCT_OUTPUT}")
set_target_properties(
"${target_name}" PROPERTIES
FOLDER "add_custom_command_target artifacts")
if (ACCT_EXCLUDE_FROM_ALL)
set_target_properties(
"${target_name}" PROPERTIES
EXCLUDE_FROM_ALL TRUE)
endif()
endif()
# "Return" the name of the custom target
set("${dependency_out_var_name}" "${target_name}" PARENT_SCOPE)
endfunction()
@@ -0,0 +1,125 @@
# This source file is part of the atomui project
#
# Copyright (c) 2017 - 2022 qinware, All rights reserved.
# Copyright (c) 2017 - 2022 chinboy <chinware@163.com>
#
# See https://qinware.com/LICENSE.txt for license information
#
# Created by chinboy on 2025/01/10.
#
# FindGoogleTest
# -----------------
#
# Try to locate the GoogleTest source files, and then build them as a
# static library.
#
# The ``GOOGLETEST_DIR`` (CMake or Environment) variable should be used
# to pinpoint the GoogleTest source files.
#
# If found, this will define the following variables:
#
# ``GoogleTest_FOUND``
# True if the GoogleTest source package has been found.
#
# ``GoogleTest``
# Target compiled as static library.
#
find_path(GOOGLE_TEST_INCLUDE_DIR
NAMES gtest/gtest.h
PATH_SUFFIXES googletest/include
HINTS
"${GOOGLETEST_DIR}" ENV GOOGLETEST_DIR
"${PROJECT_SOURCE_DIR}/googletest"
"${PROJECT_SOURCE_DIR}/../googletest"
"${PROJECT_SOURCE_DIR}/../../googletest"
"${PROJECT_SOURCE_DIR}/thirdparty/googletest"
)
find_path(GOOGLE_TEST_SRC_ALL
NAMES gtest-all.cc
PATH_SUFFIXES googletest/src
HINTS
"${GOOGLETEST_DIR}" ENV GOOGLETEST_DIR
"${PROJECT_SOURCE_DIR}/googletest"
"${PROJECT_SOURCE_DIR}/../googletest"
"${PROJECT_SOURCE_DIR}/../../googletest"
"${PROJECT_SOURCE_DIR}/thirdparty/googletest"
)
find_path(GOOGLE_MOCK_INCLUDE_DIR
NAMES gmock/gmock.h
PATH_SUFFIXES googlemock/include
HINTS
"${GOOGLETEST_DIR}" ENV GOOGLETEST_DIR
"${PROJECT_SOURCE_DIR}/googletest"
"${PROJECT_SOURCE_DIR}/../googletest"
"${PROJECT_SOURCE_DIR}/../../googletest"
"${PROJECT_SOURCE_DIR}/thirdparty/googletest"
)
find_path(GOOGLE_MOCK_SRC_ALL
NAMES gmock-all.cc
PATH_SUFFIXES googlemock/src
HINTS
"${GOOGLETEST_DIR}" ENV GOOGLETEST_DIR
"${PROJECT_SOURCE_DIR}/googletest"
"${PROJECT_SOURCE_DIR}/../googletest"
"${PROJECT_SOURCE_DIR}/../../googletest"
"${PROJECT_SOURCE_DIR}/thirdparty/googletest"
)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(GoogleTest
DEFAULT_MSG
GOOGLE_TEST_INCLUDE_DIR GOOGLE_MOCK_INCLUDE_DIR
GOOGLE_TEST_SRC_ALL GOOGLE_MOCK_SRC_ALL
)
find_package(Threads REQUIRED)
if(GoogleTest_FOUND AND NOT TARGET GoogleTest)
add_library(GoogleTest STATIC
"${GOOGLE_TEST_SRC_ALL}/gtest-all.cc"
"${GOOGLE_MOCK_SRC_ALL}/gmock-all.cc"
)
target_include_directories(GoogleTest
PUBLIC
"${GOOGLE_TEST_INCLUDE_DIR}"
"${GOOGLE_MOCK_INCLUDE_DIR}"
PRIVATE
"${GOOGLE_TEST_SRC_ALL}/.."
"${GOOGLE_MOCK_SRC_ALL}/.."
)
target_compile_definitions(GoogleTest
PRIVATE
GTEST_HAS_STD_INITIALIZER_LIST_
GTEST_LANG_CXX11
GTEST_HAS_STD_TUPLE_
GTEST_HAS_STD_TYPE_TRAITS_
GTEST_HAS_STD_FUNCTION_
GTEST_HAS_RTTI
GTEST_HAS_STD_BEGIN_AND_END_
GTEST_HAS_STD_UNIQUE_PTR_
GTEST_HAS_EXCEPTIONS
GTEST_HAS_STREAM_REDIRECTION
GTEST_HAS_TYPED_TEST
GTEST_HAS_TYPED_TEST_P
GTEST_HAS_PARAM_TEST
GTEST_HAS_DEATH_TEST
)
set_target_properties(GoogleTest PROPERTIES AUTOMOC OFF AUTOUIC OFF)
set_property(TARGET GoogleTest PROPERTY POSITION_INDEPENDENT_CODE ON)
target_compile_definitions(GoogleTest PUBLIC GOOGLE_TEST_IS_FOUND)
target_link_libraries(GoogleTest Threads::Threads)
endif()
mark_as_advanced(
GOOGLE_TEST_INCLUDE_DIR
GOOGLE_MOCK_INCLUDE_DIR
GOOGLE_TEST_SRC_ALL
GOOGLE_MOCK_SRC_ALL)
include(FeatureSummary)
set_package_properties(GoogleTest PROPERTIES
URL "https://github.com/google/googletest"
DESCRIPTION "Google Testing and Mocking Framework")
@@ -0,0 +1,54 @@
# This source file is part of the atomui project
#
# Copyright (c) 2017 - 2022 qinware, All rights reserved.
# Copyright (c) 2017 - 2022 chinboy <chinware@163.com>
#
# See https://qinware.com/LICENSE.txt for license information
#
# Created by chinboy on 2025/01/10.
if (WIN32)
set(_ATOMUI_APP_PATH "bin")
set(_ATOMUI_APP_TARGET "${ATOMUI_PACKAGE_NAME}")
set(_ATOMUI_LIBRARY_BASE_PATH "lib")
set(_ATOMUI_LIBRARY_PATH "${_ATOMUI_LIBRARY_BASE_PATH}")
set(_ATOMUI_LIBEXEC_PATH "bin")
set(_ATOMUI_DATA_PATH "share/${ATOMUI_PACKAGE_NAME}")
set(_ATOMUI_BIN_PATH "bin")
set(_ATOMUI_LIBRARY_ARCHIVE_PATH "${_ATOMUI_BIN_PATH}")
else ()
include(GNUInstallDirs)
set(_ATOMUI_APP_PATH "${CMAKE_INSTALL_BINDIR}")
set(_ATOMUI_APP_TARGET "${ATOMUI_PACKAGE_NAME}")
set(_ATOMUI_LIBRARY_BASE_PATH "${CMAKE_INSTALL_LIBDIR}")
set(_ATOMUI_LIBRARY_PATH "${_ATOMUI_LIBRARY_BASE_PATH}")
set(_ATOMUI_LIBEXEC_PATH "${CMAKE_INSTALL_LIBEXECDIR}")
set(_ATOMUI_DATA_PATH "${CMAKE_INSTALL_DATAROOTDIR}/${ATOMUI_PACKAGE_NAME}")
set(_ATOMUI_BIN_PATH "${CMAKE_INSTALL_BINDIR}")
set(_ATOMUI_LIBRARY_ARCHIVE_PATH "${_ATOMUI_LIBRARY_PATH}")
endif ()
if (APPLE)
set(_RPATH_BASE "@executable_path")
set(_LIB_RPATH "@loader_path")
elseif (WIN32)
set(_RPATH_BASE "")
set(_LIB_RPATH "")
else ()
set(_RPATH_BASE "\$ORIGIN")
set(_LIB_RPATH "\$ORIGIN;")
endif ()
set(ATOMUI_APP_PATH "${_ATOMUI_APP_PATH}") # The target path of the ATOMUI application (relative to CMAKE_INSTALL_PREFIX).
set(ATOMUI_APP_TARGET "${_ATOMUI_APP_TARGET}") # The ATOMUI application name.
set(ATOMUI_LIBRARY_BASE_PATH "${_ATOMUI_LIBRARY_BASE_PATH}") # The ATOMUI library base path (relative to CMAKE_INSTALL_PREFIX).
set(ATOMUI_LIBRARY_PATH "${_ATOMUI_LIBRARY_PATH}") # The ATOMUI library path (relative to CMAKE_INSTALL_PREFIX).
set(ATOMUI_LIBRARY_ARCHIVE_PATH "${_ATOMUI_LIBRARY_ARCHIVE_PATH}") # The ATOMUI library archive path (relative to CMAKE_INSTALL_PREFIX).
set(ATOMUI_LIBEXEC_PATH "${_ATOMUI_LIBEXEC_PATH}") # The ATOMUI libexec path (relative to CMAKE_INSTALL_PREFIX).
set(ATOMUI_DATA_PATH "${_ATOMUI_DATA_PATH}") # The ATOMUI data path (relative to CMAKE_INSTALL_PREFIX).
set(ATOMUI_BIN_PATH "${_ATOMUI_BIN_PATH}") # The ATOMUI bin path (relative to CMAKE_INSTALL_PREFIX).
file(RELATIVE_PATH RELATIVE_LIBEXEC_PATH "/${ATOMUI_BIN_PATH}" "/${ATOMUI_LIBEXEC_PATH}")
file(RELATIVE_PATH RELATIVE_DATA_PATH "/${ATOMUI_BIN_PATH}" "/${ATOMUI_DATA_PATH}")
@@ -0,0 +1,42 @@
# This source file is part of the atomui project
#
# Copyright (c) 2017 - 2022 qinware, All rights reserved.
# Copyright (c) 2017 - 2022 chinboy <chinware@163.com>
#
# See https://qinware.com/LICENSE.txt for license information
#
# Created by chinboy on 2025/01/10.
if (APPLE)
find_library(FWCoreFoundation CoreFoundation)
find_library(FWCoreServices CoreServices)
find_library(FWFoundation Foundation)
find_library(FWAppKit AppKit)
find_library(FWIOKit IOKit)
find_library(FWSecurity Security)
find_library(FWSystemConfiguration SystemConfiguration)
find_library(FWWebKit WebKit)
endif()
if(LINUX)
# 查找必需的 XCB 组件
find_package(PkgConfig REQUIRED)
pkg_check_modules(XCB REQUIRED IMPORTED_TARGET
xcb
xcb-shape
)
endif()
if(WIN32)
# 设置共享库不添加前缀
set(CMAKE_SHARED_LIBRARY_PREFIX "")
set(CMAKE_SHARED_LIBRARY_SUFFIX ".dll")
# 设置静态库不添加前缀
set(CMAKE_STATIC_LIBRARY_PREFIX "")
set(CMAKE_STATIC_LIBRARY_SUFFIX ".lib")
# 可选:确保导入库也保持一致命名
set(CMAKE_IMPORT_LIBRARY_PREFIX "")
set(CMAKE_IMPORT_LIBRARY_SUFFIX ".lib")
endif()
@@ -0,0 +1,14 @@
# This source file is part of the atomui project
#
# Copyright (c) 2017 - 2022 qinware, All rights reserved.
# Copyright (c) 2017 - 2022 chinboy <chinware@163.com>
#
# See https://qinware.com/LICENSE.txt for license information
#
# Created by chinboy on 2025/01/10.
include(ExternalProject)
if (ATOMUI_BUILD_UNITTESTS)
find_package(GoogleTest REQUIRED)
endif()
+43
View File
@@ -0,0 +1,43 @@
# This source file is part of the atomui project
#
# Copyright (c) 2017 - 2022 qinware, All rights reserved.
# Copyright (c) 2017 - 2022 chinboy <chinware@163.com>
#
# See https://qinware.com/LICENSE.txt for license information
#
# Created by chinboy on 2025/01/10.
if(NOT DEFINED ATOMUI_VERSION_MAJOR)
set(ATOMUI_VERSION_MAJOR 0)
endif()
if(NOT DEFINED ATOMUI_VERSION_MINOR)
set(ATOMUI_VERSION_MINOR 1)
endif()
if(NOT DEFINED ATOMUI_VERSION_PATCH)
set(ATOMUI_VERSION_PATCH 0)
endif()
if(NOT DEFINED ATOMUI_VERSION_BUILD)
set(ATOMUI_VERSION_BUILD "")
endif()
if (NOT ATOMUI_PACKAGE_VERSION)
set(ATOMUI_PACKAGE_VERSION "${ATOMUI_VERSION_MAJOR}.${ATOMUI_VERSION_MINOR}.${ATOMUI_VERSION_PATCH}-${ATOMUI_VERSION_BUILD}")
endif()
if (NOT ATOMUI_VERSION)
set(ATOMUI_VERSION "${ATOMUI_VERSION_MAJOR}.${ATOMUI_VERSION_MINOR}.${ATOMUI_VERSION_PATCH}")
endif()
set(ATOMUI_VERSION_COMPAT ${ATOMUI_VERSION})
math(EXPR ATOMUI_VERSION_ID ${ATOMUI_VERSION_MAJOR}*10000+${ATOMUI_VERSION_MINOR}*100+${ATOMUI_VERSION_PATCH})
set(ATOMUI_COMPAT_VERSION ${ATOMUI_VERSION})
set(ATOMUI_PACKAGE_NAME atomui)
set(ATOMUI_PACKAGE_CASED_NAME AtomUI)
set(ATOMUI_PACKAGE_STRING "${ATOMUI_PACKAGE_NAME} ${ATOMUI_PACKAGE_VERSION}")
set(ATOMUI_PACKAGE_BUGREPORT "https://qinware.com/bugs/")
set(ATOMUI_DISPLAY_NAME "AtomUI")
set(ATOMUI_COPYRIGHT_YEAR "2025")
set(ATOMUI_COMPANY_NAME "Qinware")
set(ATOMUI_COPYRIGHT "Copyright Qinware Technologies Ltd. (c) 2018-2025")
@@ -0,0 +1,35 @@
# This source file is part of the atomui project
#
# Copyright (c) 2017 - 2022 qinware, All rights reserved.
# Copyright (c) 2017 - 2022 chinboy <chinware@163.com>
#
# See https://qinware.com/LICENSE.txt for license information
#
# Created by chinboy on 2025/01/10.
#
message(STATUS "--------------------------------------------------------------------------------------")
message(STATUS "Thank for using AtomUI project, have a lot of fun!")
message(STATUS "--------------------------------------------------------------------------------------")
message(STATUS "CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}")
message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
message(STATUS "PROJECT_BINARY_DIR: ${PROJECT_BINARY_DIR}")
message(STATUS "PROJECT_SOURCE_DIR: ${PROJECT_SOURCE_DIR}")
message(STATUS "CMAKE_ROOT: ${CMAKE_ROOT}")
message(STATUS "CMAKE_SYSTEM: ${CMAKE_SYSTEM}")
message(STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}")
message(STATUS "CMAKE_SKIP_RPATH: ${CMAKE_SKIP_RPATH}")
message(STATUS "CMAKE_VERBOSE_MAKEFILE: ${CMAKE_VERBOSE_MAKEFILE}")
message(STATUS "CMAKE_C_COMPILER: ${CMAKE_C_COMPILER}")
message(STATUS "CMAKE_C_COMPILER_VERSION: ${CMAKE_C_COMPILER_VERSION}")
message(STATUS "CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}")
message(STATUS "CMAKE_CXX_COMPILER: ${CMAKE_CXX_COMPILER}")
message(STATUS "CMAKE_CXX_COMPILER_VERSION: ${CMAKE_CXX_COMPILER_VERSION}")
message(STATUS "CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")
message(STATUS "CMAKE_EXE_LINKER_FLAGS: ${CMAKE_EXE_LINKER_FLAGS}")
message(STATUS "--------------------------------------------------------------------------------------")
feature_summary(INCLUDE_QUIET_PACKAGES WHAT
PACKAGES_FOUND PACKAGES_NOT_FOUND
ENABLED_FEATURES DISABLED_FEATURES
)
+386
View File
@@ -0,0 +1,386 @@
# This source file is part of the atomui project
#
# Copyright (c) 2017 - 2022 qinware, All rights reserved.
# Copyright (c) 2017 - 2022 chinboy <chinware@163.com>
#
# See https://qinware.com/LICENSE.txt for license information
#
# Created by chinboy on 2025/01/10.
include_guard(GLOBAL)
# If we provide a list of plugins, executables, libraries, then the BUILD_<type>_BY_DEFAULT will be set to OFF
# and for every element we set BUILD_<type>_<element> to ON
# e.g. BUILD_PLUGINS=Core;TextEditor will result in BUILD_PLUGINS_BY_DEFAULT=OFF and BUILD_PLUGIN_CORE=ON and BUILD_PLUGIN_TEXTEDITOR ON
function(atomui_check_default_values_for_list list_type)
set(PLUGINS_single plugin)
set(EXECUTABLES_single executable)
set(LIBRARIES_single library)
set(TESTS_single test)
if (NOT DEFINED ATOMUI_BUILD_${list_type})
return()
endif ()
set(ATOMUI_BUILD_${list_type}_BY_DEFAULT OFF CACHE BOOL "" FORCE)
foreach (element ${ATOMUI_BUILD_${list_type}})
string(TOUPPER "${${list_type}_single}_${element}" upper_element)
set(ATOMUI_BUILD_${upper_element} ON CACHE BOOL "Build ${${list_type}_single} ${element}.")
endforeach ()
endfunction()
atomui_check_default_values_for_list(EXECUTABLES)
atomui_check_default_values_for_list(LIBRARIES)
atomui_check_default_values_for_list(TESTS)
function(atomui_library_enabled varName name)
if (NOT (name IN_LIST __ATOMUI_LIBRARIES))
message(FATAL_ERROR "atomui_library_enabled: Unknown library target \"${name}\"")
endif ()
if (TARGET ${name})
set(${varName} ON PARENT_SCOPE)
else ()
set(${varName} OFF PARENT_SCOPE)
endif ()
endfunction()
function(atomui_output_binary_dir varName)
if (ATOMUI_MERGE_BINARY_DIR)
set(${varName} ${ATOMUI_BINARY_DIR} PARENT_SCOPE)
else ()
set(${varName} ${PROJECT_BINARY_DIR} PARENT_SCOPE)
endif ()
endfunction()
function(atomui_source_dir varName)
if (ATOMUI_MERGE_BINARY_DIR)
set(${varName} ${ATOMUI_SOURCE_DIR} PARENT_SCOPE)
else ()
set(${varName} ${PROJECT_SOURCE_DIR} PARENT_SCOPE)
endif ()
endfunction()
function(atomui_add_library name)
cmake_parse_arguments(_arg "STATIC;OBJECT;FEATURE_INFO"
"DESTINATION;COMPONENT;SOURCES_PREFIX;BUILD_DEFAULT"
"CONDITION;DEPENDS;PUBLIC_DEPENDS;DEFINES;PUBLIC_DEFINES;INCLUDES;PUBLIC_INCLUDES;SOURCES;PROPERTIES" ${ARGN}
)
set(default_defines_copy ${DEFAULT_DEFINES})
if (${_arg_UNPARSED_ARGUMENTS})
message(FATAL_ERROR "atomui_add_library had unparsed arguments")
endif ()
atomui_update_cached_list(__ATOMUI_LIBRARIES "${name}")
atomui_condition_info(_extra_text _arg_CONDITION)
if (NOT _arg_CONDITION)
set(_arg_CONDITION ON)
endif ()
add_feature_info("Library ${name}" ON "${_extra_text}")
set(library_type SHARED)
if (_arg_STATIC)
set(library_type STATIC)
endif ()
if (_arg_OBJECT)
set(library_type OBJECT)
endif ()
add_library(${name} ${library_type})
add_library(AtomUI::${name} ALIAS ${name})
string(TOUPPER "ATOMUI_LIBRARY" EXPORT_SYMBOL)
if (ATOMUI_WITH_TESTS)
set(TEST_DEFINES WITH_TESTS SRCDIR="${CMAKE_CURRENT_SOURCE_DIR}")
endif ()
if (_arg_STATIC AND UNIX)
# not added by Qt if reduce_relocations is turned off for it
set_target_properties(${name} PROPERTIES POSITION_INDEPENDENT_CODE ON)
endif ()
atomui_extend_target(${name}
SOURCES_PREFIX ${_arg_SOURCES_PREFIX}
SOURCES ${_arg_SOURCES}
INCLUDES ${_arg_INCLUDES}
PUBLIC_INCLUDES ${_arg_PUBLIC_INCLUDES}
DEFINES ${EXPORT_SYMBOL} ${default_defines_copy} ${_arg_DEFINES} ${TEST_DEFINES}
PUBLIC_DEFINES ${_arg_PUBLIC_DEFINES}
DEPENDS ${_arg_DEPENDS} ${IMPLICIT_DEPENDS}
PUBLIC_DEPENDS ${_arg_PUBLIC_DEPENDS}
)
# everything is different with SOURCES_PREFIX
if (NOT _arg_SOURCES_PREFIX)
target_include_directories(${name}
PRIVATE
"$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>"
PUBLIC
"$<BUILD_INTERFACE:${ATOMUI_BINARY_INCLUDE_DIR}>"
"$<BUILD_INTERFACE:${ATOMUI_INCLUDE_DIR}>"
"$<INSTALL_INTERFACE:${ATOMUI_HEADER_INSTALL_PATH}>"
)
endif ()
set(_DESTINATION "${ATOMUI_BIN_PATH}")
if (_arg_DESTINATION)
set(_DESTINATION "${_arg_DESTINATION}")
endif ()
atomui_output_binary_dir(_output_binary_dir)
string(REGEX MATCH "^[0-9]*" ATOMUI_VERSION_MAJOR ${ATOMUI_VERSION})
set_target_properties(${name} PROPERTIES
LINK_DEPENDS_NO_SHARED ON
SOURCES_DIR "${CMAKE_CURRENT_SOURCE_DIR}"
MACHO_CURRENT_VERSION ${ATOMUI_VERSION}
MACHO_COMPATIBILITY_VERSION ${ATOMUI_VERSION_COMPAT}
CXX_EXTENSIONS OFF
CXX_VISIBILITY_PRESET hidden
VISIBILITY_INLINES_HIDDEN ON
BUILD_RPATH "${_LIB_RPATH};${CMAKE_BUILD_RPATH}"
INSTALL_RPATH "${_LIB_RPATH};${CMAKE_INSTALL_RPATH}"
RUNTIME_OUTPUT_DIRECTORY "${_output_binary_dir}/${_DESTINATION}"
LIBRARY_OUTPUT_DIRECTORY "${_output_binary_dir}/${ATOMUI_LIBRARY_PATH}"
ARCHIVE_OUTPUT_DIRECTORY "${_output_binary_dir}/${ATOMUI_LIBRARY_ARCHIVE_PATH}"
${_arg_PROPERTIES}
)
unset(NAMELINK_OPTION)
if (library_type STREQUAL "SHARED")
set(NAMELINK_OPTION NAMELINK_SKIP)
endif ()
unset(COMPONENT_OPTION)
if (_arg_COMPONENT)
set(COMPONENT_OPTION "COMPONENT" "${_arg_COMPONENT}")
endif ()
install(TARGETS ${name}
EXPORT ATOMUI
RUNTIME
DESTINATION "${_DESTINATION}"
${COMPONENT_OPTION}
OPTIONAL
LIBRARY
DESTINATION "${ATOMUI_LIBRARY_PATH}"
${NAMELINK_OPTION}
${COMPONENT_OPTION}
OPTIONAL
OBJECTS
DESTINATION "${ATOMUI_LIBRARY_PATH}"
COMPONENT Devel EXCLUDE_FROM_ALL
ARCHIVE
DESTINATION "${ATOMUI_LIBRARY_ARCHIVE_PATH}"
COMPONENT Devel EXCLUDE_FROM_ALL
OPTIONAL
)
if (ATOMUI_WITH_SANITIZE)
atomui_enable_sanitize(${SANITIZE_FLAGS})
endif ()
if (NAMELINK_OPTION)
install(TARGETS ${name}
LIBRARY
DESTINATION "${ATOMUI_LIBRARY_PATH}"
NAMELINK_ONLY
COMPONENT Devel EXCLUDE_FROM_ALL
OPTIONAL
)
endif ()
endfunction()
function(atomui_extend_library target_name)
atomui_library_enabled(_library_enabled ${target_name})
if (NOT _library_enabled)
return()
endif ()
atomui_extend_target(${target_name} ${ARGN})
endfunction()
function(atomui_extend_test target_name)
if (NOT (target_name IN_LIST __ATOMUI_TESTS))
message(FATAL_ERROR "atomui_extend_test: Unknown test target \"${target_name}\"")
endif ()
if (TARGET ${target_name})
atomui_extend_target(${target_name} ${ARGN})
endif ()
endfunction()
function(atomui_add_executable name)
cmake_parse_arguments(_arg ""
"DESTINATION;COMPONENT;BUILD_DEFAULT"
"CONDITION;DEPENDS;DEFINES;INCLUDES;SOURCES;PROPERTIES" ${ARGN})
if (${_arg_UNPARSED_ARGUMENTS})
message(FATAL_ERROR "atomui_add_executable had unparsed arguments!")
endif ()
set(default_defines_copy ${DEFAULT_DEFINES})
atomui_update_cached_list(__ATOMUI_EXECUTABLES "${name}")
if (NOT _arg_CONDITION)
set(_arg_CONDITION ON)
endif ()
string(TOUPPER "ATOMUI_BUILD_EXECUTABLE_${name}" _build_executable_var)
if (DEFINED _arg_BUILD_DEFAULT)
set(_build_executable_default ${_arg_BUILD_DEFAULT})
else ()
set(_build_executable_default ${ATOMUI_BUILD_EXECUTABLES_BY_DEFAULT})
endif ()
if (DEFINED ENV{${_build_executable_var}})
set(_build_executable_default "$ENV{${_build_executable_var}}")
endif ()
set(${_build_executable_var} "${_build_executable_default}" CACHE BOOL "Build executable ${name}.")
if ((${_arg_CONDITION}) AND ${_build_executable_var})
set(_executable_enabled ON)
else ()
set(_executable_enabled OFF)
endif ()
if (NOT _executable_enabled)
return()
endif ()
set(_DESTINATION "${ATOMUI_LIBEXEC_PATH}")
if (_arg_DESTINATION)
set(_DESTINATION "${_arg_DESTINATION}")
endif ()
set(_EXECUTABLE_PATH "${_DESTINATION}")
if (APPLE)
# path of executable might be inside app bundle instead of DESTINATION directly
cmake_parse_arguments(_prop "" "MACOSX_BUNDLE;OUTPUT_NAME" "" "${_arg_PROPERTIES}")
if (_prop_MACOSX_BUNDLE)
set(_BUNDLE_NAME "${name}")
if (_prop_OUTPUT_NAME)
set(_BUNDLE_NAME "${_prop_OUTPUT_NAME}")
endif ()
set(_BUNDLE_CONTENTS_PATH "${_DESTINATION}/${_BUNDLE_NAME}.app/Contents")
set(_EXECUTABLE_PATH "${_BUNDLE_CONTENTS_PATH}/MacOS")
set(_EXECUTABLE_FILE_PATH "${_EXECUTABLE_PATH}/${_BUNDLE_NAME}")
set(_BUNDLE_INFO_PLIST "${_BUNDLE_CONTENTS_PATH}/Info.plist")
endif ()
endif ()
if (ATOMUI_WITH_TESTS)
set(TEST_DEFINES WITH_TESTS SRCDIR="${CMAKE_CURRENT_SOURCE_DIR}")
endif ()
add_executable("${name}" ${_arg_SOURCES})
atomui_extend_target("${name}"
INCLUDES "${CMAKE_BINARY_DIR}/src" ${_arg_INCLUDES}
DEFINES ${default_defines_copy} ${TEST_DEFINES} ${_arg_DEFINES}
DEPENDS ${_arg_DEPENDS} ${IMPLICIT_DEPENDS}
)
file(RELATIVE_PATH relative_lib_path "/${_EXECUTABLE_PATH}" "/${ATOMUI_LIBRARY_PATH}")
set(build_rpath "${_RPATH_BASE}/${relative_lib_path}")
set(install_rpath "${_RPATH_BASE}/${relative_lib_path}")
if (NOT WIN32 AND NOT APPLE)
set(install_rpath "${install_rpath};")
endif ()
set(build_rpath "${build_rpath};${CMAKE_BUILD_RPATH}")
set(install_rpath "${install_rpath};${CMAKE_INSTALL_RPATH}")
atomui_output_binary_dir(_output_binary_dir)
set_target_properties("${name}" PROPERTIES
LINK_DEPENDS_NO_SHARED ON
BUILD_RPATH "${build_rpath}"
INSTALL_RPATH "${install_rpath}"
RUNTIME_OUTPUT_DIRECTORY "${_output_binary_dir}/${_DESTINATION}"
CXX_EXTENSIONS OFF
CXX_VISIBILITY_PRESET hidden
VISIBILITY_INLINES_HIDDEN ON
${_arg_PROPERTIES}
)
endfunction()
function(atomui_extend_executable name)
if (NOT (name IN_LIST __ATOMUI_EXECUTABLES))
message(FATAL_ERROR "atomui_extend_executable: Unknown executable target \"${name}\"")
endif ()
if (TARGET ${name})
atomui_extend_target(${name} ${ARGN})
endif ()
endfunction()
function(atomui_copy_to_builddir custom_target_name)
cmake_parse_arguments(_arg "CREATE_SUBDIRS" "DESTINATION" "FILES;DIRECTORIES" ${ARGN})
set(timestampFiles)
atomui_output_binary_dir(_output_binary_dir)
set(allFiles ${_arg_FILES})
foreach (srcFile ${_arg_FILES})
string(MAKE_C_IDENTIFIER "${srcFile}" destinationTimestampFilePart)
set(destinationTimestampFileName "${CMAKE_CURRENT_BINARY_DIR}/.${destinationTimestampFilePart}_timestamp")
list(APPEND timestampFiles "${destinationTimestampFileName}")
if (IS_ABSOLUTE "${srcFile}")
set(srcPath "")
else ()
get_filename_component(srcPath "${srcFile}" DIRECTORY)
endif ()
add_custom_command(OUTPUT "${destinationTimestampFileName}"
COMMAND "${CMAKE_COMMAND}" -E make_directory "${_output_binary_dir}/${_arg_DESTINATION}/${srcPath}"
COMMAND "${CMAKE_COMMAND}" -E copy "${srcFile}" "${_output_binary_dir}/${_arg_DESTINATION}/${srcPath}"
COMMAND "${CMAKE_COMMAND}" -E touch "${destinationTimestampFileName}"
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
COMMENT "Copy ${srcFile} into build directory"
DEPENDS "${srcFile}"
VERBATIM
)
endforeach ()
foreach (srcDirectory ${_arg_DIRECTORIES})
string(MAKE_C_IDENTIFIER "${srcDirectory}" destinationTimestampFilePart)
set(destinationTimestampFileName "${CMAKE_CURRENT_BINARY_DIR}/.${destinationTimestampFilePart}_timestamp")
list(APPEND timestampFiles "${destinationTimestampFileName}")
set(destinationDirectory "${_output_binary_dir}/${_arg_DESTINATION}")
if (_arg_CREATE_SUBDIRS)
set(destinationDirectory "${destinationDirectory}/${srcDirectory}")
endif ()
file(GLOB_RECURSE filesToCopy "${srcDirectory}/*")
list(APPEND allFiles ${filesToCopy})
add_custom_command(OUTPUT "${destinationTimestampFileName}"
COMMAND "${CMAKE_COMMAND}" -E copy_directory "${srcDirectory}" "${destinationDirectory}"
COMMAND "${CMAKE_COMMAND}" -E touch "${destinationTimestampFileName}"
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
COMMENT "Copy ${srcDirectory}/ into build directory"
DEPENDS ${filesToCopy}
VERBATIM
)
endforeach ()
add_custom_target("${custom_target_name}" ALL DEPENDS ${timestampFiles}
SOURCES ${allFiles})
endfunction()
function(atomui_add_public_header header)
if (NOT IS_ABSOLUTE ${header})
set(header "${CMAKE_CURRENT_SOURCE_DIR}/${header}")
endif ()
atomui_source_dir(atomui_source_dir)
get_filename_component(source_dir ${header} DIRECTORY)
file(RELATIVE_PATH include_dir_relative_path "${atomui_source_dir}" "${source_dir}")
install(
FILES ${header}
DESTINATION "${IDE_HEADER_INSTALL_PATH}/${include_dir_relative_path}"
COMPONENT Devel EXCLUDE_FROM_ALL
)
endfunction()
+130
View File
@@ -0,0 +1,130 @@
# This source file is part of the atomui project
#
# Copyright (c) 2017 - 2022 qinware, All rights reserved.
# Copyright (c) 2017 - 2022 chinboy <chinware@163.com>
#
# See https://qinware.com/LICENSE.txt for license information
#
# Created by chinboy on 2025/01/10.
# Generic support for adding a unittest.
function(atomui_add_unittest test_suite test_name)
cmake_parse_arguments(_arg "GTEST;MANUALTEST" "TIMEOUT"
"DEFINES;DEPENDS;INCLUDES;SOURCES;EXPLICIT_MOC;CONDITION;LINK_LIBS" ${ARGN})
if ($_arg_UNPARSED_ARGUMENTS)
message(FATAL_ERROR "atomui_add_unittest had unparsed arguments!")
endif ()
atomui_update_cached_list(__ATOMUI_TESTS "${test_name}")
set(_link_libs ${ATOMUI_LINK_COMPONENTS})
if (_arg_LINK_LIBS)
atomui_merge_list(_link_libs _arg_LINK_LIBS)
endif ()
if (NOT _arg_CONDITION)
set(_arg_CONDITION ON)
endif ()
if (NOT _arg_GTEST)
set(_arg_GTEST ON)
endif ()
if (NOT ATOMUI_BUILD_TESTS)
set(EXCLUDE_FROM_ALL ON)
endif ()
foreach (dependency ${_arg_DEPENDS})
if (NOT TARGET ${dependency} AND NOT _arg_GTEST)
if (ATOMUI_WITH_DEBUG_CMAKE)
message(STATUS "'${dependency}' is not a target")
endif ()
return()
endif ()
endforeach ()
if (SUPPORTS_VARIADIC_MACROS_FLAG)
list(APPEND ATOMUI_COMPILE_FLAGS "-Wno-variadic-macros")
endif ()
# Some parts of gtest rely on this GNU extension, don't warn on it.
if (SUPPORTS_GNU_ZERO_VARIADIC_MACRO_ARGUMENTS_FLAG)
list(APPEND ATOMUI_COMPILE_FLAGS "-Wno-gnu-zero-variadic-macro-arguments")
endif ()
set(TEST_DEFINES SRCDIR="${CMAKE_CURRENT_SOURCE_DIR}")
# relax cast requirements for tests
set(default_defines_copy ${DEFAULT_DEFINES})
file(RELATIVE_PATH _RPATH "/${ATOMUI_BIN_PATH}" "/${ATOMUI_LIBRARY_PATH}")
atomui_add_executable(${test_name}
DESTINATION ${ATOMUI_TEST_BIN_DIR}
SKIP_INSTALL
SOURCES ${_arg_SOURCES})
# The runtime benefits of LTO don't outweight the compile time costs for tests.
if (ATOMUI_ENABLE_LTO)
if ((UNIX OR MINGW) AND LINKER_IS_LLD)
set_property(TARGET ${test_name} APPEND_STRING PROPERTY
LINK_FLAGS " -Wl,--lto-O0")
elseif (LINKER_IS_LLD_LINK)
set_property(TARGET ${test_name} APPEND_STRING PROPERTY
LINK_FLAGS " /opt:lldlto=0")
endif ()
endif ()
atomui_extend_target(${test_name}
DEPENDS ${_arg_DEPENDS} ${IMPLICIT_DEPENDS}
INCLUDES ${ATOMUI_BINARY_INCLUDE_DIR} ${ATOMUI_INCLUDE_DIR} ${_arg_INCLUDES}
DEFINES ${_arg_DEFINES} ${TEST_DEFINES} ${default_defines_copy}
)
set_target_properties(${test_name} PROPERTIES
LINK_DEPENDS_NO_SHARED ON
CXX_VISIBILITY_PRESET hidden
VISIBILITY_INLINES_HIDDEN ON
BUILD_RPATH "${_RPATH_BASE}/${_RPATH};${CMAKE_BUILD_RPATH}"
INSTALL_RPATH "${_RPATH_BASE}/${_RPATH};${CMAKE_INSTALL_RPATH}"
)
# libpthreads overrides some standard library symbols, so main
# executable must be linked with it in order to provide consistent
# API for all shared libaries loaded by this executable.
if (_arg_GTEST)
list(APPEND _link_libs
GoogleTest
# GTest::gtest_main
# GTest::gtest
# GTest::gmock
# GTest::gmock_main
${ATOMUI_PTHREAD_LIB})
endif ()
target_link_libraries(${test_name} PRIVATE ${_link_libs})
if (ATOMUI_COMPILE_FLAGS)
target_compile_options(${test_name} PRIVATE ${ATOMUI_COMPILE_FLAGS})
endif ()
if (NOT TARGET ${test_suite})
add_custom_target("${test_suite}")
set_target_properties(${test_suite} PROPERTIES FOLDER "Tests")
endif ()
add_dependencies(${test_suite} ${test_name})
# 现在直接通过源码编译的方式引入
# add_dependencies(${test_name} thirdparty_gtest)
get_target_property(test_suite_folder ${test_suite} FOLDER)
if (test_suite_folder)
set_property(TARGET ${test_name} PROPERTY FOLDER "${test_suite_folder}")
endif ()
if (NOT _arg_GTEST AND NOT _arg_MANUALTEST)
add_test(NAME ${test_name} COMMAND ${test_name})
if (DEFINED _arg_TIMEOUT)
set(timeout_option TIMEOUT ${_arg_TIMEOUT})
else ()
set(timeout_option)
endif ()
atomui_finalize_test_setup(${test_name} ${timeout_option})
endif ()
endfunction()
+617
View File
@@ -0,0 +1,617 @@
# This source file is part of the atomui project
#
# Copyright (c) 2017 - 2022 qinware, All rights reserved.
# Copyright (c) 2017 - 2022 chinboy <chinware@163.com>
#
# See https://qinware.com/LICENSE.txt for license information
#
# Created by chinboy on 2025/01/10.
include_guard(GLOBAL)
include(CheckCSourceCompiles)
include(CheckCCompilerFlag)
include(CheckCXXCompilerFlag)
include(CheckSymbolExists)
# handle SCCACHE hack
# SCCACHE does not work with the /Zi option, which makes each compilation write debug info
# into the same .pdb file - even with /FS, which usually makes this work in the first place.
# Replace /Zi with /Z7, which leaves the debug info in the object files until link time.
# This increases memory usage, disk space usage and linking time, so should only be
# enabled if necessary.
# Must be called after project(...).
function(ATOMUI_WIN_HANDLE_sccache_support)
if (MSVC AND WITH_SCCACHE_SUPPORT)
foreach (config DEBUG RELWITHDEBINFO)
foreach (lang C CXX)
set(flags_var "CMAKE_${lang}_FLAGS_${config}")
string(REPLACE "/Zi" "/Z7" ${flags_var} "${${flags_var}}")
set(${flags_var} "${${flags_var}}" PARENT_SCOPE)
endforeach ()
endforeach ()
endif ()
endfunction()
function(atomui_enable_release_for_debug_configuration)
if (MSVC)
string(REPLACE "/Od" "/O2" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
string(REPLACE "/Ob0" "/Ob1" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
string(REPLACE "/RTC1" "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
else ()
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O2")
endif ()
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}" PARENT_SCOPE)
endfunction()
function(atomui_enable_sanitize _sanitize_flags)
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fsanitize=${_sanitize_flags}")
endif ()
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}" PARENT_SCOPE)
endfunction()
function(atomui_update_cached_list name value)
set(_tmp_list "${${name}}")
list(APPEND _tmp_list "${value}")
set("${name}" "${_tmp_list}" CACHE INTERNAL "*** Internal ***")
endfunction()
function(atomui_set_public_headers target sources)
foreach (source IN LISTS sources)
if (source MATCHES "\.h$|\.hpp$")
atomui_add_public_header(${source})
endif ()
endforeach ()
endfunction()
function(atomui_set_public_includes target includes)
foreach (inc_dir IN LISTS includes)
if (NOT IS_ABSOLUTE ${inc_dir})
set(inc_dir "${CMAKE_CURRENT_SOURCE_DIR}/${inc_dir}")
endif ()
file(RELATIVE_PATH include_dir_relative_path ${PROJECT_SOURCE_DIR} ${inc_dir})
target_include_directories(${target} PUBLIC
$<BUILD_INTERFACE:${inc_dir}>
$<INSTALL_INTERFACE:${_ATOMUI_HEADER_INSTALL_PATH}/${include_dir_relative_path}>
)
endforeach ()
endfunction()
function(atomui_finalize_test_setup test_name)
cmake_parse_arguments(_arg "" "TIMEOUT" "" ${ARGN})
if (DEFINED _arg_TIMEOUT)
set(timeout ${_arg_TIMEOUT})
else ()
set(timeout 5)
endif ()
# Never translate tests:
set_tests_properties(${name}
PROPERTIES
TIMEOUT ${timeout}
)
if (WIN32)
list(APPEND env_path $ENV{PATH})
list(APPEND env_path ${CMAKE_BINARY_DIR}/${_ATOMUI_PLUGIN_PATH})
list(APPEND env_path ${CMAKE_BINARY_DIR}/${_ATOMUI_BIN_PATH})
string(REPLACE "/" "\\" env_path "${env_path}")
string(REPLACE ";" "\\;" env_path "${env_path}")
set_tests_properties(${test_name} PROPERTIES ENVIRONMENT "PATH=${env_path}")
endif ()
endfunction()
function(atomui_check_disabled_targets target_name dependent_targets)
foreach (dependency IN LISTS ${dependent_targets})
foreach (type PLUGIN LIBRARY)
string(TOUPPER "BUILD_${type}_${dependency}" build_target)
if (DEFINED ${build_target} AND NOT ${build_target})
message(SEND_ERROR "Target ${name} depends on ${dependency} which was disabled via ${build_target} set to ${${build_target}}")
endif ()
endforeach ()
endforeach ()
endfunction()
function(atomui_add_depends target_name)
cmake_parse_arguments(_arg "" "" "PRIVATE;PUBLIC" ${ARGN})
if (${_arg_UNPARSED_ARGUMENTS})
message(FATAL_ERROR "atomui_add_depends had unparsed arguments")
endif ()
atomui_check_disabled_targets(${target_name} _arg_PRIVATE)
atomui_check_disabled_targets(${target_name} _arg_PUBLIC)
set(depends "${_arg_PRIVATE}")
set(public_depends "${_arg_PUBLIC}")
get_target_property(target_type ${target_name} TYPE)
if (NOT target_type STREQUAL "OBJECT_LIBRARY")
target_link_libraries(${target_name} PRIVATE ${depends} PUBLIC ${public_depends})
else ()
list(APPEND object_lib_depends ${depends})
list(APPEND object_public_depends ${public_depends})
endif ()
foreach (obj_lib IN LISTS object_lib_depends)
target_compile_options(${target_name} PRIVATE $<TARGET_PROPERTY:${obj_lib},INTERFACE_COMPILE_OPTIONS>)
target_compile_definitions(${target_name} PRIVATE $<TARGET_PROPERTY:${obj_lib},INTERFACE_COMPILE_DEFINITIONS>)
target_include_directories(${target_name} PRIVATE $<TARGET_PROPERTY:${obj_lib},INTERFACE_INCLUDE_DIRECTORIES>)
endforeach ()
foreach (obj_lib IN LISTS object_public_depends)
target_compile_options(${target_name} PUBLIC $<TARGET_PROPERTY:${obj_lib},INTERFACE_COMPILE_OPTIONS>)
target_compile_definitions(${target_name} PUBLIC $<TARGET_PROPERTY:${obj_lib},INTERFACE_COMPILE_DEFINITIONS>)
target_include_directories(${target_name} PUBLIC $<TARGET_PROPERTY:${obj_lib},INTERFACE_INCLUDE_DIRECTORIES>)
endforeach ()
endfunction()
function(atomui_find_dependent_plugins varName)
set(_RESULT ${ARGN})
foreach (i ${ARGN})
get_property(_dep TARGET "${i}Plugin" PROPERTY _arg_DEPENDS)
if (_dep)
atomui_find_dependent_plugins(_REC ${_dep})
list(APPEND _RESULT ${_REC})
endif ()
endforeach ()
if (_RESULT)
list(REMOVE_DUPLICATES _RESULT)
list(SORT _RESULT)
endif ()
set("${varName}" ${_RESULT} PARENT_SCOPE)
endfunction()
function(atomui_condition_info varName condition)
if (NOT ${condition})
set(${varName} "" PARENT_SCOPE)
else ()
string(REPLACE ";" " " _contents "${${condition}}")
set(${varName} "with CONDITION ${_contents}" PARENT_SCOPE)
endif ()
endfunction()
function(atomui_extend_target target_name)
cmake_parse_arguments(_arg
""
"SOURCES_PREFIX;SOURCES_PREFIX_FROM_TARGET;FEATURE_INFO"
"CONDITION;DEPENDS;PUBLIC_DEPENDS;DEFINES;PUBLIC_DEFINES;INCLUDES;PUBLIC_INCLUDES;SOURCES;PROPERTIES"
${ARGN}
)
if (${_arg_UNPARSED_ARGUMENTS})
message(FATAL_ERROR "atomui_extend_target had unparsed arguments")
endif ()
atomui_condition_info(_extra_text _arg_CONDITION)
if (NOT _arg_CONDITION)
set(_arg_CONDITION ON)
endif ()
if (${_arg_CONDITION})
set(_feature_enabled ON)
else ()
set(_feature_enabled OFF)
endif ()
if (_arg_FEATURE_INFO)
add_feature_info(${_arg_FEATURE_INFO} _feature_enabled "${_extra_text}")
endif ()
if (NOT _feature_enabled)
return()
endif ()
if (_arg_SOURCES_PREFIX_FROM_TARGET)
if (NOT TARGET ${_arg_SOURCES_PREFIX_FROM_TARGET})
return()
else ()
get_target_property(_arg_SOURCES_PREFIX ${_arg_SOURCES_PREFIX_FROM_TARGET} SOURCES_DIR)
endif ()
endif ()
atomui_add_depends(${target_name}
PRIVATE ${_arg_DEPENDS}
PUBLIC ${_arg_PUBLIC_DEPENDS}
)
target_compile_definitions(${target_name}
PRIVATE ${_arg_DEFINES}
PUBLIC ${_arg_PUBLIC_DEFINES}
)
target_include_directories(${target_name} PRIVATE ${_arg_INCLUDES})
atomui_set_public_includes(${target_name} "${_arg_PUBLIC_INCLUDES}")
if (_arg_SOURCES_PREFIX)
foreach (source IN LISTS _arg_SOURCES)
list(APPEND prefixed_sources "${_arg_SOURCES_PREFIX}/${source}")
endforeach ()
if (NOT IS_ABSOLUTE ${_arg_SOURCES_PREFIX})
set(_arg_SOURCES_PREFIX "${CMAKE_CURRENT_SOURCE_DIR}/${_arg_SOURCES_PREFIX}")
endif ()
target_include_directories(${target_name} PRIVATE $<BUILD_INTERFACE:${_arg_SOURCES_PREFIX}>)
set(_arg_SOURCES ${prefixed_sources})
endif ()
target_sources(${target_name} PRIVATE ${_arg_SOURCES})
atomui_set_public_headers(${target_name} "${_arg_SOURCES}")
if (_arg_PROPERTIES)
set_target_properties(${target_name} PROPERTIES ${_arg_PROPERTIES})
endif ()
endfunction()
# list functions
function(atomui_list_subtract lhs rhs result_var_name)
set(result)
foreach (item IN LISTS lhs)
if (NOT "${item}" IN_LIST rhs)
list(APPEND result "${item}")
endif ()
endforeach ()
set("${result_var_name}" "${result}" PARENT_SCOPE)
endfunction()
function(atomui_list_intersect lhs rhs result_var_name)
set(result)
foreach (item IN LISTS lhs)
if ("${item}" IN_LIST rhs)
list(APPEND result "${item}")
endif ()
endforeach ()
set("${result_var_name}" "${result}" PARENT_SCOPE)
endfunction()
function(atomui_list_union lhs rhs result_var_name)
set(result)
foreach (item IN LISTS lhs rhs)
if (NOT "${item}" IN_LIST result)
list(APPEND result "${item}")
endif ()
endforeach ()
set("${result_var_name}" "${result}" PARENT_SCOPE)
endfunction()
function(_list_add_string_suffix input_list suffix result_var_name)
set(result)
foreach (element ${input_list})
list(APPEND result "${element}${suffix}")
endforeach ()
set("${result_var_name}" "${result}" PARENT_SCOPE)
endfunction()
function(_list_escape_for_shell input_list result_var_name)
set(result "")
foreach (element ${input_list})
string(REPLACE " " "\\ " element "${element}")
set(result "${result}${element} ")
endforeach ()
set("${result_var_name}" "${result}" PARENT_SCOPE)
endfunction()
function(atomui_list_replace input_list old new)
set(replaced_list)
foreach (item ${${input_list}})
if (${item} STREQUAL ${old})
list(APPEND replaced_list ${new})
else ()
list(APPEND replaced_list ${item})
endif ()
endforeach ()
set("${input_list}" "${replaced_list}" PARENT_SCOPE)
endfunction()
macro(atomui_merge_list target list)
foreach (_listItem ${${list}})
list(APPEND ${target} ${_listItem})
endforeach ()
if (target)
list(REMOVE_DUPLICATES ${target})
endif ()
endmacro()
function(atomui_precondition var)
cmake_parse_arguments(
PRECONDITION # prefix
"NEGATE" # options
"MESSAGE" # single-value args
"" # multi-value args
${ARGN})
if (PRECONDITION_NEGATE)
if (${var})
if (PRECONDITION_MESSAGE)
message(FATAL_ERROR "Error! ${PRECONDITION_MESSAGE}")
else ()
message(FATAL_ERROR "Error! Variable ${var} is true or not empty. The value of ${var} is ${${var}}.")
endif ()
endif ()
else ()
if (NOT ${var})
if (PRECONDITION_MESSAGE)
message(FATAL_ERROR "Error! ${PRECONDITION_MESSAGE}")
else ()
message(FATAL_ERROR "Error! Variable ${var} is false, empty or not set.")
endif ()
endif ()
endif ()
endfunction()
# Assert is 'NOT ${LHS} ${OP} ${RHS}' is true.
function(atomui_precondition_binary_op OP LHS RHS)
cmake_parse_arguments(
PRECONDITIONBINOP # prefix
"NEGATE" # options
"MESSAGE" # single-value args
"" # multi-value args
${ARGN})
if (PRECONDITIONBINOP_NEGATE)
if (${LHS} ${OP} ${RHS})
if (PRECONDITIONBINOP_MESSAGE)
message(FATAL_ERROR "Error! ${PRECONDITIONBINOP_MESSAGE}")
else ()
message(FATAL_ERROR "Error! ${LHS} ${OP} ${RHS} is true!")
endif ()
endif ()
else ()
if (NOT ${LHS} ${OP} ${RHS})
if (PRECONDITIONBINOP_MESSAGE)
message(FATAL_ERROR "Error! ${PRECONDITIONBINOP_MESSAGE}")
else ()
message(FATAL_ERROR "Error! ${LHS} ${OP} ${RHS} is false!")
endif ()
endif ()
endif ()
endfunction()
# Translate a yes/no variable to the presence of a given string in a
# variable.
#
# Usage:
# atomui_translate_flag(is_set flag_name var_name)
#
# If is_set is true, sets ${var_name} to ${flag_name}. Otherwise,
# unsets ${var_name}.
function(atomui_translate_flag is_set flag_name var_name)
if (${is_set})
set("${var_name}" "${flag_name}" PARENT_SCOPE)
else ()
set("${var_name}" "" PARENT_SCOPE)
endif ()
endfunction()
macro(atomui_translate_flags prefix options)
foreach (var ${options})
atomui_translate_flag("${${prefix}_${var}}" "${var}" "${prefix}_${var}_keyword")
endforeach ()
endmacro()
# Set ${outvar} to ${${invar}}, asserting if ${invar} is not set.
function(atomui_precondition_translate_flag invar outvar)
atomui_precondition(${invar})
set(${outvar} "${${invar}}" PARENT_SCOPE)
endfunction()
# Set variable to value if value is not null or false. Otherwise set variable to
# default_value.
function(atomui_set_with_default variable value)
cmake_parse_argument(
SWD
""
"DEFAULT"
"" ${ARGN})
atomui_precondition(SWD_DEFAULT
MESSAGE "Must specify a default argument")
if (value)
set(${variable} ${value} PARENT_SCOPE)
else ()
set(${variable} ${SWD_DEFAULT} PARENT_SCOPE)
endif ()
endfunction()
function(atomui_dump_vars)
set(ATOMUI_STDLIB_GLOBAL_CMAKE_CACHE)
get_cmake_property(variableNames VARIABLES)
foreach (variableName ${variableNames})
if (variableName MATCHES "^ATOMUI")
set(ATOMUI_STDLIB_GLOBAL_CMAKE_CACHE "${ATOMUI_STDLIB_GLOBAL_CMAKE_CACHE}set(${variableName} \"${${variableName}}\")\n")
message("set(${variableName} \"${${variableName}}\")")
endif ()
endforeach ()
endfunction()
#
# Look for either a program in execute_process()'s path or for a hardcoded path.
# Find a program's version and set it in the parent scope.
# Replace newlines with spaces so it prints on one line.
#
function(atomui_find_version cmd flag find_in_path)
if (find_in_path)
message(STATUS "Finding installed version for: ${cmd}")
else ()
message(STATUS "Finding version for: ${cmd}")
endif ()
execute_process(
COMMAND ${cmd} ${flag}
OUTPUT_VARIABLE out
OUTPUT_STRIP_TRAILING_WHITESPACE)
if (NOT out)
if (find_in_path)
message(STATUS "tried to find version for ${cmd}, but ${cmd} not found in path, continuing")
else ()
message(FATAL_ERROR "tried to find version for ${cmd}, but ${cmd} not found")
endif ()
else ()
string(REPLACE "\n" " " out2 ${out})
message(STATUS "Found version: ${out2}")
endif ()
message(STATUS "")
endfunction()
function(atomui_append_flag value)
foreach (variable ${ARGN})
set(${variable} "${${variable}} ${value}" PARENT_SCOPE)
endforeach (variable)
endfunction()
function(atomui_append_flag_if condition value)
if (${condition})
foreach (variable ${ARGN})
set(${variable} "${${variable}} ${value}" PARENT_SCOPE)
endforeach (variable)
endif ()
endfunction()
macro(atomui_add_flag_if_supported flag name)
check_c_compiler_flag("-Werror ${flag}" "C_SUPPORTS_${name}")
atomui_append_flag_if("C_SUPPORTS_${name}" "${flag}" CMAKE_C_FLAGS)
check_cxx_compiler_flag("-Werror ${flag}" "CXX_SUPPORTS_${name}")
atomui_append_flag_if("CXX_SUPPORTS_${name}" "${flag}" CMAKE_CXX_FLAGS)
endmacro()
function(atomui_add_flag_or_print_warning flag name)
check_c_compiler_flag("-Werror ${flag}" "C_SUPPORTS_${name}")
check_cxx_compiler_flag("-Werror ${flag}" "CXX_SUPPORTS_${name}")
if (C_SUPPORTS_${name} AND CXX_SUPPORTS_${name})
message(STATUS "Building with ${flag}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${flag}" PARENT_SCOPE)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${flag}" PARENT_SCOPE)
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${flag}" PARENT_SCOPE)
else ()
message(WARNING "${flag} is not supported.")
endif ()
endfunction()
function(atomui_add_files target)
list(REMOVE_AT ARGV 0)
foreach (file ${ARGV})
list(APPEND ${target} ${CMAKE_CURRENT_SOURCE_DIR}/${file})
endforeach ()
set(${target} ${${target}} PARENT_SCOPE)
endfunction()
function(atomui_generate_header_guard filename output)
string(TOUPPER ${filename} filename)
string(REPLACE "." "_" filename ${filename})
string(REPLACE "/" "_" filename ${filename})
set(${output} HAVE_${filename} PARENT_SCOPE)
endfunction()
function(atomui_define_have name)
atomui_generate_header_guard(${name} haveName)
set(${haveName} ON PARENT_SCOPE)
endfunction()
macro(atomui_find_parent_dir path output)
get_filename_component(${output} ${path} ABSOLUTE)
get_filename_component(${output} ${${output}} DIRECTORY)
endmacro()
macro(atomui_add_rt_require_lib name)
list(APPEND ATOMUI_RT_REQUIRE_LIBS ${name})
if (NOT ${CMAKE_CURRENT_SOURCE_DIR} STREQUAL ${CMAKE_SOURCE_DIR})
set(ATOMUI_RT_REQUIRE_LIBS ${ATOMUI_RT_REQUIRE_LIBS} PARENT_SCOPE)
endif ()
endmacro()
macro(atomui_check_library_exists library function location variable)
check_library_exists("${library}" "${function}" "${location}" "${variable}")
if (${${variable}})
set(ATOMUI_${variable} ON)
endif ()
endmacro()
macro(atomui_check_symbol_exists symbol files variable)
check_symbol_exists("${symbol}" "${files}" "${variable}")
if (${${variable}})
set(ATOMUI_${variable} ON)
endif ()
endmacro()
# Beware that there is no implementation of remove_llvm_definitions.
macro(atomui_add_definitions)
# We don't want no semicolons on ATOMUI_DEFINITIONS:
foreach (arg ${ARGN})
if (DEFINED ATOMUI_DEFINITIONS)
set(ATOMUI_DEFINITIONS "${ATOMUI_DEFINITIONS} ${arg}")
else ()
set(ATOMUI_DEFINITIONS ${arg})
endif ()
endforeach (arg)
add_definitions(${ARGN})
endmacro()
macro(atomui_check_headers)
foreach (_filename ${ARGV})
atomui_generate_header_guard(${_filename} _guardName)
check_include_file(${_filename} ${_guardName})
if (${${_guardName}})
set(ATOMUI_${_guardName} ON)
endif ()
endforeach ()
endmacro()
macro(atomui_check_funcs)
foreach (_func ${ARGV})
string(TOUPPER ${_func} upcase)
check_function_exists(${_func} HAVE_${upcase})
if (${HAVE_${upcase}})
set(ATOMUI_HAVE_${upcase} ON)
endif ()
endforeach ()
endmacro()
# Set each output directory according to ${CMAKE_CONFIGURATION_TYPES}.
# Note: Don't set variables CMAKE_*_OUTPUT_DIRECTORY any more,
# or a certain builder, for eaxample, msbuild.exe, would be confused.
function(atomui_set_output_directory target)
cmake_parse_arguments(ARG "" "BINARY_DIR;LIBRARY_DIR" "" ${ARGN})
# module_dir -- corresponding to LIBRARY_OUTPUT_DIRECTORY.
# It affects output of add_library(MODULE).
if (WIN32 OR CYGWIN)
# DLL platform
set(module_dir ${ARG_BINARY_DIR})
else ()
set(module_dir ${ARG_LIBRARY_DIR})
endif ()
if (NOT "${CMAKE_CFG_INTDIR}" STREQUAL ".")
foreach (build_mode ${CMAKE_CONFIGURATION_TYPES})
string(TOUPPER "${build_mode}" CONFIG_SUFFIX)
if (ARG_BINARY_DIR)
string(REPLACE ${CMAKE_CFG_INTDIR} ${build_mode} bi ${ARG_BINARY_DIR})
set_target_properties(${target} PROPERTIES "RUNTIME_OUTPUT_DIRECTORY_${CONFIG_SUFFIX}" ${bi})
endif ()
if (ARG_LIBRARY_DIR)
string(REPLACE ${CMAKE_CFG_INTDIR} ${build_mode} li ${ARG_LIBRARY_DIR})
set_target_properties(${target} PROPERTIES "ARCHIVE_OUTPUT_DIRECTORY_${CONFIG_SUFFIX}" ${li})
endif ()
if (module_dir)
string(REPLACE ${CMAKE_CFG_INTDIR} ${build_mode} mi ${module_dir})
set_target_properties(${target} PROPERTIES "LIBRARY_OUTPUT_DIRECTORY_${CONFIG_SUFFIX}" ${mi})
endif ()
endforeach ()
else ()
if (ARG_BINARY_DIR)
set_target_properties(${target} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${ARG_BINARY_DIR})
endif ()
if (ARG_LIBRARY_DIR)
set_target_properties(${target} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${ARG_LIBRARY_DIR})
endif ()
if (module_dir)
set_target_properties(${target} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${module_dir})
endif ()
endif ()
endfunction()
function(atomui_set_if_target var target)
if (TARGET "${target}")
set(_result ON)
else ()
set(_result OFF)
endif ()
set(${var} "${_result}" PARENT_SCOPE)
endfunction()
+10
View File
@@ -0,0 +1,10 @@
# This source file is part of the atomui project
#
# Copyright (c) 2017 - 2022 qinware, All rights reserved.
# Copyright (c) 2017 - 2022 chinboy <chinware@163.com>
#
# See https://qinware.com/LICENSE.txt for license information
#
# Created by chinboy on 2025/01/10.
configure_file(Config.h.in ${CMAKE_CURRENT_BINARY_DIR}/Config.h ESCAPE_QUOTES)
+5 -5
View File
@@ -11,14 +11,14 @@
#include "atomui/Compiler.h"
#define ATOMUI_VERSION_MAJOR ${VERSION_MAJOR}
#define ATOMUI_VERSION_MINOR ${VERSION_MINOR}
#define ATOMUI_VERSION_PATCH ${VERSION_ALTER}
#define ATOMUI_VERSION_BUILD ${VERSION_BUILD}
#define ATOMUI_VERSION_MAJOR ${PROJECT_VERSION_MAJOR}
#define ATOMUI_VERSION_MINOR ${PROJECT_VERSION_MINOR}
#define ATOMUI_VERSION_PATCH ${PROJECT_VERSION_PATCH}
#define ATOMUI_VERSION_BUILD "${ATOMUI_VERSION_BUILD}"
namespace atomui {
const char ATOMUI_VERSION_LONG[] = "${VERSION}";
const char ATOMUI_VERSION_LONG[] = "${PROJECT_VERSION}";
const char ATOMUI_AUTHOR[] = "Qinware Technologies Ltd.";
const char ATOMUI_YEAR[] = "${ATOMUI_COPYRIGHT_YEAR}";
+37
View File
@@ -0,0 +1,37 @@
# This source file is part of the atomui project
#
# Copyright (c) 2017 - 2022 qinware, All rights reserved.
# Copyright (c) 2017 - 2022 chinboy <chinware@163.com>
#
# See https://qinware.com/LICENSE.txt for license information
#
# Created by chinboy on 2025/01/10.
atomui_add_library(AtomUINative
BUILD_DEFAULT
SOURCES
Global.cpp
bridge/WindowUtils.cpp
${ATOMUI_INCLUDE_DIR}/atomui/WindowUtils.h
)
atomui_extend_library(AtomUINative CONDITION APPLE
SOURCES
macos/WindowUtils.mm
DEPENDS
${FWFoundation} ${FWAppKit}
)
atomui_extend_library(AtomUINative CONDITION WIN32
SOURCES
windows/WindowUtils.cpp
)
atomui_extend_library(AtomUINative CONDITION LINUX
SOURCES
linux/WindowUtils.cpp
DEPENDS
PkgConfig::XCB
INCLUDES ${XCB_INCLUDE_DIRS}
)
+3 -38
View File
@@ -1,7 +1,5 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="$(MSBuildThisFileDirectory)../../build/AtomUINativePackageInfo.props"/>
<PropertyGroup>
<TargetFrameworks>$(AtomUIDevelopTargetFramework);$(AtomUIProductionTargetFramework)</TargetFrameworks>
<ImplicitUsings>enable</ImplicitUsings>
@@ -38,9 +36,6 @@
<ProjectReference Include="$(MSBuildThisFileDirectory)/../../src/AtomUI.IconPkg.AntDesign/AtomUI.IconPkg.AntDesign.csproj">
<IncludeAssets>$(IncludeAssets)</IncludeAssets>
</ProjectReference>
<ProjectReference Include="$(MSBuildThisFileDirectory)/../../src/AtomUI.Native/AtomUI.Native.csproj">
<IncludeAssets>$(IncludeAssets)</IncludeAssets>
</ProjectReference>
<ProjectReference Include="$(MSBuildThisFileDirectory)/../../src/AtomUI.Theme/AtomUI.Theme.csproj">
<IncludeAssets>$(IncludeAssets)</IncludeAssets>
</ProjectReference>
@@ -59,16 +54,9 @@
<Reference Include="$(AtomUIPackageOutput)/AtomUI.IconPkg.dll"/>
<Reference Include="$(AtomUIPackageOutput)/AtomUI.IconPkg.AntDesign.dll"/>
<Reference Include="$(AtomUIPackageOutput)/AtomUI.Theme.dll"/>
<Reference Include="$(AtomUIPackageOutput)/AtomUI.Native.dll"/>
<Reference Include="$(AtomUIPackageOutput)/AtomUI.ReactiveUI.dll"/>
</ItemGroup>
<PropertyGroup>
<AtomUINativeWindowsX64Artifact>$(OutputPathWithoutFramework)/$(AtomUINativeWindowsX64DeployPath)/$(AtomUINativeWindowsArtifactName)</AtomUINativeWindowsX64Artifact>
<AtomUINativeMacOSArtifact>$(OutputPathWithoutFramework)/$(AtomUINativeMacOSDeployPath)/$(AtomUINativeMacOSArtifactName)</AtomUINativeMacOSArtifact>
<AtomUINativeLinuxX64Artifact>$(OutputPathWithoutFramework)/$(AtomUINativeLinuxX64DeployPath)/$(AtomUINativeLinuxArtifactName)</AtomUINativeLinuxX64Artifact>
</PropertyGroup>
<PropertyGroup>
<TargetsForTfmSpecificContentInPackage>$(TargetsForTfmSpecificContentInPackage);IncludeReferencedProjectInPackage</TargetsForTfmSpecificContentInPackage>
</PropertyGroup>
@@ -86,36 +74,13 @@
<TfmSpecificPackageFile Include="$(OutputPath)/AtomUI.IconPkg.AntDesign.pdb" PackagePath="lib/$(TargetFramework)"/>
<TfmSpecificPackageFile Include="$(OutputPath)/AtomUI.Theme.dll" PackagePath="lib/$(TargetFramework)"/>
<TfmSpecificPackageFile Include="$(OutputPath)/AtomUI.Theme.pdb" PackagePath="lib/$(TargetFramework)"/>
<TfmSpecificPackageFile Include="$(OutputPath)/AtomUI.Native.dll" PackagePath="lib/$(TargetFramework)"/>
<TfmSpecificPackageFile Include="$(OutputPath)/AtomUI.Native.pdb" PackagePath="lib/$(TargetFramework)"/>
<TfmSpecificPackageFile Include="$(OutputPath)/AtomUI.ReactiveUI.dll" PackagePath="lib/$(TargetFramework)"/>
<TfmSpecificPackageFile Include="$(OutputPath)/AtomUI.ReactiveUI.pdb" PackagePath="lib/$(TargetFramework)"/>
</ItemGroup>
</Target>
<ItemGroup>
<Content Include="$(AtomUINativeMacOSArtifact)"
Condition="$([System.IO.File]::Exists('$(AtomUINativeMacOSArtifact)'))">
<Link>$(AtomUINativeMacOSDeployPath)/$(AtomUINativeMacOSArtifactName)</Link>
<PackagePath>$(AtomUINativeMacOSDeployPath)</PackagePath>
<Pack>true</Pack>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="$(AtomUINativeWindowsX64Artifact)"
Condition="$([System.IO.File]::Exists('$(AtomUINativeWindowsX64Artifact)'))">
<Link>$(AtomUINativeWindowsX64DeployPath)/$(AtomUINativeWindowsArtifactName)</Link>
<PackagePath>$(AtomUINativeWindowsX64DeployPath)</PackagePath>
<Pack>true</Pack>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="$(AtomUINativeLinuxX64Artifact)"
Condition="$([System.IO.File]::Exists('$(AtomUINativeLinuxX64Artifact)'))">
<Link>$(AtomUINativeLinuxX64DeployPath)/$(AtomUINativeLinuxArtifactName)</Link>
<PackagePath>$(AtomUINativeLinuxX64DeployPath)</PackagePath>
<Pack>true</Pack>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<ItemGroup Condition=" '$(Configuration)' == 'Release' ">
<PackageReference Include="AtomUI.Native"/>
</ItemGroup>
</Project>
+14 -16
View File
@@ -38,24 +38,22 @@ $env:XMAKE_COLORTERM = 'nocolor'
$buildType = $buildType.ToLower()
if ($IsWindows) {
xmake config --toolchain=clang --project=$sourceDir --builddir=$buildDir -p msys -a x86_64 -m $buildType -v
xmake build
xmake install --installdir=$installPrefix
Copy-Item -Path $installPrefix/x86_64/lib/$libName -Destination $deployDir
cmake -B $buildDir -S $sourceDir -DCMAKE_INSTALL_PREFIX="$installPrefix" -DCMAKE_BUILD_TYPE="$buildType" -G Ninja
cmake --build $buildDir
cmake --install $buildDir --config $buildType
Copy-Item -Path $installPrefix/bin/$libName -Destination $deployDir
} elseif ($IsMacOS) {
xmake config --project=$sourceDir --builddir=$buildDir -p macosx -a arm64 -m $buildType
xmake build
xmake install --installdir=$installPrefix
xmake config --project=$sourceDir --builddir=$buildDir -p macosx -a x86_64 -m $buildType
xmake build
xmake install --installdir=$installPrefix
Write-Output "generate universal binary"
lipo -create $installPrefix/arm64/lib/$libName $installPrefix/x86_64/lib/$libName -output $deployDir/$libName
cmake -B $buildDir -S $sourceDir -DCMAKE_INSTALL_PREFIX="$installPrefix" -DCMAKE_BUILD_TYPE="$buildType" -G Ninja -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64"
cmake --build $buildDir
cmake --install $buildDir --config $buildType
Copy-Item -Path $installPrefix/lib/$libName -Destination $deployDir
} elseif ($IsLinux) {
xmake config --project=$sourceDir --builddir=$buildDir -p linux -a x86_64 -m $buildType
xmake build
xmake install --installdir=$installPrefix
Copy-Item -Path $installPrefix/x86_64/lib/$libName -Destination $deployDir
cmake -B $buildDir -S $sourceDir -DCMAKE_INSTALL_PREFIX="$installPrefix" -DCMAKE_BUILD_TYPE="$buildType"
cmake --build $buildDir
cmake --install $buildDir --config $buildType
Copy-Item -Path $installPrefix/lib/$libName -Destination $deployDir
} else {
$osInfo = $PSVersionTable.OS
throw "Unsupported operating system: $osInfo. Only supported on Windows, Linux or macOS."
+4
View File
@@ -42,6 +42,10 @@ function Push-NuGetPackages {
}
}
dotnet build -v diag --configuration $buildType ../src/AtomUI.Native/AtomUI.Native.csproj
dotnet pack --no-build --configuration $buildType ../src/AtomUI.Native/AtomUI.Native.csproj -v:diag
Push-NuGetPackages -Source $localSourcesDir
dotnet build -v diag --configuration $buildType ../packages/AtomUI/AtomUI.csproj
dotnet pack --no-build --configuration $buildType ../packages/AtomUI/AtomUI.csproj
dotnet pack --no-build --configuration $buildType ../src/AtomUI.IconPkg.Generator/AtomUI.IconPkg.Generator.csproj
+1 -4
View File
@@ -9,6 +9,7 @@
<PackageReference Include="Avalonia"/>
<PackageReference Include="Avalonia.ReactiveUI"/>
<PackageReference Include="System.Reactive"/>
<PackageReference Include="AtomUI.Native"/>
</ItemGroup>
<ItemGroup>
@@ -19,9 +20,5 @@
<InternalsVisibleTo Include="AtomUI.Controls.DataGrid"/>
<InternalsVisibleTo Include="AtomUI.ReactiveUI"/>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="../AtomUI.Native/AtomUI.Native.csproj" />
</ItemGroup>
</Project>
@@ -88,18 +88,6 @@ namespace AtomUI.Theme.Styling
public static readonly TokenResourceKey TextFontWeight = new TokenResourceKey("Badge.TextFontWeight");
}
public static class ButtonSpinnerTokenKey
{
public static readonly TokenResourceKey ControlWidth = new TokenResourceKey("ButtonSpinner.ControlWidth");
public static readonly TokenResourceKey FilledHandleBg = new TokenResourceKey("ButtonSpinner.FilledHandleBg");
public static readonly TokenResourceKey HandleActiveBg = new TokenResourceKey("ButtonSpinner.HandleActiveBg");
public static readonly TokenResourceKey HandleBg = new TokenResourceKey("ButtonSpinner.HandleBg");
public static readonly TokenResourceKey HandleBorderColor = new TokenResourceKey("ButtonSpinner.HandleBorderColor");
public static readonly TokenResourceKey HandleHoverColor = new TokenResourceKey("ButtonSpinner.HandleHoverColor");
public static readonly TokenResourceKey HandleIconSize = new TokenResourceKey("ButtonSpinner.HandleIconSize");
public static readonly TokenResourceKey HandleWidth = new TokenResourceKey("ButtonSpinner.HandleWidth");
}
public static class ButtonTokenKey
{
public static readonly TokenResourceKey BorderColorDisabled = new TokenResourceKey("Button.BorderColorDisabled");
@@ -151,6 +139,18 @@ namespace AtomUI.Theme.Styling
public static readonly TokenResourceKey TextHoverBg = new TokenResourceKey("Button.TextHoverBg");
}
public static class ButtonSpinnerTokenKey
{
public static readonly TokenResourceKey ControlWidth = new TokenResourceKey("ButtonSpinner.ControlWidth");
public static readonly TokenResourceKey FilledHandleBg = new TokenResourceKey("ButtonSpinner.FilledHandleBg");
public static readonly TokenResourceKey HandleActiveBg = new TokenResourceKey("ButtonSpinner.HandleActiveBg");
public static readonly TokenResourceKey HandleBg = new TokenResourceKey("ButtonSpinner.HandleBg");
public static readonly TokenResourceKey HandleBorderColor = new TokenResourceKey("ButtonSpinner.HandleBorderColor");
public static readonly TokenResourceKey HandleHoverColor = new TokenResourceKey("ButtonSpinner.HandleHoverColor");
public static readonly TokenResourceKey HandleIconSize = new TokenResourceKey("ButtonSpinner.HandleIconSize");
public static readonly TokenResourceKey HandleWidth = new TokenResourceKey("ButtonSpinner.HandleWidth");
}
public static class CalendarTokenKey
{
public static readonly TokenResourceKey CellActiveWithRangeBg = new TokenResourceKey("Calendar.CellActiveWithRangeBg");
+45 -3
View File
@@ -5,6 +5,7 @@
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<IncludeBuildOutput>true</IncludeBuildOutput>
</PropertyGroup>
<ItemGroup>
@@ -16,13 +17,20 @@
<InternalsVisibleTo Include="AtomUI.Controls"/>
</ItemGroup>
<PropertyGroup>
<AtomUINativeWindowsX64Artifact>$(OutputPathWithoutFramework)/$(AtomUINativeWindowsX64DeployPath)/$(AtomUINativeWindowsArtifactName)</AtomUINativeWindowsX64Artifact>
<AtomUINativeWindowsArm64Artifact>$(OutputPathWithoutFramework)/$(AtomUINativeWindowsArm64DeployPath)/$(AtomUINativeWindowsArtifactName)</AtomUINativeWindowsArm64Artifact>
<AtomUINativeMacOSArtifact>$(OutputPathWithoutFramework)/$(AtomUINativeMacOSDeployPath)/$(AtomUINativeMacOSArtifactName)</AtomUINativeMacOSArtifact>
<AtomUINativeLinuxX64Artifact>$(OutputPathWithoutFramework)/$(AtomUINativeLinuxX64DeployPath)/$(AtomUINativeLinuxArtifactName)</AtomUINativeLinuxX64Artifact>
</PropertyGroup>
<PropertyGroup>
<AtomUINavtiveBuildPath>$([System.IO.Path]::Combine($(MSBuildProjectDirectory), $(IntermediateOutputPathWithoutFramework), 'AtomUINative'))</AtomUINavtiveBuildPath>
<AtomUINativeSrcPath>$([System.IO.Path]::GetFullPath('$(MSBuildProjectDirectory)/../../nativelibs'))</AtomUINativeSrcPath>
<AtomUITempInstallPrefix>$([System.IO.Path]::GetFullPath('$(OutputPathWithoutFramework)'))</AtomUITempInstallPrefix>
<AtomUINativeAbsoluteDeployPath>$(OutputPathWithoutFramework)/$(AtomUINativeDeployPath)</AtomUINativeAbsoluteDeployPath>
<AtomUIBuildPwShScript>$([System.IO.Path]::GetFullPath('$(MSBuildProjectDirectory)/../../scripts/BuildAtomUINative.ps1'))</AtomUIBuildPwShScript>
<AtomUINativeCompiledMarker>$(AtomUINavtiveBuildPath)/.native_compiled</AtomUINativeCompiledMarker>
</PropertyGroup>
@@ -44,6 +52,7 @@
</PropertyGroup>
</Otherwise>
</Choose>
<Target Name="BuildAtomUINative"
BeforeTargets="Build"
Inputs="@(AtomUINativeSources)"
@@ -51,7 +60,7 @@
<PropertyGroup>
<CPUCount>$([System.Environment]::ProcessorCount)</CPUCount>
</PropertyGroup>
<MakeDir Directories="$(AtomUINavtiveBuildPath)" Condition="!Exists('$(AtomUINavtiveBuildPath)')"/>
<MakeDir Directories="$(AtomUITempInstallPrefix)" Condition="!Exists('$(AtomUITempInstallPrefix)')"/>
<MakeDir Directories="$(AtomUINativeAbsoluteDeployPath)" Condition="!Exists('$(AtomUINativeAbsoluteDeployPath)')"/>
@@ -63,7 +72,40 @@
</Target>
<Target Name="BuildAtomUINativeCacheFile" AfterTargets="Clean">
<Delete Files="@(AtomUINativeCompiledMarker)" />
<Delete Files="@(AtomUINativeCompiledMarker)"/>
</Target>
<ItemGroup>
<Content Include="$(AtomUINativeMacOSArtifact)"
Condition="$([System.IO.File]::Exists('$(AtomUINativeMacOSArtifact)'))">
<Link>$(AtomUINativeMacOSDeployPath)/$(AtomUINativeMacOSArtifactName)</Link>
<PackagePath>$(AtomUINativeMacOSDeployPath)</PackagePath>
<Pack>true</Pack>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="$(AtomUINativeWindowsX64Artifact)"
Condition="$([System.IO.File]::Exists('$(AtomUINativeWindowsX64Artifact)'))">
<Link>$(AtomUINativeWindowsX64DeployPath)/$(AtomUINativeWindowsArtifactName)</Link>
<PackagePath>$(AtomUINativeWindowsX64DeployPath)</PackagePath>
<Pack>true</Pack>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="$(AtomUINativeWindowsArm64Artifact)"
Condition="$([System.IO.File]::Exists('$(AtomUINativeWindowsArm64Artifact)'))">
<Link>$(AtomUINativeWindowsArm64DeployPath)/$(AtomUINativeWindowsArtifactName)</Link>
<PackagePath>$(AtomUINativeWindowsArm64DeployPath)</PackagePath>
<Pack>true</Pack>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="$(AtomUINativeLinuxX64Artifact)"
Condition="$([System.IO.File]::Exists('$(AtomUINativeLinuxX64Artifact)'))">
<Link>$(AtomUINativeLinuxX64DeployPath)/$(AtomUINativeLinuxArtifactName)</Link>
<PackagePath>$(AtomUINativeLinuxX64DeployPath)</PackagePath>
<Pack>true</Pack>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project>