xmake

github-ci github-ci github-ci Github All Releases AUR votes
license Reddit Gitter Telegram QQ Discord Donate
A cross-platform build utility based on Lua
Modern C/C++ build tools, Simple, Fast, Powerful dependency package integration
## Supporting the project Support this project by becoming a sponsor. Your logo will show up here with a link to your website. 🙏 [[Become a sponsor](https://xmake.io/#/about/sponsor)] ## Introduction ([中文](/README_zh.md)) xmake is a lightweight cross-platform build utility based on Lua. It uses xmake.lua to maintain project builds. Compared with makefile/CMakeLists.txt, the configuration syntax is more concise and intuitive. It is very friendly to novices and can quickly get started in a short time. Let users focus more on actual project development. It can compile the project directly like Make/Ninja, or generate project files like CMake/Meson, and it also has a built-in package management system to help users solve the integrated use of C/C++ dependent libraries. If you want to know more, please refer to: [Documents](https://xmake.io/#/home), [Github](https://github.com/xmake-io/xmake) and [Gitee](https://gitee.com/tboox/xmake) and also welcome to join our [community](https://xmake.io/#/about/contact). ![](https://xmake.io/assets/img/index/xmake-basic-render.gif) ## Installation #### via curl ```bash bash <(curl -fsSL https://xmake.io/shget.text) ``` #### via wget ```bash bash <(wget https://xmake.io/shget.text -O -) ``` #### via powershell ```powershell Invoke-Expression (Invoke-Webrequest 'https://xmake.io/psget.text' -UseBasicParsing).Content ``` ## Simple description ## Package dependences An official xmake package repository: [xmake-repo](https://github.com/xmake-io/xmake-repo) ## Build project ```bash $ xmake ``` ## Run target ```bash $ xmake run console ``` ## Debug target ```bash $ xmake run -d console ``` ## Configure platform ```bash $ xmake f -p [windows|linux|macosx|android|iphoneos ..] -a [x86|arm64 ..] -m [debug|release] $ xmake ``` ## Menu configuration ```bash $ xmake f --menu ``` ## Build as fast as ninja The test project: [xmake-core](https://github.com/xmake-io/xmake/tree/master/core) ### Multi-task parallel compilation | buildsystem | Termux (8core/-j12) | buildsystem | MacOS (8core/-j12) | |----- | ---- | --- | --- | |xmake | 24.890s | xmake | 12.264s | |ninja | 25.682s | ninja | 11.327s | |cmake(gen+make) | 5.416s+28.473s | cmake(gen+make) | 1.203s+14.030s | |cmake(gen+ninja) | 4.458s+24.842s | cmake(gen+ninja) | 0.988s+11.644s | ### Single task compilation | buildsystem | Termux (-j1) | buildsystem | MacOS (-j1) | |----- | ---- | --- | --- | |xmake | 1m57.707s | xmake | 39.937s | |ninja | 1m52.845s | ninja | 38.995s | |cmake(gen+make) | 5.416s+2m10.539s | cmake(gen+make) | 1.203s+41.737s | |cmake(gen+ninja) | 4.458s+1m54.868s | cmake(gen+ninja) | 0.988s+38.022s | ## Package management ### Download and build ### Processing architecture ### Supported package repositories * Official package repository [xmake-repo](https://github.com/xmake-io/xmake-repo) (tbox >1.6.1) * Official package manager [Xrepo](https://github.com/xmake-io/xrepo) * [User-built repositories](https://xmake.io/#/package/remote_package?id=using-self-built-private-package-repository) * Conan (conan::openssl/1.1.1g) * Vcpkg (vcpkg:ffmpeg) * Homebrew/Linuxbrew (brew::pcre2/libpcre2-8) * Pacman on archlinux/msys2 (pacman::libcurl) * Clib (clib::clibs/bytes@0.0.4) * Dub (dub::log 0.4.3) ## Supported platforms * Windows (x86, x64) * macOS (i386, x86_64, arm64) * Linux (i386, x86_64, cross-toolchains ..) * *BSD (i386, x86_64) * Android (x86, x86_64, armeabi, armeabi-v7a, arm64-v8a) * iOS (armv7, armv7s, arm64, i386, x86_64) * WatchOS (armv7k, i386) * MSYS (i386, x86_64) * MinGW (i386, x86_64, arm, arm64) * Cygwin (i386, x86_64) * Wasm (wasm32) * Cross (cross-toolchains ..) ## Supported toolchains ```bash $ xmake show -l toolchains xcode Xcode IDE vs VisualStudio IDE yasm The Yasm Modular Assembler clang A C language family frontend for LLVM go Go Programming Language Compiler dlang D Programming Language Compiler gfortran GNU Fortran Programming Language Compiler zig Zig Programming Language Compiler sdcc Small Device C Compiler cuda CUDA Toolkit ndk Android NDK rust Rust Programming Language Compiler llvm A collection of modular and reusable compiler and toolchain technologies cross Common cross compilation toolchain nasm NASM Assembler gcc GNU Compiler Collection mingw Minimalist GNU for Windows gnu-rm GNU Arm Embedded Toolchain envs Environment variables toolchain fasm Flat Assembler tinyc Tiny C Compiler emcc A toolchain for compiling to asm.js and WebAssembly icc Intel C/C++ Compiler ifort Intel Fortran Compiler muslcc The musl-based cross-compilation toolchains ``` ## Supported Languages * C * C++ * Objective-C and Objective-C++ * Swift * Assembly * Golang * Rust * Dlang * Fortran * Cuda * Zig ## Support Features * Simple project configuration syntax * Direct build support, without relying on any third-party back-end make tools * Support cross platform * Support cross compilation * Multi-task parallel compilation support * C++20 Module-TS support * Support cross-platform C/C++ dependency packages * Support self-built distributed and third-party package repositories * Support multi-language mixed compilation * Flexible lua scripts, rich extension modules * Support for generating vsproj/cmake/makefile/compile_commands files * REPL interactive execution support * Incremental compilation support, automatic analysis of header dependency files * Fast switching toolchains * Automatic pull toolchain and dependency package integration ## Supported Projects * Static Library * Shared Library * Console * Cuda Program * Qt Application * WDK Driver (umdf/kmdf/wdm) * WinSDK Application * MFC Application * iOS/MacOS Application * Framework and Bundle Program (iOS/MacOS) ## More Examples #### Debug and release modes ```lua add_rules("mode.debug", "mode.release") target("console") set_kind("binary") add_files("src/*.c") if is_mode("debug") then add_defines("DEBUG") end ``` #### Custom scripts ```lua target("test") set_kind("binary") add_files("src/*.c") after_build(function (target) print("hello: %s", target:name()) os.exec("echo %s", target:targetfile()) end) ``` #### Automatic integration of dependent packages Download and use packages in [xmake-repo](https://github.com/xmake-io/xmake-repo) or third-party repositories: ```lua add_requires("tbox >1.6.1", "libuv master", "vcpkg::ffmpeg", "brew::pcre2/libpcre2-8") add_requires("conan::openssl/1.1.1g", {alias = "openssl", optional = true, debug = true}) target("test") set_kind("binary") add_files("src/*.c") add_packages("tbox", "libuv", "vcpkg::ffmpeg", "brew::pcre2/libpcre2-8", "openssl") ``` In addition, we can also use the [xrepo](https://github.com/xmake-io/xrepo) command to quickly install dependent packages. #### Qt QuickApp Program ```lua target("test") add_rules("qt.quickapp") add_files("src/*.cpp") add_files("src/qml.qrc") ``` #### Cuda Program ```lua target("test") set_kind("binary") add_files("src/*.cu") add_cugencodes("native") add_cugencodes("compute_35") ``` #### WDK/UMDF Driver Program ```lua target("echo") add_rules("wdk.driver", "wdk.env.umdf") add_files("driver/*.c") add_files("driver/*.inx") add_includedirs("exe") target("app") add_rules("wdk.binary", "wdk.env.umdf") add_files("exe/*.cpp") ``` More wdk driver program examples (umdf/kmdf/wdm), please see [WDK Program Examples](https://xmake.io/#/guide/project_examples?id=wdk-driver-program) #### iOS/MacOS Application ```lua target("test") add_rules("xcode.application") add_files("src/*.m", "src/**.storyboard", "src/*.xcassets") add_files("src/Info.plist") ``` #### Framework and Bundle Program (iOS/MacOS) ```lua target("test") add_rules("xcode.framework") -- or xcode.bundle add_files("src/*.m") add_files("src/Info.plist") ``` #### OpenMP Program ```lua add_requires("libomp", {optional = true}) target("loop") set_kind("binary") add_files("src/*.cpp") add_rules("c++.openmp") add_packages("libomp") ``` #### Zig Program ```lua target("test") set_kind("binary") add_files("src/*.zig") ``` ### Automatically fetch remote toolchain #### fetch the special version of llvm We use clang in llvm-10 to compile the project. ```lua add_requires("llvm 10.x", {alias = "llvm-10"}) target("test") set_kind("binary") add_files("src/*.c) set_toolchains("llvm@llvm-10") ```` #### Fetch cross-compilation toolchain We can also pull the specified cross-compilation tool chain to compile the project. ```lua add_requires("muslcc") target("test") set_kind("binary") add_files("src/*.c) set_toolchains("@muslcc") ``` #### Fetch toolchain and packages We can also use the specified muslcc cross-compilation toolchain to compile and integrate all dependent packages ```lua add_requires("muslcc") add_requires("zlib", "libogg", {system = false}) set_toolchains("@muslcc") target("test") set_kind("binary") add_files("src/*.c") add_packages("zlib", "libogg") ``` ## Plugins #### Generate IDE project file plugin(makefile, vs2002 - vs2019 .. ) ```bash $ xmake project -k vsxmake -m "debug;release" # New vsproj generator (Recommended) $ xmake project -k vs -m "debug;release" $ xmake project -k cmake $ xmake project -k ninja $ xmake project -k compile_commands ``` #### Run the custom lua script plugin ```bash $ xmake l ./test.lua $ xmake l -c "print('hello xmake!')" $ xmake l lib.detect.find_tool gcc $ xmake l > print("hello xmake!") > {1, 2, 3} < { 1, 2, 3 } ``` More builtin plugins, please see: [Builtin plugins](https://xmake.io/#/plugin/builtin_plugins) Please download and install more other plugins from the plugins repository [xmake-plugins](https://github.com/xmake-io/xmake-plugins). ## IDE/Editor Integration * [xmake-vscode](https://github.com/xmake-io/xmake-vscode) * [xmake-sublime](https://github.com/xmake-io/xmake-sublime) * [xmake-idea](https://github.com/xmake-io/xmake-idea) * [xmake.vim](https://github.com/luzhlon/xmake.vim) (third-party, thanks [@luzhlon](https://github.com/luzhlon)) ### XMake Gradle Plugin (JNI) We can uses [xmake-gradle](https://github.com/xmake-io/xmake-gradle) plugin to compile JNI library in gradle. ``` plugins { id 'org.tboox.gradle-xmake-plugin' version '1.0.6' } android { externalNativeBuild { xmake { path "jni/xmake.lua" } } } ``` The `xmakeBuild` will be injected to `assemble` task automatically if the gradle-xmake-plugin has been applied. ```console $ ./gradlew app:assembleDebug > Task :nativelib:xmakeConfigureForArm64 > Task :nativelib:xmakeBuildForArm64 >> xmake build [ 50%]: ccache compiling.debug nativelib.cc [ 75%]: linking.debug libnativelib.so [100%]: build ok! >> install artifacts to /Users/ruki/projects/personal/xmake-gradle/nativelib/libs/arm64-v8a > Task :nativelib:xmakeConfigureForArmv7 > Task :nativelib:xmakeBuildForArmv7 >> xmake build [ 50%]: ccache compiling.debug nativelib.cc [ 75%]: linking.debug libnativelib.so [100%]: build ok! >> install artifacts to /Users/ruki/projects/personal/xmake-gradle/nativelib/libs/armeabi-v7a > Task :nativelib:preBuild > Task :nativelib:assemble > Task :app:assembleDebug ``` ## Technical Support We also provide paid technical support to help users quickly solve related problems. For details, please click the image link below: Or you can also consider sponsoring us to get technical support services, [[Become a sponsor](https://xmake.io/#/about/sponsor)] ## Project Examples Some projects using xmake: * [tbox](https://github.com/tboox/tbox) * [more](https://github.com/xmake-io/awesome-xmake) ## Contacts * Email:[waruqi@gmail.com](mailto:waruqi@gmail.com) * Homepage:[xmake.io](https://xmake.io) * Community - [Chat on reddit](https://www.reddit.com/r/xmake/) - [Chat on telegram](https://t.me/tbooxorg) - [Chat on gitter](https://gitter.im/xmake-io/xmake?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) - [Chat on discord](https://discord.gg/xmake) - Chat on QQ Group: 343118190, 662147501 * Source Code:[Github](https://github.com/xmake-io/xmake), [Gitee](https://gitee.com/tboox/xmake) * Wechat Public: tboox-os ## Thanks This project exists thanks to all the people who have [contributed](CONTRIBUTING.md): * [TitanSnow](https://github.com/TitanSnow): provide the xmake [logo](https://github.com/TitanSnow/ts-xmake-logo) and install scripts * [uael](https://github.com/uael): provide the semantic versioning library [sv](https://github.com/uael/sv) * [OpportunityLiu](https://github.com/OpportunityLiu): improve cuda, tests and ci