Skip to content

Commit

Permalink
CMakeLists.txt周辺整理
Browse files Browse the repository at this point in the history
  msvc判定をCMAKE_CXX_COMPILER_IDからMSVCへ統一
  exampleのCMakeLists.txt内容の整理とそれに伴い
    THEOLIZERConfig.cmakeとzz_process.cmakeを修正
    1.CMAKE_CXX_STANDARD群でC++11と非gnu拡張を指定
    2.警告レベルを上げた
    3.テストをビルドから独立(CTest仕様変更対応)
    4.CMAKE_DEBUG_POSTFIX削除
ソース・コードの若干の整理
  余分な ; の削除
  メンバ変数名変更対応準備のTHEOLIZER_INTERNAL_FIRST()を
  THEOLIZER_INTERNAL_UNPARENへ変更
v1.1.2へ変更

------ auto generated message by Theolizer
auto test(one-set) : PASS
TheolizerDriver  : d0d3ded1886ff69b796cd3e3d3e33b08
TheolizerLibrary : d120381d5a68a263d8f9be17c7646bfa
Library's Header : f8cdb0e57ebe487d0fd30db85ba904a1
------ end of message
  • Loading branch information
yossi-tahara committed Jun 27, 2017
1 parent 8b2b149 commit ea131eb
Showing 16 changed files with 89 additions and 92 deletions.
19 changes: 12 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
@@ -99,7 +99,7 @@ struct Foo

#include "example.cpp.theolizer.hpp" // Theolizer自動生成先

int main(int argc, char* argv[])
int main()
{
// 保存
{
@@ -142,18 +142,23 @@ int main(int argc, char* argv[])

### example.cppをビルドする手順

1. [Theolzierのダウンロード](http://doc.theolizer.com/html/_prepare.html#PrepareTheolizer)
2. [Theolizerドライバの準備](http://doc.theolizer.com/html/_prepare.html#ReplaceDriver)
3. [ビルド環境の自動生成(by CMake)とビルド](http://doc.theolizer.com/html/_how_to_make_project.html#Example)
1. [Theolzierのダウンロードとインストール](http://doc.theolizer.com/html/_prepare.html)
2. [ビルド環境の自動生成(by CMake)とビルド](http://doc.theolizer.com/html/_how_to_make_project.html#Example)

### リフレクションがあればよいのに
C#のように[リフレクション](https://goo.gl/XCRSND)を提供する言語なら可能ですか、C++はそのような機能を提供しておらず、我々のC++プログラムがクラスのメンバ変数のリストを得ることができません。(C++コンパイラは持っている情報ですので扱えそうな気もして、かなり深く調べましたが残念ながらできません。)<br>
### CMakeプロジェクトを作ってTheolizerを組み込む方法

それを clangのlibToolingの力を借りてできるようにしました。これにより、C++コンパイラが持っているクラスのメンバ変数リストとenum型のシンボル名を取り出して、自動シリアライズを実現しました。
公式サイトの[技術ブログ](https://theolizer.com/theolizer/cmake_and_cmakelists/)で解説しています。<br>
CMakeの基礎から解説していますので、CMakeの使い方を学びたい方も是非ご覧になって下さい。

---
<h1 id="Features">2.Theolizerの特長</h1>

C#のように[リフレクション](https://goo.gl/XCRSND)を提供する言語なら可能ですか、C++はそのような機能を提供しておらず、我々のC++プログラムがクラスのメンバ変数のリストを得ることができません。(C++コンパイラは持っている情報ですので扱えそうな気もして、かなり深く調べましたが残念ながらできません。)<br>

それを clangのlibToolingの力を借りてできるようにしました。これにより、C++コンパイラが持っているクラスのメンバ変数リストとenum型のシンボル名を取り出して、自動シリアライズを実現しました。<br>

そのTheolizerは、次のような特長を持っています。

## 2-1.自動シリアライズ
Theolizerは[Clang/LLVM](http://llvm.org/)に含まれるlibTooling[libTooling](http://qiita.com/Chironian/items/6021d35bf2750341d80c)の構文解析機能を用いてクラスやenum型の定義を解析し、メンバのリストを自動生成します。これにより、クラスやenum型を変更した時もメンバ・リストへの反映漏れが無く、プログラム開発が捗ります。

8 changes: 5 additions & 3 deletions build_tools/tools/zz_process.cmake
Original file line number Diff line number Diff line change
@@ -332,6 +332,8 @@ macro(build TARGET CONFIG_TYPE WORKING_DIR)
set(LABEL "TestF[2L].*")
elseif("${TARGET}" STREQUAL "FullTest3")
set(LABEL "TestF[3L].*")
elseif("${TARGET}" STREQUAL "example")
set(LABEL "")
endif()

if (NOT "${LABEL}" STREQUAL "")
@@ -385,14 +387,14 @@ macro(prepare_sample TARGET)

# サンプルのビルドと実行
if("${CONFIG_TYPE}" STREQUAL "")
build(BuildTest Release "${CMAKE_SOURCE_DIR}/${TARGET}")
build(example Release "${CMAKE_SOURCE_DIR}/${TARGET}")
set(TEMP_LOG2 "${TEMP_LOG2}${OUTPUT_LOG}")
if("${CI_SERVICE}" STREQUAL "")
build(BuildTest Debug "${CMAKE_SOURCE_DIR}/${TARGET}")
build(example Debug "${CMAKE_SOURCE_DIR}/${TARGET}")
set(TEMP_LOG2 "${TEMP_LOG2}${OUTPUT_LOG}")
endif()
else()
build(BuildTest ${CONFIG_TYPE} "${CMAKE_SOURCE_DIR}/${TARGET}")
build(example ${CONFIG_TYPE} "${CMAKE_SOURCE_DIR}/${TARGET}")
set(TEMP_LOG2 "${TEMP_LOG2}${OUTPUT_LOG}")
endif()

19 changes: 7 additions & 12 deletions source/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -39,7 +39,7 @@ message(STATUS "CI_SERVICE =${CI_SERVICE}")
# Project version
#-----------------------------------------------------------------------------

project(Theolizer VERSION 1.1.1)
project(Theolizer VERSION 1.1.2)
#set(TEMPORARY_VERSION "-Prerelease.")

message(STATUS "PROJECT_VERSION=${PROJECT_VERSION}${TEMPORARY_VERSION}")
@@ -101,11 +101,6 @@ message(STATUS "CpuCount=${CpuCount}")
# Get compiler informations
#-----------------------------------------------------------------------------

set(IS_MSVC OFF)
if (${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
set(IS_MSVC ON)
endif()

message(STATUS "CMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}")

#-----------------------------------------------------------------------------
@@ -133,11 +128,11 @@ endif()
# default compile options
#-----------------------------------------------------------------------------

if (${IS_MSVC})
if (MSVC)
add_definitions(-D_UNICODE -DUNICODE)
set(CMAKE_DEBUG_POSTFIX "d")
string(REPLACE "/W3 " "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4 /bigobj")
string(REPLACE "/W3 " "/W4 " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj")
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11")
endif()
@@ -166,7 +161,7 @@ set(INCLUDE_DIR include)
set(LIB_DIR lib)
set(SAMPLES_DIR samples)

if (NOT ${IS_MSVC})
if (NOT MSVC)
set(LIB_DIR "${LIB_DIR}/${CMAKE_BUILD_TYPE}")
endif()
message(STATUS "LIB_DIR=${LIB_DIR}")
@@ -365,7 +360,7 @@ function(add_test_function TARGET_NAME WILL_FAIL)
target_link_libraries(${TARGET_NAME} ${Boost_LIBRARIES})
endif()

if (${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC)
if (MSVC)
add_definitions(-D_UNICODE -DUNICODE)
foreach(LINK_LIB IN LISTS LIBRARY_LIST)
target_link_libraries(${TARGET_NAME} optimized ${LINK_LIB}.lib)
@@ -449,7 +444,7 @@ endif()

# ---<<< CMake Helper >>>---

if (${IS_MSVC})
if (MSVC)
install(FILES tools/theolizer.props.in DESTINATION .)
endif()

4 changes: 2 additions & 2 deletions source/driver/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -98,7 +98,7 @@ add_dependencies(LongTest TheolizerDriver)

target_link_libraries(TheolizerDriver ${Boost_LIBRARIES})

if (NOT IS_MSVC)
if (NOT MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-comment")
endif()
@@ -147,7 +147,7 @@ message(STATUS "CMAKE_CXX_FLAGS_RELEASE = ${CMAKE_CXX_FLAGS_RELEASE}")

install(TARGETS TheolizerDriver CONFIGURATIONS Release DESTINATION ${BIN_DIR})

if (IS_MSVC)
if (MSVC)
install(FILES $<TARGET_FILE:TheolizerDriver>
CONFIGURATIONS Release
DESTINATION msbuild-bin
10 changes: 5 additions & 5 deletions source/library/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -129,7 +129,7 @@ message(STATUS "DEBUG_LIBS =${DEBUG_LIBS}")

# extract *.o files from libboost*.a and make list(OBJECT_FILES) for add_library
set(OBJECT_FILES "")
if (NOT ${IS_MSVC} AND ${STATIC_WITH_BOOST})
if ((NOT MSVC) AND ${STATIC_WITH_BOOST})
if ((${CMAKE_BUILD_TYPE} STREQUAL Release) OR (${CMAKE_BUILD_TYPE} STREQUAL MinSizeRel))
set(LINK_LIB_LIST ${RELEASE_LIBS})
else()
@@ -156,7 +156,7 @@ endif()
if(${BUILD_SHARED_LIBS})
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DTHEOLIZER_DYN_LINK")

if (NOT ${IS_MSVC})
if (NOT MSVC)
if(WIN32)
else()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden")
@@ -175,7 +175,7 @@ add_dependencies(${TheolizerLib} checkBuildSystem)
version_at_build(${TheolizerLib} "/theolizer/internal" "${VERSION_SOURCE}")

# boostをTheolizerLibにパッケージする場合(MSVC)
if (${IS_MSVC} AND ${STATIC_WITH_BOOST})
if (MSVC AND ${STATIC_WITH_BOOST})
# This is a measure to fix the trouble.
# POST_BUILD run always when cmake "--build ."
set_target_properties(${TheolizerLib} PROPERTIES OUTPUT_NAME ${TheolizerLib}Tmp)
@@ -200,7 +200,7 @@ else()
install(TARGETS ${TheolizerLib} DESTINATION ${LIB_DIR})
endif()

if (${IS_MSVC})
if (MSVC)
file(GLOB_RECURSE PDBS ${CMAKE_CURRENT_BINARY_DIR}/*.dir/Debug/*.pdb)
message(STATUS "PDBS=${PDBS}")
install(FILES ${PDBS} DESTINATION ${LIB_DIR})
@@ -213,7 +213,7 @@ add_dependencies(${TheolizerTest} checkBuildSystem)
target_link_libraries(${TheolizerTest} ${TheolizerLib})

# for boost test
if (${IS_MSVC})
if (MSVC)
set_target_properties(${TheolizerTest} PROPERTIES COMPILE_FLAGS "/EHa")
endif()

6 changes: 3 additions & 3 deletions source/library/theolizer/internal/core.h
Original file line number Diff line number Diff line change
@@ -722,7 +722,7 @@ class Element : public ElementBase

#define THEOLIZER_INTERNAL_REGISTER_ELEMENT(dName,dNextName,dTrack,dDest,dType,dVerNo,dVer)\
{ \
/*要素名*/ THEOLIZER_INTERNAL_STRINGIZE(THEOLIZER_INTERNAL_FIRST dName),\
/*要素名*/ THEOLIZER_INTERNAL_STRINGIZE(THEOLIZER_INTERNAL_UNPAREN dName),\
/*Is基底クラス*/ false, \
/*保存先*/ {THEOLIZER_INTERNAL_UNPAREN dDest}, \
/*TypeIndex関数*/ \
@@ -735,13 +735,13 @@ class Element : public ElementBase
[](tBaseSerializer& iSerializer, TheolizerVersion& iInstance) \
{ \
THEOLIZER_INTERNAL_SAVE(iSerializer, \
iInstance.THEOLIZER_INTERNAL_FIRST dName, dTrack); \
iInstance.THEOLIZER_INTERNAL_UNPAREN dName, dTrack); \
}, \
/*回復関数*/ \
[](tBaseSerializer& iSerializer, TheolizerVersion& iInstance) \
{ \
THEOLIZER_INTERNAL_LOAD(iSerializer, \
iInstance.THEOLIZER_INTERNAL_FIRST dName, dTrack); \
iInstance.THEOLIZER_INTERNAL_UNPAREN dName, dTrack); \
}, \
/*(次バージョンの要素名)*/ \
#dNextName, \
4 changes: 2 additions & 2 deletions source/library/theolizer/internal/core_type_info.h
Original file line number Diff line number Diff line change
@@ -1353,7 +1353,7 @@ void RegisterPointeeUnderlying
uIsDerived,
uIsManual
>::getInstance().setPointee();
};
}

//----------------------------------------------------------------------------
// 配列の場合、基本型を登録する関数本体
@@ -1432,7 +1432,7 @@ void RegisterPointeeUnderlying
uIsDerived,
uIsManual
>::registerType();
};
}

// ***************************************************************************
// Switcher2(管理する型毎に特殊化する)
2 changes: 1 addition & 1 deletion source/library/theolizer/internal/serializer_fast.cpp
Original file line number Diff line number Diff line change
@@ -64,7 +64,7 @@ namespace internal
namespace
{
GlobalVersionNoTableBase const*const sGlobalVersionNoTable=
GlobalVersionNoTable<1>::getInstance();;
GlobalVersionNoTable<1>::getInstance();
} // namespace

//############################################################################
2 changes: 1 addition & 1 deletion source/library/theolizer/internal/test_tool.cpp
Original file line number Diff line number Diff line change
@@ -155,7 +155,7 @@ PrepareDir::~PrepareDir()
boost::system::error_code error;
boostF::remove_all(mDirPath, error);
}
};
}

// ***************************************************************************
// ファイル/フォルダの有無チェック
Loading

0 comments on commit ea131eb

Please sign in to comment.