You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

254 lines
7.2 KiB

cmake_minimum_required(VERSION 3.0.0)
# ------------------------------------------------------------------------------
if(DEFINED ENV{EMSCRIPTEN})
SET(emscripten_root_path "$ENV{EMSCRIPTEN}")
else()
find_file(EMCC_EXECUTABLE emcc HINTS "/usr/lib/emscripten")
if(EXISTS ${EMCC_EXECUTABLE})
get_filename_component(emscripten_root_path ${EMCC_EXECUTABLE} DIRECTORY)
endif()
endif()
# Abort if not found.
if ("${emscripten_root_path}" STREQUAL "")
MESSAGE(FATAL_ERROR "Could not locate the Emscripten directory via the \
EMSCRIPTEN environment variable! Set it up or pass \
-Demscripten_root_path=xxx to CMake to specify the \
directory.")
endif()
SET(CMAKE_TOOLCHAIN_FILE "${emscripten_root_path}/cmake/Modules/Platform/Emscripten.cmake")
SET(project_name "libUncrustify")
PROJECT(${project_name})
set(CMAKE_INCLUDE_CURRENT_DIR ON)
#get parent folder, add src
GET_FILENAME_COMPONENT(unc_projdir ${CMAKE_CURRENT_LIST_DIR} DIRECTORY)
# ------------------------------------------------------------------------------
include(CheckCXXCompilerFlag)
include(CheckIncludeFileCXX)
include(CheckSymbolExists)
include(CheckCXXSymbolExists)
include(CheckTypeSize)
find_package(PythonInterp REQUIRED)
#
# Determine config
#
if(WIN32)
# Windows builds use src/windows_compat.h instead of config.h
else()
# Generate config.h
set(avail_headers "")
set(headers
inttypes.h
memory.h
stdint.h
stdlib.h
strings.h
string.h
sys/stat.h
sys/types.h
unistd.h
utime.h
)
foreach(header ${headers})
string(TOUPPER "${header}" header_uc)
string(REGEX REPLACE "[^A-Z0-9_]" "_" include_var "HAVE_${header_uc}")
check_include_file_cxx("${header}" ${include_var})
if(${include_var})
list(APPEND avail_headers ${header})
endif()
unset(include_var)
unset(header_uc)
endforeach()
unset(headers)
check_include_file("stdbool.h" HAVE_STDBOOL_H)
set(symbols
memset
strcasecmp
strchr
strdup
strerror
strtol
strtoul
)
foreach(symbol ${symbols})
string(TOUPPER "${symbol}" symbol_uc)
string(REGEX REPLACE "[^A-Z0-9_]" "_" symbol_var "HAVE_${symbol_uc}")
check_cxx_symbol_exists("${symbol}" "${avail_headers}" ${symbol_var})
unset(symbol_var)
unset(symbol_uc)
endforeach()
unset(symbols)
unset(avail_headers)
check_type_size(_Bool _BOOL LANGUAGE C)
configure_file("${unc_projdir}/src/config.h.in" config.h @ONLY)
endif()
#
# Generate uncrustify_version.h
#
set(CURRENT_VERSION "Uncrustify-0.69.0_f")
option(NoGitVersionString "Do not use make_version.py and git to build a version string" OFF)
if(NoGitVersionString)
configure_file("${unc_projdir}/src/uncrustify_version.h.in" "${PROJECT_BINARY_DIR}/uncrustify_version.h" @ONLY)
else()
# Add target to generate version header;
# do this every build to ensure git SHA is up to date
add_custom_target(generate_version_header
${CMAKE_COMMAND}
-D PYTHON_EXECUTABLE:STRING=${PYTHON_EXECUTABLE}
-D SOURCE_DIR:PATH="${unc_projdir}"
-D INPUT:PATH="${unc_projdir}/src/uncrustify_version.h.in"
-D OUTPUT:PATH="${PROJECT_BINARY_DIR}/uncrustify_version.h"
-D CURRENT_VERSION:STRING="CURRENT_VERSION"
-P ${unc_projdir}/cmake/GenerateVersionHeader.cmake
COMMENT "Generating version header"
)
set_source_files_properties(
"${PROJECT_BINARY_DIR}/uncrustify_version.h"
PROPERTIES GENERATED TRUE
)
endif()
#
# Generate token_names.h
#
add_custom_command(
OUTPUT "${PROJECT_BINARY_DIR}/token_names.h"
COMMAND ${CMAKE_COMMAND}
"-Dsrc_file=${unc_projdir}/src/token_enum.h"
"-Ddst_file=${PROJECT_BINARY_DIR}/token_names.h"
-P "${unc_projdir}/cmake/GenerateTokenNames.cmake"
MAIN_DEPENDENCY "${unc_projdir}/src/token_enum.h"
COMMENT "Generating token_names.h"
)
# Set up commands for generated source files
function(py_gen OUTPUT SCRIPT INPUT)
set(out "${PROJECT_BINARY_DIR}/src/${OUTPUT}")
set(deps "${unc_projdir}/src/${INPUT}")
get_filename_component(outdir "${out}" DIRECTORY)
foreach(arg IN LISTS ARGN)
list(APPEND deps "${unc_projdir}/src/${arg}")
endforeach()
add_custom_command(
OUTPUT "${out}"
COMMAND ${CMAKE_COMMAND} -E make_directory "${outdir}"
COMMAND ${PYTHON_EXECUTABLE}
"${unc_projdir}/scripts/${SCRIPT}"
"${out}"
${deps}
DEPENDS ${deps} "${unc_projdir}/scripts/${SCRIPT}"
MAIN_DEPENDENCY ${unc_projdir}/src/${INPUT}
COMMENT "Generating ${OUTPUT}"
)
endfunction()
py_gen(punctuator_table.h
make_punctuator_table.py
symbols_table.h
)
py_gen(options.cpp
make_options.py
options.h
options.cpp.in
)
py_gen(option_enum.h
make_option_enum.py
option.h
option_enum.h.in
)
py_gen(option_enum.cpp
make_option_enum.py
option.h
option_enum.cpp.in
)
# ------------------------------------------------------------------------------
FILE(GLOB unc_infiles "${unc_projdir}/src/*.cpp")
ADD_EXECUTABLE(${project_name}
${unc_infiles}
${unc_projdir}/src/token_enum.h
${unc_projdir}/src/symbols_table.h
${unc_projdir}/src/options.h
${unc_projdir}/src/option.h
${PROJECT_BINARY_DIR}/src/options.cpp
${PROJECT_BINARY_DIR}/src/option_enum.cpp
${PROJECT_BINARY_DIR}/src/option_enum.h
${PROJECT_BINARY_DIR}/uncrustify_version.h
${unc_projdir}/src/option_enum.cpp.in
${unc_projdir}/src/option_enum.h.in
${unc_projdir}/src/options.cpp.in
)
add_dependencies(${project_name} generate_version_header)
include_directories(
${PROJECT_BINARY_DIR}
${PROJECT_BINARY_DIR}/src
${unc_projdir}/src
)
SET(unc_compile_flags "--bind -O3")
SET_TARGET_PROPERTIES(${project_name}
PROPERTIES
CXX_STANDARD 11
CXX_STANDARD_REQUIRED YES
CXX_EXTENSIONS NO
COMPILE_FLAGS "${unc_compile_flags}"
LINK_FLAGS "${unc_compile_flags} \
-s TOTAL_MEMORY=67108864 \
-s ALLOW_MEMORY_GROWTH=1 \
-s VERBOSE=1 \
-s MODULARIZE=1 \
-s EXPORT_NAME=\"'${project_name}'\" \
-s ERROR_ON_UNDEFINED_SYMBOLS=1 \
-s 'EXTRA_EXPORTED_RUNTIME_METHODS=[\"UTF8ToString\",\"stringToUTF8\",\"lengthBytesUTF8\", \"writeAsciiToMemory\"]' \
-s WASM=0\
--memory-init-file 0\
--pre-js ${CMAKE_CURRENT_LIST_DIR}/prefix_module.js \
--post-js ${CMAKE_CURRENT_LIST_DIR}/postfix_module.js \
")
EM_LINK_PRE_JS(${project_name} ${CMAKE_CURRENT_LIST_DIR}/prefix_module.js)
EM_LINK_POST_JS(${project_name} ${CMAKE_CURRENT_LIST_DIR}/postfix_module.js)
# ------------------------------------------------------------------------------
# add file post/pre-fix
add_custom_command(TARGET ${project_name}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -Dunc_targetfile:FILEPATH=$<TARGET_FILE:${project_name}>
-P "${CMAKE_CURRENT_LIST_DIR}/CMake_catFiles.cmake"
)
add_custom_target(emscripten_test
COMMAND ${CMAKE_COMMAND} -Dunc_targetfile:FILEPATH=$<TARGET_FILE:${project_name}>
-Dunc_projdir:FILEPATH=${unc_projdir}
-P "${CMAKE_CURRENT_LIST_DIR}/CMake_emscripten_test.cmake"
COMMENT "Starting libUncrustify.js tests:"
)