Port the build scripts to CMake 3.5, refactor them.

* Use the official LLVMConfig rather than our FindLLVM.
* Add target rule for Ragel.
* Remove useless dependencies by only compiling for the native target.
* Use target rules.
This commit is contained in:
Stefano Sanfilippo 2019-06-24 10:35:23 +02:00
parent 3b5a9be6b9
commit 68dee1250d
6 changed files with 73 additions and 115 deletions

View File

@ -1,31 +1,13 @@
# Copyright 2017 the Monicelli project authors. All rights reserved.
# Use of this source code is governed by a GPLv3 license, see LICENSE.txt.
cmake_minimum_required(VERSION 3.0)
project(Monicelli)
cmake_minimum_required(VERSION 3.5)
project(Monicelli CXX)
set(CMAKE_BUILD_TYPE Release)
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake")
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
find_package(Doxygen)
include(MonicelliDoc)
add_subdirectory(src)
if (DOXYGEN_FOUND)
set(DOXYGEN_CONFIG ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in
${DOXYGEN_CONFIG}
@ONLY
)
add_custom_target(doc
DEPENDS ${DOXYGEN_CONFIG}
COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_CONFIG}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
VERBATIM
)
endif()
install(FILES README.md LICENSE.txt DESTINATION doc/monicelli)

View File

@ -1,54 +0,0 @@
# Copyright 2017 the Monicelli project authors. All rights reserved.
# Use of this source code is governed by a GPLv3 license, see LICENSE.txt.
find_program(LLVM_CONFIG llvm-config)
if (LLVM_CONFIG STREQUAL "LLVM_CONFIG-NOTFOUND")
message(FATAL_ERROR "Please install the LLVM dev package to compile Monicelli.")
else()
message(STATUS "Found llvm-config: ${LLVM_CONFIG}")
endif()
execute_process(
COMMAND ${LLVM_CONFIG} --version
OUTPUT_VARIABLE LLVM_VERSION
OUTPUT_STRIP_TRAILING_WHITESPACE
)
set(TARGET_LLVM_VERSION "6.0.0")
if (NOT LLVM_VERSION STREQUAL ${TARGET_LLVM_VERSION})
message(WARNING "Expected LLVM ${TARGET_LLVM_VERSION}, found ${LLVM_VERSION}, build may fail.")
endif()
execute_process(
COMMAND ${LLVM_CONFIG} --includedir
OUTPUT_VARIABLE LLVM_INCLUDE_DIR
OUTPUT_STRIP_TRAILING_WHITESPACE
)
execute_process(
COMMAND ${LLVM_CONFIG} --libdir
OUTPUT_VARIABLE LLVM_LIBRARY_DIR
OUTPUT_STRIP_TRAILING_WHITESPACE
)
execute_process(
COMMAND ${LLVM_CONFIG} --cxxflags
OUTPUT_VARIABLE LLVM_CXXFLAGS
OUTPUT_STRIP_TRAILING_WHITESPACE
)
execute_process(
COMMAND ${LLVM_CONFIG} --libs all
OUTPUT_VARIABLE LLVM_MODULE_LIBS
OUTPUT_STRIP_TRAILING_WHITESPACE
)
execute_process(
COMMAND ${LLVM_CONFIG} --system-libs
OUTPUT_VARIABLE LLVM_SYSTEM_LIBS
OUTPUT_STRIP_TRAILING_WHITESPACE
)
set(LLVM_LIBS ${LLVM_MODULE_LIBS} ${LLVM_SYSTEM_LIBS})

View File

@ -8,3 +8,29 @@ if (${RAGEL} STREQUAL "RAGEL-NOTFOUND")
else()
message(STATUS "Found ragel: ${RAGEL}")
endif()
function(add_ragel_library name source header)
set(generated_cpp "${source}.cpp")
add_custom_command(
OUTPUT "${generated_cpp}"
MAIN_DEPENDENCY "${source}"
DEPENDS "${header}"
COMMAND ${RAGEL} -G2 "${CMAKE_CURRENT_SOURCE_DIR}/${source}" -o "${generated_cpp}"
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
VERBATIM
)
add_library(${name} "${generated_cpp}")
set_target_properties(${name}
PROPERTIES
CXX_STANDARD 11
CXX_STANDARD_REQUIRED true
)
# The lexer uses implicit fallthroughs all over, but it's OK.
target_compile_options(${name} PRIVATE -Wno-implicit-fallthrough)
target_include_directories(${name} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
endfunction()

22
cmake/MonicelliDoc.cmake Normal file
View File

@ -0,0 +1,22 @@
# Copyright 2019 the Monicelli project authors. All rights reserved.
# Use of this source code is governed by a GPLv3 license, see LICENSE.txt.
find_package(Doxygen)
if (DOXYGEN_FOUND)
set(MONICELLI_DOXYGEN_CONFIG ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
configure_file(
${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in
${MONICELLI_DOXYGEN_CONFIG}
@ONLY
)
add_custom_target(doc
DEPENDS ${MONICELLI_DOXYGEN_CONFIG}
COMMAND ${DOXYGEN_EXECUTABLE} ${MONICELLI_DOXYGEN_CONFIG}
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
VERBATIM
)
endif()

View File

@ -1,41 +1,12 @@
# Copyright 2017 the Monicelli project authors. All rights reserved.
# Use of this source code is governed by a GPLv3 license, see LICENSE.txt.
find_package(LLVM REQUIRED)
find_package(LLVM REQUIRED CONFIG)
find_package(Ragel REQUIRED)
option(ENABLE_LINKER "Enable the Monicelli linker. Requires POSIX." ON)
option(MONICELLI_ENABLE_LINKER "Enable the Monicelli linker. Requires POSIX." ON)
if (ENABLE_LINKER)
add_definitions(-DMONICELLI_ENABLE_LINKER)
endif()
add_definitions(
-std=c++11
-Wall -Wextra -Werror
# The lexer uses implicit fallthroughs all over, but it's OK.
-Wno-implicit-fallthrough
${LLVM_CXXFLAGS}
-g -O2 -UNDEBUG
)
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
${LLVM_INCLUDE_DIR}
)
link_directories(
${LLVM_LIBRARY_DIR}
)
add_custom_command(
OUTPUT lexer.rl.cpp
MAIN_DEPENDENCY lexer.rl
DEPENDS lexer.h
COMMAND ${RAGEL} -G2 "${CMAKE_CURRENT_SOURCE_DIR}/lexer.rl" -o lexer.rl.cpp
WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
VERBATIM
)
add_ragel_library(lexer lexer.rl lexer.h)
add_executable(mcc
main.cpp
@ -49,7 +20,6 @@ add_executable(mcc
parser.cpp
lexer.cpp
lexer.def
"${CMAKE_CURRENT_BINARY_DIR}/lexer.rl.cpp"
options.cpp
errors.cpp
support.cpp
@ -59,6 +29,20 @@ add_executable(mcc
operators.def
)
target_link_libraries(mcc ${LLVM_LIBS})
set_target_properties(mcc
PROPERTIES
CXX_STANDARD 11
CXX_STANDARD_REQUIRED true
)
target_compile_options(mcc PRIVATE -Wall -Wextra -Werror)
if (MONICELLI_ENABLE_LINKER)
target_compile_definitions(mcc PRIVATE MONICELLI_ENABLE_LINKER)
endif()
# TODO expand this line to support compiling on other architectures and cross-compilation.
llvm_config(mcc core support x86codegen x86asmparser)
target_link_libraries(mcc PRIVATE lexer)
install(TARGETS mcc RUNTIME DESTINATION bin)

View File

@ -24,11 +24,9 @@
namespace monicelli {
void registerTargets() {
llvm::InitializeAllTargetInfos();
llvm::InitializeAllTargets();
llvm::InitializeAllTargetMCs();
llvm::InitializeAllAsmParsers();
llvm::InitializeAllAsmPrinters();
llvm::InitializeNativeTarget();
llvm::InitializeNativeTargetAsmParser();
llvm::InitializeNativeTargetAsmPrinter();
}
llvm::TargetMachine* getTargetMachine(const std::string& triple, const std::string& cpu,