# HG changeset patch
# User SokoL_SD
# Date 1244385096 0
# Node ID a860544c5ee8df92b8801304fe8de8b9320cf96d
# Parent 6d5eeec1d9a19e43737828bfb29e78755b620aa5
CMake: initial version of CMakeD script.
CMake: MSVC fixes (not work yet).
CMake: add experimental option BUILD_SHARED_LIBRARIES.
diff -r 6d5eeec1d9a1 -r a860544c5ee8 CMakeLists.txt
--- a/CMakeLists.txt Sun Jun 07 14:05:29 2009 +0000
+++ b/CMakeLists.txt Sun Jun 07 14:31:36 2009 +0000
@@ -1,667 +1,437 @@
-cmake_minimum_required(VERSION 2.6)
-PROJECT(qtd CXX C)
-FIND_PACKAGE(Qt4 REQUIRED)
-
-##--------------------------------------------
-## Settings.
-##--------------------------------------------
-
-include_directories(${QT_INCLUDES} include ${CMAKE_CURRENT_BINARY_DIR}/include)
-
-## Options.
-option(BUILD_EXAMPLES "Build examples" "ON")
-option(BUILD_TOOLS "Build tools" "ON")
-option(GENERATE_DI_FILES "Generate *.di files with DC -H command" "OFF")
-
-set(all_packages Core Gui OpenGL Xml Svg Network WebKit) ## TODO: Loading.
-
-
-## Strip utility.
-find_program(STRIP strip)
-
-## Find D compiler and parsing its version.
-
-find_program(DC dmd ldc)
-if (DC)
- get_filename_component(dc_path ${DC} PATH)
- if("${dc_path}" STREQUAL ${CMAKE_BINARY_DIR})
- get_filename_component(DC ${DC} NAME)
- endif("${dc_path}" STREQUAL ${CMAKE_BINARY_DIR})
- exec_program(${DC} ARGS "" OUTPUT_VARIABLE d_output)
- string(REGEX MATCH "Digital Mars D Compiler v[0-9]\\.[0-9]+" dmd_version "${d_output}")
- if (dmd_version)
- set(D_IS_MARS true)
- set(D_IS_DMD true)
- set(D_COMPILER_NAME "Digital Mars D Compiler")
- string(REGEX REPLACE "Digital Mars D Compiler v([0-9])\\.[0-9]+" "\\1" D_VERSION "${dmd_version}")
- string(REGEX REPLACE "Digital Mars D Compiler v[0-9]\\.([0-9]+)" "\\1" D_FRONTEND "${dmd_version}")
- else (dmd_version)
- string(REGEX MATCH "LLVM-based D Compiler" is_ldc "${d_output}")
- if (is_ldc)
- exec_program(${DC} ARGS "--version" OUTPUT_VARIABLE d_output)
- string(REGEX MATCH "based on DMD v[0-9]\\.[0-9]+" ldc_version "${d_output}")
- set(D_IS_LLVM true)
- set(D_IS_LDC true)
- if(ldc_version)
- set(D_IS_LLVM true)
- set(D_COMPILER_NAME "LLVM-based D Compiler")
- string(REGEX REPLACE "based on DMD v([0-9])\\.[0-9]+" "\\1" D_VERSION "${ldc_version}")
- string(REGEX REPLACE "based on DMD v[0-9]\\.([0-9]+)" "\\1" D_FRONTEND "${ldc_version}")
- else(ldc_version)
- message(FATAL_ERROR "LDC compiler was found, but the version can not be processed")
- endif(ldc_version)
- else (is_ldc)
- message(FATAL_ERROR "D compliler not found")
- endif(is_ldc)
- endif(dmd_version)
- message(STATUS "D compiler found -- ${D_COMPILER_NAME} v${D_VERSION}.${D_FRONTEND}")
-else (DC)
- message(FATAL_ERROR "D compliler not found")
-endif (DC)
-
-if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT OR "${CMAKE_INSTALL_PREFIX}" STREQUAL "")
- get_filename_component(dc_path ${DC} PATH)
- if("${dc_path}" STREQUAL "")
- find_program(dc_path_tmp ${DC})
- get_filename_component(dc_path ${dc_path_tmp} PATH)
- mark_as_advanced(dc_path_tmp)
- endif("${dc_path}" STREQUAL "")
- get_filename_component(dc_parent_dir ${dc_path} NAME)
- if("${dc_parent_dir}" STREQUAL "bin")
- get_filename_component(dc_path ${dc_path} PATH)
- endif("${dc_parent_dir}" STREQUAL "bin")
- set(CMAKE_INSTALL_PREFIX
- ${dc_path} CACHE PATH "QtD install prefix" FORCE
- )
-endif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT OR "${CMAKE_INSTALL_PREFIX}" STREQUAL "")
-
-## TODO: disable this option for ldc < rev. 1433.
-if(D_IS_MARS)
- option(SINGLE_D_OBJECT "Build all d sources to one object file" "ON")
-elseif(D_IS_LLVM)
- option(SINGLE_D_OBJECT "Build all d sources to one object file" "OFF")
-endif(D_IS_MARS)
-
-if(SINGLE_D_OBJECT AND D_IS_LLVM)
- set(D_FLAGS ${D_FLAGS} -singleobj)
-endif(SINGLE_D_OBJECT AND D_IS_LLVM)
-
-# Check D compiler version
-if(D_VERSION EQUAL "1")
- if (D_FRONTEND LESS "041")
- message(STATUS "Minimum required version of D compiler is 1.041 (or compiler based on this version)")
- endif(D_FRONTEND LESS "041")
- set(D_TARGET d1-tango)
-elseif(D_VERSION EQUAL "2")
- set(D_TARGET ) ## TODO: hm... I don`t known this parameter for D2 ^(
-endif(D_VERSION EQUAL "1")
-set(D_FLAGS ${D_FLAGS} -I${CMAKE_SOURCE_DIR}/qt/d${D_VERSION})
-
-# Debug and release flags.
-if (NOT CMAKE_BUILD_TYPE)
- set(CMAKE_BUILD_TYPE Release)
-endif (NOT CMAKE_BUILD_TYPE)
-if(${CMAKE_BUILD_TYPE} MATCHES [dD][eE][bB][uU][gG])
- set(CMAKE_BUILD_TYPE Debug)
- #set( SUFFIXLIB "${SUFFIXLIB}-debug" )
- #set( SUFFIXBIN "${SUFFIXBIN}-debug" )
- add_definitions(-DDEBUG)
- set(D_FLAGS ${D_FLAGS} -g -gc -debug)
-elseif (NOT ${CMAKE_BUILD_TYPE} MATCHES [rR][eE][lL][eE][aA][sS])
- message(STATUS "Only debug and release configuration are now supproted. Configuration changed to 'Release'")
- set(CMAKE_BUILD_TYPE Release)
-endif (${CMAKE_BUILD_TYPE} MATCHES [dD][eE][bB][uU][gG])
-if (${CMAKE_BUILD_TYPE} MATCHES [rR][eE][lL][eE][aA][sS])
- #add_definitions(-UNO_DEBUG)
- set(D_FLAGS ${D_FLAGS} -O -release)
- if(D_IS_MARS)
- set(D_FLAGS ${D_FLAGS} -inline)
- elseif(D_IS_LLVM)
- set(D_FLAGS ${D_FLAGS} -enable-inlining)
- endif(D_IS_MARS)
- if(CMAKE_HOST_WIN32)
- set(D_FLAGS ${D_FLAGS} -L/subsystem:windows)
- endif(CMAKE_HOST_WIN32)
-endif(${CMAKE_BUILD_TYPE} MATCHES [rR][eE][lL][eE][aA][sS] )
-
-set(D_FLAGS ${D_FLAGS} -I${CMAKE_BINARY_DIR} -I${CMAKE_SOURCE_DIR})
-if(D_IS_MARS AND CMAKE_HOST_WIN32)
-else(D_IS_MARS AND CMAKE_HOST_WIN32)
- set(D_FLAGS ${D_FLAGS} -L-L${CMAKE_BINARY_DIR}/lib)
-endif(D_IS_MARS AND CMAKE_HOST_WIN32)
-
-# System specifc settings.
-if(CMAKE_HOST_WIN32)
- set(implib implib)
- find_program(IMPLIB ${implib})
- if (NOT IMPLIB)
- message(FATAL_ERROR "implib not found. You can donwload it from http://ftp.digitalmars.com/bup.zip")
- endif (NOT IMPLIB)
- set(D_OBJECT_SUFFIX .obj)
- if(D_IS_MARS)
- set(D_LIB_SUFFIX .lib)
- set(D_LIB_PREFIX )
- set(D_FLAGS ${D_FLAGS} -version=cpp_shared)
- set(GEN_OPT ${GEN_OPT} --cpp_shared)
- add_definitions(-DCPP_SHARED)
- elseif(D_IS_LDC)
- set(D_LIB_SUFFIX .a)
- set(D_LIB_PREFIX lib)
- endif(D_IS_MARS)
- string(REGEX REPLACE ".dll([A-Za-z\\.0-9]+)" "\\1" CMAKE_IMPORT_LIBRARY_SUFFIX "${CMAKE_IMPORT_LIBRARY_SUFFIX}")
-elseif(CMAKE_HOST_UNIX)
- set(D_LIB_SUFFIX .a)
- set(D_LIB_PREFIX lib)
- set(D_OBJECT_SUFFIX .o)
-endif(CMAKE_HOST_WIN32)
-
-set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} ./)
-set(GEN_OPT ${GEN_OPT} --d-target=${D_TARGET})
-
-## Bootstrap settings for tools.
-set(DRCC ${CMAKE_BINARY_DIR}/tools/drcc/drcc)
-
-##--------------------------------------------
-## Macroses and functions.
-##--------------------------------------------
-
-## Make native path.
-## Usage:
-## set(path c:/file_path/file_name.cpp)
-## make_native_path(path)
-## message(STATUS ${path})
-## Output:
-## -- "c:\file_path\file_name.cpp"
-## Command "file(TO_NATIVE_PATH ...)" is wrong on Windows
-macro(MAKE_NATIVE_PATH pathname)
- if(CMAKE_HOST_WIN32)
- # An extra \\ escape is necessary to get a \ through CMake's processing.
- string(REPLACE "/" "\\" ${pathname} "${${pathname}}")
- # Enclose with UNESCAPED quotes. This means we need to escape our
- # quotes once here, i.e. with \"
- set(${pathname} \"${${pathname}}\")
- endif(CMAKE_HOST_WIN32)
-endmacro(MAKE_NATIVE_PATH)
-
-##
-## Example:
-## set(path 24.3+23.bin)
-## obj_path(path)
-## message(STATUS ${path})
-## Example output:
-## -- 24\.3\+23\.bin
-macro(regex_safe_string outvariable)
- set(${outvariable} ${ARGN})
- set(__regex_chars__ ^ $ . ] [ - * + ? | \( \))
- foreach(__regex_char__ ${__regex_chars__})
- string(REPLACE "${__regex_char__}"
- "\\${__regex_char__}" ${outvariable} ${${outvariable}}
- )
- endforeach(__regex_char__ ${__regex_chars__})
-endmacro(regex_safe_string outvariable)
-
-## Remove unnecessary path to the object file.
-## path -- path to object file.
-## Example:
-## set(path ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/target.dir/main.d.obj)
-## obj_path(path)
-## message(STATUS ${path})
-## Example output:
-## -- CMakeFiles/target.dir/main.d.obj
-macro(OBJ_PATH path)
- regex_safe_string(__cbd_safe__ ${CMAKE_CURRENT_BINARY_DIR})
- regex_safe_string(__csd_safe__ ${CMAKE_CURRENT_SOURCE_DIR})
- set(regexp_str "(${__cbd_safe__}/|${__csd_safe__}/|)(.+)")
- string(REGEX REPLACE ${regexp_str} "\\2" ${path} "${${path}}")
-endmacro(OBJ_PATH)
-
-## Compile d files.
-## target -- name of a new target.
-## objects_list -- created object files.
-## params -- sources files.
-macro(compile_d_files target objects_list)
- set(${objects_list})
- set(tmp_dir ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${target}.dir)
- file(MAKE_DIRECTORY ${tmp_dir})
- if(NOT SINGLE_D_OBJECT)
- foreach (d_source_p ${ARGN})
- ## TODO: why find_file command work wrong?
- find_file(d_source_p ${d_source_p} PATHS ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}
- ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR})
- set (d_source ${d_source_p})
- obj_path(d_source)
- set(d_obj ${tmp_dir}/${d_source}${D_OBJECT_SUFFIX})
- set(${objects_list} ${${objects_list}} ${d_obj})
- get_filename_component(path ${d_obj} PATH)
- file(MAKE_DIRECTORY ${path})
- set(d_obj_out ${d_obj})
- obj_path(d_obj_out)
- add_custom_command(OUTPUT "${d_obj}"
- COMMAND "${DC}"
- ARGS ${D_FLAGS} -c ${d_source_p} -of${d_obj}
- COMMENT "Building ${d_obj_out}"
- DEPENDS ${d_source_p}
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
- )
- endforeach(d_source_p)
- else(NOT SINGLE_D_OBJECT)
- set(${objects_list} ${tmp_dir}/${target}${D_OBJECT_SUFFIX})
- set(d_obj_out ${${objects_list}})
- obj_path(d_obj_out)
- set(parameters ${D_FLAGS} -c ${ARGN} -of${${objects_list}})
- set(parameters_list_file ${tmp_dir}/parameters)
- if(CMAKE_HOST_WIN32)
- file(REMOVE ${parameters_list_file})
- foreach(arg ${parameters})
- file(APPEND ${parameters_list_file} "${arg}\n")
- endforeach(arg)
- set(param @${parameters_list_file})
- elseif(CMAKE_HOST_UNIX)
- set(param ${parameters})
- endif(CMAKE_HOST_WIN32)
- add_custom_command(OUTPUT "${${objects_list}}"
- COMMAND "${DC}"
- ARGS ${param}
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
- DEPENDS ${ARGN}
- COMMENT ""
- )
- endif(NOT SINGLE_D_OBJECT)
- add_custom_target(${target} DEPENDS "${${objects_list}}")
-endmacro(compile_d_files objects_list)
-
-macro(qtd_add_resource name output)
- set(${output})
- foreach(res "${ARGN}")
- ## Test input file exists.
- get_filename_component(res_path ${res} PATH)
- get_filename_component(res_name ${res} NAME_WE)
- get_filename_component(res_ext ${res} EXT)
- #if(NOT ${req_ext} STREQUAL "qrc")
- # get_filename_component(res_name ${res} NAME_WE)
- #endif(NOT ${req_ext} STREQUAL "qrc")
- set(out ${CMAKE_CURRENT_BINARY_DIR}/${res_path}qrc_${res_name}.d)
- add_custom_command(OUTPUT "${out}"
- COMMAND "${DRCC}"
- ARGS -name ${name} ${res} -o ${out}
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
- DEPENDS ${res}
- COMMENT "Compile QtD resource ${res}"
- )
- set(${output} ${${output}} ${out})
- endforeach(res "${ARGN}")
-endmacro(qtd_add_resource output)
-
-## Build example macro.
-## name -- example name.
-## Options:
-## PACKAGES -- list of packages to link to exaple (for example, QtCore QtGui QtOpenGL).
-## Default value is "QtCore QtGui".
-## params -- sources d files.
-## Usage:
-## build_example(ExampleName PACKAGES QtCore QtGui QtXml main.d another_d_file.d)
-macro(build_example name)
- set(qtd_libs ${core_lib_param} ${gui_lib_param})
- set(type_dat SOURCES)
- set(RESOURCES)
- set(SOURCES)
- set(PACKAGES)
- ## Parse parameters list.
- set(params_dat RESOURCES SOURCES PACKAGES)
- foreach(arg_dat ${ARGN})
- set(founded_type_dat)
- foreach(param_dat ${params_dat})
- if(${arg_dat} STREQUAL ${param_dat})
- set(type_dat ${param_dat})
- set(founded_type_dat 1)
- break(${arg_dat} STREQUAL ${param_dat})
- endif(${arg_dat} STREQUAL ${param_dat})
- endforeach(param_dat ${params_dat})
- if(NOT founded_type_dat)
- set(${type_dat} ${${type_dat}} ${arg_dat})
- endif(NOT founded_type_dat)
- endforeach(arg_dat ${ARGN})
- if(NOT PACKAGES)
- set(PACKAGES QtCore QtGui)
- endif(NOT PACKAGES)
- ## TODO: Tools building is acitve???
- if(RESOURCES)
- if(NOT BUILD_TOOLS)
- message(STATUS "Example '${name}' required drcc. Example will not build")
- return(build_example name)
- endif(NOT BUILD_TOOLS)
- qtd_add_resource(${name} res_sources ${RESOURCES})
- endif(RESOURCES)
- compile_d_files(${name}_dobjs objects ${SOURCES} ${res_sources})
- set(output ${CMAKE_CURRENT_BINARY_DIR}/${name}${CMAKE_EXECUTABLE_SUFFIX})
- set(output_native ${output})
- make_native_path(output_native)
- foreach(package ${PACKAGES})
- string(REGEX REPLACE "Qt([A-Za-z0-9])" "\\1" req "${package}")
- set(is_founded)
- foreach(package_big ${packages_big})
- string(TOLOWER ${package_big} package)
- if(${req} STREQUAL ${package_big})
- set(is_founded 1)
- break(package_big ${packages_big})
- endif(${req} STREQUAL ${package_big})
- endforeach(package_big ${packages_big})
- if(NOT is_founded)
- message(STATUS "Example '${name}' required package '${req}', but its not active. Example will not build")
- return(build_example name)
- else(NOT is_founded)
- set(qtd_libs ${${package}_lib_param} ${qtd_libs})
- endif(NOT is_founded)
- endforeach(package ${PACKAGES})
- add_custom_command(OUTPUT "${output}"
- COMMAND "${DC}"
- ARGS ${D_FLAGS} ${libs_path} ${qtd_libs} ${objects}
- -of${output_native}
- DEPENDS ${objects}
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
- COMMENT "Building example ${name}"
- )
- add_custom_target(example_${name} ALL DEPENDS "${output}")
- ## TODO: Enable on windows too.
- if(STRIP AND ${CMAKE_BUILD_TYPE} EQUAL "Release" AND CMAKE_HOST_UNIX) ##
- add_custom_command(TARGET example_${name} POST_BUILD COMMAND "${STRIP}" ARGS "${output}")
- endif(STRIP AND ${CMAKE_BUILD_TYPE} EQUAL "Release" AND CMAKE_HOST_UNIX)
- add_dependencies(example_${name} allpackages)
-endmacro(build_example sources)
-
-##--------------------------------------------
-## Build and install library.
-##--------------------------------------------
-
-file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
-add_custom_target(allpackages)
-link_directories(${CMAKE_BINARY_DIR}/CMakeFiles)
-
-foreach(package_big ${all_packages})
- string(TOLOWER ${package_big} package)
- ## Loading settings for package.
- set(required)
- set(d_objs)
- set(cpp_objs)
- set(d_sources)
- set(cpp_sources)
- set(lib_name)
- set(link_cpp)
- set(link_d)
- set(cpp_files)
- set(d_files)
- set(classes)
- set(d_generated_files)
- set(d_version_files)
- set(link_example)
- include (${CMAKE_SOURCE_DIR}/build/${package}.txt)
-
- set(all_req_found 1)
- string(TOUPPER ${package} package_upper)
- option(BUILD_QT_${package_upper} "Build Qt${package_big}" "ON")
- if(BUILD_QT_${package_upper})
- foreach(req ${required})
- set(req_found)
- foreach(pack ${packages_big})
- if(${pack} STREQUAL ${req})
- set(req_found 1)
- endif(${pack} STREQUAL ${req})
- endforeach(pack ${packages})
- if(NOT req_found)
- set(req_found)
- foreach(pack ${all_packages})
- if(${pack} STREQUAL ${req})
- set(req_found 1)
- endif(${pack} STREQUAL ${req})
- endforeach(pack ${all_packages})
- if(req_found)
- message(STATUS "Package '${package_big}' required '${req}', but its not active")
- else(req_found)
- message(STATUS "Package '${package_big}' required '${req}', but its not found")
- endif(req_found)
- set(all_req_found)
- endif(NOT req_found)
- endforeach(req ${required})
- else(BUILD_QT_${package_upper})
- set(all_req_found)
- endif(BUILD_QT_${package_upper})
-
- ## TODO: cleanup.
- if("${all_req_found}" EQUAL 1)
- set(packages_big ${packages_big} ${package_big})
- set(packages ${packages} ${package})
- ## Loading package sources list.
- foreach(d_source ${d_version_files})
- set(d_sources ${d_sources} ${CMAKE_SOURCE_DIR}/qt/d${D_VERSION}/qt/${d_source}.d)
- if(NOT GENERATE_DI_FILES)
- get_filename_component(path ${d_source}.d PATH)
- get_filename_component(name ${d_source}.d NAME_WE)
- install(FILES ${CMAKE_SOURCE_DIR}/qt/d${D_VERSION}/qt/${d_source}.d COMPONENT qtd DESTINATION include/d/qt/${path} RENAME ${name}.di)
- install(FILES ${CMAKE_SOURCE_DIR}/qt/d${D_VERSION}/qt/${d_source}_enum.d COMPONENT qtd DESTINATION include/d/qt/${path} RENAME ${name}_enum.di OPTIONAL)
- endif(NOT GENERATE_DI_FILES)
- endforeach(d_source)
- foreach(d_source ${d_files})
- set(d_sources ${d_sources} ${CMAKE_SOURCE_DIR}/qt/${d_source}.d)
- if(NOT GENERATE_DI_FILES)
- get_filename_component(path ${d_source}.d PATH)
- get_filename_component(name ${d_source}.d NAME_WE)
- install(FILES ${CMAKE_SOURCE_DIR}/qt/${d_source}.d DESTINATION include/d/qt/${path} COMPONENT qtd RENAME ${name}.di)
- install(FILES ${CMAKE_SOURCE_DIR}/qt/${d_source}_enum.d DESTINATION include/d/qt/${path} COMPONENT qtd RENAME ${name}_enum.di OPTIONAL)
- endif(NOT GENERATE_DI_FILES)
- endforeach(d_source)
- foreach(d_source ${d_generated_files})
- set(d_sources ${d_sources} ${CMAKE_BINARY_DIR}/qt/${d_source}.d)
- if(NOT GENERATE_DI_FILES)
- get_filename_component(path ${d_source}.d PATH)
- get_filename_component(name ${d_source}.d NAME_WE)
- install(FILES ${CMAKE_BINARY_DIR}/qt/${d_source}.d DESTINATION include/d/qt/${path} COMPONENT qtd RENAME ${name}.di)
- install(FILES ${CMAKE_BINARY_DIR}/qt/${d_source}_enum.d DESTINATION include/d/qt/${path} COMPONENT qtd RENAME ${name}_enum.di OPTIONAL)
- endif(NOT GENERATE_DI_FILES)
- endforeach(d_source)
- foreach (cpp_source ${cpp_files})
- set(cpp_sources ${cpp_sources} ${CMAKE_SOURCE_DIR}/cpp/${cpp_source}.cpp)
- endforeach(cpp_source)
- set(classes ArrayOps ${classes})
- foreach(class ${classes})
- set(d_sources ${d_sources} ${CMAKE_BINARY_DIR}/qt/${package}/${class}.d)
- set(cpp_sources ${cpp_sources} ${CMAKE_BINARY_DIR}/cpp/qt_${package}/${class}_shell.cpp)
- set(files_for_gen ${files_for_gen} ${CMAKE_BINARY_DIR}/cpp/qt_${package}/${class}_shell.cpp
- ${CMAKE_BINARY_DIR}/qt/${package}/${class}.d)
- if(NOT GENERATE_DI_FILES)
- install(FILES ${CMAKE_BINARY_DIR}/qt/${package}/${class}.d DESTINATION include/d/qt/${package} COMPONENT qtd RENAME ${class}.di)
- install(FILES ${CMAKE_BINARY_DIR}/qt/${package}/${class}_enum.d DESTINATION include/d/qt/${package} COMPONENT qtd RENAME ${class}_enum.di OPTIONAL)
- endif(NOT GENERATE_DI_FILES)
- endforeach(class)
-
- ## Link CPP library.
- add_library(cpp_${package} SHARED ${cpp_sources})
- set_property(TARGET cpp_${package} PROPERTY LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/CMakeFiles)
- foreach(cpp_source ${cpp_sources})
- set(cpp_source ${cpp_source})
- obj_path(cpp_source)
- set(cpp_objs ${cpp_objs} CMakeFiles/cpp_${package}.dir/${cpp_source}${CMAKE_CXX_OUTPUT_EXTENSION})
- endforeach(cpp_source)
-
- ## Link D library.
- set(lib_name ${D_LIB_PREFIX}qtd${package}${D_LIB_SUFFIX})
- set(lib lib/${lib_name})
- compile_d_files(${package}_dobjs objects ${d_sources})
- set(d_objs ${d_objs} ${objects})
- if(CMAKE_HOST_WIN32)
- set_property(TARGET cpp_${package} PROPERTY RUNTIME_OUTPUT_DIRECTORY lib)
- set_property(TARGET cpp_${package} PROPERTY ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/CMakeFiles)
- foreach(req ${required})
- set(is_found)
- foreach(pack ${packages_big})
- if("${pack}" STREQUAL "${req}")
- set(is_found 1)
- break(pack ${packages_big})
- endif("${pack}" STREQUAL "${req}")
- endforeach(pack ${packages_big})
- if(NOT is_found)
- message(FATAL_ERROR "Package ${package_big} required ${req}, but its not found")
- endif(NOT is_found)
- string(TOUPPER ${req} req_upper)
- string(TOLOWER ${req} req_lower)
- set(link_cpp ${link_cpp} cpp_${req_lower} ${QT_QT${req_upper}_LIBRARY})
- endforeach(req ${require})
-
- ## Does the next three lines need for ldc?
- string(TOUPPER ${package} package_upper)
- set(link_cpp ${link_cpp} ${QT_QT${package_upper}_LIBRARY})
- target_link_libraries(cpp_${package} ${link_cpp} )
- if(D_IS_MARS)
- set(cpp_lib ${CMAKE_BINARY_DIR}/lib/libcpp_${package}.dll)
- set(cpp_lib_native ${cpp_lib})
- make_native_path(cpp_lib_native)
- set(d_implib ${CMAKE_BINARY_DIR}/CMakeFiles/${package}.dir/cpp_${package}.lib)
- set(d_implib_native ${d_implib})
- make_native_path(d_implib_native)
- add_custom_command(
- OUTPUT "${d_implib}"
- COMMAND "${IMPLIB}"
- ARGS /system /PAGESIZE:32 ${d_implib_native} ${cpp_lib_native}
- DEPENDS "cpp_${package}"
- COMMENT "Creating implib ${lib_name}"
- )
-
- add_custom_command(
- OUTPUT "${lib}"
- COMMAND "${DC}"
- ARGS -lib ${d_objs} ${d_implib} -of${lib}
- DEPENDS ${d_objs} ${d_implib}
- COMMENT "Linking ${lib_name}"
- )
- elseif(D_IS_MARS)
- add_custom_command(
- OUTPUT "${lib}"
- COMMAND "${CMAKE_AR}"
- ARGS rcs ${lib} ${d_objs} ${cpp_objs}
- DEPENDS ${d_objs}
- COMMENT "Linking ${lib_name}"
- )
- endif(D_IS_MARS)
- install(FILES ${cpp_lib} COMPONENT qtd DESTINATION lib)
- else(CMAKE_HOST_UNIX)
- add_custom_command(
- OUTPUT "${lib}"
- COMMAND "${CMAKE_AR}"
- ARGS rcs ${lib} ${d_objs} ${cpp_objs}
- DEPENDS ${d_objs} cpp_${package}
- COMMENT "Linking ${lib_name}"
- )
- endif(CMAKE_HOST_WIN32)
- install(FILES ${CMAKE_BINARY_DIR}/${lib} COMPONENT qtd DESTINATION lib)
-
- ## Dependences.
- add_custom_target(${package} DEPENDS ${lib})
- foreach(depend ${required})
- string(TOLOWER ${depend} depend)
- add_dependencies(cpp_${package} cpp_${depend})
- add_dependencies(${package} ${depend})
- endforeach(depend ${required})
- add_dependencies(allpackages ${package})
-
- ## Paths for QtD libs. Needed by examples.
- if(CMAKE_HOST_WIN32 AND D_IS_MARS)
- set(libs_path ${CMAKE_BINARY_DIR}/lib/qtd${package}.lib)
- make_native_path(libs_path)
- set(${package}_lib_param -L+${libs_path})
- foreach(link ${link_example})
- set(link ${CMAKE_SOURCE_DIR}/lib/${link}.lib)
- make_native_path(link)
- set(link -L+${link})
- set(${package}_lib_param ${${package}_lib_param} ${link})
- endforeach(link ${link_example})
- else (CMAKE_HOST_WIN32 AND D_IS_MARS)
- set(${package}_lib_param -L-lqtd${package} -L-lQt${package_big})
- foreach(link ${link_example})
- set(${package}_lib_param ${${package}_lib_param} ${link})
- endforeach(link ${link_example})
- endif(CMAKE_HOST_WIN32 AND D_IS_MARS)
-
- if(GENERATE_DI_FILES)
- regexseafestring(cbd_safe ${CMAKE_BINARY_DIR})
- regexseafestring(csd_safe ${CMAKE_SOURCE_DIR})
- set(regexp_str "(${csd}/qt/d${D_VERSION}|${csd_safe}|${cbd_safe})/([A-Za-z0-9\\-_\\\\/]+)[/]+([A-Za-z0-9\\-_\\\\]+).d")
- foreach(source ${d_sources})
- # find_file(source ${source} PATHS ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}
- # ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR})
- string(REGEX REPLACE ${regexp_str} "\\2" inc_path "${source}")
- string(REGEX REPLACE ${regexp_str} "\\3" file_name "${source}")
- set(interface_file_path ${CMAKE_BINARY_DIR}/d/${inc_path})
- set(interface_file "${interface_file_path}/${file_name}.di")
- if(NOT "${file_name}" STREQUAL "QGlobal")
- add_custom_command(OUTPUT "${interface_file}"
- COMMAND "${DC}"
- ARGS ${D_FLAGS} -o- -H -Hd${interface_file_path} ${source}
- COMMENT "Generating header for ${source}"
- DEPENDS ${source}
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
- )
- else(NOT "${file_name}" STREQUAL "QGlobal") ## DMD frontend crash on this file.
- add_custom_command(OUTPUT "${interface_file}"
- COMMAND ${CMAKE_COMMAND} -E make_directory ${interface_file_path}
- COMMAND ${CMAKE_COMMAND} -E remove -f ${interface_file}
- COMMAND ${CMAKE_COMMAND} -E copy ${source} ${interface_file}
- COMMENT ""
- DEPENDS ${source}
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
- )
- endif(NOT "${file_name}" STREQUAL "QGlobal" AND GENERATE_DI_FILES)
- set(interfaces_list ${interfaces_list} ${interface_file_path}/${file_name}.di)
- install(FILES ${interface_file} COMPONENT qtd DESTINATION include/d/${inc_path})
- endforeach(source)
- endif(GENERATE_DI_FILES)
- endif("${all_req_found}" EQUAL 1)
-endforeach(package_big ${packages_big})
-if(GENERATE_DI_FILES)
- add_custom_target(generate_headers ALL DEPENDS ${interfaces_list})
-endif(GENERATE_DI_FILES)
-
-add_subdirectory(generator)
-## Dependences.
-foreach(package ${packages})
- add_dependencies(cpp_${package} dgen)
-endforeach(package ${packages})
-add_sources_for_generating(${files_for_gen})
-
-set(CPACK_COMPONENTS_ALL qtd qtd_tools)
-
-##--------------------------------------------
-## Build other parts of the QtD.
-##--------------------------------------------
-add_custom_target(tools ALL)
-if(BUILD_TOOLS)
- add_subdirectory(tools)
- add_dependencies(tools drcc duic)
-endif(BUILD_TOOLS)
-
-if(BUILD_EXAMPLES)
- add_subdirectory(demos)
- add_subdirectory(examples)
-endif(BUILD_EXAMPLES)
-
-##--------------------------------------------
-## CPack.
-##--------------------------------------------
-set(CPACK_PACKAGE_VERSION_PATCH 1)
-set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "QtD is a D binding to the Qt application and UI framework.
-QtD is a D binding to the Qt application and UI framework.
-This package installs binding and static library for qt port on D programming language.
-")
-#SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/ReadMe.txt")
-SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/license.txt")
-set(CPACK_PACKAGE_VENDOR "QtD team")
-set(CPACK_PACKAGE_CONTACT "e@mail.ru" )
-SET(CPACK_PACKAGE_VERSION "0.1")
-#set(CPACK_PACKAGE_VERSION_PATCH "${RFS_VERSION_BUILD}")
-set(CPACK_PACKAGE_INSTALL_DIRECTORY "qtd ${CPACK_PACKAGE_VERSION}")
-set(CPACK_PACKAGE_FILE_NAME "qtd-${CPACK_PACKAGE_VERSION}")
-set(CPACK_SOURCE_PACKAGE_FILE_NAME "qtd-${CPACK_PACKAGE_VERSION}")
-if(CMAKE_HOST_WIN32)
- set(CPACK_GENERATOR "ZIP")
-elseif(CMAKE_HOST_UNIX)
- set(CPACK_GENERATOR "TBZ2;DEB;RPM")
-endif(CMAKE_HOST_WIN32)
+cmake_minimum_required(VERSION 2.6)
+PROJECT(qtd CXX C)
+FIND_PACKAGE(Qt4 REQUIRED)
+
+##--------------------------------------------
+## Settings.
+##--------------------------------------------
+
+include_directories(${QT_INCLUDES} include ${CMAKE_CURRENT_BINARY_DIR}/include)
+
+## Options.
+option(BUILD_EXAMPLES "Build examples" "ON")
+option(BUILD_SHARED_LIBRARIES "Build shared library (very experemental and only for ldc)" "OFF")
+option(BUILD_TOOLS "Build tools" "ON")
+#option(GENERATE_DI_FILES "Generate *.di files with DC -H command" "OFF")
+set(GENERATE_DI_FILES OFF) ## Very experemental option. Temporary disabled.
+
+set(QTD_VERSION_STR ${QT_VERSION_MAJOR}.${QT_VERSION_MINOR}.${QT_VERSION_PATCH})
+math(EXPR QTD_VERSION "(${QT_VERSION_MAJOR} << 16) + (${QT_VERSION_MINOR} << 8) + ${QT_VERSION_PATCH}")
+configure_file(qt/QGlobal.d.inc qt/QGlobal.d)
+
+set(all_packages Core Gui OpenGL Xml Svg Network WebKit)
+
+## Init D toolkit.
+set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
+FIND_PACKAGE(D REQUIRED)
+
+## Strip utility.
+find_program(STRIP strip)
+
+if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT OR "${CMAKE_INSTALL_PREFIX}" STREQUAL "")
+ set(CMAKE_INSTALL_PREFIX
+ ${DC_PATH} CACHE PATH "QtD install prefix" FORCE
+ )
+endif(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT OR "${CMAKE_INSTALL_PREFIX}" STREQUAL "")
+
+# Check D compiler version
+if(D_VERSION EQUAL "1")
+ if (D_FRONTEND LESS "041")
+ message(STATUS "Minimum required version of D compiler is 1.041 (or compiler based on this version)")
+ endif(D_FRONTEND LESS "041")
+ set(D_TARGET d1-tango)
+elseif(D_VERSION EQUAL "2")
+ set(D_TARGET ) ## TODO: hm... I don`t known this parameter for D2 ^(
+endif(D_VERSION EQUAL "1")
+
+# Debug and release flags.
+if (NOT CMAKE_BUILD_TYPE)
+ set(CMAKE_BUILD_TYPE Release)
+endif (NOT CMAKE_BUILD_TYPE)
+if(${CMAKE_BUILD_TYPE} MATCHES [dD][eE][bB][uU][gG])
+ set(CMAKE_BUILD_TYPE Debug)
+ #set( SUFFIXLIB "${SUFFIXLIB}-debug" )
+ #set( SUFFIXBIN "${SUFFIXBIN}-debug" )
+ add_definitions(-DDEBUG)
+elseif (NOT ${CMAKE_BUILD_TYPE} MATCHES [rR][eE][lL][eE][aA][sS])
+ message(STATUS "Only debug and release configurations are supproted now. Configuration will change to 'Release'")
+ set(CMAKE_BUILD_TYPE Release)
+endif (${CMAKE_BUILD_TYPE} MATCHES [dD][eE][bB][uU][gG])
+if (${CMAKE_BUILD_TYPE} MATCHES [rR][eE][lL][eE][aA][sS])
+ #add_definitions(-UNO_DEBUG)
+endif(${CMAKE_BUILD_TYPE} MATCHES [rR][eE][lL][eE][aA][sS] )
+
+# System specifc settings.
+if(CMAKE_HOST_WIN32)
+ set(implib implib)
+ find_program(IMPLIB ${implib})
+ if (NOT IMPLIB)
+ message(FATAL_ERROR "implib not found. You can donwload it from http://ftp.digitalmars.com/bup.zip")
+ endif (NOT IMPLIB)
+ if(D_IS_MARS)
+ set(D_FLAGS ${D_FLAGS} -version=cpp_shared)
+ set(GEN_OPT ${GEN_OPT} --cpp_shared)
+ add_definitions(-DCPP_SHARED)
+ endif(D_IS_MARS)
+ string(REGEX REPLACE ".dll([A-Za-z\\.0-9]+)" "\\1" CMAKE_IMPORT_LIBRARY_SUFFIX "${CMAKE_IMPORT_LIBRARY_SUFFIX}")
+endif(CMAKE_HOST_WIN32)
+
+set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} ./)
+set(GEN_OPT ${GEN_OPT} --d-target=${D_TARGET})
+
+## Bootstrap settings for QtD.
+set(DRCC ${CMAKE_BINARY_DIR}/tools/drcc/drcc)
+set(QTD_IMPORT_PATH ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR} ${CMAKE_SOURCE_DIR}/qt/d${D_VERSION})
+set(QTD_LIBRARIES_PATH ${CMAKE_BINARY_DIR}/lib)
+
+##--------------------------------------------
+## Macroses and functions.
+##--------------------------------------------
+
+macro(qtd_add_resource name output)
+ set(${output})
+ foreach(res "${ARGN}")
+ ## Test input file exists.
+ get_filename_component(res_path ${res} PATH)
+ get_filename_component(res_name ${res} NAME_WE)
+ get_filename_component(res_ext ${res} EXT)
+ #if(NOT ${req_ext} STREQUAL "qrc")
+ # get_filename_component(res_name ${res} NAME_WE)
+ #endif(NOT ${req_ext} STREQUAL "qrc")
+ set(out ${CMAKE_CURRENT_BINARY_DIR}/${res_path}qrc_${res_name}.d)
+ add_custom_command(OUTPUT "${out}"
+ COMMAND "${DRCC}"
+ ARGS -name ${name} ${res} -o ${out}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ DEPENDS ${res}
+ COMMENT "Compile QtD resource ${res}"
+ )
+ set(${output} ${${output}} ${out})
+ endforeach(res "${ARGN}")
+endmacro(qtd_add_resource output)
+
+## Build example macro.
+## name -- example name.
+## Options:
+## PACKAGES -- list of packages to link to exaple (for example, QtCore QtGui QtOpenGL).
+## Default value is "QtCore QtGui".
+## params -- sources d files.
+## Usage:
+## build_example(ExampleName PACKAGES QtCore QtGui QtXml main.d another_d_file.d)
+macro(build_example name)
+ set(qtd_libs ${core_lib_param} ${gui_lib_param})
+ set(type_dat SOURCES)
+ set(RESOURCES)
+ set(SOURCES)
+ set(PACKAGES)
+ ## Parse parameters list.
+ set(params_dat RESOURCES SOURCES PACKAGES)
+ foreach(arg_dat ${ARGN})
+ set(founded_type_dat)
+ foreach(param_dat ${params_dat})
+ if(${arg_dat} STREQUAL ${param_dat})
+ set(type_dat ${param_dat})
+ set(founded_type_dat 1)
+ break(${arg_dat} STREQUAL ${param_dat})
+ endif(${arg_dat} STREQUAL ${param_dat})
+ endforeach(param_dat ${params_dat})
+ if(NOT founded_type_dat)
+ set(${type_dat} ${${type_dat}} ${arg_dat})
+ endif(NOT founded_type_dat)
+ endforeach(arg_dat ${ARGN})
+ if(NOT PACKAGES)
+ set(PACKAGES QtCore QtGui)
+ endif(NOT PACKAGES)
+ ## TODO: Is the building tools activated ???
+ if(RESOURCES)
+ if(NOT BUILD_TOOLS)
+ message(STATUS "Example '${name}' required drcc. Example will not build")
+ return(build_example name)
+ endif(NOT BUILD_TOOLS)
+ qtd_add_resource(${name} res_sources ${RESOURCES})
+ endif(RESOURCES)
+ foreach(package ${PACKAGES})
+ string(REGEX REPLACE "Qt([A-Za-z0-9])" "\\1" req "${package}")
+ set(is_founded)
+ foreach(package_big ${packages_big})
+ string(TOLOWER ${package_big} package)
+ if(${req} STREQUAL ${package_big})
+ set(is_founded 1)
+ break(package_big ${packages_big})
+ endif(${req} STREQUAL ${package_big})
+ endforeach(package_big ${packages_big})
+ if(NOT is_founded)
+ message(STATUS "Example '${name}' required package '${req}', but its not active. Example will not build")
+ return(build_example name)
+ else(NOT is_founded)
+ set(qtd_libs ${${package}_lib_param} ${qtd_libs})
+ endif(NOT is_founded)
+ endforeach(package ${PACKAGES})
+ add_d_program(${name} ${SOURCES} ${res_sources} INCLUDES ${QTD_IMPORT_PATH} ${CMAKE_CURRENT_BINARY_DIR}
+ LIB_PATHS ${QTD_LIBRARIES_PATH} ${CMAKE_SOURCE_DIR}/lib LIBS ${qtd_libs})
+ ## TODO: Enable on windows too.
+ if(STRIP AND ${CMAKE_BUILD_TYPE} EQUAL "Release" AND CMAKE_HOST_UNIX) ##
+ add_custom_command(TARGET example_${name} POST_BUILD COMMAND "${STRIP}" ARGS "${output}")
+ endif(STRIP AND ${CMAKE_BUILD_TYPE} EQUAL "Release" AND CMAKE_HOST_UNIX)
+ add_dependencies(${name} allpackages)
+endmacro(build_example sources)
+
+##--------------------------------------------
+## Build and install library.
+##--------------------------------------------
+
+file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
+add_custom_target(allpackages)
+link_directories(${CMAKE_BINARY_DIR}/CMakeFiles)
+
+foreach(package_big ${all_packages})
+ string(TOLOWER ${package_big} package)
+ ## Loading settings for package.
+ set(required)
+ set(d_objs)
+ set(cpp_objs)
+ set(d_sources)
+ set(cpp_sources)
+ set(lib_name)
+ set(link_cpp)
+ set(link_d)
+ set(cpp_files)
+ set(d_files)
+ set(classes)
+ set(d_generated_files)
+ set(d_version_files)
+ set(link_example)
+ include (${CMAKE_SOURCE_DIR}/build/${package}.txt)
+
+ set(all_req_found 1)
+ string(TOUPPER ${package} package_upper)
+ option(BUILD_QT_${package_upper} "Build Qt${package_big}" "ON")
+ if(BUILD_QT_${package_upper})
+ foreach(req ${required})
+ set(req_found)
+ foreach(pack ${packages_big})
+ if(${pack} STREQUAL ${req})
+ set(req_found 1)
+ endif(${pack} STREQUAL ${req})
+ endforeach(pack ${packages})
+ if(NOT req_found)
+ set(req_found)
+ foreach(pack ${all_packages})
+ if(${pack} STREQUAL ${req})
+ set(req_found 1)
+ endif(${pack} STREQUAL ${req})
+ endforeach(pack ${all_packages})
+ if(req_found)
+ message(STATUS "Package '${package_big}' required '${req}', but its not active")
+ else(req_found)
+ message(STATUS "Package '${package_big}' required '${req}', but its not found")
+ endif(req_found)
+ set(all_req_found)
+ endif(NOT req_found)
+ endforeach(req ${required})
+ else(BUILD_QT_${package_upper})
+ set(all_req_found)
+ endif(BUILD_QT_${package_upper})
+
+ ## TODO: cleanup.
+ if("${all_req_found}" EQUAL 1)
+ set(packages_big ${packages_big} ${package_big})
+ set(packages ${packages} ${package})
+ ## Loading package sources list.
+ foreach(d_source ${d_generated_files})
+ set(d_sources ${d_sources} ${CMAKE_BINARY_DIR}/qt/${d_source}.d)
+ endforeach(d_source ${d_generated_files})
+ set(classes ArrayOps ${classes})
+ foreach(class ${classes})
+ set(d_sources ${d_sources} ${CMAKE_BINARY_DIR}/qt/${package}/${class}.d)
+ set(cpp_sources ${cpp_sources} ${CMAKE_BINARY_DIR}/cpp/qt_${package}/${class}_shell.cpp)
+ endforeach(class ${classes})
+ set(files_for_gen ${files_for_gen} ${cpp_sources} ${d_sources})
+
+ foreach (cpp_source ${cpp_files})
+ set(cpp_sources ${cpp_sources} ${CMAKE_SOURCE_DIR}/cpp/${cpp_source}.cpp)
+ endforeach(cpp_source)
+ foreach(d_source ${d_version_files})
+ set(d_sources ${d_sources} ${CMAKE_SOURCE_DIR}/qt/d${D_VERSION}/qt/${d_source}.d)
+ endforeach(d_source ${d_version_files})
+ foreach(d_source ${d_files})
+ set(d_sources ${d_sources} ${CMAKE_SOURCE_DIR}/qt/${d_source}.d)
+ endforeach(d_source ${d_files})
+
+ if(NOT GENERATE_DI_FILES)
+ foreach(d_source ${d_sources})
+ get_filename_component(path ${d_source} PATH)
+ get_filename_component(name ${d_source} NAME_WE)
+ regex_safe_string(cbd_safe_tmp ${CMAKE_CURRENT_BINARY_DIR})
+ regex_safe_string(csd_safe_tmp ${CMAKE_CURRENT_SOURCE_DIR})
+ regex_safe_string(ver_safe_tmp ${CMAKE_CURRENT_SOURCE_DIR}/qt/d${D_VERSION})
+ set(regexp_str_tmp "(${ver_safe_tmp}/|${cbd_safe_tmp}/|${csd_safe_tmp}/|)(.+)")
+ string(REGEX REPLACE ${regexp_str_tmp} "\\2" ins_path "${path}")
+ install(FILES ${d_source} DESTINATION include/d/${ins_path} COMPONENT qtd RENAME ${name}.di)
+ install(FILES ${path}/${name}_enum.d DESTINATION include/d/${ins_path} COMPONENT qtd RENAME ${name}_enum.di OPTIONAL)
+ endforeach(d_source ${d_sources})
+ endif(NOT GENERATE_DI_FILES)
+
+ ## Link CPP library.
+ add_library(cpp_${package} SHARED ${cpp_sources})
+ set_property(TARGET cpp_${package} PROPERTY LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/CMakeFiles)
+ if(CMAKE_HOST_WIN32 AND D_IS_MARS) ## TODO: Replace by SEPAREATE_CPP_PART
+ else(CMAKE_HOST_WIN32 AND D_IS_MARS)
+ foreach(cpp_source ${cpp_sources})
+ set(cpp_source ${cpp_source})
+ obj_path(cpp_source)
+ set(cpp_objs ${cpp_objs} ${CMAKE_BINARY_DIR}/CMakeFiles/cpp_${package}.dir/${cpp_source}${CMAKE_CXX_OUTPUT_EXTENSION})
+ endforeach(cpp_source ${cpp_sources})
+ endif(CMAKE_HOST_WIN32 AND D_IS_MARS)
+
+ ## Link D library.
+ set(lib_name qtd${package})
+ if(BUILD_SHARED_LIBRARIES)
+ set(lib lib/${CMAKE_SHARED_LIBRARY_PREFIX}${lib_name}${CMAKE_SHARED_LIBRARY_SUFFIX})
+ set(build_type SHARED)
+ else(BUILD_SHARED_LIBRARIES)
+ set(lib lib/${D_LIB_PREFIX}${lib_name}${D_LIB_SUFFIX})
+ set(build_type STATIC)
+ endif(BUILD_SHARED_LIBRARIES)
+
+ foreach(req ${required})
+ set(is_found)
+ foreach(pack ${packages_big})
+ if("${pack}" STREQUAL "${req}")
+ set(is_found 1)
+ break(pack ${packages_big})
+ endif("${pack}" STREQUAL "${req}")
+ endforeach(pack ${packages_big})
+ if(NOT is_found)
+ message(FATAL_ERROR "Package ${package_big} required ${req}, but its not found")
+ endif(NOT is_found)
+ string(TOUPPER ${req} req_upper)
+ string(TOLOWER ${req} req_lower)
+ set(link_cpp ${link_cpp} cpp_${req_lower} ${QT_QT${req_upper}_LIBRARY})
+ endforeach(req ${require})
+ set(d_objs ${d_objs} ${objects})
+
+ set_property(TARGET cpp_${package} PROPERTY RUNTIME_OUTPUT_DIRECTORY lib)
+ set_property(TARGET cpp_${package} PROPERTY ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/CMakeFiles)
+ string(TOUPPER ${package} package_upper)
+ set(link_cpp ${link_cpp} ${QT_QT${package_upper}_LIBRARY})
+ target_link_libraries(cpp_${package} ${link_cpp} )
+ if(CMAKE_HOST_WIN32 AND D_IS_MARS) ## TODO: Replace by SEPAREATE_CPP_PART
+ set(cpp_lib ${CMAKE_BINARY_DIR}/lib/libcpp_${package}.dll)
+ set(cpp_lib_native ${cpp_lib})
+ make_native_path(cpp_lib_native)
+ set(d_implib ${CMAKE_BINARY_DIR}/CMakeFiles/${package}.dir/cpp_${package}.lib)
+ set(d_implib_native ${d_implib})
+ make_native_path(d_implib_native)
+ add_custom_command(
+ OUTPUT "${d_implib}"
+ COMMAND "${IMPLIB}"
+ ARGS /system /PAGESIZE:32 ${d_implib_native} ${cpp_lib_native}
+ DEPENDS "cpp_${package}"
+ COMMENT "Creating implib ${lib_name}"
+ )
+ install(FILES ${cpp_lib} COMPONENT qtd DESTINATION lib)
+ else(CMAKE_HOST_WIN32 AND D_IS_MARS)
+ set(${package}_lib_param Qt${package_big}) ## Paths for QtD libs. Needed by examples.
+ endif(CMAKE_HOST_WIN32 AND D_IS_MARS)
+ add_d_target(${lib_name} TYPE ${build_type} INCLUDES ${QTD_IMPORT_PATH} SOURCES ${d_sources} OBJECTS ${cpp_objs} ${d_implib}
+ OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib DEPENDS ${d_implib})
+ install(FILES ${CMAKE_BINARY_DIR}/${lib} COMPONENT qtd DESTINATION lib)
+
+ ## Paths for QtD libs. Needed by examples.
+ set(${package}_lib_param qtd${package} ${${package}_lib_param} ${link_example})
+
+ ## Dependences.
+ add_custom_target(${package} DEPENDS ${lib})
+ foreach(depend ${required})
+ string(TOLOWER ${depend} depend)
+ add_dependencies(cpp_${package} cpp_${depend})
+ add_dependencies(${package} ${depend})
+ endforeach(depend ${required})
+ add_dependencies(allpackages ${package})
+
+ if(GENERATE_DI_FILES)
+ regexseafestring(cbd_safe ${CMAKE_BINARY_DIR})
+ regexseafestring(csd_safe ${CMAKE_SOURCE_DIR})
+ set(regexp_str "(${csd}/qt/d${D_VERSION}|${csd_safe}|${cbd_safe})/([A-Za-z0-9\\-_\\\\/]+)[/]+([A-Za-z0-9\\-_\\\\]+).d")
+ foreach(source ${d_sources})
+ # find_file(source ${source} PATHS ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}
+ # ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR})
+ string(REGEX REPLACE ${regexp_str} "\\2" inc_path "${source}")
+ string(REGEX REPLACE ${regexp_str} "\\3" file_name "${source}")
+ set(interface_file_path ${CMAKE_BINARY_DIR}/d/${inc_path})
+ set(interface_file "${interface_file_path}/${file_name}.di")
+ if(NOT "${file_name}" STREQUAL "QGlobal")
+ add_custom_command(OUTPUT "${interface_file}"
+ COMMAND "${DC}"
+ ARGS ${D_FLAGS} -o- -H -Hd${interface_file_path} ${source}
+ COMMENT "Generating header for ${source}"
+ DEPENDS ${source}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ )
+ else(NOT "${file_name}" STREQUAL "QGlobal") ## DMD frontend crash on this file.
+ add_custom_command(OUTPUT "${interface_file}"
+ COMMAND ${CMAKE_COMMAND} -E make_directory ${interface_file_path}
+ COMMAND ${CMAKE_COMMAND} -E remove -f ${interface_file}
+ COMMAND ${CMAKE_COMMAND} -E copy ${source} ${interface_file}
+ COMMENT ""
+ DEPENDS ${source}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ )
+ endif(NOT "${file_name}" STREQUAL "QGlobal" AND GENERATE_DI_FILES)
+ set(interfaces_list ${interfaces_list} ${interface_file_path}/${file_name}.di)
+ install(FILES ${interface_file} COMPONENT qtd DESTINATION include/d/${inc_path})
+ endforeach(source)
+ endif(GENERATE_DI_FILES)
+ endif("${all_req_found}" EQUAL 1)
+endforeach(package_big ${packages_big})
+if(GENERATE_DI_FILES)
+ add_custom_target(generate_headers ALL DEPENDS ${interfaces_list})
+endif(GENERATE_DI_FILES)
+
+add_subdirectory(generator)
+## Dependences.
+foreach(package ${packages})
+ add_dependencies(cpp_${package} dgen)
+endforeach(package ${packages})
+add_sources_for_generating(${files_for_gen})
+
+set(CPACK_COMPONENTS_ALL qtd qtd_tools)
+
+##--------------------------------------------
+## Build other parts of the QtD.
+##--------------------------------------------
+add_custom_target(tools ALL)
+if(BUILD_TOOLS)
+ add_subdirectory(tools)
+ add_dependencies(tools drcc duic)
+endif(BUILD_TOOLS)
+
+if(BUILD_EXAMPLES)
+ add_subdirectory(demos)
+ add_subdirectory(examples)
+endif(BUILD_EXAMPLES)
+
+##--------------------------------------------
+## CPack.
+##--------------------------------------------
+set(CPACK_PACKAGE_VERSION_PATCH 1)
+set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "QtD is a D binding to the Qt application and UI framework.
+QtD is a D binding to the Qt application and UI framework.
+This package installs binding and static library for qt port on D programming language.
+")
+#SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/ReadMe.txt")
+SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/license.txt")
+set(CPACK_PACKAGE_VENDOR "QtD team")
+set(CPACK_PACKAGE_CONTACT "e@mail.ru" )
+SET(CPACK_PACKAGE_VERSION "0.1")
+#set(CPACK_PACKAGE_VERSION_PATCH "${RFS_VERSION_BUILD}")
+set(CPACK_PACKAGE_INSTALL_DIRECTORY "qtd ${CPACK_PACKAGE_VERSION}")
+set(CPACK_PACKAGE_FILE_NAME "qtd-${CPACK_PACKAGE_VERSION}")
+set(CPACK_SOURCE_PACKAGE_FILE_NAME "qtd-${CPACK_PACKAGE_VERSION}")
+if(CMAKE_HOST_WIN32)
+ set(CPACK_GENERATOR "ZIP")
+elseif(CMAKE_HOST_UNIX)
+ set(CPACK_GENERATOR "TBZ2;DEB;RPM")
+endif(CMAKE_HOST_WIN32)
include(CPack)
\ No newline at end of file
diff -r 6d5eeec1d9a1 -r a860544c5ee8 build/core.txt
--- a/build/core.txt Sun Jun 07 14:05:29 2009 +0000
+++ b/build/core.txt Sun Jun 07 14:31:36 2009 +0000
@@ -7,7 +7,7 @@
qt_core/QString_shell qt_core/QVariant_shell
qt_core/QModelIndex_shell qt_core/QMetaType_shell)
## Module specific d files.
-set (d_files QGlobal qtd/Array qtd/Str QtDObject qtd/ArrayOpsPrimitive
+set (d_files qtd/Array qtd/Str QtDObject qtd/ArrayOpsPrimitive
core/QPoint core/QPointF
core/QSize core/QSizeF
core/QLine core/QLineF
@@ -15,7 +15,7 @@
core/QString core/QVariant
core/QModelIndex core/QMetaType)
set (d_version_files Signal)
-set (d_generated_files core/Qt)
+set (d_generated_files core/Qt QGlobal)
## Classes.
set (classes
QChildEvent
diff -r 6d5eeec1d9a1 -r a860544c5ee8 cmake/FindD.cmake
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/cmake/FindD.cmake Sun Jun 07 14:31:36 2009 +0000
@@ -0,0 +1,532 @@
+##--------------------------------------------
+## Variables.
+##--------------------------------------------
+
+## Find D compiler and parsing its version.
+find_program(DC dmd ldc)
+if (DC)
+ get_filename_component(dc_path ${DC} PATH)
+ if("${dc_path}" STREQUAL ${CMAKE_BINARY_DIR})
+ get_filename_component(DC ${DC} NAME)
+ endif("${dc_path}" STREQUAL ${CMAKE_BINARY_DIR})
+ exec_program(${DC} ARGS "" OUTPUT_VARIABLE d_output)
+ string(REGEX MATCH "Digital Mars D Compiler v[0-9]\\.[0-9]+" dmd_version "${d_output}")
+ if (dmd_version)
+ set(D_IS_MARS true)
+ set(D_IS_DMD true)
+ set(D_COMPILER_NAME "Digital Mars D Compiler")
+ string(REGEX REPLACE "Digital Mars D Compiler v([0-9])\\.[0-9]+" "\\1" D_VERSION "${dmd_version}")
+ string(REGEX REPLACE "Digital Mars D Compiler v[0-9]\\.([0-9]+)" "\\1" D_FRONTEND "${dmd_version}")
+ else (dmd_version)
+ string(REGEX MATCH "LLVM-based D Compiler" is_ldc "${d_output}")
+ if (is_ldc)
+ exec_program(${DC} ARGS "--version" OUTPUT_VARIABLE d_output)
+ string(REGEX MATCH "based on DMD v[0-9]\\.[0-9]+" ldc_version "${d_output}")
+ set(D_IS_LLVM true)
+ set(D_IS_LDC true)
+ if(ldc_version)
+ set(D_IS_LLVM true)
+ set(D_COMPILER_NAME "LLVM-based D Compiler")
+ string(REGEX REPLACE "based on DMD v([0-9])\\.[0-9]+" "\\1" D_VERSION "${ldc_version}")
+ string(REGEX REPLACE "based on DMD v[0-9]\\.([0-9]+)" "\\1" D_FRONTEND "${ldc_version}")
+ else(ldc_version)
+ message(FATAL_ERROR "LDC compiler was found, but the version can not be processed")
+ endif(ldc_version)
+ else (is_ldc)
+ message(FATAL_ERROR "D compliler not found")
+ endif(is_ldc)
+ endif(dmd_version)
+ message(STATUS "D compiler found -- ${D_COMPILER_NAME} v${D_VERSION}.${D_FRONTEND}")
+else (DC)
+ message(FATAL_ERROR "D compliler not found")
+endif (DC)
+
+## Get D compiler path.
+get_filename_component(DC_PATH ${DC} PATH)
+if("${DC_PATH}" STREQUAL "")
+ find_program(dc_path_tmp ${DC})
+ get_filename_component(DC_PATH ${dc_path_tmp} PATH)
+ mark_as_advanced(dc_path_tmp)
+endif("${DC_PATH}" STREQUAL "")
+get_filename_component(dc_parent_dir ${DC_PATH} NAME)
+if("${dc_parent_dir}" STREQUAL "bin")
+ get_filename_component(DC_PATH ${DC_PATH} PATH)
+endif("${dc_parent_dir}" STREQUAL "bin")
+
+#option(ONE_BUILD_COMMAND "Build in one command" "OFF")
+set(ONE_BUILD_COMMAND OFF) ## TODO: test it and uncomment the previous line.
+
+if (NOT ONE_BUILD_COMMAND)
+ ## TODO: disable SINGLE_D_OBJECT option for ldc < rev. 1433.
+ if(D_IS_MARS)
+ set(opt_tmp "ON")
+ else(D_IS_MARS)
+ set(opt_tmp "OFF")
+ endif(D_IS_MARS)
+ option(SINGLE_D_OBJECT "Build all d sources to one object file" ${opt_tmp})
+ if(SINGLE_D_OBJECT AND D_IS_LLVM)
+ set(D_FLAGS ${D_FLAGS} -singleobj)
+ endif(SINGLE_D_OBJECT AND D_IS_LLVM)
+endif(NOT ONE_BUILD_COMMAND)
+
+## Specifics flags for build configurations.
+## TODO: Add another targets.
+set(D_RELEASE_FLAGS -O -release)
+if(D_IS_LLVM)
+ set(D_RELEASE_FLAGS ${D_RELEASE_FLAGS} -enable-inlining)
+else(D_IS_LLVM)
+ set(D_RELEASE_FLAGS ${D_RELEASE_FLAGS} -inline)
+endif(D_IS_LLVM)
+if(CMAKE_HOST_WIN32)
+ set(D_RELEASE_FLAGS ${D_RELEASE_FLAGS} -L/subsystem:windows)
+endif(CMAKE_HOST_WIN32)
+set(D_DEBUG_FLAGS -g -gc -debug)
+
+## Settings.
+if(CMAKE_HOST_WIN32)
+ set(D_OBJECT_SUFFIX .obj)
+ if(D_IS_MARS)
+ set(D_LIB_SUFFIX .lib)
+ set(D_LIB_PREFIX )
+ elseif(D_IS_LDC)
+ set(D_LIB_SUFFIX .a)
+ set(D_LIB_PREFIX lib)
+ endif(D_IS_MARS)
+elseif(CMAKE_HOST_UNIX)
+ set(D_LIB_SUFFIX .a)
+ set(D_LIB_PREFIX lib)
+ set(D_OBJECT_SUFFIX .o)
+endif(CMAKE_HOST_WIN32)
+
+##--------------------------------------------
+## Macroses and functions.
+##--------------------------------------------
+
+## Make native path.
+## Usage:
+## set(path c:/file_path/file_name.cpp)
+## make_native_path(path)
+## message(STATUS ${path})
+## Output:
+## -- "c:\file_path\file_name.cpp"
+## Command "file(TO_NATIVE_PATH ...)" is wrong on Windows
+macro(make_native_path pathname)
+ if(CMAKE_HOST_WIN32)
+ # An extra \\ escape is necessary to get a \ through CMake's processing.
+ string(REPLACE "/" "\\" ${pathname} "${${pathname}}")
+ # Enclose with UNESCAPED quotes. This means we need to escape our
+ # quotes once here, i.e. with \"
+ set(${pathname} \"${${pathname}}\")
+ endif(CMAKE_HOST_WIN32)
+endmacro(make_native_path)
+
+##
+## Example:
+## set(path 24.3+23.bin)
+## obj_path(path)
+## message(STATUS ${path})
+## Example output:
+## -- 24\.3\+23\.bin
+macro(regex_safe_string outvariable)
+ set(${outvariable} ${ARGN})
+ set(__regex_chars__ ^ $ . ] [ - * + ? | \( \))
+ foreach(__regex_char__ ${__regex_chars__})
+ string(REPLACE "${__regex_char__}"
+ "\\${__regex_char__}" ${outvariable} ${${outvariable}}
+ )
+ endforeach(__regex_char__ ${__regex_chars__})
+endmacro(regex_safe_string outvariable)
+
+## Remove unnecessary path to the object file.
+## path -- path to object file.
+## Example:
+## set(path ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/target.dir/main.d.obj)
+## obj_path(path)
+## message(STATUS ${path})
+## Example output:
+## -- CMakeFiles/target.dir/main.d.obj
+macro(obj_path path)
+ regex_safe_string(cbd_safe_tmp ${CMAKE_CURRENT_BINARY_DIR})
+ regex_safe_string(csd_safe_tmp ${CMAKE_CURRENT_SOURCE_DIR})
+ set(regexp_str_tmp "(${cbd_safe_tmp}/|${csd_safe_tmp}/|)(.+)")
+ string(REGEX REPLACE ${regexp_str_tmp} "\\2" ${path} "${${path}}")
+endmacro(obj_path path)
+
+## Compile d files.
+## target -- name of a new target.
+## objects_list -- created object files.
+## params -- sources files.
+macro(compile_d_files target objects_list)
+ set(${objects_list})
+ set(tmp_dir_tmp ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${target}.dir)
+
+ set(type_tmp SOURCES)
+ set(SOURCES_tmp )
+ set(FLAGS_tmp )
+
+ ## Parse parameters list.
+ set(params_tmp SOURCES FLAGS)
+ foreach(arg_tmp ${ARGN})
+ set(founded_type_tmp)
+ if(NOT founded_type_tmp)
+ foreach(param_tmp ${params_tmp})
+ if(arg_tmp STREQUAL param_tmp)
+ set(type_tmp ${param_tmp})
+ set(founded_type_tmp 1)
+ break(param_tmp ${params_tmp})
+ endif(arg_tmp STREQUAL param_tmp)
+ endforeach(param_tmp ${params_tmp})
+ endif(NOT founded_type_tmp)
+ if(NOT founded_type_tmp)
+ set(${type_tmp}_tmp ${${type_tmp}_tmp} ${arg_tmp})
+ endif(NOT founded_type_tmp)
+ endforeach(arg_tmp ${ARGN})
+
+ if(NOT SINGLE_D_OBJECT)
+ set(${objects_list})
+ foreach (d_source_p_tmp ${SOURCES_tmp})
+ get_filename_component(ext_tmp ${d_source_p_tmp} EXT)
+ find_file(d_source_p_tmp ${d_source_p_tmp} PATHS ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_BINARY_DIR} ${CMAKE_SOURCE_DIR})
+ set (d_source_tmp ${d_source_p_tmp})
+ obj_path(d_source_tmp)
+ set(d_obj_tmp ${tmp_dir_tmp}/${d_source_tmp}${D_OBJECT_SUFFIX})
+ set(${objects_list} ${${objects_list}} ${d_obj_tmp})
+ get_filename_component(path_tmp ${d_obj_tmp} PATH)
+ file(MAKE_DIRECTORY ${path_tmp})
+ set(d_obj_out_tmp ${d_obj_tmp})
+ obj_path(d_obj_out_tmp)
+ #get_imported_files(depends_tmp ${d_source_p_tmp}) ## Too slow.....
+ add_custom_command(OUTPUT "${d_obj_tmp}"
+ COMMAND "${DC}"
+ ARGS ${FLAGS_tmp} ${d_source_p_tmp} -c -of${d_obj_tmp}
+ COMMENT "Building ${d_obj_out_tmp}"
+ DEPENDS ${d_source_p} ${depends_tmp}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ )
+ endforeach (d_source_p_tmp ${SOURCES_tmp})
+ else(NOT SINGLE_D_OBJECT)
+ set(object_tmp ${tmp_dir_tmp}/${target}${D_OBJECT_SUFFIX})
+ set(d_obj_out_tmp ${${objects_list}})
+ obj_path(d_obj_out_tmp)
+ set(parameters_tmp ${FLAGS_tmp} -c ${SOURCES_tmp} -of${object_tmp})
+ set(parameters_list_file_tmp ${tmp_dir_tmp}/parameters_obj)
+ if(CMAKE_HOST_WIN32)
+ file(REMOVE ${parameters_list_file_tmp})
+ foreach(arg_tmp ${parameters_tmp})
+ file(APPEND ${parameters_list_file_tmp} "${arg_tmp}\n")
+ endforeach(arg_tmp)
+ set(param_tmp @${parameters_list_file_tmp})
+ elseif(CMAKE_HOST_UNIX)
+ set(param_tmp ${parameters_tmp})
+ endif(CMAKE_HOST_WIN32)
+ #get_imported_files(depends_tmp ${ARGN})
+ add_custom_command(OUTPUT "${object_tmp}"
+ COMMAND "${DC}"
+ ARGS ${param_tmp}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ DEPENDS ${SOURCES_tmp} ${depends_tmp}
+ COMMENT ""
+ )
+ set(${objects_list} ${object_tmp})
+ endif(NOT SINGLE_D_OBJECT)
+ #add_custom_target(${target} DEPENDS "${${objects_list}}")
+endmacro(compile_d_files objects_list)
+
+
+## Add D target.
+## name -- target name.
+## Params:
+## TYPE -- target type.
+## STATIC -- static library.
+## SHARED -- shared library.
+## BINARY -- executable.
+## SOURCES -- sources of the target.
+## INCLUDES -- include paths.
+## FLAGS -- build flags.
+## LIBS -- libraries for link.
+## LIB_PATHS -- libraries paths.
+## DEPENDS -- target depends.
+macro(add_d_target name)
+ set(type_tmp SOURCES)
+ set(TYPE_tmp)
+ set(INCLUDES_tmp )
+ set(FLAGS_tmp )
+ set(SOURCES_tmp )
+ set(OBJECTS_tmp )
+ set(LIBS_tmp )
+ set(LIB_PATHS_tmp)
+ set(DEPENDS_tmp)
+ set(OUTPUT_PATH_tmp )
+ set(compile_flags_tmp ${D_FLAGS})
+ set(additional_commands_tmp )
+ set(link_flags_tmp )
+
+ ## Parse parameters list.
+ set(params_tmp TYPE INCLUDES FLAGS SOURCES OBJECTS LIBS LIB_PATHS DEPENDS OUTPUT_PATH)
+ foreach(arg_tmp ${ARGN})
+ set(founded_type_tmp)
+ if(${arg_tmp} STREQUAL "DETECT_DEPENDS")
+ set(auto_detect_depentes_tmp 1)
+ set(founded_type_tmp 1)
+ endif(${arg_tmp} STREQUAL "DETECT_DEPENDS")
+ if(NOT founded_type_tmp)
+ foreach(param_tmp ${params_tmp})
+ if(arg_tmp STREQUAL param_tmp)
+ set(type_tmp ${param_tmp})
+ set(founded_type_tmp 1)
+ break(param_tmp ${params_tmp})
+ endif(arg_tmp STREQUAL param_tmp)
+ endforeach(param_tmp ${params_tmp})
+ endif(NOT founded_type_tmp)
+ if(NOT founded_type_tmp)
+ set(${type_tmp}_tmp ${${type_tmp}_tmp} ${arg_tmp})
+ endif(NOT founded_type_tmp)
+ endforeach(arg_tmp ${ARGN})
+
+ ## Init target type.
+ if (OUTPUT_PATH_tmp)
+ set(output_name_tmp "${OUTPUT_PATH_tmp}")
+ endif (OUTPUT_PATH_tmp)
+ if("${TYPE_tmp}" STREQUAL "STATIC")
+ set(link_flags_tmp ${link_flags_tmp} -lib)
+ if(NOT OUTPUT_PATH_tmp)
+ if(ARCHIVE_OUTPUT_DIRECTORY)
+ set(output_name_tmp ${ARCHIVE_OUTPUT_DIRECTORY})
+ else(ARCHIVE_OUTPUT_DIRECTORY)
+ set(output_name_tmp ${CMAKE_CURRENT_BINARY_DIR}/lib)
+ endif(ARCHIVE_OUTPUT_DIRECTORY)
+ endif(NOT OUTPUT_PATH_tmp)
+ set(output_name_tmp ${output_name_tmp}/${D_LIB_PREFIX}${name}${D_LIB_SUFFIX})
+ elseif("${TYPE_tmp}" STREQUAL "BINARY")
+ set(build_binary_tmp 1)
+ if(NOT OUTPUT_PATH_tmp)
+ if(RUNTIME_OUTPUT_DIRECTORY)
+ set(output_name ${RUNTIME_OUTPUT_DIRECTORY})
+ else(RUNTIME_OUTPUT_DIRECTORY)
+ set(output_name_tmp ${CMAKE_CURRENT_BINARY_DIR}/bin)
+ endif(RUNTIME_OUTPUT_DIRECTORY)
+ endif(NOT OUTPUT_PATH_tmp)
+ set(output_name_tmp ${output_name_tmp}/${name}${CMAKE_EXECUTABLE_SUFFIX})
+ elseif("${TYPE_tmp}" STREQUAL "SHARED")
+ if(D_IS_MARS)
+ message(FATAL_ERROR "DMD not support building shared library")
+ endif(D_IS_MARS)
+ if(NOT OUTPUT_PATH_tmp)
+ if(LIBRARY_OUTPUT_DIRECTORY)
+ set(output_name_tmp ${LIBRARY_OUTPUT_DIRECTORY})
+ else(LIBRARY_OUTPUT_DIRECTORY)
+ set(output_name_tmp ${CMAKE_CURRENT_BINARY_DIR}/lib)
+ endif(LIBRARY_OUTPUT_DIRECTORY)
+ endif(NOT OUTPUT_PATH_tmp)
+ set(build_binary 1)
+ set(output_name_tmp ${output_name_tmp}/${CMAKE_SHARED_LIBRARY_PREFIX}${name}${CMAKE_SHARED_LIBRARY_SUFFIX})
+ set(link_flags_tmp ${compile_flags_tmp} -L-shared)
+ else("${TYPE_tmp}" STREQUAL "STATIC")
+ message(FATAL_ERROR "D target ${TYPE_tmp} not supported")
+ endif("${TYPE_tmp}" STREQUAL "STATIC")
+
+ ## Include paths.
+ foreach(inc_tmp ${INCLUDES_tmp} ${D_INCLUDES})
+ set(compile_flags_tmp ${compile_flags_tmp} -I${inc_tmp})
+ endforeach(inc_tmp ${INCLUDES_tmp} ${D_INCLUDES})
+
+ ## Libraries and paths of them.
+ set(libs_tmp)
+ if(build_binary_tmp)
+ if(D_IS_MARS AND CMAKE_HOST_WIN32)
+ foreach(lib_path_tmp ${LIB_PATHS_tmp} ${D_LIB_PATHS})
+ make_native_path(lib_path_tmp)
+ string(REPLACE "/" "\\" lib_path_tmp "${lib_path_tmp}//")
+ set(lib_path_tmp \"${lib_path_tmp}\")
+ set(link_flags_tmp ${link_flags_tmp} -L+${lib_path_tmp})
+ endforeach(lib_path_tmp ${LIB_PATHS_tmp} ${D_LIB_PATHS})
+ #set(additional_commands_tmp COMMAND set ARGS LIB=)
+ #foreach(lib_path_tmp ${LIB_PATHS_tmp} ${D_LIB_PATHS})
+ #MAKE_NATIVE_PATH(lib_path_tmp)
+ #set(additional_commands_tmp ${additional_commands_tmp}${lib_path_tmp};)
+ #endforeach(lib_path_tmp ${LIB_PATHS_tmp} ${D_LIB_PATHS})
+ else(D_IS_MARS AND CMAKE_HOST_WIN32)
+ foreach(lib_path_tmp ${LIB_PATHS_tmp} ${D_LIB_PATHS})
+ set(link_flags_tmp ${link_flags_tmp} -L-L${lib_path_tmp})
+ endforeach(lib_path_tmp ${LIB_PATHS_tmp} ${D_LIB_PATHS})
+ endif(D_IS_MARS AND CMAKE_HOST_WIN32)
+ foreach(lib_tmp ${LIBS_tmp} ${D_LIBS})
+ if(D_IS_MARS AND CMAKE_HOST_WIN32)
+ set(link_flags_tmp ${link_flags_tmp} -L+${lib_tmp})
+ else(D_IS_MARS AND CMAKE_HOST_WIN32)
+ set(link_flags_tmp ${link_flags_tmp} -L-l${lib_tmp})
+ endif(D_IS_MARS AND CMAKE_HOST_WIN32)
+ endforeach(lib_tmp ${LIBS_tmp} ${D_LIBS})
+ endif(build_binary_tmp)
+
+ set(not_obj_tmp ${ONE_BUILD_COMMAND})
+ ## Ldc not support -lib flag.
+ if(ONE_BUILD_COMMAND AND ${TYPE_tmp} STREQUAL "STATIC" AND D_IS_LLVM)
+ set(not_obj_tmp OFF)
+ endif(ONE_BUILD_COMMAND AND ${TYPE_tmp} STREQUAL "STATIC" AND D_IS_LLVM)
+
+ if(build_binary_tmp AND NOT D_IS_MARS)
+ set(compile_flags_tmp ${compile_flags_tmp} -od${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${name}.dir)
+ endif(build_binary_tmp AND NOT D_IS_MARS)
+
+ if(CMAKE_BUILD_TYPE)
+ string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UPPER)
+ set(compile_flags_tmp ${compile_flags_tmp} ${D_${CMAKE_BUILD_TYPE_UPPER}_FLAGS})
+ endif(CMAKE_BUILD_TYPE)
+
+ if(auto_detect_depentes_tmp)
+ get_files_depends(SOURCES_tmp ${SOURCES_tmp})
+ endif(auto_detect_depentes_tmp)
+
+ set(used_ar_tmp)
+ get_filename_component(output_path_tmp ${output_name_tmp} PATH)
+ if (NOT not_obj_tmp)
+ compile_d_files(${name} objs_tmp ${SOURCES_tmp} FLAGS ${compile_flags_tmp})
+ set(SOURCES_tmp ${objs_tmp})
+ if(NOT D_IS_MARS AND ${TYPE_tmp} STREQUAL "STATIC")
+ set(parameters_tmp rcs ${output_name_tmp} ${SOURCES_tmp} ${OBJECTS_tmp})
+ set(parameters_list_file_tmp ${tmp_dir_tmp}/parameters)
+ if(CMAKE_HOST_WIN32)
+ file(REMOVE ${parameters_list_file_tmp})
+ foreach(arg_tmp ${parameters_tmp})
+ file(APPEND ${parameters_list_file_tmp} "${arg_tmp}\n")
+ endforeach(arg_tmp)
+ set(param_tmp @${parameters_list_file_tmp})
+ elseif(CMAKE_HOST_UNIX)
+ set(param_tmp ${parameters_tmp})
+ endif(CMAKE_HOST_WIN32)
+ add_custom_command(
+ OUTPUT "${output_name_tmp}"
+ COMMAND "${CMAKE_AR}"
+ ARGS ${param_tmp}
+ DEPENDS ${SOURCES_tmp}
+ COMMENT "Linking ${lib_name}"
+ )
+ set(used_ar_tmp 1)
+ endif(NOT D_IS_MARS AND ${TYPE_tmp} STREQUAL "STATIC")
+ endif (NOT not_obj_tmp)
+
+ if (NOT used_ar_tmp)
+ set(output_name_native_tmp ${output_name_tmp})
+ if(D_IS_MARS)
+ set(additional_commands_tmp ${additional_commands_tmp} COMMAND ${CMAKE_COMMAND} -E make_directory ${output_path_tmp})
+ make_native_path(output_name_native_tmp)
+ endif(D_IS_MARS)
+ set(parameters_tmp ${compile_flags_tmp} ${link_flags_tmp} ${SOURCES_tmp} ${OBJECTS_tmp} -of${output_name_native_tmp})
+ set(parameters_list_file_tmp ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${name}.dir/parameters)
+ if(CMAKE_HOST_WIN32)
+ file(REMOVE ${parameters_list_file_tmp})
+ foreach(arg_tmp ${parameters_tmp})
+ file(APPEND ${parameters_list_file_tmp} "${arg_tmp}\n")
+ endforeach(arg_tmp)
+ set(param_tmp @${parameters_list_file_tmp})
+ elseif(CMAKE_HOST_UNIX)
+ set(param_tmp ${parameters_tmp})
+ endif(CMAKE_HOST_WIN32)
+ #get_imported_files(depends_tmp ${SOURCES_tmp})
+ add_custom_command(
+ OUTPUT ${output_name_tmp}
+ ${additional_commands_tmp}
+ COMMAND ${DC}
+ ARGS ${param_tmp}
+ DEPENDS ${SOURCES_tmp} ${depends_tmp}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ COMMENT "Linking ${name}"
+ )
+ endif(NOT used_ar_tmp)
+ add_custom_target(${name} ALL DEPENDS ${DEPENDS_tmp} ${output_name_tmp})
+endmacro(add_d_target name)
+
+## Add static library target.
+macro(add_d_static_lib name)
+ add_d_target(${name} TYPE STATIC SOURCES ${ARGN})
+endmacro(add_d_static_lib name)
+
+## Add binary target.
+macro(add_d_program name)
+ add_d_target(${name} TYPE BINARY SOURCES ${ARGN})
+endmacro(add_d_program name)
+
+## Add shared library target.
+macro(add_d_shared_lib name)
+ add_d_target(${name} TYPE SHARED SOURCES ${ARGN})
+endmacro(add_d_shared_lib name)
+
+## Add library target.
+## If it support library would shared.
+macro(add_d_lib name)
+ if(D_IS_MARS)
+ add_d_target(${name} TYPE STATIC ${ARGN})
+ else(D_IS_MARS)
+ add_d_target(${name} TYPE SHARED ${ARGN})
+ endif(D_IS_MARS)
+endmacro(add_d_lib name)
+
+##
+macro(get_imported_files imported)
+ execute_process(COMMAND ${DC} -c -o- -v ${compile_flags_tmp} ${ARGN}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ OUTPUT_VARIABLE dc_output_tmp
+ )
+ string(REGEX MATCHALL "import[^\\(]*([^\\)]*)" dc_output_tmp "${dc_output_tmp}")
+ set(${imported})
+ foreach(import_tmp ${dc_output_tmp})
+ string(REGEX REPLACE "import[^\\(]*\\(([^\\)]*)" "\\1" import_tmp ${import_tmp})
+ set(${imported} ${${imported}} ${import_tmp})
+ endforeach(import_tmp ${dc_output_tmp})
+endmacro(get_imported_files imported)
+
+macro(filter_paths result)
+ set(${result})
+ set(read_now_tmp paths)
+ set(include_tmp)
+ set(paths_tmp)
+ foreach(arg_tmp ${ARGN})
+ set(founded_tmp)
+ if(${arg_tmp} STREQUAL "INCLUDE_PATHS")
+ set(read_now_tmp includes)
+ set(founded_tmp 1)
+ elseif(${arg_tmp} STREQUAL "INCLUDE_CURRENT_DIR")
+ set(locale_tmp 1)
+ set(read_now_tmp paths)
+ set(founded_tmp 1)
+ endif(${arg_tmp} STREQUAL "INCLUDE_PATHS")
+ if(NOT founded_tmp)
+ set(${read_now_tmp}_tmp ${${read_now_tmp}_tmp} ${arg_tmp})
+ endif(NOT founded_tmp)
+ endforeach(arg_tmp ${ARGN})
+ regex_safe_string(include_tmp ${includes_tmp})
+ set(regex_include_tmp)
+ set(is_first_tmp 1)
+ foreach(include_tmp ${includes_tmp})
+ if(is_first_tmp)
+ set(is_first_tmp 1)
+ else(is_first_tmp)
+ set(regex_includes_tmp ${regex_includes_tmp}|)
+ endif(is_first_tmp)
+ set(regex_includes_tmp ${regex_includes_tmp}${include_tmp})
+ endforeach(include_tmp ${include_tmp})
+ foreach(path_tmp ${paths_tmp})
+ file(TO_CMAKE_PATH path_tmp ${path_tmp})
+ string(REGEX MATCH "(${regex_includes_tmp})[^/]*" found "${path_tmp}")
+ set(full_path_tmp 1)
+ if(locale_tmp)
+ string(SUBSTRING "${path_tmp}" 0 1 first_sym_tmp)
+ set(full_path_tmp)
+ if(${first_sym_tmp} STREQUAL "/")
+ set(full_path_tmp 1)
+ endif(${first_sym_tmp} STREQUAL "/")
+ endif(locale_tmp)
+ if(NOT found AND full_path_tmp)
+ else(NOT found AND full_path_tmp)
+ set(${result} ${${result}} ${path_tmp})
+ endif(NOT found AND full_path_tmp)
+ endforeach(path_tmp ${paths_tmp})
+endmacro(filter_paths )
+
+macro(get_files_depends out)
+ get_imported_files(${out} ${ARGN})
+ filter_paths(${out} ${${out}} INCLUDE_CURRENT_DIR INCLUDE_PATHS ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR})
+ set(${out} ${ARGN} ${${out}})
+endmacro(get_files_depends out)
\ No newline at end of file
diff -r 6d5eeec1d9a1 -r a860544c5ee8 generator/CMakeLists.txt
--- a/generator/CMakeLists.txt Sun Jun 07 14:05:29 2009 +0000
+++ b/generator/CMakeLists.txt Sun Jun 07 14:31:36 2009 +0000
@@ -1,311 +1,335 @@
-PROJECT(generator CXX C)
-cmake_minimum_required(VERSION 2.6)
-FIND_PACKAGE(Qt4 REQUIRED)
-
-## Sources
-set(srcs
- classlistgenerator.cpp
- cppgenerator.cpp
- cppheadergenerator.cpp
- cppimplgenerator.cpp
- docparser.cpp
- generatorsetd.cpp
- dgenerator.cpp
- jumptable.cpp
- metainfogenerator.cpp
- metajavabuilder.cpp
- qdocgenerator.cpp
- uiconverter.cpp
- containergenerator.cpp
-
- generator.cpp
- main.cpp
- reporthandler.cpp
- typeparser.cpp
- typesystem.cpp
- asttoxml.cpp
- fileout.cpp
- generatorset.cpp
- metajava.cpp
- customtypes.cpp
- abstractmetabuilder.cpp
- abstractmetalang.cpp
- prigenerator.cpp
-
- # rxx
- parser/ast.cpp
- parser/lexer.cpp
- parser/list.cpp
- parser/parser.cpp
- parser/smallobject.cpp
- parser/control.cpp
- parser/visitor.cpp
- parser/default_visitor.cpp
- parser/dumptree.cpp
- parser/tokens.cpp
- parser/binder.cpp
- parser/codemodel.cpp
- parser/type_compiler.cpp
- parser/name_compiler.cpp
- parser/declarator_compiler.cpp
- parser/class_compiler.cpp
- parser/codemodel_finder.cpp
- parser/compiler_utils.cpp
-
- ## rpp
- parser/rpp/preprocessor.cpp
-)
-## Moc headers
-set(moc_hdrs
- classlistgenerator.h
- cppgenerator.h
- cppheadergenerator.h
- cppimplgenerator.h
- docparser.h
- generatorsetd.h
- dgenerator.h
- jumptable.h
- metainfogenerator.h
- metajavabuilder.h
- qdocgenerator.h
- uiconverter.h
- containergenerator.h
- generator.h
- main.h
- reporthandler.h
- typeparser.h
- typesystem.h
- asttoxml.h
- fileout.h
- generatorset.h
- metajava.h
- customtypes.h
- abstractmetabuilder.h
- abstractmetalang.h
- prigenerator.h
-
- ## rxx
- parser/ast.h
- parser/lexer.h
- parser/list.h
- parser/parser.h
- parser/rxx_allocator.h
- parser/rpp-allocator.h
- parser/smallobject.h
- parser/tokens.h
- parser/symbol.h
- parser/control.h
- parser/visitor.h
- parser/default_visitor.h
- parser/dumptree.h
- parser/binder.h
- parser/codemodel.h
- parser/codemodel_pointer.h
- parser/codemodel_fwd.h
- parser/type_compiler.h
- parser/name_compiler.h
- parser/declarator_compiler.h
- parser/class_compiler.h
- parser/codemodel_finder.h
- parser/compiler_utils.h
-
- # rpp
- parser/rpp/pp-cctype.h
- parser/rpp/pp-engine-bits.h
- parser/rpp/pp-engine.h
- parser/rpp/pp-environment.h
- parser/rpp/pp-fwd.h
- parser/rpp/pp-internal.h
- parser/rpp/pp-iterator.h
- parser/rpp/pp-macro-expander.h
- parser/rpp/pp-macro.h
- parser/rpp/pp-scanner.h
- parser/rpp/pp-string.h
- parser/rpp/pp-symbol.h
- parser/rpp/pp.h
- parser/rpp/preprocessor.h
-
-)
-
-## Resources.
-set(res_files
- generator.qrc
-)
-
-#win32-msvc2005:{
-# QMAKE_CXXFLAGS += -wd4996
-# QMAKE_CFLAGS += -wd4996
-#}
-
-#win32-msvc.net {
-# QMAKE_CXXFLAGS += /Zm500
-# QMAKE_CXXFLAGS -= -Zm200
-# QMAKE_CFLAGS -= -Zm200
-#}
-
-## Includes path.
-set(inc_paths
- ${CMAKE_CURRENT_SOURCE_DIR}/../common
- ${CMAKE_CURRENT_SOURCE_DIR}/parser
- ${CMAKE_CURRENT_SOURCE_DIR}
- ${CMAKE_CURRENT_SOURCE_DIR}/parser/rpp
- #${CMAKE_CURRENT_SOURCE_DIR}/parser/include
-)
-
-add_definitions(-DRXX_ALLOCATOR_INIT_0)
-
-## Build project
-find_package (Qt4 REQUIRED)
-set (QT_USE_QTMAIN true)
-set (QT_USE_QTGUI false)
-set (QT_USE_QTXML true)
-include(${QT_USE_FILE} ${CMAKE_CURRENT_SOURCE_DIR})
-
-set(inc_paths
- ${inc_paths}
- ${QT_INCLUDES}
-)
-set(lib_paths
- ${lib_paths}
- ${QT_LIBRARY_DIR}
-)
-set(libs
- ${QT_LIBRARIES}
-)
-
-qt4_wrap_cpp(moc_srcs ${moc_hdrs})
-qt4_add_resources(res_wrapped_files ${res_files})
-
-set (all_srcs
- ${srcs} ${moc_srcs}
- ${res_wrapped_files})
-include_directories(${inc_paths})
-add_executable(generator ${all_srcs} )
-target_link_libraries(generator ${libs})
-
-macro(add_dgen_target package)
- string(TOLOWER ${package} package)
- set(dgen_build_conf ${CMAKE_BINARY_DIR}/CMakeFiles/built_${package}.txt)
- set(dgen_build_conf_req ${CMAKE_BINARY_DIR}/CMakeFiles/built_${package}_with_req.txt)
- file(REMOVE ${dgen_build_conf})
- file(REMOVE ${dgen_build_conf_req})
- file(APPEND ${dgen_build_conf} "\n")
- file(APPEND ${dgen_build_conf_req} "\n")
- foreach(req ${ARGN})
- string(TOLOWER ${req} req_lower)
- file(APPEND ${dgen_build_conf} " \n")
- file(APPEND ${dgen_build_conf_req} " \n")
- endforeach(req ${ARGN})
-
- if(${package} STREQUAL "all")
- foreach(pack ${ARGN})
- set(dgen_impl ${CMAKE_BINARY_DIR}/cpp/qt_${pack}/metainfo.cpp) ## Temporary
- break(pack ${ARGN})
- endforeach(pack ${ARGN})
- else(${package} STREQUAL "all")
- set(dgen_impl ${CMAKE_BINARY_DIR}/cpp/qt_${package}/qt_${package}.pri)
- set(gen_sources ${gen_sources} ${CMAKE_SOURCE_DIR}/generator/typesystem_${package}.xml
- ${CMAKE_SOURCE_DIR}/generator/typesystem_${package}-java.java)
- file(APPEND ${dgen_build_conf} " \n")
- file(APPEND ${dgen_build_conf_req} " \n")
- endif(${package} STREQUAL "all")
-
- file(APPEND ${dgen_build_conf} "\n")
- file(APPEND ${dgen_build_conf_req} "\n")
-
- foreach(pack ${ARGN})
- string(TOLOWER ${pack} pack_lower)
- set(gen_sources ${gen_sources} ${CMAKE_SOURCE_DIR}/generator/typesystem_${pack_lower}.xml
- ${CMAKE_SOURCE_DIR}/generator/typesystem_${pack_lower}-java.java)
- endforeach(pack ${ARGN})
-
- add_custom_command(OUTPUT ${dgen_impl}
- COMMAND ${CMAKE_COMMAND} -E remove -f ${dgen_impl}
- COMMAND "generator"
- ARGS ${GEN_OPT} --no-repreprocess --qt-include-directory=${QT_INCLUDE_DIR} --output-directory=./
- --source-directory=${CMAKE_SOURCE_DIR}/generator
- qtjambi_masterinclude.h
- ${dgen_build_conf}
- COMMENT "Generating binding..."
- DEPENDS generator ${gen_sources}
- )
- add_custom_target(dgen_${package} DEPENDS ${dgen_impl} COMMENT "")
-endmacro(add_dgen_target target package required)
-
-foreach(pack ${packages})
- set(gen_typesystem ${gen_typesystem} ${CMAKE_SOURCE_DIR}/generator/typesystem_${pack}.xml)
- set(gen_sources ${gen_sources} ${CMAKE_SOURCE_DIR}/generator/typesystem_${pack}-java.java)
-endforeach(pack ${packages})
-
-set(dgen_build_conf ${CMAKE_BINARY_DIR}/CMakeFiles/build.txt)
-file(REMOVE ${dgen_build_conf})
-file(APPEND ${dgen_build_conf} "\n")
-foreach(package ${packages})
- file(APPEND ${dgen_build_conf} " \n")
-endforeach(package ${packages})
-file(APPEND ${dgen_build_conf} "\n")
-
-# macro(add_sources_for_generating)
-# set(parameters_list_file ${CMAKE_BINARY_DIR}/CMakeFiles/dgen_parameters)
-# if(${CMAKE_SYSTEM_NAME} STREQUAL Windows)
-# file(REMOVE ${parameters_list_file})
-# foreach(arg ${ARGN})
-# file(APPEND ${parameters_list_file} "${arg}\n")
-# endforeach(arg)
-# set(param @${parameters_list_file})
-# elseif(${CMAKE_SYSTEM_NAME} STREQUAL Linux)
-# set(param ${parameters})
-# endif(${CMAKE_SYSTEM_NAME} STREQUAL Windows)
-# foreach(dgen_impl ${ARGN})
-# add_custom_command(OUTPUT ${dgen_impl}
-# COMMAND ${CMAKE_COMMAND} -E remove -f ${param}
-# COMMAND "generator"
-# ARGS ${GEN_OPT} --qt-include-directory=${QT_INCLUDE_DIR} --output-directory=${CMAKE_BINARY_DIR}
-# --source-directory=${CMAKE_SOURCE_DIR}/generator
-# qtjambi_masterinclude.h
-# ${CMAKE_BINARY_DIR}/CMakeFiles/build.txt
-# COMMENT "Generating binding..."
-# DEPENDS generator ${gen_typesystem} ${gen_sources}
-# )
-# endforeach(dgen_impl ${ARGN})
-# add_custom_target(dgen DEPENDS ${ARGN})
-# endmacro(add_sources_for_generating)
-
-set(gen_sources)
-foreach(package ${packages})
- set(gen_sources ${gen_sources} ${CMAKE_SOURCE_DIR}/generator/typesystem_${package}.xml)
- find_file(d_inc_file_found typesystem_${package}-java.java PATHS ${CMAKE_SOURCE_DIR}/generator/)
- if(d_inc_file_found)
- set(${CMAKE_SOURCE_DIR}/generator/typesystem_${package}-java.java)
- endif(d_inc_file_found)
-endforeach(package ${packages})
-mark_as_advanced(d_inc_file_found)
-set(d_inc_file_found 1)
-
-foreach(package ${packages})
- set(dgen_impl ${CMAKE_BINARY_DIR}/cpp/qt_${package}/qt_${package}.pri)
- break(package ${packages})
-endforeach(package ${packages})
-
-add_custom_command(OUTPUT ${dgen_impl}
- COMMAND ${CMAKE_COMMAND} -E remove -f ${dgen_impl}
- COMMAND "generator"
- ARGS ${GEN_OPT} --qt-include-directory=${QT_INCLUDE_DIR} --output-directory=${CMAKE_BINARY_DIR}
- --source-directory=${CMAKE_SOURCE_DIR}/generator
- qtjambi_masterinclude.h
- ${CMAKE_BINARY_DIR}/CMakeFiles/build.txt
- COMMENT "Generating binding..."
- DEPENDS generator ${gen_sources}
- )
-add_custom_target(dgen DEPENDS ${dgen_impl} COMMENT "")
-
-macro(add_sources_for_generating)
- foreach(source ${ARGN})
- add_custom_command(OUTPUT "${source}"
- COMMAND ""
- ARGS ""
- DEPENDS ${dgen_impl}
- COMMENT ""
- )
- endforeach(source ${ARGN})
+PROJECT(generator CXX C)
+cmake_minimum_required(VERSION 2.6)
+FIND_PACKAGE(Qt4 REQUIRED)
+
+## Force Release settings
+STRING(TOUPPER "${CMAKE_BUILD_TYPE}" build_type_upper)
+set(CMAKE_CXX_FLAGS_${build_type_upper} ${CMAKE_CXX_FLAGS_RELEASE})
+get_property(dir_prop DIRECTORY
+ PROPERTY COMPILE_DEFINITIONS_RELEASE)
+set_property(DIRECTORY PROPERTY COMPILE_DEFINITIONS_${build_type_upper} ${dir_prop})
+
+## Sources
+set(srcs
+ classlistgenerator.cpp
+ cppgenerator.cpp
+ cppheadergenerator.cpp
+ cppimplgenerator.cpp
+ docparser.cpp
+ generatorsetd.cpp
+ dgenerator.cpp
+ jumptable.cpp
+ metainfogenerator.cpp
+ metajavabuilder.cpp
+ qdocgenerator.cpp
+ uiconverter.cpp
+ containergenerator.cpp
+
+ generator.cpp
+ main.cpp
+ reporthandler.cpp
+ typeparser.cpp
+ typesystem.cpp
+ asttoxml.cpp
+ fileout.cpp
+ generatorset.cpp
+ metajava.cpp
+ customtypes.cpp
+ abstractmetabuilder.cpp
+ abstractmetalang.cpp
+ prigenerator.cpp
+
+ # rxx
+ parser/ast.cpp
+ parser/lexer.cpp
+ parser/list.cpp
+ parser/parser.cpp
+ parser/smallobject.cpp
+ parser/control.cpp
+ parser/visitor.cpp
+ parser/default_visitor.cpp
+ parser/dumptree.cpp
+ parser/tokens.cpp
+ parser/binder.cpp
+ parser/codemodel.cpp
+ parser/type_compiler.cpp
+ parser/name_compiler.cpp
+ parser/declarator_compiler.cpp
+ parser/class_compiler.cpp
+ parser/codemodel_finder.cpp
+ parser/compiler_utils.cpp
+
+ ## rpp
+ parser/rpp/preprocessor.cpp
+)
+## Moc headers
+set(moc_hdrs
+ #classlistgenerator.h
+ cppgenerator.h
+ cppheadergenerator.h
+ cppimplgenerator.h
+ #docparser.h
+ generatorsetd.h
+ dgenerator.h
+ jumptable.h
+ #metainfogenerator.h
+ #metajavabuilder.h
+ #qdocgenerator.h
+ #uiconverter.h
+ containergenerator.h
+ generator.h
+ #main.h
+ #reporthandler.h
+ #typeparser.h
+ #typesystem.h
+ #asttoxml.h
+ fileout.h
+ generatorset.h
+ #metajava.h
+ #customtypes.h
+ #abstractmetabuilder.h
+ #abstractmetalang.h
+ prigenerator.h
+
+ ## rxx
+ #parser/ast.h
+ #parser/lexer.h
+ #parser/list.h
+ #parser/parser.h
+ #parser/rxx_allocator.h
+ #parser/rpp-allocator.h
+ #parser/smallobject.h
+ #parser/tokens.h
+ #parser/symbol.h
+ #parser/control.h
+ #parser/visitor.h
+ #parser/default_visitor.h
+ #parser/dumptree.h
+ #parser/binder.h
+ #parser/codemodel.h
+ #parser/codemodel_pointer.h
+ #parser/codemodel_fwd.h
+ #parser/type_compiler.h
+ #parser/name_compiler.h
+ #parser/declarator_compiler.h
+ #parser/class_compiler.h
+ #parser/codemodel_finder.h
+ #parser/compiler_utils.h
+
+ # rpp
+ #parser/rpp/pp-cctype.h
+ #parser/rpp/pp-engine-bits.h
+ #parser/rpp/pp-engine.h
+ #parser/rpp/pp-environment.h
+ #parser/rpp/pp-fwd.h
+ #parser/rpp/pp-internal.h
+ #parser/rpp/pp-iterator.h
+ #parser/rpp/pp-macro-expander.h
+ #parser/rpp/pp-macro.h
+ #parser/rpp/pp-scanner.h
+ #parser/rpp/pp-string.h
+ #parser/rpp/pp-symbol.h
+ #parser/rpp/pp.h
+ #parser/rpp/preprocessor.h
+
+)
+
+## Resources.
+set(res_files
+ generator.qrc
+)
+
+#win32-msvc2005:{
+# QMAKE_CXXFLAGS += -wd4996
+# QMAKE_CFLAGS += -wd4996
+#}
+
+#if(MSVC)
+# set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /Zm500 /Zc:wchar_t-")
+#endif(MSVC)
+
+#win32-msvc.net {
+# QMAKE_CXXFLAGS += /Zm500
+# QMAKE_CXXFLAGS -= -Zm200
+# QMAKE_CFLAGS -= -Zm200
+#}
+
+## Includes path.
+set(inc_paths
+ ${CMAKE_CURRENT_SOURCE_DIR}/../common
+ ${CMAKE_CURRENT_SOURCE_DIR}/parser
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/parser/rpp
+ #${CMAKE_CURRENT_SOURCE_DIR}/parser/include
+)
+
+add_definitions(-DRXX_ALLOCATOR_INIT_0)
+
+## Build project
+find_package (Qt4 REQUIRED)
+set (QT_USE_QTMAIN true)
+set (QT_USE_QTGUI false)
+set (QT_USE_QTXML true)
+
+include(${QT_USE_FILE} ${CMAKE_CURRENT_SOURCE_DIR})
+
+set(inc_paths
+ ${inc_paths}
+ ${QT_INCLUDES}
+)
+set(lib_paths
+ ${lib_paths}
+ ${QT_LIBRARY_DIR}
+)
+set(libs
+ ${QT_LIBRARIES}
+)
+
+qt4_wrap_cpp(moc_srcs ${moc_hdrs})
+qt4_add_resources(res_wrapped_files ${res_files})
+
+set (all_srcs
+ ${srcs} ${moc_srcs}
+ ${res_wrapped_files})
+include_directories(${inc_paths})
+add_executable(generator ${all_srcs} )
+target_link_libraries(generator ${libs})
+
+## TODO: Precompilated header work well, but I don`t known license of PCHSupport_26.cmake.
+## downloaded from http://www.vtk.org/Bug/view.php?id=1260.
+#OPTION(USEPCH "Build the project with precompiled-headers" ON)
+#include(../cmake/PCHSupport_26.cmake)
+#
+#IF(NOT USEPCH)
+# MESSAGE(STATUS "NOT using precompiled-header")
+#ELSE(NOT USEPCH)
+# MESSAGE(STATUS "Using precompiled-header")
+# add_precompiled_header(generator ${CMAKE_CURRENT_SOURCE_DIR}/generator_pch.h)
+#ENDIF(NOT USEPCH)
+
+macro(add_dgen_target package)
+ string(TOLOWER ${package} package)
+ set(dgen_build_conf ${CMAKE_BINARY_DIR}/CMakeFiles/built_${package}.txt)
+ set(dgen_build_conf_req ${CMAKE_BINARY_DIR}/CMakeFiles/built_${package}_with_req.txt)
+ file(REMOVE ${dgen_build_conf})
+ file(REMOVE ${dgen_build_conf_req})
+ file(APPEND ${dgen_build_conf} "\n")
+ file(APPEND ${dgen_build_conf_req} "\n")
+ foreach(req ${ARGN})
+ string(TOLOWER ${req} req_lower)
+ file(APPEND ${dgen_build_conf} " \n")
+ file(APPEND ${dgen_build_conf_req} " \n")
+ endforeach(req ${ARGN})
+
+ if(${package} STREQUAL "all")
+ foreach(pack ${ARGN})
+ set(dgen_impl ${CMAKE_BINARY_DIR}/cpp/qt_${pack}/metainfo.cpp) ## Temporary
+ break(pack ${ARGN})
+ endforeach(pack ${ARGN})
+ else(${package} STREQUAL "all")
+ set(dgen_impl ${CMAKE_BINARY_DIR}/cpp/qt_${package}/qt_${package}.pri)
+ set(gen_sources ${gen_sources} ${CMAKE_SOURCE_DIR}/generator/typesystem_${package}.xml
+ ${CMAKE_SOURCE_DIR}/generator/typesystem_${package}-java.java)
+ file(APPEND ${dgen_build_conf} " \n")
+ file(APPEND ${dgen_build_conf_req} " \n")
+ endif(${package} STREQUAL "all")
+
+ file(APPEND ${dgen_build_conf} "\n")
+ file(APPEND ${dgen_build_conf_req} "\n")
+
+ foreach(pack ${ARGN})
+ string(TOLOWER ${pack} pack_lower)
+ set(gen_sources ${gen_sources} ${CMAKE_SOURCE_DIR}/generator/typesystem_${pack_lower}.xml
+ ${CMAKE_SOURCE_DIR}/generator/typesystem_${pack_lower}-java.java)
+ endforeach(pack ${ARGN})
+
+ add_custom_command(OUTPUT ${dgen_impl}
+ COMMAND ${CMAKE_COMMAND} -E remove -f ${dgen_impl}
+ COMMAND "generator"
+ ARGS ${GEN_OPT} --no-repreprocess --qt-include-directory=${QT_INCLUDE_DIR} --output-directory=./
+ --source-directory=${CMAKE_SOURCE_DIR}/generator
+ qtjambi_masterinclude.h
+ ${dgen_build_conf}
+ COMMENT "Generating binding..."
+ DEPENDS generator ${gen_sources}
+ )
+ add_custom_target(dgen_${package} DEPENDS ${dgen_impl} COMMENT "")
+endmacro(add_dgen_target target package required)
+
+foreach(pack ${packages})
+ set(gen_typesystem ${gen_typesystem} ${CMAKE_SOURCE_DIR}/generator/typesystem_${pack}.xml)
+ set(gen_sources ${gen_sources} ${CMAKE_SOURCE_DIR}/generator/typesystem_${pack}-java.java)
+endforeach(pack ${packages})
+
+set(dgen_build_conf ${CMAKE_BINARY_DIR}/CMakeFiles/build.txt)
+file(REMOVE ${dgen_build_conf})
+file(APPEND ${dgen_build_conf} "\n")
+foreach(package ${packages})
+ file(APPEND ${dgen_build_conf} " \n")
+endforeach(package ${packages})
+file(APPEND ${dgen_build_conf} "\n")
+
+# macro(add_sources_for_generating)
+# set(parameters_list_file ${CMAKE_BINARY_DIR}/CMakeFiles/dgen_parameters)
+# if(${CMAKE_SYSTEM_NAME} STREQUAL Windows)
+# file(REMOVE ${parameters_list_file})
+# foreach(arg ${ARGN})
+# file(APPEND ${parameters_list_file} "${arg}\n")
+# endforeach(arg)
+# set(param @${parameters_list_file})
+# elseif(${CMAKE_SYSTEM_NAME} STREQUAL Linux)
+# set(param ${parameters})
+# endif(${CMAKE_SYSTEM_NAME} STREQUAL Windows)
+# foreach(dgen_impl ${ARGN})
+# add_custom_command(OUTPUT ${dgen_impl}
+# COMMAND ${CMAKE_COMMAND} -E remove -f ${param}
+# COMMAND "generator"
+# ARGS ${GEN_OPT} --qt-include-directory=${QT_INCLUDE_DIR} --output-directory=${CMAKE_BINARY_DIR}
+# --source-directory=${CMAKE_SOURCE_DIR}/generator
+# qtjambi_masterinclude.h
+# ${CMAKE_BINARY_DIR}/CMakeFiles/build.txt
+# COMMENT "Generating binding..."
+# DEPENDS generator ${gen_typesystem} ${gen_sources}
+# )
+# endforeach(dgen_impl ${ARGN})
+# add_custom_target(dgen DEPENDS ${ARGN})
+# endmacro(add_sources_for_generating)
+
+set(gen_sources)
+foreach(package ${packages})
+ set(gen_sources ${gen_sources} ${CMAKE_SOURCE_DIR}/generator/typesystem_${package}.xml)
+ find_file(d_inc_file_found typesystem_${package}-java.java PATHS ${CMAKE_SOURCE_DIR}/generator/)
+ if(d_inc_file_found)
+ set(${CMAKE_SOURCE_DIR}/generator/typesystem_${package}-java.java)
+ endif(d_inc_file_found)
+endforeach(package ${packages})
+mark_as_advanced(d_inc_file_found)
+set(d_inc_file_found 1)
+
+foreach(package ${packages})
+ set(dgen_impl ${CMAKE_BINARY_DIR}/cpp/qt_${package}/qt_${package}.pri)
+ break(package ${packages})
+endforeach(package ${packages})
+
+add_custom_command(OUTPUT ${dgen_impl}
+ COMMAND ${CMAKE_COMMAND} -E remove -f ${dgen_impl}
+ COMMAND "generator"
+ ARGS ${GEN_OPT} --qt-include-directory=${QT_INCLUDE_DIR} --output-directory=${CMAKE_BINARY_DIR}
+ --source-directory=${CMAKE_SOURCE_DIR}/generator
+ qtjambi_masterinclude.h
+ ${CMAKE_BINARY_DIR}/CMakeFiles/build.txt
+ COMMENT "Generating binding..."
+ DEPENDS generator ${gen_sources}
+ )
+add_custom_target(dgen DEPENDS ${dgen_impl} COMMENT "")
+
+macro(add_sources_for_generating)
+ foreach(source ${ARGN})
+ add_custom_command(OUTPUT "${source}"
+ COMMAND ""
+ ARGS ""
+ DEPENDS ${dgen_impl}
+ COMMENT ""
+ )
+ endforeach(source ${ARGN})
endmacro(add_sources_for_generating)
\ No newline at end of file
diff -r 6d5eeec1d9a1 -r a860544c5ee8 generator/cppimplgenerator.cpp
--- a/generator/cppimplgenerator.cpp Sun Jun 07 14:05:29 2009 +0000
+++ b/generator/cppimplgenerator.cpp Sun Jun 07 14:31:36 2009 +0000
@@ -1375,7 +1375,10 @@
AbstractMetaFunctionList signal_funcs = signalFunctions(java_class);
if (cpp_shared)
- s << "EmitCallback emit_callbacks_" << java_class->name() << "[" << signal_funcs.size() << "];" << endl;
+ if(signal_funcs.size() > 0)
+ s << "EmitCallback emit_callbacks_" << java_class->name() << "[" << signal_funcs.size() << "];" << endl;
+ else
+ s << "EmitCallback emit_callbacks_" << java_class->name() << "[1];" << endl; // Hack for msvc.
else {
// D-side signal callbacks
for(int i = 0; i < signal_funcs.size(); i++) {
@@ -1383,7 +1386,10 @@
writeSignalHandler(s, java_class, signal);
}
- s << "EmitCallback emit_callbacks_" << java_class->name() << "[" << signal_funcs.size() << "] = {" << endl;
+ if(signal_funcs.size() > 0)
+ s << "EmitCallback emit_callbacks_" << java_class->name() << "[" << signal_funcs.size() << "] = {" << endl;
+ else
+ s << "EmitCallback emit_callbacks_" << java_class->name() << "[1] = {" << endl; // Hack for msvc.
for(int i = 0; i < signal_funcs.size(); i++) {
AbstractMetaFunction *signal = signal_funcs.at(i);
s << endl;