clean up
This commit is contained in:
parent
cd52843da6
commit
bd568d74f2
19 changed files with 7 additions and 1176 deletions
|
|
@ -1,2 +0,0 @@
|
||||||
[child]
|
|
||||||
program=zsh
|
|
||||||
|
|
@ -1,7 +0,0 @@
|
||||||
local modes = require "modes"
|
|
||||||
|
|
||||||
modes.add_binds("normal", {
|
|
||||||
{ "<Control-c>", "Copy selected text.", function ()
|
|
||||||
luakit.selection.clipboard = luakit.selection.primary
|
|
||||||
end},
|
|
||||||
})
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
backend = "alsa"
|
|
||||||
|
|
@ -1,90 +0,0 @@
|
||||||
# Colour Themes:
|
|
||||||
#focused_border_colour : #0a8
|
|
||||||
focused_border_colour : #a30
|
|
||||||
unfocused_border_colour : #333333
|
|
||||||
swap_border_colour : #eeeeee
|
|
||||||
|
|
||||||
# General Options:
|
|
||||||
gaps : 15
|
|
||||||
border_width : 3
|
|
||||||
master_width : 60 # Percentage of screen width
|
|
||||||
resize_master_amount : 2
|
|
||||||
resize_stack_amt : 20
|
|
||||||
move_window_amount : 50
|
|
||||||
resize_window_amount : 50
|
|
||||||
snap_distance : 5
|
|
||||||
motion_throttle : 60 # Set to screen refresh rate for smoothest motions
|
|
||||||
should_float :
|
|
||||||
new_win_focus : true
|
|
||||||
warp_cursor : true
|
|
||||||
floating_on_top : true
|
|
||||||
new_win_master : true
|
|
||||||
can_swallow : "st", "st-256color", "pcmanfm"
|
|
||||||
can_be_swallowed : "mpv", "sxiv", "nsxiv", "meh", "feh", "okular", "zathura"
|
|
||||||
start_fullscreen : "vlc"
|
|
||||||
|
|
||||||
# Keybinds:
|
|
||||||
# Commands must be surrounded with ""
|
|
||||||
# Function calls don't need this
|
|
||||||
mod_key : super
|
|
||||||
|
|
||||||
# Application Launchers:
|
|
||||||
bind : mod + + shift + Return : "st"
|
|
||||||
bind : mod + shift + s : "librewolf"
|
|
||||||
bind : mod + s : "screenshot"
|
|
||||||
bind : mod + d : "dmenu_run -sb #592b38"
|
|
||||||
|
|
||||||
# Window Management:
|
|
||||||
call : mod + shift + d : close_window
|
|
||||||
call : mod + c : centre_window
|
|
||||||
call : mod + shift + e : quit
|
|
||||||
|
|
||||||
call : mod + j : focus_next
|
|
||||||
call : mod + k : focus_prev
|
|
||||||
|
|
||||||
call : mod + comma : focus_prev_mon
|
|
||||||
call : mod + period : focus_next_mon
|
|
||||||
call : mod + shift + comma : move_prev_mon
|
|
||||||
call : mod + shift + period : move_next_mon
|
|
||||||
|
|
||||||
call : mod + shift + j : master_next
|
|
||||||
call : mod + shift + k : master_previous
|
|
||||||
call : mod + l : master_increase
|
|
||||||
call : mod + h : master_decrease
|
|
||||||
call : mod + ctrl + l : stack_increase
|
|
||||||
call : mod + ctrl + h : stack_decrease
|
|
||||||
|
|
||||||
call : mod + Up : move_win_up
|
|
||||||
call : mod + Down : move_win_down
|
|
||||||
call : mod + Left : move_win_left
|
|
||||||
call : mod + Right : move_win_right
|
|
||||||
|
|
||||||
call : mod + shift + Up : resize_win_up
|
|
||||||
call : mod + shift + Down : resize_win_down
|
|
||||||
call : mod + shift + Left : resize_win_left
|
|
||||||
call : mod + shift + Right : resize_win_right
|
|
||||||
|
|
||||||
call : mod + shift + space : toggle_floating
|
|
||||||
call : mod + shift + k : global_floating
|
|
||||||
call : mod + g : fullscreen
|
|
||||||
|
|
||||||
call : mod + r : reload_config
|
|
||||||
|
|
||||||
workspace : mod + 1 : move 1
|
|
||||||
workspace : mod + shift + 1 : swap 1
|
|
||||||
workspace : mod + 2 : move 2
|
|
||||||
workspace : mod + shift + 2 : swap 2
|
|
||||||
workspace : mod + 3 : move 3
|
|
||||||
workspace : mod + shift + 3 : swap 3
|
|
||||||
workspace : mod + 4 : move 4
|
|
||||||
workspace : mod + shift + 4 : swap 4
|
|
||||||
workspace : mod + 5 : move 5
|
|
||||||
workspace : mod + shift + 5 : swap 5
|
|
||||||
workspace : mod + 6 : move 6
|
|
||||||
workspace : mod + shift + 6 : swap 6
|
|
||||||
workspace : mod + 7 : move 7
|
|
||||||
workspace : mod + shift + 7 : swap 7
|
|
||||||
workspace : mod + 8 : move 8
|
|
||||||
workspace : mod + shift + 8 : swap 8
|
|
||||||
workspace : mod + 9 : move 9
|
|
||||||
workspace : mod + shift + 9 : swap 9
|
|
||||||
|
|
@ -23,8 +23,8 @@ color menufg "#5294E2"
|
||||||
gap 8 8 8 8
|
gap 8 8 8 8
|
||||||
|
|
||||||
# Size of manually tiled Windows in %
|
# Size of manually tiled Windows in %
|
||||||
htile 0
|
htile 55
|
||||||
vtile 55
|
vtile 0
|
||||||
|
|
||||||
# How many pixels a window gets moved by
|
# How many pixels a window gets moved by
|
||||||
moveamount 50
|
moveamount 50
|
||||||
|
|
|
||||||
|
|
@ -2,3 +2,5 @@
|
||||||
[user]
|
[user]
|
||||||
name = kento2
|
name = kento2
|
||||||
email = kento+pub@placeq.com
|
email = kento+pub@placeq.com
|
||||||
|
[core]
|
||||||
|
autocrlf = input
|
||||||
|
|
|
||||||
|
|
@ -1,119 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
# shellcheck disable=SC2059,SC2064,SC2086,SC2001,SC2016
|
|
||||||
|
|
||||||
# simple lightweight lemonbar script for use with dk
|
|
||||||
|
|
||||||
set -eE -o pipefail
|
|
||||||
|
|
||||||
bg="#000000" # background colour
|
|
||||||
fg="#ffffff" # foreground colour
|
|
||||||
hi="#00aaaa" # highlight colour
|
|
||||||
ul=2 # underline thickness
|
|
||||||
sep="┃" # separator text
|
|
||||||
fifo="/tmp/bar.fifo"
|
|
||||||
font="Iosevka:size=11"
|
|
||||||
|
|
||||||
clock()
|
|
||||||
{
|
|
||||||
date +"T %a %H:%M "
|
|
||||||
|
|
||||||
# sync up the clock to the minute mark
|
|
||||||
min=$(date +"%M")
|
|
||||||
while [[ $(date +"%M") == "$min" ]]; do
|
|
||||||
sleep 1
|
|
||||||
done
|
|
||||||
|
|
||||||
while :; do
|
|
||||||
date +"T %a %H:%M "
|
|
||||||
sleep 60
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
battery()
|
|
||||||
{
|
|
||||||
while :; do
|
|
||||||
perc="$(cat /sys/class/power_supply/BAT0/capacity)"
|
|
||||||
echo "B bat: ${perc}%"
|
|
||||||
sleep 60
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
volume()
|
|
||||||
{
|
|
||||||
vol="$(pactl get-sink-volume @DEFAULT_SINK@ | grep -oE '[1-9]+%' | head -n1)"
|
|
||||||
echo "V vol: ${vol}"
|
|
||||||
}
|
|
||||||
|
|
||||||
workspaces()
|
|
||||||
{
|
|
||||||
# these will be filled out once we eval each line
|
|
||||||
typeset name="" title="" layout="" focused=false active=false
|
|
||||||
|
|
||||||
WS=""
|
|
||||||
while read -r l; do
|
|
||||||
printf '%s\n\n' "$1" >> "$HOME/a" 2>&1
|
|
||||||
if [[ $l =~ ^title=* ]]; then
|
|
||||||
# default foreground, background, and underline colours
|
|
||||||
# changing the foreground and underline based on
|
|
||||||
# the active and focused state
|
|
||||||
f="$fg" b="$bg" u="$fg";
|
|
||||||
$active && u="$hi"
|
|
||||||
if $focused; then
|
|
||||||
# clicking the layout symbol will cycle the layout
|
|
||||||
lyt="%{A:dkcmd set layout cycle:}${layouts[$layout]}%{A}"
|
|
||||||
WIN="${title:0:50}"
|
|
||||||
f="$hi"
|
|
||||||
fi
|
|
||||||
# clicking on a workspace name will view it
|
|
||||||
WS="$WS%{F$f}%{B$b}%{+u}%{U$u}%{A:dkcmd ws $name:} $name %{A}%{-u}%{B-}%{F-}"
|
|
||||||
fi
|
|
||||||
# turn the dk JSON output into lines that can be `eval`ed one by one,
|
|
||||||
# filling out the following fields: name, focused, active, layout, title
|
|
||||||
done < <(dkcmd -p <<< "$1" | sed '/.*\[\|]/d; /[{}],\?/d; s/^\s*\|,$//g; /"monitor":\|"number":\|"id":/d; s/"\(.*\)": /\1=/; s/\$(/\\\$(/g; s/`/\\`/g')
|
|
||||||
WS="$WS $lyt"
|
|
||||||
}
|
|
||||||
|
|
||||||
parsefifo()
|
|
||||||
{
|
|
||||||
# globals to simplify the workspaces call
|
|
||||||
declare -g WS
|
|
||||||
|
|
||||||
local time vol bat net
|
|
||||||
|
|
||||||
while read -r line; do
|
|
||||||
case $line in
|
|
||||||
T*) time="${line#?}" ;;
|
|
||||||
V*) vol="${line#?}" ;;
|
|
||||||
B*) bat="${line#?}" ;;
|
|
||||||
N*) net="${line#?}" ;;
|
|
||||||
'{'*) workspaces "$line" ;;
|
|
||||||
esac
|
|
||||||
echo "%{l} ${WS}%{c}${time}%{r}${bat}${vol} "
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
# kill the process and cleanup if we exit or get killed
|
|
||||||
trap "trap - TERM; rm -f '$fifo'; kill 0" INT TERM QUIT EXIT PIPE
|
|
||||||
|
|
||||||
# make the fifo
|
|
||||||
[ -e "$fifo" ] && rm "$fifo"
|
|
||||||
mkfifo "$fifo"
|
|
||||||
|
|
||||||
# here we dump info into the FIFO, order does not matter things are parsed
|
|
||||||
# out using the first character of the line. Click commands for left button
|
|
||||||
# can be added by passing an argument containing the command (like below)
|
|
||||||
#
|
|
||||||
# comment a line to remove the "module"
|
|
||||||
clock > "$fifo" &
|
|
||||||
battery > "$fifo" &
|
|
||||||
volume > "$fifo" &
|
|
||||||
dkcmd status type=bar > "$fifo" &
|
|
||||||
|
|
||||||
# run the pipeline
|
|
||||||
if [[ $1 == '-b' ]]; then
|
|
||||||
parsefifo < "$fifo" | lemonbar -b -a 32 -u $ul -B "$bg" -F "$fg" -f "$font" | sh;
|
|
||||||
else
|
|
||||||
parsefifo < "$fifo" | lemonbar -a 32 -u $ul -B "$bg" -F "$fg" -f "$font" | sh
|
|
||||||
fi
|
|
||||||
|
|
||||||
# vim:ft=sh:fdm=marker:fmr={,}
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
get_mem() {
|
|
||||||
while IFS=':k ' read -r key val _; do
|
|
||||||
case $key in
|
|
||||||
MemTotal) mem_used="$((mem_used + val))" ;;
|
|
||||||
Shmem) mem_used="$((mem_used + val))" ;;
|
|
||||||
MemFree|Buffers|Cached|SReclaimable) mem_used="$((mem_used - val))" ;;
|
|
||||||
esac
|
|
||||||
done < /proc/meminfo
|
|
||||||
|
|
||||||
echo "$((mem_used / 1024))"
|
|
||||||
}
|
|
||||||
|
|
||||||
echo "$USER@$(hostname)"
|
|
||||||
echo 'os: Void Linux x86_64-musl'
|
|
||||||
echo "uptime:$(uptime -p | tr -d 'up')" # 4 hors 20 mintes
|
|
||||||
echo "ip: $(ip a | grep -oEm1 '192\.168\.[0-9][0-9][0-9]\.[0-9]+' | head -n1)"
|
|
||||||
echo "pkgs: $(xbps-query -lm | wc -l)"
|
|
||||||
echo "mem: $(get_mem)M"
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
JOURNAL="$HOME/nfs/idk"
|
|
||||||
|
|
||||||
tmp="$(mktemp /tmp/journal.XXXXXX)"
|
|
||||||
|
|
||||||
d="$(date -I)"
|
|
||||||
grep "$d" "$JOURNAL" || printf "%s\n" "$d" > "$tmp"
|
|
||||||
|
|
||||||
"${EDITOR:-vi}" "$tmp"
|
|
||||||
tail "$JOURNAL"
|
|
||||||
(printf "\n"; cat "$tmp" | tee -a "$JOURNAL") && rm "$tmp"
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
LIBGL_ALWAYS_SOFTWARE=1 exec /usr/bin/luakit $@
|
|
||||||
2
files/.local/bin/xclip
Executable file
2
files/.local/bin/xclip
Executable file
|
|
@ -0,0 +1,2 @@
|
||||||
|
#!/bin/sh
|
||||||
|
xclip -selection clipboard $@
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2015 Dmitry Ivanov
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
|
|
@ -1,44 +0,0 @@
|
||||||
# premake-ninja
|
|
||||||
|
|
||||||
[Premake](https://github.com/premake/premake-core) module to support [Ninja](https://github.com/martine/ninja), because it's awesome.
|
|
||||||
Note recent version of premake handles ninja natively
|
|
||||||
|
|
||||||
## Usage (little reminder)
|
|
||||||
1. Put these files in a "premake-ninja" subdirectory of [Premake search paths](https://premake.github.io/docs/Locating-Scripts/).<br>
|
|
||||||
|
|
||||||
2. Adapt your premake5.lua script, or better: create/adapt your [premake-system.lua](https://premake.github.io/docs/System-Scripts/)
|
|
||||||
|
|
||||||
```lua
|
|
||||||
require "premake-ninja/premake-ninja"
|
|
||||||
```
|
|
||||||
|
|
||||||
3. Generate ninja files
|
|
||||||
|
|
||||||
```sh
|
|
||||||
premake5 premake-ninja
|
|
||||||
```
|
|
||||||
On msys2 (mingw)
|
|
||||||
```sh
|
|
||||||
premake5 premake-ninja --cc=gcc --shell=posix
|
|
||||||
```
|
|
||||||
|
|
||||||
4. Run ninja
|
|
||||||
|
|
||||||
For each project - configuration pair, we create separate .ninja file. For solution we create build.ninja file which imports other .ninja files with subninja command.
|
|
||||||
|
|
||||||
Build.ninja file sets phony targets for configuration names so you can build them from command line. And default target is the first configuration name in your project (usually default).
|
|
||||||
|
|
||||||
General from:
|
|
||||||
```sh
|
|
||||||
ninja $(YourProjectName)_$(ConfigName)
|
|
||||||
```
|
|
||||||
as example:
|
|
||||||
```sh
|
|
||||||
ninja myapp_Release
|
|
||||||
```
|
|
||||||
|
|
||||||
### Tested on   
|
|
||||||
|
|
||||||
### Extra Tests
|
|
||||||
|
|
||||||
Part of integration tests of several generators in https://github.com/Jarod42/premake-sample-projects 
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
return {
|
|
||||||
'_preload.lua',
|
|
||||||
'premake-ninja.lua',
|
|
||||||
}
|
|
||||||
|
|
@ -1,61 +0,0 @@
|
||||||
--
|
|
||||||
-- Name: premake-ninja/_preload.lua
|
|
||||||
-- Purpose: Define the ninja action.
|
|
||||||
-- Author: Dmitry Ivanov
|
|
||||||
-- Created: 2015/07/04
|
|
||||||
-- Copyright: (c) 2015 Dmitry Ivanov
|
|
||||||
--
|
|
||||||
|
|
||||||
local p = premake
|
|
||||||
|
|
||||||
newaction {
|
|
||||||
-- Metadata for the command line and help system
|
|
||||||
trigger = 'ninja',
|
|
||||||
shortname = 'ninja',
|
|
||||||
description = 'Ninja is a small build system with a focus on speed',
|
|
||||||
|
|
||||||
-- The capabilities of this action
|
|
||||||
valid_kinds = { 'ConsoleApp', 'WindowedApp', 'SharedLib', 'StaticLib', 'None' }, -- Not supported: Makefile, Packaging, SharedItems, Utility
|
|
||||||
valid_languages = { 'C', 'C++' },
|
|
||||||
valid_tools = { cc = { 'gcc', 'clang', 'msc', 'emcc' } },
|
|
||||||
|
|
||||||
toolset = iif(
|
|
||||||
os.target() == 'windows',
|
|
||||||
'msc-v142', -- Visual Studio 2019
|
|
||||||
iif(os.target() == 'macosx', 'clang', 'gcc')
|
|
||||||
),
|
|
||||||
|
|
||||||
-- Workspace and project generation logic
|
|
||||||
onWorkspace = function(wks)
|
|
||||||
p.eol('\r\n')
|
|
||||||
p.indent(' ')
|
|
||||||
p.generate(wks, 'build.ninja', p.modules.ninja.generateWorkspace)
|
|
||||||
end,
|
|
||||||
onProject = function(prj)
|
|
||||||
p.eol('\r\n')
|
|
||||||
p.indent(' ')
|
|
||||||
p.modules.ninja.generateProject(prj)
|
|
||||||
end,
|
|
||||||
onBranch = function(prj)
|
|
||||||
p.eol('\r\n')
|
|
||||||
p.indent(' ')
|
|
||||||
p.modules.ninja.generateProject(prj)
|
|
||||||
end,
|
|
||||||
onCleanSolution = function(sln)
|
|
||||||
-- TODO
|
|
||||||
end,
|
|
||||||
onCleanProject = function(prj)
|
|
||||||
-- TODO
|
|
||||||
end,
|
|
||||||
onCleanTarget = function(prj)
|
|
||||||
-- TODO
|
|
||||||
end,
|
|
||||||
}
|
|
||||||
|
|
||||||
--
|
|
||||||
-- Decide when the full module should be loaded.
|
|
||||||
--
|
|
||||||
|
|
||||||
return function(cfg)
|
|
||||||
return (_ACTION == 'premake-ninja')
|
|
||||||
end
|
|
||||||
|
|
@ -1,785 +0,0 @@
|
||||||
--
|
|
||||||
-- Name: premake-ninja/ninja.lua
|
|
||||||
-- Purpose: Define the ninja action.
|
|
||||||
-- Author: Dmitry Ivanov
|
|
||||||
-- Created: 2015/07/04
|
|
||||||
-- Copyright: (c) 2015 Dmitry Ivanov
|
|
||||||
--
|
|
||||||
|
|
||||||
local p = premake
|
|
||||||
local tree = p.tree
|
|
||||||
local project = p.project
|
|
||||||
local config = p.config
|
|
||||||
local fileconfig = p.fileconfig
|
|
||||||
|
|
||||||
-- Some toolset fixes/helper
|
|
||||||
p.tools.clang.objectextension = '.o'
|
|
||||||
p.tools.gcc.objectextension = '.o'
|
|
||||||
p.tools.msc.objectextension = '.obj'
|
|
||||||
|
|
||||||
p.tools.clang.tools.rc = p.tools.clang.tools.rc or 'windres'
|
|
||||||
|
|
||||||
p.tools.msc.gettoolname = function(cfg, name)
|
|
||||||
local map = { cc = 'cl', cxx = 'cl', ar = 'lib', rc = 'rc' }
|
|
||||||
return map[name]
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Ninja module
|
|
||||||
premake.modules.ninja = {}
|
|
||||||
local ninja = p.modules.ninja
|
|
||||||
|
|
||||||
ninja.handlers = {}
|
|
||||||
|
|
||||||
function ninja.register_handler(kind, compilation_rules, target_rules)
|
|
||||||
ninja.handlers[kind] = { compilation_rules = compilation_rules, target_rules = target_rules }
|
|
||||||
end
|
|
||||||
|
|
||||||
local function get_key(cfg, name)
|
|
||||||
local name = name or cfg.project.name
|
|
||||||
|
|
||||||
if cfg.platform then
|
|
||||||
return name .. '_' .. cfg.buildcfg .. '_' .. cfg.platform
|
|
||||||
else
|
|
||||||
return name .. '_' .. cfg.buildcfg
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local build_cache = {}
|
|
||||||
|
|
||||||
function ninja.add_build(cfg, out, implicit_outputs, command, inputs, implicit_inputs, dependencies, vars)
|
|
||||||
implicit_outputs = ninja.list(table.translate(implicit_outputs, ninja.esc))
|
|
||||||
if #implicit_outputs > 0 then
|
|
||||||
implicit_outputs = ' |' .. implicit_outputs
|
|
||||||
else
|
|
||||||
implicit_outputs = ''
|
|
||||||
end
|
|
||||||
|
|
||||||
inputs = ninja.list(table.translate(inputs, ninja.esc))
|
|
||||||
|
|
||||||
implicit_inputs = ninja.list(table.translate(implicit_inputs, ninja.esc))
|
|
||||||
if #implicit_inputs > 0 then
|
|
||||||
implicit_inputs = ' |' .. implicit_inputs
|
|
||||||
else
|
|
||||||
implicit_inputs = ''
|
|
||||||
end
|
|
||||||
|
|
||||||
dependencies = ninja.list(table.translate(dependencies, ninja.esc))
|
|
||||||
if #dependencies > 0 then
|
|
||||||
dependencies = ' ||' .. dependencies
|
|
||||||
else
|
|
||||||
dependencies = ''
|
|
||||||
end
|
|
||||||
build_line = 'build ' .. ninja.esc(out) .. implicit_outputs .. ': ' .. command .. inputs .. implicit_inputs .. dependencies
|
|
||||||
|
|
||||||
local cached = build_cache[out]
|
|
||||||
if cached ~= nil then
|
|
||||||
if build_line == cached.build_line and table.equals(vars or {}, cached.vars or {}) then
|
|
||||||
-- custom_command/copy rule are identical for each configuration (contrary to other rules)
|
|
||||||
-- So we can compare extra parameter
|
|
||||||
if command == 'custom_command' or command == 'copy' then
|
|
||||||
p.outln('# INFO: Rule ignored, same as ' .. cached.cfg_key)
|
|
||||||
else
|
|
||||||
local cfg_key = cfg and get_key(cfg) or 'Global scope'
|
|
||||||
p.warn(cached.cfg_key .. ' and ' .. cfg_key .. ' both generate (differently?) ' .. out .. '. Ignoring ' .. cfg_key)
|
|
||||||
p.outln('# WARNING: Rule ignored, using the one from ' .. cached.cfg_key)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
local cfg_key = cfg and get_key(cfg) or 'Global scope'
|
|
||||||
p.warn(cached.cfg_key .. ' and ' .. cfg_key .. ' both generate differently ' .. out .. '. Ignoring ' .. cfg_key)
|
|
||||||
p.outln('# ERROR: Rule ignored, using the one from ' .. cached.cfg_key)
|
|
||||||
end
|
|
||||||
p.outln('# ' .. build_line)
|
|
||||||
for i, var in ipairs(vars or {}) do
|
|
||||||
p.outln('# ' .. var)
|
|
||||||
end
|
|
||||||
return
|
|
||||||
end
|
|
||||||
p.outln(build_line)
|
|
||||||
for i, var in ipairs(vars or {}) do
|
|
||||||
p.outln(' ' .. var)
|
|
||||||
end
|
|
||||||
build_cache[out] = {
|
|
||||||
cfg_key = cfg and get_key(cfg) or 'Global scope',
|
|
||||||
build_line = build_line,
|
|
||||||
vars = vars,
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
local function build_command(commands, command_sep)
|
|
||||||
command_sep = command_sep or '&&'
|
|
||||||
if #commands > 1 then
|
|
||||||
local command = iif(os.shell() == 'cmd', 'cmd /c ', 'sh -c ')
|
|
||||||
return command .. ninja.quote(table.implode(commands, '', '', ' ' .. command_sep .. '$\n '))
|
|
||||||
else
|
|
||||||
return commands[1]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
function ninja.emit_rule(name, command, description, opts)
|
|
||||||
opts = opts or {}
|
|
||||||
p.outln('rule ' .. name)
|
|
||||||
p.outln(' command = ' .. command)
|
|
||||||
p.outln(' description = ' .. description)
|
|
||||||
for key, value in pairs(opts) do
|
|
||||||
p.outln(' ' .. key .. ' = ' .. value)
|
|
||||||
end
|
|
||||||
p.outln('')
|
|
||||||
end
|
|
||||||
|
|
||||||
function ninja.emit_flags(name, value)
|
|
||||||
p.outln(name .. '=' .. value)
|
|
||||||
end
|
|
||||||
|
|
||||||
function ninja.esc(value)
|
|
||||||
value = value:gsub('%$', '$$') -- TODO maybe there is better way
|
|
||||||
value = value:gsub(':', '$:')
|
|
||||||
value = value:gsub('\n', '$\n')
|
|
||||||
value = value:gsub(' ', '$ ')
|
|
||||||
return value
|
|
||||||
end
|
|
||||||
|
|
||||||
function ninja.quote(value)
|
|
||||||
value = value:gsub('\\', '\\\\')
|
|
||||||
value = value:gsub("'", "\\'")
|
|
||||||
value = value:gsub('"', '\\"')
|
|
||||||
|
|
||||||
return '"' .. value .. '"'
|
|
||||||
end
|
|
||||||
|
|
||||||
-- in some cases we write file names in rule commands directly
|
|
||||||
-- so we need to propely escape them
|
|
||||||
function ninja.shesc(value)
|
|
||||||
if type(value) == 'table' then
|
|
||||||
return table.translate(value, ninja.shesc)
|
|
||||||
end
|
|
||||||
|
|
||||||
if value:find(' ') or value:find('"') or value:find('(', 1, true) or value:find(')') or value:find('|') or value:find('&') then
|
|
||||||
return ninja.quote(value)
|
|
||||||
end
|
|
||||||
return value
|
|
||||||
end
|
|
||||||
|
|
||||||
function ninja.can_generate(prj)
|
|
||||||
return p.action.supports(prj.kind) and prj.kind ~= p.NONE
|
|
||||||
end
|
|
||||||
|
|
||||||
-- generate solution that will call ninja for projects
|
|
||||||
function ninja.generateWorkspace(wks)
|
|
||||||
local oldGetDefaultSeparator = path.getDefaultSeparator
|
|
||||||
path.getDefaultSeparator = function()
|
|
||||||
return '/'
|
|
||||||
end
|
|
||||||
|
|
||||||
p.outln('# solution build file')
|
|
||||||
p.outln('# generated with premake ninja')
|
|
||||||
p.outln('')
|
|
||||||
|
|
||||||
p.outln('# build projects')
|
|
||||||
local cfgs = {} -- key is concatenated name or variant name, value is string of outputs names
|
|
||||||
local key = ''
|
|
||||||
local cfg_first = nil
|
|
||||||
local cfg_first_lib = nil
|
|
||||||
local subninjas = {}
|
|
||||||
|
|
||||||
for prj in p.workspace.eachproject(wks) do
|
|
||||||
if ninja.can_generate(prj) then
|
|
||||||
for cfg in p.project.eachconfig(prj) do
|
|
||||||
key = get_key(cfg)
|
|
||||||
|
|
||||||
if not cfgs[cfg.buildcfg] then
|
|
||||||
cfgs[cfg.buildcfg] = {}
|
|
||||||
end
|
|
||||||
table.insert(cfgs[cfg.buildcfg], key)
|
|
||||||
|
|
||||||
-- set first configuration name
|
|
||||||
if wks.defaultplatform == nil then
|
|
||||||
if (cfg_first == nil) and (cfg.kind == p.CONSOLEAPP or cfg.kind == p.WINDOWEDAPP) then
|
|
||||||
cfg_first = key
|
|
||||||
end
|
|
||||||
end
|
|
||||||
if (cfg_first_lib == nil) and (cfg.kind == p.STATICLIB or cfg.kind == p.SHAREDLIB) then
|
|
||||||
cfg_first_lib = key
|
|
||||||
end
|
|
||||||
if prj.name == wks.startproject then
|
|
||||||
if wks.defaultplatform == nil then
|
|
||||||
cfg_first = key
|
|
||||||
elseif cfg.platform == wks.defaultplatform then
|
|
||||||
if cfg_first == nil then
|
|
||||||
cfg_first = key
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- include other ninja file
|
|
||||||
table.insert(subninjas, ninja.esc(ninja.projectCfgFilename(cfg, true)))
|
|
||||||
p.outln('subninja ' .. ninja.esc(ninja.projectCfgFilename(cfg, true)))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
if cfg_first == nil then
|
|
||||||
cfg_first = cfg_first_lib
|
|
||||||
end
|
|
||||||
|
|
||||||
p.outln('')
|
|
||||||
|
|
||||||
p.outln('# targets')
|
|
||||||
for cfg, outputs in spairs(cfgs) do
|
|
||||||
p.outln('build ' .. ninja.esc(cfg) .. ': phony' .. ninja.list(table.translate(outputs, ninja.esc)))
|
|
||||||
end
|
|
||||||
p.outln('')
|
|
||||||
|
|
||||||
if wks.editorintegration then
|
|
||||||
-- we need to filter out the 'file' argument, since we already output
|
|
||||||
-- the script separately.
|
|
||||||
local args = {}
|
|
||||||
for _, arg in ipairs(_ARGV) do
|
|
||||||
if not (arg:startswith('--file') or arg:startswith('/file')) then
|
|
||||||
table.insert(args, arg)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
table.sort(args)
|
|
||||||
|
|
||||||
p.outln('# Rule')
|
|
||||||
ninja.emit_rule('premake', ninja.shesc(p.workspace.getrelative(wks, _PREMAKE_COMMAND)) .. ' --file=$in ' .. table.concat(ninja.shesc(args), ' '), 'run premake', { generator = 'true', restat = 'true' })
|
|
||||||
ninja.add_build(nil, 'build.ninja', subninjas, 'premake', { p.workspace.getrelative(wks, _MAIN_SCRIPT) }, {}, {}, {})
|
|
||||||
p.outln('')
|
|
||||||
end
|
|
||||||
|
|
||||||
if cfg_first then
|
|
||||||
p.outln('# default target')
|
|
||||||
p.outln('default ' .. ninja.esc(cfg_first))
|
|
||||||
p.outln('')
|
|
||||||
end
|
|
||||||
|
|
||||||
path.getDefaultSeparator = oldGetDefaultSeparator
|
|
||||||
end
|
|
||||||
|
|
||||||
function ninja.list(value)
|
|
||||||
if #value > 0 then
|
|
||||||
return ' ' .. table.concat(value, ' ')
|
|
||||||
else
|
|
||||||
return ''
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function shouldcompileasc(filecfg)
|
|
||||||
if filecfg.compileas and filecfg.compileas ~= 'Default' then
|
|
||||||
return p.languages.isc(filecfg.compileas)
|
|
||||||
end
|
|
||||||
return path.iscfile(filecfg.abspath)
|
|
||||||
end
|
|
||||||
|
|
||||||
local function shouldcompileascpp(filecfg)
|
|
||||||
if filecfg.compileas and filecfg.compileas ~= 'Default' then
|
|
||||||
return p.languages.iscpp(filecfg.compileas)
|
|
||||||
end
|
|
||||||
return path.iscppfile(filecfg.abspath)
|
|
||||||
end
|
|
||||||
|
|
||||||
local function getFileDependencies(cfg)
|
|
||||||
local dependencies = {}
|
|
||||||
if #cfg.prebuildcommands > 0 or cfg.prebuildmessage then
|
|
||||||
dependencies = { 'prebuild_' .. get_key(cfg) }
|
|
||||||
end
|
|
||||||
for i = 1, #cfg.dependson do
|
|
||||||
local dependpostfix = ''
|
|
||||||
if cfg.platform then
|
|
||||||
dependpostfix = '_' .. cfg.platform
|
|
||||||
end
|
|
||||||
|
|
||||||
table.insert(dependencies, cfg.dependson[i] .. '_' .. cfg.buildcfg .. dependpostfix)
|
|
||||||
end
|
|
||||||
return dependencies
|
|
||||||
end
|
|
||||||
|
|
||||||
local function getcflags(toolset, cfg, filecfg)
|
|
||||||
p.escaper(ninja.shesc)
|
|
||||||
local buildopt = ninja.list(filecfg.buildoptions)
|
|
||||||
local cppflags = ninja.list(toolset.getcppflags(filecfg))
|
|
||||||
local cflags = ninja.list(toolset.getcflags(filecfg))
|
|
||||||
local defines = ninja.list(table.join(toolset.getdefines(filecfg.defines, filecfg), toolset.getundefines(filecfg.undefines)))
|
|
||||||
local includes = ninja.list(toolset.getincludedirs(cfg, filecfg.includedirs, filecfg.externalincludedirs, filecfg.frameworkdirs, filecfg.includedirsafter))
|
|
||||||
local forceincludes = ninja.list(toolset.getforceincludes(cfg))
|
|
||||||
p.escaper(nil)
|
|
||||||
|
|
||||||
return buildopt .. cppflags .. cflags .. defines .. includes .. forceincludes
|
|
||||||
end
|
|
||||||
|
|
||||||
local function getcxxflags(toolset, cfg, filecfg)
|
|
||||||
p.escaper(ninja.shesc)
|
|
||||||
local buildopt = ninja.list(filecfg.buildoptions)
|
|
||||||
local cppflags = ninja.list(toolset.getcppflags(filecfg))
|
|
||||||
local cxxflags = ninja.list(toolset.getcxxflags(filecfg))
|
|
||||||
local defines = ninja.list(table.join(toolset.getdefines(filecfg.defines, filecfg), toolset.getundefines(filecfg.undefines)))
|
|
||||||
local includes = ninja.list(toolset.getincludedirs(cfg, filecfg.includedirs, filecfg.externalincludedirs, filecfg.frameworkdirs, filecfg.includedirsafter))
|
|
||||||
local forceincludes = ninja.list(toolset.getforceincludes(cfg))
|
|
||||||
p.escaper(nil)
|
|
||||||
|
|
||||||
return buildopt .. cppflags .. cxxflags .. defines .. includes .. forceincludes
|
|
||||||
end
|
|
||||||
|
|
||||||
local function getldflags(toolset, cfg)
|
|
||||||
local ldflags = ninja.list(table.join(toolset.getLibraryDirectories(cfg), toolset.getrunpathdirs(cfg, table.join(cfg.runpathdirs, config.getsiblingtargetdirs(cfg))), toolset.getldflags(cfg), cfg.linkoptions))
|
|
||||||
|
|
||||||
-- experimental feature, change install_name of shared libs
|
|
||||||
--[[
|
|
||||||
if toolset == p.tools.clang and cfg.kind == p.SHAREDLIB and cfg.buildtarget.name:endswith('.dylib') then
|
|
||||||
ldflags = ldflags .. ' -install_name ' .. cfg.buildtarget.name
|
|
||||||
end
|
|
||||||
--]]
|
|
||||||
|
|
||||||
return ldflags
|
|
||||||
end
|
|
||||||
|
|
||||||
local function getresflags(toolset, cfg, filecfg)
|
|
||||||
p.escaper(ninja.shesc)
|
|
||||||
local defines = ninja.list(toolset.getdefines(table.join(filecfg.defines, filecfg.resdefines), filecfg))
|
|
||||||
local includes = ninja.list(toolset.getincludedirs(cfg, table.join(filecfg.externalincludedirs, filecfg.includedirsafter, filecfg.includedirs, filecfg.resincludedirs), {}, {}, {}))
|
|
||||||
local options = ninja.list(cfg.resoptions)
|
|
||||||
p.escaper(nil)
|
|
||||||
|
|
||||||
return defines .. includes .. options
|
|
||||||
end
|
|
||||||
|
|
||||||
local function prebuild_rule(cfg)
|
|
||||||
if #cfg.prebuildcommands > 0 or cfg.prebuildmessage then
|
|
||||||
local commands = {}
|
|
||||||
if cfg.prebuildmessage then
|
|
||||||
commands = { os.translateCommandsAndPaths('{ECHO} ' .. cfg.prebuildmessage, cfg.workspace.basedir, cfg.workspace.location) }
|
|
||||||
end
|
|
||||||
commands = table.join(commands, os.translateCommandsAndPaths(cfg.prebuildcommands, cfg.workspace.basedir, cfg.workspace.location))
|
|
||||||
ninja.emit_rule('run_prebuild', build_command(commands, ';'), 'prebuild')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function prelink_rule(cfg)
|
|
||||||
if #cfg.prelinkcommands > 0 or cfg.prelinkmessage then
|
|
||||||
local commands = {}
|
|
||||||
if cfg.prelinkmessage then
|
|
||||||
commands = { os.translateCommandsAndPaths('{ECHO} ' .. cfg.prelinkmessage, cfg.workspace.basedir, cfg.workspace.location) }
|
|
||||||
end
|
|
||||||
commands = table.join(commands, os.translateCommandsAndPaths(cfg.prelinkcommands, cfg.workspace.basedir, cfg.workspace.location))
|
|
||||||
ninja.emit_rule('run_prelink', build_command(commands, ';'), 'prelink')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function postbuild_rule(cfg)
|
|
||||||
if #cfg.postbuildcommands > 0 or cfg.postbuildmessage then
|
|
||||||
local commands = {}
|
|
||||||
if cfg.postbuildmessage then
|
|
||||||
commands = { os.translateCommandsAndPaths('{ECHO} ' .. cfg.postbuildmessage, cfg.workspace.basedir, cfg.workspace.location) }
|
|
||||||
end
|
|
||||||
commands = table.join(commands, os.translateCommandsAndPaths(cfg.postbuildcommands, cfg.workspace.basedir, cfg.workspace.location))
|
|
||||||
ninja.emit_rule('run_postbuild', build_command(commands, ';'), 'postbuild')
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function c_cpp_compilation_rules(cfg, toolset, pch)
|
|
||||||
---------------------------------------------------- figure out toolset executables
|
|
||||||
local cc = toolset.gettoolname(cfg, 'cc')
|
|
||||||
local cxx = toolset.gettoolname(cfg, 'cxx')
|
|
||||||
local ar = toolset.gettoolname(cfg, 'ar')
|
|
||||||
local link = toolset.gettoolname(cfg, iif(cfg.language == 'C', 'cc', 'cxx'))
|
|
||||||
local rc = toolset.gettoolname(cfg, 'rc')
|
|
||||||
|
|
||||||
-- all paths need to be relative to the workspace output location,
|
|
||||||
-- and not relative to the project output location.
|
|
||||||
-- override the toolset getrelative function to achieve this
|
|
||||||
|
|
||||||
local getrelative = p.tools.getrelative
|
|
||||||
p.tools.getrelative = function(cfg, value)
|
|
||||||
return p.workspace.getrelative(cfg.workspace, value)
|
|
||||||
end
|
|
||||||
|
|
||||||
local all_cflags = getcflags(toolset, cfg, cfg)
|
|
||||||
local all_cxxflags = getcxxflags(toolset, cfg, cfg)
|
|
||||||
local all_ldflags = getldflags(toolset, cfg)
|
|
||||||
local all_resflags = getresflags(toolset, cfg, cfg)
|
|
||||||
|
|
||||||
if toolset == p.tools.msc then
|
|
||||||
ninja.emit_flags('CFLAGS', all_cflags)
|
|
||||||
local cc_command = cc .. ' $CFLAGS /nologo /showIncludes -c /Tc$in /Fo$out'
|
|
||||||
ninja.emit_rule('cc', cc_command, 'cc $out', { deps = 'msvc' })
|
|
||||||
|
|
||||||
ninja.emit_flags('CXXFLAGS', all_cxxflags)
|
|
||||||
local cxx_command = cxx .. ' $CXXFLAGS /nologo /showIncludes -c /Tp$in /Fo$out'
|
|
||||||
ninja.emit_rule('cxx', cxx_command, 'cxx $out', { deps = 'msvc' })
|
|
||||||
|
|
||||||
ninja.emit_flags('CFLAGS', all_cflags)
|
|
||||||
ninja.emit_rule('clangtidy_cc', build_command({ 'clang-tidy $in -- -x c $CFLAGS', cc_command }, ';'), 'cc $out', { deps = 'msvc' }, ';')
|
|
||||||
|
|
||||||
ninja.emit_flags('CXXFLAGS', all_cxxflags)
|
|
||||||
ninja.emit_rule('clangtidy_cxx', build_command({ 'clang-tidy $in -- -x c++ $CFLAGS', cxx_command }, ';'), 'cxx $out', { deps = 'msvc' }, ';')
|
|
||||||
|
|
||||||
ninja.emit_flags('RESFLAGS', all_resflags)
|
|
||||||
ninja.emit_rule('rc', rc .. ' /nologo /fo$out $in $RESFLAGS', 'rc $out')
|
|
||||||
|
|
||||||
if cfg.kind == p.STATICLIB then
|
|
||||||
ninja.emit_rule('ar', ar .. ' @$out.rsp /nologo -OUT:$out', 'ar $out', { rspfile = '$out.rsp', rspfile_content = '$in_newline' })
|
|
||||||
else
|
|
||||||
ninja.emit_rule('link', link .. ' @$out.rsp ' .. ninja.list(ninja.shesc(toolset.getlinks(cfg, true))) .. ' /link ' .. all_ldflags .. ' /nologo /out:$out', 'link $out', { rspfile = '$out.rsp', rspfile_content = '$in_newline' })
|
|
||||||
end
|
|
||||||
elseif toolset == p.tools.clang or toolset == p.tools.gcc or toolset == p.tools.emcc then
|
|
||||||
local force_include = pch and (' -include ' .. ninja.shesc(pch.placeholder)) or ''
|
|
||||||
|
|
||||||
if pch then
|
|
||||||
ninja.emit_rule('build_pch', iif(cfg.language == 'C', cc .. all_cflags .. ' -x c-header', cxx .. all_cxxflags .. ' -x c++-header') .. ' -H -MF $out.d -c -o $out $in', 'build_pch $out', { depfile = '$out.d', deps = 'gcc' })
|
|
||||||
end
|
|
||||||
|
|
||||||
ninja.emit_flags('CFLAGS', all_cflags)
|
|
||||||
local cc_command = cc .. ' $CFLAGS' .. force_include .. ' -x c -MF $out.d -c -o $out $in'
|
|
||||||
ninja.emit_rule('cc', cc_command, 'cc $out', { depfile = '$out.d', deps = 'gcc' })
|
|
||||||
|
|
||||||
ninja.emit_flags('CXXFLAGS', all_cxxflags)
|
|
||||||
local cxx_command = cxx .. ' $CXXFLAGS' .. force_include .. ' -x c++ -MF $out.d -c -o $out $in'
|
|
||||||
ninja.emit_rule('cxx', cxx_command, 'cxx $out', { depfile = '$out.d', deps = 'gcc' })
|
|
||||||
|
|
||||||
ninja.emit_flags('CFLAGS', all_cflags)
|
|
||||||
ninja.emit_rule('clangtidy_cc', build_command({ 'clang-tidy $in -- -x c $CFLAGS' .. force_include, cc_command }, ';'), 'cc $out', { depfile = '$out.d', deps = 'gcc' })
|
|
||||||
|
|
||||||
ninja.emit_flags('CXXFLAGS', all_cxxflags)
|
|
||||||
ninja.emit_rule('clangtidy_cxx', build_command({ 'clang-tidy $in -- -x c++ $CFLAGS' .. force_include, cxx_command }, ';'), 'cxx $out', { depfile = '$out.d', deps = 'gcc' })
|
|
||||||
|
|
||||||
ninja.emit_flags('RESFLAGS', all_resflags)
|
|
||||||
if rc then
|
|
||||||
ninja.emit_rule('rc', rc .. ' -i $in -o $out $RESFLAGS', 'rc $out')
|
|
||||||
end
|
|
||||||
|
|
||||||
if ar and cfg.kind == p.STATICLIB then
|
|
||||||
if os.target() == 'macosx' then -- doesn't support response file
|
|
||||||
ninja.emit_rule('ar', ar .. ' rcs $out $in', 'ar $out')
|
|
||||||
else
|
|
||||||
ninja.emit_rule('ar', ar .. ' rcs $out @$out.rsp', 'ar $out', { rspfile = '$out.rsp', rspfile_content = '$in_newline' })
|
|
||||||
end
|
|
||||||
else
|
|
||||||
local groups = iif(cfg.linkgroups == premake.ON, { '-Wl,--start-group ', ' -Wl,--end-group' }, { '', '' })
|
|
||||||
ninja.emit_rule('link', link .. ' -o $out ' .. groups[1] .. '@$out.rsp' .. ninja.list(ninja.shesc(toolset.getlinks(cfg, true, true))) .. all_ldflags .. groups[2], 'link $out', { rspfile = '$out.rsp', rspfile_content = '$in_newline' })
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
p.tools.getrelative = getrelative
|
|
||||||
end
|
|
||||||
|
|
||||||
local function custom_command_rule()
|
|
||||||
ninja.emit_rule('custom_command', '$CUSTOM_COMMAND', '$CUSTOM_DESCRIPTION')
|
|
||||||
end
|
|
||||||
|
|
||||||
local function copy_rule()
|
|
||||||
ninja.emit_rule('copy', os.translateCommands('{COPYFILE} $in $out'), 'copy $in $out')
|
|
||||||
end
|
|
||||||
|
|
||||||
local function collect_generated_files(prj, cfg)
|
|
||||||
local generated_files = {}
|
|
||||||
tree.traverse(project.getsourcetree(prj), {
|
|
||||||
onleaf = function(node, depth)
|
|
||||||
function append_to_generated_files(filecfg)
|
|
||||||
local outputs = project.getrelative(prj.workspace, filecfg.buildoutputs)
|
|
||||||
generated_files = table.join(generated_files, outputs)
|
|
||||||
end
|
|
||||||
local filecfg = fileconfig.getconfig(node, cfg)
|
|
||||||
if not filecfg or filecfg.excludefrombuild then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local rule = p.global.getRuleForFile(node.name, prj.rules)
|
|
||||||
if fileconfig.hasCustomBuildRule(filecfg) then
|
|
||||||
append_to_generated_files(filecfg)
|
|
||||||
elseif rule then
|
|
||||||
local environ = table.shallowcopy(filecfg.environ)
|
|
||||||
|
|
||||||
if rule.propertydefinition then
|
|
||||||
p.rule.prepareEnvironment(rule, environ, cfg)
|
|
||||||
p.rule.prepareEnvironment(rule, environ, filecfg)
|
|
||||||
end
|
|
||||||
local rulecfg = p.context.extent(rule, environ)
|
|
||||||
append_to_generated_files(rulecfg)
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
}, false, 1)
|
|
||||||
return generated_files
|
|
||||||
end
|
|
||||||
|
|
||||||
local function pch_build(cfg, pch)
|
|
||||||
local pch_dependency = {}
|
|
||||||
if pch then
|
|
||||||
pch_dependency = { pch.gch }
|
|
||||||
ninja.add_build(cfg, pch.gch, {}, 'build_pch', { pch.input }, {}, {}, {})
|
|
||||||
end
|
|
||||||
return pch_dependency
|
|
||||||
end
|
|
||||||
|
|
||||||
local function custom_command_build(prj, cfg, filecfg, filename, file_dependencies)
|
|
||||||
local outputs = project.getrelative(prj.workspace, filecfg.buildoutputs)
|
|
||||||
local output = outputs[1]
|
|
||||||
table.remove(outputs, 1)
|
|
||||||
local commands = {}
|
|
||||||
if filecfg.buildmessage then
|
|
||||||
commands = { os.translateCommandsAndPaths('{ECHO} ' .. filecfg.buildmessage, prj.workspace.basedir, prj.workspace.location) }
|
|
||||||
end
|
|
||||||
commands = table.join(commands, os.translateCommandsAndPaths(filecfg.buildcommands, prj.workspace.basedir, prj.workspace.location))
|
|
||||||
if #commands > 1 then
|
|
||||||
commands = 'sh -c ' .. ninja.quote(table.implode(commands, '', '', ';'))
|
|
||||||
else
|
|
||||||
commands = commands[1]
|
|
||||||
end
|
|
||||||
|
|
||||||
ninja.add_build(cfg, output, outputs, 'custom_command', { filename }, project.getrelative(prj.workspace, filecfg.buildinputs), file_dependencies, { 'CUSTOM_COMMAND = ' .. commands, 'CUSTOM_DESCRIPTION = custom build ' .. ninja.shesc(output) })
|
|
||||||
end
|
|
||||||
|
|
||||||
local function compile_file_build(cfg, filecfg, toolset, pch_dependency, regular_file_dependencies, objfiles, extrafiles)
|
|
||||||
local obj_file = filecfg.objname .. (toolset.objectextension or '.o')
|
|
||||||
local obj_dir = project.getrelative(cfg.workspace, cfg.objdir)
|
|
||||||
local filepath = project.getrelative(cfg.workspace, filecfg.abspath)
|
|
||||||
local has_custom_settings = fileconfig.hasFileSettings(filecfg)
|
|
||||||
local use_clangtidy = filecfg.clangtidy or (filecfg.clangtidy == nil and cfg.clangtidy)
|
|
||||||
|
|
||||||
if use_clangtidy and toolset == p.tools.msc then
|
|
||||||
premake.warnOnce('clang-tidy_msc', 'Turn off clang-tidy when using msc (flags might differ too much between the tools).')
|
|
||||||
use_clangtidy = false
|
|
||||||
end
|
|
||||||
|
|
||||||
if filecfg.buildaction == 'None' then
|
|
||||||
return
|
|
||||||
elseif filecfg.buildaction == 'Copy' then
|
|
||||||
local target = project.getrelative(cfg.workspace, path.join(cfg.targetdir, filecfg.name))
|
|
||||||
ninja.add_build(cfg, target, {}, 'copy', { filepath }, {}, {}, {})
|
|
||||||
extrafiles[#extrafiles + 1] = target
|
|
||||||
elseif shouldcompileasc(filecfg) then
|
|
||||||
local objfilename = obj_dir .. '/' .. obj_file
|
|
||||||
objfiles[#objfiles + 1] = objfilename
|
|
||||||
local vars = {}
|
|
||||||
if has_custom_settings then
|
|
||||||
vars = { 'CFLAGS = $CFLAGS ' .. getcflags(toolset, cfg, filecfg) }
|
|
||||||
end
|
|
||||||
ninja.add_build(cfg, objfilename, {}, iif(use_clangtidy, 'clangtidy_cc', 'cc'), { filepath }, pch_dependency, regular_file_dependencies, vars)
|
|
||||||
elseif shouldcompileascpp(filecfg) then
|
|
||||||
local objfilename = obj_dir .. '/' .. obj_file
|
|
||||||
objfiles[#objfiles + 1] = objfilename
|
|
||||||
local vars = {}
|
|
||||||
if has_custom_settings then
|
|
||||||
vars = { 'CXXFLAGS = $CXXFLAGS ' .. getcxxflags(toolset, cfg, filecfg) }
|
|
||||||
end
|
|
||||||
ninja.add_build(cfg, objfilename, {}, iif(use_clangtidy, 'clangtidy_cxx', 'cxx'), { filepath }, pch_dependency, regular_file_dependencies, vars)
|
|
||||||
elseif path.isresourcefile(filecfg.abspath) then
|
|
||||||
local objfilename = obj_dir .. '/' .. filecfg.basename .. '.res'
|
|
||||||
objfiles[#objfiles + 1] = objfilename
|
|
||||||
local resflags = {}
|
|
||||||
if has_custom_settings then
|
|
||||||
resflags = { 'RESFLAGS = $RESFLAGS ' .. getresflags(toolset, cfg, filecfg) }
|
|
||||||
end
|
|
||||||
local rc = toolset.gettoolname(cfg, 'rc')
|
|
||||||
if rc then
|
|
||||||
ninja.add_build(cfg, objfilename, {}, 'rc', { filepath }, {}, {}, resflags)
|
|
||||||
else
|
|
||||||
p.warnOnce(filepath, string.format('Ignored resource: "%s"', filepath))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
local function files_build(prj, cfg, toolset, pch_dependency, regular_file_dependencies, file_dependencies)
|
|
||||||
local objfiles = {}
|
|
||||||
local extrafiles = {}
|
|
||||||
tree.traverse(project.getsourcetree(prj), {
|
|
||||||
onleaf = function(node, depth)
|
|
||||||
local filecfg = fileconfig.getconfig(node, cfg)
|
|
||||||
if not filecfg or filecfg.excludefrombuild then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
local rule = p.global.getRuleForFile(node.name, prj.rules)
|
|
||||||
local filepath = project.getrelative(cfg.workspace, node.abspath)
|
|
||||||
|
|
||||||
if fileconfig.hasCustomBuildRule(filecfg) then
|
|
||||||
custom_command_build(prj, cfg, filecfg, filepath, file_dependencies)
|
|
||||||
elseif rule then
|
|
||||||
local environ = table.shallowcopy(filecfg.environ)
|
|
||||||
|
|
||||||
if rule.propertydefinition then
|
|
||||||
p.rule.prepareEnvironment(rule, environ, cfg)
|
|
||||||
p.rule.prepareEnvironment(rule, environ, filecfg)
|
|
||||||
end
|
|
||||||
local rulecfg = p.context.extent(rule, environ)
|
|
||||||
custom_command_build(prj, cfg, rulecfg, filepath, file_dependencies)
|
|
||||||
else
|
|
||||||
compile_file_build(cfg, filecfg, toolset, pch_dependency, regular_file_dependencies, objfiles, extrafiles)
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
}, false, 1)
|
|
||||||
p.outln('')
|
|
||||||
|
|
||||||
return objfiles, extrafiles
|
|
||||||
end
|
|
||||||
|
|
||||||
local function generated_files_build(cfg, generated_files, key)
|
|
||||||
local final_dependency = {}
|
|
||||||
if #generated_files > 0 then
|
|
||||||
p.outln('# generated files')
|
|
||||||
ninja.add_build(cfg, 'generated_files_' .. key, {}, 'phony', generated_files, {}, {}, {})
|
|
||||||
final_dependency = { 'generated_files_' .. key }
|
|
||||||
end
|
|
||||||
return final_dependency
|
|
||||||
end
|
|
||||||
|
|
||||||
-- generate project + config build file
|
|
||||||
function ninja.generateProjectCfg(cfg)
|
|
||||||
local oldGetDefaultSeparator = path.getDefaultSeparator
|
|
||||||
path.getDefaultSeparator = function()
|
|
||||||
return '/'
|
|
||||||
end
|
|
||||||
|
|
||||||
local prj = cfg.project
|
|
||||||
local key = get_key(cfg)
|
|
||||||
local toolset, toolset_version = p.tools.canonical(cfg.toolset)
|
|
||||||
|
|
||||||
if not toolset then
|
|
||||||
p.error('Unknown toolset ' .. cfg.toolset)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Some toolset fixes
|
|
||||||
cfg.gccprefix = cfg.gccprefix or ''
|
|
||||||
|
|
||||||
p.outln('# project build file')
|
|
||||||
p.outln('# generated with premake ninja')
|
|
||||||
p.outln('')
|
|
||||||
|
|
||||||
-- premake-ninja relies on scoped rules
|
|
||||||
-- and they were added in ninja v1.6
|
|
||||||
p.outln('ninja_required_version = 1.6')
|
|
||||||
p.outln('')
|
|
||||||
|
|
||||||
local is_c_or_cpp = cfg.language == p.C or cfg.language == p.CPP
|
|
||||||
|
|
||||||
---------------------------------------------------- figure out settings
|
|
||||||
local pch = nil
|
|
||||||
if is_c_or_cpp and toolset ~= p.tools.msc then
|
|
||||||
pch = p.tools.gcc.getpch(cfg)
|
|
||||||
if pch then
|
|
||||||
pch = {
|
|
||||||
input = pch,
|
|
||||||
placeholder = project.getrelative(cfg.workspace, path.join(cfg.objdir, path.getname(pch))),
|
|
||||||
gch = project.getrelative(cfg.workspace, path.join(cfg.objdir, path.getname(pch) .. '.gch')),
|
|
||||||
}
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
---------------------------------------------------- write rules
|
|
||||||
p.outln('# core rules for ' .. cfg.name)
|
|
||||||
prebuild_rule(cfg)
|
|
||||||
prelink_rule(cfg)
|
|
||||||
postbuild_rule(cfg)
|
|
||||||
|
|
||||||
if is_c_or_cpp then
|
|
||||||
c_cpp_compilation_rules(cfg, toolset, pch)
|
|
||||||
else
|
|
||||||
local handler = ninja.handlers[cfg.language]
|
|
||||||
if not handler then
|
|
||||||
p.error('expected registered ninja handler action for target ' .. cfg.language)
|
|
||||||
end
|
|
||||||
handler.compilation_rules(cfg, toolset)
|
|
||||||
end
|
|
||||||
|
|
||||||
copy_rule()
|
|
||||||
custom_command_rule()
|
|
||||||
|
|
||||||
---------------------------------------------------- build all files
|
|
||||||
p.outln('# build files')
|
|
||||||
|
|
||||||
local pch_dependency = is_c_or_cpp and pch_build(cfg, pch) or {}
|
|
||||||
|
|
||||||
local generated_files = collect_generated_files(prj, cfg)
|
|
||||||
|
|
||||||
local file_dependencies = getFileDependencies(cfg)
|
|
||||||
local regular_file_dependencies = table.join(iif(#generated_files > 0, { 'generated_files_' .. key }, {}), file_dependencies)
|
|
||||||
|
|
||||||
local obj_dir = project.getrelative(cfg.workspace, cfg.objdir)
|
|
||||||
local objfiles, extrafiles = files_build(prj, cfg, toolset, pch_dependency, regular_file_dependencies, file_dependencies)
|
|
||||||
local final_dependency = generated_files_build(cfg, generated_files, key)
|
|
||||||
|
|
||||||
---------------------------------------------------- build final target
|
|
||||||
if #cfg.prebuildcommands > 0 or cfg.prebuildmessage then
|
|
||||||
p.outln('# prebuild')
|
|
||||||
ninja.add_build(cfg, 'prebuild_' .. get_key(cfg), {}, 'run_prebuild', {}, {}, {}, {})
|
|
||||||
end
|
|
||||||
local prelink_dependency = {}
|
|
||||||
if #cfg.prelinkcommands > 0 or cfg.prelinkmessage then
|
|
||||||
p.outln('# prelink')
|
|
||||||
ninja.add_build(cfg, 'prelink_' .. get_key(cfg), {}, 'run_prelink', {}, objfiles, final_dependency, {})
|
|
||||||
prelink_dependency = { 'prelink_' .. get_key(cfg) }
|
|
||||||
end
|
|
||||||
if #cfg.postbuildcommands > 0 or cfg.postbuildmessage then
|
|
||||||
p.outln('# postbuild')
|
|
||||||
ninja.add_build(cfg, 'postbuild_' .. get_key(cfg), {}, 'run_postbuild', {}, { ninja.outputFilename(cfg) }, {}, {})
|
|
||||||
end
|
|
||||||
|
|
||||||
if is_c_or_cpp then
|
|
||||||
-- we don't pass getlinks(cfg) through dependencies
|
|
||||||
-- because system libraries are often not in PATH so ninja can't find them
|
|
||||||
local libs = table.translate(config.getlinks(cfg, 'siblings', 'fullpath'), function(p)
|
|
||||||
return project.getrelative(cfg.workspace, path.join(cfg.project.location, p))
|
|
||||||
end)
|
|
||||||
local cfg_output = ninja.outputFilename(cfg)
|
|
||||||
local extra_outputs = {}
|
|
||||||
local command_rule = ''
|
|
||||||
if cfg.kind == p.STATICLIB then
|
|
||||||
p.outln('# link static lib')
|
|
||||||
command_rule = 'ar'
|
|
||||||
elseif cfg.kind == p.SHAREDLIB then
|
|
||||||
p.outln('# link shared lib')
|
|
||||||
command_rule = 'link'
|
|
||||||
extra_outputs = iif(os.target() == 'windows', { path.replaceextension(cfg_output, '.lib'), path.replaceextension(cfg_output, '.exp') }, {})
|
|
||||||
elseif (cfg.kind == p.CONSOLEAPP) or (cfg.kind == p.WINDOWEDAPP) then
|
|
||||||
p.outln('# link executable')
|
|
||||||
command_rule = 'link'
|
|
||||||
else
|
|
||||||
p.error("ninja action doesn't support this kind of target " .. cfg.kind)
|
|
||||||
end
|
|
||||||
|
|
||||||
local deps = table.join(final_dependency, extrafiles, prelink_dependency)
|
|
||||||
ninja.add_build(cfg, cfg_output, extra_outputs, command_rule, table.join(objfiles, libs), {}, deps, {})
|
|
||||||
outputs = { cfg_output }
|
|
||||||
else
|
|
||||||
local handler = ninja.handlers[cfg.language]
|
|
||||||
if not handler then
|
|
||||||
p.error('expected registered ninja handler action for target ' .. cfg.language)
|
|
||||||
end
|
|
||||||
outputs = handler.target_rules(cfg, toolset)
|
|
||||||
end
|
|
||||||
|
|
||||||
p.outln('')
|
|
||||||
if #cfg.postbuildcommands > 0 or cfg.postbuildmessage then
|
|
||||||
ninja.add_build(cfg, key, {}, 'phony', { 'postbuild_' .. get_key(cfg) }, {}, {}, {})
|
|
||||||
else
|
|
||||||
ninja.add_build(cfg, key, {}, 'phony', outputs, {}, {}, {})
|
|
||||||
end
|
|
||||||
p.outln('')
|
|
||||||
|
|
||||||
path.getDefaultSeparator = oldGetDefaultSeparator
|
|
||||||
end
|
|
||||||
|
|
||||||
-- return name of output binary relative to build folder
|
|
||||||
function ninja.outputFilename(cfg)
|
|
||||||
return project.getrelative(cfg.workspace, cfg.buildtarget.directory) .. '/' .. cfg.buildtarget.name
|
|
||||||
end
|
|
||||||
|
|
||||||
-- return name of build file for configuration
|
|
||||||
function ninja.projectCfgFilename(cfg, relative)
|
|
||||||
if relative ~= nil then
|
|
||||||
relative = project.getrelative(cfg.workspace, cfg.location) .. '/'
|
|
||||||
else
|
|
||||||
relative = ''
|
|
||||||
end
|
|
||||||
return relative .. get_key(cfg, cfg.project.filename) .. '.ninja'
|
|
||||||
end
|
|
||||||
|
|
||||||
-- generate all build files for every project configuration
|
|
||||||
function ninja.generateProject(prj)
|
|
||||||
if not ninja.can_generate(prj) then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
for cfg in project.eachconfig(prj) do
|
|
||||||
p.generate(cfg, ninja.projectCfgFilename(cfg), ninja.generateProjectCfg)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
include('_preload.lua')
|
|
||||||
|
|
||||||
return ninja
|
|
||||||
|
|
@ -1 +0,0 @@
|
||||||
require "ninja/ninja"
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
. /etc/profile
|
|
||||||
export ENV="$HOME/.shrc"
|
export ENV="$HOME/.shrc"
|
||||||
export PATH="$HOME/.local/bin":"$PATH"
|
export PATH="$HOME/.local/bin":"$PATH"
|
||||||
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/:/usr/lib/pkgconfig
|
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/:/usr/lib/pkgconfig
|
||||||
|
|
@ -6,3 +5,4 @@ export XKB_DEFAULT_LAYOUT=de
|
||||||
export XBPS_DISTDIR="$HOME/void-packages"
|
export XBPS_DISTDIR="$HOME/void-packages"
|
||||||
|
|
||||||
export EDITOR=/usr/bin/vis
|
export EDITOR=/usr/bin/vis
|
||||||
|
export CHEZSCHEMELIBDIRS="/usr/local/lib/csv10.3.0/":"$CHEZSCHEMELIBDIRS"
|
||||||
|
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
source ~/.exrc
|
|
||||||
syntax on
|
|
||||||
colorscheme lunaperche
|
|
||||||
set clipboard=unnamed
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue