diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7a7635eaf2..29b93feed6 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -689,7 +689,7 @@ add_custom_target(make_stdlib ALL # The actual rule is in a separate makefile because we want to prefix it with '+' to use the Make job server # for a parallelized nested build, but CMake doesn't let us do that. # We use `lean` from the previous stage, but `leanc`, headers, etc. from the current stage - COMMAND $(MAKE) -f ${CMAKE_BINARY_DIR}/stdlib.make Init Std Lean + COMMAND $(MAKE) -f ${CMAKE_BINARY_DIR}/stdlib.make Init Std Lean Leanc VERBATIM) # if we have LLVM enabled, then build `lean.h.bc` which has the LLVM bitcode @@ -768,7 +768,7 @@ if(${STAGE} GREATER 0 AND EXISTS ${LEAN_SOURCE_DIR}/Leanc.lean AND NOT ${CMAKE_S add_custom_target(leanc ALL WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/leanc DEPENDS leanshared - COMMAND $(MAKE) -f ${CMAKE_BINARY_DIR}/stdlib.make Leanc + COMMAND $(MAKE) -f ${CMAKE_BINARY_DIR}/stdlib.make leanc VERBATIM) endif() @@ -823,7 +823,6 @@ endif() # Escape for `make`. Yes, twice. string(REPLACE "$" "\\\$$" CMAKE_EXE_LINKER_FLAGS_MAKE "${CMAKE_EXE_LINKER_FLAGS}") -string(REPLACE "$" "$$" CMAKE_EXE_LINKER_FLAGS_MAKE_MAKE "${CMAKE_EXE_LINKER_FLAGS_MAKE}") configure_file(${LEAN_SOURCE_DIR}/stdlib.make.in ${CMAKE_BINARY_DIR}/stdlib.make) # hacky diff --git a/src/lakefile.toml.in b/src/lakefile.toml.in index 29205134eb..640b5ccbee 100644 --- a/src/lakefile.toml.in +++ b/src/lakefile.toml.in @@ -8,7 +8,7 @@ name = "lean4" bootstrap = true -defaultTargets = ["Init", "Std", "Lean", "Lake", "LakeMain"] +defaultTargets = ["Init", "Std", "Lean", "Lake", "LakeMain", "Leanc"] # The root of all the compiler output directories buildDir = "${CMAKE_BINARY_DIR}" @@ -65,3 +65,9 @@ name = "LakeMain" srcDir = "lake" libName = "${LAKE_LIB_PREFIX}LakeMain" defaultFacets = ["static.export"] + +[[lean_lib]] +name = "Leanc" +srcDir = "${CMAKE_BINARY_DIR}/leanc" +libName = "${LAKE_LIB_PREFIX}Leanc" +defaultFacets = ["static"] diff --git a/src/stdlib.make.in b/src/stdlib.make.in index f3a5086e3b..c015fdf97b 100644 --- a/src/stdlib.make.in +++ b/src/stdlib.make.in @@ -41,9 +41,9 @@ ifeq "${USE_LAKE} ${STAGE}" "ON 1" # build in parallel Init: - ${PREV_STAGE}/bin/lake build Init Std Lean Lake LakeMain $(LAKE_EXTRA_ARGS) + ${PREV_STAGE}/bin/lake build $(LAKE_EXTRA_ARGS) -Std Lean Lake: Init +Std Lean Lake Leanc: Init else @@ -60,6 +60,11 @@ Std: Init Lean: Std +"${LEAN_BIN}/leanmake" lib lib.export PKG=Lean $(LEANMAKE_OPTS) +Leanc: Lean +ifneq "${STAGE}" "0" + +"${LEAN_BIN}/leanmake" -C "${CMAKE_BINARY_DIR}/leanc" lib PKG=Leanc $(LEANMAKE_OPTS) OUT="${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" LIB_OUT="${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" +endif + Lake: # lake is in its own subdirectory, so must adjust relative paths... +"${LEAN_BIN}/leanmake" -C lake lib lib.export ../${LIB}/temp/LakeMain.o.export PKG=Lake $(LEANMAKE_OPTS) OUT="../${LIB}" LIB_OUT="../${LIB}/lean" TEMP_OUT="../${LIB}/temp" OLEAN_OUT="../${LIB}/lean" EXTRA_SRC_ROOTS=LakeMain.lean @@ -146,5 +151,10 @@ ${CMAKE_BINARY_DIR}/bin/lean${CMAKE_EXECUTABLE_SUFFIX}: ${CMAKE_LIBRARY_OUTPUT_D lean: ${CMAKE_BINARY_DIR}/bin/lean${CMAKE_EXECUTABLE_SUFFIX} -Leanc: - +"${LEAN_BIN}/leanmake" bin PKG=Leanc BIN_NAME=leanc${CMAKE_EXECUTABLE_SUFFIX} $(LEANMAKE_OPTS) LINK_OPTS='${CMAKE_EXE_LINKER_FLAGS_MAKE_MAKE}' OUT="${CMAKE_BINARY_DIR}" OLEAN_OUT="${CMAKE_BINARY_DIR}" LEAN_PATH="${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" +${CMAKE_BINARY_DIR}/bin/leanc${CMAKE_EXECUTABLE_SUFFIX}: ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/libLeanc.a + @echo "[ ] Building $@" +# on Windows, must remove file before writing a new one (since the old one may be in use) + @rm -f $@ + "${CMAKE_BINARY_DIR}/leanc.sh" $< ${CMAKE_EXE_LINKER_FLAGS_MAKE} ${LEAN_EXE_LINKER_FLAGS} ${LEANC_OPTS} -o $@ + +leanc: ${CMAKE_BINARY_DIR}/bin/leanc${CMAKE_EXECUTABLE_SUFFIX}