mirror of
https://github.com/AtomUI/AtomUI.git
synced 2026-10-27 12:17:42 +08:00
Merge remote-tracking branch 'origin/release/0.1.0' into develop
# Conflicts: # build/Version.props
This commit is contained in:
@@ -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 }}
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)"/>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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()
|
||||
@@ -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
|
||||
)
|
||||
@@ -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()
|
||||
@@ -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()
|
||||
@@ -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()
|
||||
@@ -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)
|
||||
@@ -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}";
|
||||
|
||||
|
||||
@@ -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}
|
||||
)
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
+12
-12
@@ -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");
|
||||
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user