Skip to content

Commit 446beeb

Browse files
thughesry
authored andcommitted
Add cmake build support.
Squashed commit of ca128f7dcd28cbcfba154c8577ed54d4aa71dd02 with contributions from Mark Constable (markc@renta.net) and Daniel Gröber (darklord@darkboxed.org).
1 parent b52b419 commit 446beeb

21 files changed

+776
-1
lines changed

CMakeLists.txt

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
cmake_minimum_required(VERSION 2.6)
2+
project(node)
3+
4+
#
5+
# options
6+
#
7+
8+
option(SHARED_V8 "use system shared V8 library")
9+
option(SHARED_LIBEV "use system shared libev library")
10+
option(SHARED_CARES "use system shared c-ares library")
11+
option(V8_SNAPSHOT "turn on snapshot when building stock v8")
12+
13+
14+
# cmake policies to get rid of some warnings
15+
cmake_policy(SET CMP0009 NEW)
16+
17+
# generic cmake configuration
18+
include("cmake/configure.cmake")
19+
20+
# find and configure libs
21+
include("cmake/libs.cmake")
22+
23+
# setup node build targets
24+
include("cmake/node_build.cmake")
25+
26+
# setup v8 build targets
27+
include("cmake/v8_build.cmake")
28+
29+
# docs
30+
include("cmake/docs.cmake")
31+
32+
# tests
33+
include("cmake/tests.cmake")
34+
35+
# package
36+
include("cmake/package.cmake")
37+
38+
39+
#
40+
# Final build configuration output
41+
#
42+
43+
message("** Build Summary **")
44+
message(" Version: ${node_version_string}")
45+
message(" Prefix: ${PREFIX}")
46+
message(" Build Type: ${CMAKE_BUILD_TYPE}")
47+
message(" Architecture: ${CMAKE_SYSTEM_PROCESSOR}")
48+
49+
if(SHARED_V8)
50+
message(" V8: ${V8_LIBRARY_PATH}")
51+
#else()
52+
#message(" V8 jobs: ${parallel_jobs}")
53+
endif()
54+
55+
if(SHARED_libev)
56+
message(" libev: ${LIBEV_LIBRARY}")
57+
endif()
58+
59+
if(SHARED_CARES)
60+
message(" libc-ares: ${LIBCARES_LIBRARY}")
61+
endif()
62+
63+
message(" RT library: ${RT}")
64+
message(" DL library: ${DL}")
65+
66+
if(${OPENSSL_FOUND} MATCHES TRUE)
67+
message(" OpenSSL: Found!")
68+
endif()
69+
70+
# message(" CCFLAGS: ${CCFLAGS}")
71+
# message(" CPPFLAGS: ${CPPFLAGS}")

cmake/CTestCustom.cmake

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
set(CTEST_CUSTOM_PRE_TEST "sh -c \"rm -rf ../test/tmp && mkdir ../test/tmp\"")
2+
set(CTEST_CUSTOM_POST_TEST ${CTEST_CUSTOM_PRE_TEST})

cmake/configure.cmake

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
#
2+
# configure node for building
3+
#
4+
include(CheckFunctionExists)
5+
6+
7+
if(NOT "v${CMAKE_BUILD_TYPE}" MATCHES vDebug)
8+
set(CMAKE_BUILD_TYPE "Release")
9+
endif()
10+
11+
string(TOLOWER ${CMAKE_SYSTEM_NAME} node_platform)
12+
13+
# Get system architecture
14+
if(${CMAKE_SYSTEM_PROCESSOR} MATCHES i686*)
15+
set(node_arch x86)
16+
elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES i386*)
17+
set(node_arch x86)
18+
else()
19+
set(node_arch ${CMAKE_SYSTEM_PROCESSOR})
20+
endif()
21+
22+
if(${node_arch} MATCHES unknown)
23+
set(node_arch x86)
24+
endif()
25+
26+
27+
# Copy tools directory for out-of-source build
28+
string(COMPARE EQUAL $(PROJECT_BINARY_DIR) ${PROJECT_SOURCE_DIR} in_source_build)
29+
if(NOT ${in_source_build})
30+
execute_process(COMMAND cmake -E copy_directory ${PROJECT_SOURCE_DIR}/tools ${PROJECT_BINARY_DIR}/tools)
31+
endif()
32+
33+
# Set some compiler/linker flags..
34+
set(CMAKE_C_FLAGS_DEBUG "-O0 -Wall -g -Wextra -DDEBUG $ENV{CFLAGS}")
35+
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -Wall -g -Wextra -DDEBUG $ENV{CXXFLAGS}")
36+
37+
set(CMAKE_C_FLAGS_RELEASE "-g -O3 -DNDEBUG $ENV{CFLAGS}")
38+
set(CMAKE_CXX_FLAGS_RELEASE "-g -O3 -DNDEBUG $ENV{CXXFLAGS}")
39+
40+
if(${node_platform} MATCHES sunos)
41+
# shouldn't this be added to CMAE_C_FLAGS or something?
42+
add_definitions(-threads)
43+
elseif(NOT ${node_platform} MATCHES cygwin*)
44+
# shouldn't this be added to CMAE_C_FLAGS or something?
45+
add_definitions(-pthread)
46+
set(CMAKE_C_FLAGS -rdynamic)
47+
set(CMAKE_EXE_LINKER_FLAGS -pthread)
48+
endif()
49+
50+
if(${node_platform} MATCHES darwin)
51+
set(CMAKE_EXE_LINKER_FLAGS "-framework Carbon")
52+
endif()
53+
54+
check_function_exists(fdatasync HAVE_FDATASYNC)
55+
if(HAVE_FDATASYNC)
56+
add_definitions(-DHAVE_FDATASYNC=1)
57+
else()
58+
add_definitions(-DHAVE_FDATASYNC=0)
59+
endif()
60+
61+
add_definitions(
62+
-DPLATFORM=${node_platform}
63+
-DX_STACKSIZE=65536
64+
-D_LARGEFILE_SOURCE
65+
-D_FILE_OFFSET_BITS=64
66+
-DEV_MULTIPLICITY=0
67+
)
68+
69+
# set the exec output path to be compatible with the current waf build system
70+
if(${CMAKE_BUILD_TYPE} MATCHES Debug)
71+
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/debug/)
72+
else()
73+
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/default/)
74+
endif()
75+
76+
#
77+
## ---------------------------------------------------------
78+
#
79+
80+
file(GLOB js2c_files ${PROJECT_SOURCE_DIR}/lib/*.js)
81+
set(js2c_files ${PROJECT_SOURCE_DIR}/src/node.js ${js2c_files})
82+
file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/src)
83+
84+
set(PREFIX ${CMAKE_INSTALL_PREFIX})
85+
if(${CMAKE_BUILD_TYPE} MATCHES Debug)
86+
set(CCFLAGS "${CMAKE_C_FLAGS_DEBUG} ${CMAKE_C_FLAGS}")
87+
else()
88+
set(CCFLAGS "${CMAKE_C_FLAGS_RELEASE} ${CMAKE_C_FLAGS}")
89+
endif()
90+
get_directory_property(compile_defs COMPILE_DEFINITIONS)
91+
foreach(def ${compile_defs})
92+
set(CPPFLAGS "${CPPFLAGS} -D${def}")
93+
endforeach()

cmake/docs.cmake

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
#
2+
# docs
3+
#
4+
5+
file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/doc)
6+
7+
set(node_binary ${PROJECT_BINARY_DIR}/default/node)
8+
set(doctool tools/doctool/doctool.js)
9+
set(changelog_html ${PROJECT_BINARY_DIR}/doc/changelog.html)
10+
11+
file(GLOB_RECURSE doc_sources RELATIVE ${PROJECT_SOURCE_DIR} doc/*)
12+
13+
foreach(FILE ${doc_sources})
14+
string(REGEX REPLACE "(.*)api_assets(.*)" "\\1api/assets\\2" OUT_FILE ${FILE})
15+
add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/${OUT_FILE}
16+
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PROJECT_SOURCE_DIR}/${FILE} ${PROJECT_BINARY_DIR}/${OUT_FILE}
17+
DEPENDS ${PROJECT_SOURCE_DIR}/${FILE}
18+
)
19+
list(APPEND doc_sources_copy ${PROJECT_BINARY_DIR}/${OUT_FILE})
20+
endforeach()
21+
22+
file(GLOB_RECURSE api_markdown RELATIVE ${PROJECT_SOURCE_DIR} ${PROJECT_SOURCE_DIR}/doc/api/*)
23+
24+
foreach(file ${api_markdown})
25+
string(REGEX REPLACE "(.*)\\.markdown" "\\1" tmp ${file})
26+
set(api_basenames ${api_basenames} ${tmp})
27+
endforeach()
28+
29+
foreach(api ${api_basenames})
30+
set(api_html ${api_html} ${PROJECT_BINARY_DIR}/${api}.html)
31+
add_custom_command(
32+
OUTPUT "${PROJECT_BINARY_DIR}/${api}.html"
33+
COMMAND ${node_binary} ${doctool} ${PROJECT_BINARY_DIR}/doc/template.html "${PROJECT_BINARY_DIR}/${api}.markdown" > "${PROJECT_BINARY_DIR}/${api}.html"
34+
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
35+
DEPENDS node ${doctool} ${doc_sources_copy}
36+
VERBATIM
37+
)
38+
endforeach()
39+
40+
add_custom_target(
41+
doc
42+
DEPENDS node ${doc_sources_copy} ${api_html} ${changelog_html}
43+
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
44+
)
45+
46+
#add_custom_command(
47+
# OUTPUT ${PROJECT_BINARY_DIR}/doc/api.html
48+
# COMMAND ${PROJECT_BINARY_DIR}/default/node tools/ronnjs/bin/ronn.js --fragment doc/api.markdown
49+
# | sed "s/<h2>\\\(.*\\\)<\\/h2>/<h2 id=\"\\1\">\\1<\\/h2>/g"
50+
# | cat doc/api_header.html - doc/api_footer.html > ${PROJECT_BINARY_DIR}/doc/api.html
51+
# WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
52+
# DEPENDS node doc/api.markdown doc/api_header.html doc/api_footer.html
53+
# VERBATIM
54+
# )
55+
56+
add_custom_command(
57+
OUTPUT ${changelog_html}
58+
COMMAND ${node_binary} ${doctool} doc/template.html ChangeLog
59+
| sed "s|assets/|api/assets/|g"
60+
| sed "s|<body>|<body id=\"changelog\">|g" > ${changelog_html}
61+
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
62+
DEPENDS ChangeLog node ${doctool} ${doc_sources_copy}
63+
VERBATIM
64+
)
65+
66+
#add_custom_command(
67+
# OUTPUT ${PROJECT_BINARY_DIR}/doc/changelog.html
68+
# COMMAND cat doc/changelog_header.html ChangeLog doc/changelog_footer.html > ${PROJECT_BINARY_DIR}/doc/changelog.html
69+
# WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
70+
# DEPENDS ChangeLog doc/changelog_header.html doc/changelog_footer.html
71+
# VERBATIM
72+
# )
73+
74+
#add_custom_command(
75+
# OUTPUT ${PROJECT_BINARY_DIR}/doc/node.1
76+
# COMMAND ${PROJECT_BINARY_DIR}/default/node tools/ronnjs/bin/ronn.js --roff doc/api.markdown > ${PROJECT_BINARY_DIR}/doc/node.1
77+
# WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
78+
# DEPENDS node doc/api.markdown tools/ronnjs/bin/ronn.js
79+
# VERBATIM
80+
# )

cmake/libc-ares.cmake

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
if(SHARED_CARES)
2+
find_library(LIBCARES_LIBRARY NAMES cares)
3+
find_path(LIBCARES_INCLUDE_DIR ares.h
4+
PATH_SUFFIXES include
5+
) # Find header
6+
find_package_handle_standard_args(libcares DEFAULT_MSG LIBCARES_LIBRARY LIBCARES_INCLUDE_DIR)
7+
else()
8+
set(cares_arch ${node_arch})
9+
10+
if(${node_arch} MATCHES x86_64)
11+
set(cares_arch x64)
12+
elseif(${node_arch} MATCHES x86)
13+
set(cares_arch ia32)
14+
endif()
15+
16+
add_subdirectory(deps/c-ares)
17+
set(LIBCARES_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/deps/c-ares ${CMAKE_SOURCE_DIR}/deps/c-ares/${node_platform}-${cares_arch})
18+
endif()

cmake/libev.cmake

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
if(SHARED_LIBEV)
2+
find_library(LIBEV_LIBRARY NAMES ev)
3+
find_path(LIBEV_INCLUDE_DIR ev.h
4+
PATH_SUFFIXES include/ev include
5+
) # Find header
6+
find_package_handle_standard_args(libev DEFAULT_MSG LIBEV_LIBRARY LIBEV_INCLUDE_DIR)
7+
else()
8+
add_subdirectory(deps/libev)
9+
set(LIBEV_INCLUDE_DIR deps/libev)
10+
endif()

cmake/libs.cmake

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
#
2+
# libraries
3+
#
4+
5+
include(FindPackageHandleStandardArgs)
6+
set(HAVE_CONFIG_H True)
7+
add_definitions(-DHAVE_CONFIG_H=1)
8+
9+
find_package(OpenSSL QUIET)
10+
find_package(Threads)
11+
find_library(RT rt)
12+
find_library(DL dl)
13+
14+
if(RT)
15+
set(extra_libs ${extra_libs} ${RT})
16+
endif()
17+
18+
if(DL)
19+
set(extra_libs ${extra_libs} ${DL})
20+
endif()
21+
22+
if(${node_platform} MATCHES freebsd)
23+
find_library(KVM NAMES kvm)
24+
set(extra_libs ${extra_libs} KVM)
25+
endif()
26+
27+
if(${OPENSSL_FOUND} MATCHES True)
28+
add_definitions(-DHAVE_OPENSSL=1)
29+
set(HAVE_OPENSSL True)
30+
set(node_extra_src ${node_extra_src} src/node_crypto.cc)
31+
set(extra_libs ${extra_libs} ${OPENSSL_LIBRARIES})
32+
endif()
33+
34+
include("cmake/libc-ares.cmake")
35+
include("cmake/libev.cmake")
36+
include("cmake/libv8.cmake")
37+
38+
add_subdirectory(deps/libeio)
39+
add_subdirectory(deps/http_parser)

cmake/libv8.cmake

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
set(V8_INCLUDE_NAMES v8.h v8-debug.h v8-profiler.h)
2+
set(V8_LIBRARY_NAMES v8)
3+
4+
if(SHARED_V8)
5+
find_path(V8_INCLUDE_DIR NAMES ${V8_INCLUDE_NAMES})
6+
find_library(V8_LIBRARY_PATH NAMES ${V8_LIBRARY_NAMES} NO_CMAKE_PATH)
7+
else()
8+
set(V8_INCLUDE_DIR "${PROJECT_BINARY_DIR}/deps/v8/include")
9+
if(${CMAKE_BUILD_TYPE} MATCHES Debug)
10+
set(v8_fn "libv8_g.a")
11+
else()
12+
set(v8_fn "libv8.a")
13+
endif()
14+
set(V8_LIBRARY_PATH "${PROJECT_BINARY_DIR}/deps/v8/${v8_fn}")
15+
endif()

0 commit comments

Comments
 (0)