Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Build & distribute release builds with Zig as stand-alone C compiler #659

Closed
wants to merge 16 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 22 additions & 6 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,13 @@ jobs:
strategy:
matrix:
include:
# portable release build: link most libraries statically and use channel with older glibc (2.27; LLVM 7)
- name: Linux release
os: ubuntu-latest
release: true
shell: nix-shell --arg pkgs "import (fetchTarball \"channel:nixos-19.03\") {{}}" --argstr llvmPackages latest --run "bash -euxo pipefail {0}"
zig-url: https://ziglang.org/download/0.8.1/zig-linux-x86_64-0.8.1.tar.xz
# link against older glibc for compatibility
ZIG_ARGS: -target x86_64-linux-gnu.2.15
# separate job because Zig can't build stage 2 (yet)
- name: Linux
os: ubuntu-latest
check-stage3: true
Expand All @@ -44,13 +46,17 @@ jobs:
shell: bash -euxo pipefail {0}
# Mojave, oldest maintained version as of 2021
CMAKE_OPTIONS: -DCMAKE_OSX_DEPLOYMENT_TARGET=10.14
# seems to need much more work :(
#zig-url: https://ziglang.org/download/0.8.1/zig-macos-x86_64-0.8.1.tar.xz
- name: Windows
os: windows-2022
release: true
shell: msys2 {0}
CMAKE_OPTIONS: -G "Unix Makefiles" -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++
CMAKE_OPTIONS: -G "Unix Makefiles" -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DAUTO_THREAD_FINALIZATION=OFF
# for reasons unknown, interactivetests are flaky on Windows
CTEST_OPTIONS: --repeat until-pass:2
# TODO: https://github.com/ziglang/zig/pull/9347 + https://github.com/ziglang/zig/pull/9771
zig-url: https://pp.ipd.kit.edu/~ullrich/tmp/zig-windows-x86_64-0.9.0-dev.961+aa881c483.zip
# complete all jobs
fail-fast: false
name: ${{ matrix.name }}
Expand Down Expand Up @@ -99,18 +105,24 @@ jobs:
run: |
mkdir build
cd build
OPTIONS=
OPTIONS=()
if [ -n "${{ matrix.zig-url }}" ]; then
wget -q ${{ matrix.zig-url }}
[ -e "zig-*.zip" ] && unzip zig-* || tar xf zig-*
find . -type d -name 'zig-*' -exec mv {} zig \; -prune
OPTIONS+=(-DZIG_ROOT=$PWD/zig -DZIG_ARGS='${{ matrix.ZIG_ARGS }}' -DLEANC_CC='./zig/zig cc ${{ matrix.ZIG_ARGS }}')
fi
if [[ $GITHUB_EVENT_NAME == 'schedule' && -n '${{ matrix.release }}' && -n '${{ secrets.PUSH_NIGHTLY_TOKEN }}' ]]; then
git remote add nightly https://foo:'${{ secrets.PUSH_NIGHTLY_TOKEN }}'@github.com/${{ github.repository_owner }}/lean4-nightly.git
git fetch nightly --tags
LEAN_VERSION_STRING="nightly-$(date -u +%F)"
# do nothing if commit already has a different tag
if [[ $(git name-rev --name-only --tags --no-undefined HEAD 2> /dev/null || echo $LEAN_VERSION_STRING) == $LEAN_VERSION_STRING ]]; then
OPTIONS=-DLEAN_SPECIAL_VERSION_DESC=$LEAN_VERSION_STRING
OPTIONS+=(-DLEAN_SPECIAL_VERSION_DESC=$LEAN_VERSION_STRING)
echo "LEAN_VERSION_STRING=$LEAN_VERSION_STRING" >> $GITHUB_ENV
fi
fi
cmake .. ${{ matrix.CMAKE_OPTIONS }} $OPTIONS
cmake .. ${{ matrix.CMAKE_OPTIONS }} "${OPTIONS[@]-}"
make -j4
# de-Nix-ify binaries
- name: Patch
Expand Down Expand Up @@ -146,6 +158,10 @@ jobs:
cp $(ldd bin/lean.exe | cut -f3 -d' ' | grep mingw) bin/
ldd bin/lean.exe
ls -l bin/
- name: Take Off Every Zig
run: |
cp -r build/zig/ build/stage1/bin
if: matrix.zig-url
- name: Test Binary without Nix Shell
if: matrix.name != 'Windows'
shell: bash {0}
Expand Down
31 changes: 24 additions & 7 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,18 @@ option(CHECK_OLEAN_VERSION "Only load .olean files compiled with the current ver

set(LEAN_EXTRA_MAKE_OPTS "" CACHE STRING "extra options to lean --make")
set(LEANC_CC "cc" CACHE STRING "C compiler to use in `leanc`")
set(ZIG_ROOT "" CACHE STRING "Zig compiler to use for compilation")

if (ZIG_ROOT)
# fails with "undefined symbol: _create_local" (Windows, https://github.com/ziglang/zig/issues/8531?)
# and "unknown filetype for positional input file: '.../binarytrees.lean.o'" (macOS) otherwise
set(ZIG_ARGS "${ZIG_ARGS} -fno-lto")
configure_file(zigcc.in zigcc.sh)
set(CMAKE_C_COMPILER ${CMAKE_BINARY_DIR}/zigcc.sh)
configure_file(zigc++.in zigc++.sh)
set(CMAKE_CXX_COMPILER ${CMAKE_BINARY_DIR}/zigc++.sh)
set(CMAKE_CXX_COMPILER_ID Clang)
endif()

if ("${FAKE_FREE}" MATCHES "ON")
set(LEAN_EXTRA_CXX_FLAGS "${LEAN_EXTRA_CXX_FLAGS} -D LEAN_FAKE_FREE")
Expand Down Expand Up @@ -245,6 +257,9 @@ if("${CMAKE_SYSTEM_NAME}" MATCHES "Emscripten")
else()
# GMP
find_package(GMP 5.0.5 REQUIRED)
# without this, cmake removes the include below inside a Nix shell because it is in CMAKE_INCLUDE_PATH,
# but without it Zig won't find GMP because it doesn't use NIX_CFLAGS_COMPILE
unset(CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES)
include_directories(${GMP_INCLUDE_DIR})
# dlopen
set(EXTRA_LIBS ${EXTRA_LIBS} ${CMAKE_DL_LIBS})
Expand All @@ -264,8 +279,6 @@ endif()
# Python
find_package(PythonInterp)

include_directories(${CMAKE_BINARY_DIR}/include)

# libleancpp/Lean as well as libleanrt/Init/Std are cyclically dependent. This works by default on macOS, which also doesn't like
# the linker flags necessary on other platforms.
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
Expand All @@ -276,7 +289,7 @@ else()
set(LEANC_STATIC_LINKER_FLAGS "-Wl,--start-group -lleancpp -lLean -Wl,--end-group -Wl,--start-group -lInit -lStd -lleanrt -Wl,--end-group")
endif()

if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin" OR ZIG_ROOT)
set(LEANC_STATIC_LINKER_FLAGS "${LEANC_STATIC_LINKER_FLAGS} -lc++")
set(LEANSHARED_LINKER_FLAGS "${LEANSHARED_LINKER_FLAGS} -lc++")
else()
Expand Down Expand Up @@ -430,13 +443,17 @@ string(TOUPPER "${CMAKE_BUILD_TYPE}" uppercase_CMAKE_BUILD_TYPE)
# These are used in lean.mk and passed through by stdlib.make
set(LEANC_OPTS "${LEANC_OPTS} ${CMAKE_CXX_FLAGS_${uppercase_CMAKE_BUILD_TYPE}} ${CMAKE_CXX_SYSROOT_FLAG}${CMAKE_OSX_SYSROOT} ${CMAKE_CXX_OSX_DEPLOYMENT_TARGET_FLAG}${CMAKE_OSX_DEPLOYMENT_TARGET}")

if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
if(ZIG_ROOT)
# workaround for `--whole-archive` missing from `zig ld`
set(LEANSHARED_LINKER_FLAGS "`find . -name 'Leanpkg*' -prune -o -name 'runtmp*' -prune -o -name shell -prune -o -name '*.o' -print -o -name '*.obj' -print` ${CMAKE_BINARY_DIR}/lib/lean/libleancpp.a ${CMAKE_BINARY_DIR}/runtime/libleanrt_initial-exec.a ${LEANSHARED_LINKER_FLAGS}")
elseif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
set(LEANSHARED_LINKER_FLAGS "-Wl,-force_load,${CMAKE_BINARY_DIR}/lib/lean/libInit.a -Wl,-force_load,${CMAKE_BINARY_DIR}/lib/lean/libStd.a -Wl,-force_load,${CMAKE_BINARY_DIR}/lib/lean/libLean.a -Wl,-force_load,${CMAKE_BINARY_DIR}/lib/lean/libleancpp.a ${CMAKE_BINARY_DIR}/runtime/libleanrt_initial-exec.a ${LEANSHARED_LINKER_FLAGS}")
else()
set(LEANSHARED_LINKER_FLAGS "-Wl,--whole-archive -lInit -lStd -lLean -lleancpp -Wl,--no-whole-archive ${CMAKE_BINARY_DIR}/runtime/libleanrt_initial-exec.a ${LEANSHARED_LINKER_FLAGS}")
if(${CMAKE_SYSTEM_NAME} MATCHES "Windows")
set(LEANSHARED_LINKER_FLAGS "${LEANSHARED_LINKER_FLAGS} -Wl,--out-implib,${CMAKE_BINARY_DIR}/lib/lean/libleanshared.dll.a")
endif()
endif()

if(${CMAKE_SYSTEM_NAME} MATCHES "Windows")
set(LEANSHARED_LINKER_FLAGS "${LEANSHARED_LINKER_FLAGS} -Wl,--out-implib,${CMAKE_BINARY_DIR}/lib/lean/libleanshared.dll.a")
endif()

# Escape for `make`. Yes, twice.
Expand Down
9 changes: 5 additions & 4 deletions src/Leanc.lean
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,10 @@ Beware of the licensing consequences since GMP is LGPL."
let mut cc := (← IO.getEnv "LEAN_CC").getD "@LEANC_CC@"
if cc.startsWith "." then
cc := (binDir / cc).toString

let args := cflags ++ args ++ ldflagsExt ++ ldflags ++ ["-Wno-unused-command-line-argument"]
-- support `LEANC_CC='ccache cc'`
let cc' :: ccArgs ← cc.trim.splitOn | throw <| IO.userError "LEAN_CC is empty"
let args := ccArgs ++ cflags ++ args ++ ldflagsExt ++ ldflags ++ ["-Wno-unused-command-line-argument"]
if args.contains "-v" then
IO.eprintln s!"{cc} {" ".intercalate args}"
let child ← IO.Process.spawn { cmd := cc, args := args.toArray }
IO.eprintln s!"{cc'} {" ".intercalate args}"
let child ← IO.Process.spawn { cmd := cc', args := args.toArray }
child.wait
4 changes: 2 additions & 2 deletions src/bin/leanc.in
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/usr/bin/env bash
# used only for building Lean itself
root=$(dirname $0)
ldflags=("-L$root/lib/lean" "${LEANC_GMP:--lgmp}" @LEAN_EXTRA_LINKER_FLAGS@)
root="$(cd $(dirname $0); pwd)" # ensure absolute path for Zig/Windows
ldflags=("-L$root/lib" "-L$root/lib/lean" "${LEANC_GMP:--lgmp}" @LEAN_EXTRA_LINKER_FLAGS@)
for arg in "$@"; do
# ccache doesn't like linker flags being passed here
[[ "$arg" = "-c" ]] && ldflags=()
Expand Down
1 change: 1 addition & 0 deletions src/runtime/io.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ Authors: Leonardo de Moura, Sebastian Ullrich
#if defined(LEAN_WINDOWS)
#include <windows.h>
#include <io.h>
#define NOMINMAX // prevent ntdef.h from defining min/max macros
#include <ntdef.h>
#include <bcrypt.h>
#elif defined(__APPLE__)
Expand Down
6 changes: 3 additions & 3 deletions src/runtime/thread.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ Author: Leonardo de Moura
#include <iostream>
#ifdef LEAN_WINDOWS
#include <windows.h>
#include <process.h>
#else
#include <pthread.h>
#endif
Expand Down Expand Up @@ -81,15 +82,14 @@ struct lthread::imp {
std::function<void(void)> m_proc;
HANDLE m_thread;

static DWORD WINAPI _main(void * p) {
static unsigned WINAPI _main(void * p) {
thread_main(p);
return 0;
}

imp(runnable const & p) {
runnable * f = new std::function<void()>(mk_thread_proc(p, get_max_heartbeat()));
m_thread = CreateThread(nullptr, m_thread_stack_size,
_main, f, 0, nullptr);
m_thread = (HANDLE)_beginthreadex(nullptr, m_thread_stack_size, &_main, f, 0, nullptr);
if (m_thread == NULL) {
throw exception("failed to create thread");
}
Expand Down
38 changes: 20 additions & 18 deletions src/shell/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,16 @@ add_test(lean_ghash2 "${CMAKE_BINARY_DIR}/bin/lean" --githash)
add_test(lean_unknown_option bash "${LEAN_SOURCE_DIR}/cmake/check_failure.sh" "${CMAKE_BINARY_DIR}/bin/lean" "-z")
add_test(lean_unknown_file1 bash "${LEAN_SOURCE_DIR}/cmake/check_failure.sh" "${CMAKE_BINARY_DIR}/bin/lean" "boofoo.lean")

set(TEST_VARS "PATH=${LEAN_BIN}:$PATH LEAN_CC='${CMAKE_C_COMPILER_LAUNCHER} ${CMAKE_C_COMPILER}' LEANC_GMP=${GMP_LIBRARIES}")

# LEAN TESTS
file(GLOB LEANTESTS "${LEAN_SOURCE_DIR}/../tests/lean/*.lean")
FOREACH(T ${LEANTESTS})
if(NOT T MATCHES "\\.#")
GET_FILENAME_COMPONENT(T_NAME ${T} NAME)
add_test(NAME "leantest_${T_NAME}"
WORKING_DIRECTORY "${LEAN_SOURCE_DIR}/../tests/lean"
COMMAND bash -c "PATH=${LEAN_BIN}:$PATH ./test_single.sh ${T_NAME}")
COMMAND bash -c "${TEST_VARS} ./test_single.sh ${T_NAME}")
endif()
ENDFOREACH(T)

Expand All @@ -64,7 +66,7 @@ FOREACH(T ${LEANRUNTESTS})
GET_FILENAME_COMPONENT(T_NAME ${T} NAME)
add_test(NAME "leanruntest_${T_NAME}"
WORKING_DIRECTORY "${LEAN_SOURCE_DIR}/../tests/lean/run"
COMMAND bash -c "PATH=${LEAN_BIN}:$PATH ./test_single.sh ${T_NAME}")
COMMAND bash -c "${TEST_VARS} ./test_single.sh ${T_NAME}")
endif()
ENDFOREACH(T)

Expand All @@ -74,15 +76,15 @@ FOREACH(T ${LEANCOMPTESTS})
GET_FILENAME_COMPONENT(T_NAME ${T} NAME)
add_test(NAME "leancomptest_${T_NAME}"
WORKING_DIRECTORY "${LEAN_SOURCE_DIR}/../tests/compiler"
COMMAND bash -c "PATH=${LEAN_BIN}:$PATH ./test_single.sh ${T_NAME}")
COMMAND bash -c "${TEST_VARS} ./test_single.sh ${T_NAME}")
ENDFOREACH(T)

add_test(NAME leancomptest_foreign
WORKING_DIRECTORY "${LEAN_SOURCE_DIR}/../tests/compiler/foreign"
COMMAND bash -c "${LEAN_BIN}/leanmake --always-make && ./build/bin/test")
COMMAND bash -c "${TEST_VARS} leanmake --always-make CPP=${CMAKE_CXX_COMPILER} && ./build/bin/test")
add_test(NAME leancomptest_doc_example
WORKING_DIRECTORY "${LEAN_SOURCE_DIR}/../doc/examples/compiler"
COMMAND bash -c "${LEAN_BIN}/leanmake --always-make bin && ./build/bin/test hello world")
COMMAND bash -c "${TEST_VARS} leanmake --always-make bin && ./build/bin/test hello world")

# LEAN INTERPRETER TESTS
file(GLOB LEANINTERPTESTS "${LEAN_SOURCE_DIR}/../tests/compiler/*.lean")
Expand All @@ -91,7 +93,7 @@ FOREACH(T ${LEANINTERPTESTS})
GET_FILENAME_COMPONENT(T_NAME ${T} NAME)
add_test(NAME "leaninterptest_${T_NAME}"
WORKING_DIRECTORY "${LEAN_SOURCE_DIR}/../tests/compiler"
COMMAND bash -c "PATH=${LEAN_BIN}:$PATH ./test_single_interpret.sh ${T_NAME}")
COMMAND bash -c "${TEST_VARS} ./test_single_interpret.sh ${T_NAME}")
endif()
ENDFOREACH(T)

Expand All @@ -103,15 +105,15 @@ FOREACH(T_OUT ${LEANBENCHTESTS})
GET_FILENAME_COMPONENT(T_NAME ${T} NAME)
add_test(NAME "leanbenchtest_${T_NAME}"
WORKING_DIRECTORY "${LEAN_SOURCE_DIR}/../tests/bench"
COMMAND bash -c "PATH=${LEAN_BIN}:$PATH ./test_single.sh ${T_NAME}")
COMMAND bash -c "${TEST_VARS} ./test_single.sh ${T_NAME}")
ENDFOREACH(T_OUT)

file(GLOB LEANINTERPTESTS "${LEAN_SOURCE_DIR}/../tests/plugin/*.lean")
FOREACH(T ${LEANINTERPTESTS})
GET_FILENAME_COMPONENT(T_NAME ${T} NAME)
add_test(NAME "leanplugintest_${T_NAME}"
WORKING_DIRECTORY "${LEAN_SOURCE_DIR}/../tests/plugin"
COMMAND bash -c "PATH=${LEAN_BIN}:$PATH ./test_single.sh ${T_NAME}")
COMMAND bash -c "${TEST_VARS} ./test_single.sh ${T_NAME}")
ENDFOREACH(T)

# LEAN TESTS using --trust=0
Expand All @@ -120,7 +122,7 @@ FOREACH(T ${LEANT0TESTS})
GET_FILENAME_COMPONENT(T_NAME ${T} NAME)
add_test(NAME "leant0test_${T_NAME}"
WORKING_DIRECTORY "${LEAN_SOURCE_DIR}/../tests/lean/trust0"
COMMAND bash -c "PATH=${LEAN_BIN}:$PATH ./test_single.sh ${T_NAME}")
COMMAND bash -c "${TEST_VARS} ./test_single.sh ${T_NAME}")
ENDFOREACH(T)

# LEAN SERVER TESTS
Expand All @@ -130,7 +132,7 @@ FOREACH(T ${LEANTESTS})
GET_FILENAME_COMPONENT(T_NAME ${T} NAME)
add_test(NAME "leanservertest_${T_NAME}"
WORKING_DIRECTORY "${LEAN_SOURCE_DIR}/../tests/lean/server"
COMMAND bash -c "PATH=${LEAN_BIN}:$PATH ./test_single.sh ${T_NAME}")
COMMAND bash -c "${TEST_VARS} ./test_single.sh ${T_NAME}")
endif()
ENDFOREACH(T)

Expand All @@ -141,15 +143,15 @@ FOREACH(T ${LEANTESTS})
GET_FILENAME_COMPONENT(T_NAME ${T} NAME)
add_test(NAME "leaninteractivetest_${T_NAME}"
WORKING_DIRECTORY "${LEAN_SOURCE_DIR}/../tests/lean/interactive"
COMMAND bash -c "PATH=${LEAN_BIN}:$PATH ./test_single.sh ${T_NAME}")
COMMAND bash -c "${TEST_VARS} ./test_single.sh ${T_NAME}")
endif()
ENDFOREACH(T)

add_test(NAME leanpkgtest
WORKING_DIRECTORY "${LEAN_SOURCE_DIR}/../tests/leanpkg/b"
COMMAND bash -c "
set -eu
export PATH=${LEAN_BIN}:$PATH
export ${TEST_VARS}
leanpkg build
# linking requires some manual steps
(cd ../a; leanpkg build lib)
Expand All @@ -160,45 +162,45 @@ add_test(NAME leanpkgtest_cyclic
WORKING_DIRECTORY "${LEAN_SOURCE_DIR}/../tests/leanpkg/cyclic"
COMMAND bash -c "
set -eu
export PATH=${LEAN_BIN}:$PATH
export ${TEST_VARS}
leanpkg build 2>&1 | grep 'import cycle'")

add_test(NAME leanpkgtest_user_ext
WORKING_DIRECTORY "${LEAN_SOURCE_DIR}/../tests/leanpkg/user_ext"
COMMAND bash -c "
set -eu
export PATH=${LEAN_BIN}:$PATH
export ${TEST_VARS}
find . -name '*.olean' -delete
leanmake | grep 'world, hello, test'")

add_test(NAME leanpkgtest_user_attr
WORKING_DIRECTORY "${LEAN_SOURCE_DIR}/../tests/leanpkg/user_attr"
COMMAND bash -c "
set -eu
export PATH=${LEAN_BIN}:$PATH
export ${TEST_VARS}
find . -name '*.olean' -delete
leanmake")

add_test(NAME leanpkgtest_user_opt
WORKING_DIRECTORY "${LEAN_SOURCE_DIR}/../tests/leanpkg/user_opt"
COMMAND bash -c "
set -eu
export PATH=${LEAN_BIN}:$PATH
export ${TEST_VARS}
find . -name '*.olean' -delete
leanmake")

add_test(NAME leanpkgtest_prv
WORKING_DIRECTORY "${LEAN_SOURCE_DIR}/../tests/leanpkg/prv"
COMMAND bash -c "
set -eu
export PATH=${LEAN_BIN}:$PATH
export ${TEST_VARS}
find . -name '*.olean' -delete
leanmake 2>&1 | grep 'error: field.*private'")

add_test(NAME leanpkgtest_user_attr_app
WORKING_DIRECTORY "${LEAN_SOURCE_DIR}/../tests/leanpkg/user_attr_app"
COMMAND bash -c "
set -eu
export PATH=${LEAN_BIN}:$PATH
export ${TEST_VARS}
find . -name '*.olean' -delete
leanmake bin LINK_OPTS='${LEAN_DYN_EXE_LINKER_FLAGS}' && build/bin/UserAttr")
3 changes: 2 additions & 1 deletion src/stdlib.make.in
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,8 @@ Lean: Init Std
# we specify the precise file names here to avoid rebuilds
${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libleanshared${CMAKE_SHARED_LIBRARY_SUFFIX}: ${LIB}/lean/libInit.a ${LIB}/lean/libStd.a ${LIB}/lean/libLean.a ${LIB}/lean/libleancpp.a ${CMAKE_BINARY_DIR}/runtime/libleanrt_initial-exec.a
@echo "[ ] Building $@"
"${CMAKE_BINARY_DIR}/leanc.sh" -shared -o $@ ${LEANSHARED_LINKER_FLAGS} ${LEANC_OPTS}
# cd into directory to make cmdline fit on Windows, do not use ccache because it is confused here on Windows (and irrelevant anyway)
cd ${CMAKE_BINARY_DIR}; LEAN_CC=${CMAKE_C_COMPILER} ./leanc.sh -shared -o $@ ${LEANSHARED_LINKER_FLAGS} ${LEANC_OPTS}

leanshared: ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libleanshared${CMAKE_SHARED_LIBRARY_SUFFIX}

Expand Down
2 changes: 2 additions & 0 deletions src/zigc++.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/usr/bin/env sh
${ZIG_ROOT}/zig c++ ${ZIG_ARGS} "$@"
2 changes: 2 additions & 0 deletions src/zigcc.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/usr/bin/env sh
${ZIG_ROOT}/zig cc ${ZIG_ARGS} "$@"
5 changes: 3 additions & 2 deletions tests/compiler/foreign/Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
PKG = main
CPP = c++
CPPFLAGS = -O3
include lean.mk

Expand All @@ -9,7 +10,7 @@ all: $(BIN_OUT)/test

$(OUT)/testcpp/%.o: %.cpp
@mkdir -p "$(@D)"
c++ -std=c++14 -c -o $@ $< $(CPPFLAGS) `leanc --print-cflags`
$(CPP) -std=c++14 -c -o $@ $< $(CPPFLAGS) `leanc --print-cflags`

$(BIN_OUT)/test: $(LIB_OUT)/libmain.a $(CPP_OBJS) | $(BIN_OUT)
c++ -o $@ $^ `leanc --print-ldflags`
$(CPP) -o $@ $^ `leanc --print-ldflags`