2023年10月28日土曜日

ゼロからのCMake(1)

今まで避けてきた「CMake」に今さら挑戦するっていうちょっと恥ずい取り組み。

参考サイトはこちら。すばらしい。CMakeはインストールされているとして、はじめてのCMakeプロジェクトをやってみる。


.cppとしながらも、中身はC的なソースコード。
ではビルドして実行してみる。
できた。
./buildの中にいろんなものがてきちゃうので、hello worldをCMakeでビルドするのは正義かどうか悩んじゃうけど、お勉強ですので。
こちら、説明とか一切書かずに参考サイトにもたれっきりの記事なので、次の項目までやる。

ここでは過去自力で作成したKeeloqを題材にする。

./study2.cpp
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include "keeloq/include/keeloq.hpp"
  4. int main(int argc,char** argv){
  5. uint32_t pr=0xf741e2db;
  6. uint64_t kr=0x5cec6701b79fd949;
  7. uint32_t cr;
  8. cr=keeloq_enc(pr,kr);
  9. printf("%08X\n",cr);
  10. pr=keeloq_dec(cr,kr);
  11. printf("%08X\n",pr);
  12. return 0;
  13. }
./CMakeLists.txt
  1. cmake_minimum_required(VERSION 3.1)
  2. project(study2 CXX)
  3. add_subdirectory(./keeloq)
  4. add_executable(study2 study2.cpp)
  5. target_link_libraries(study2 keeloq)
./keeloq/CMakeLists.txt
  1. cmake_minimum_required(VERSION 3.1)
  2. project(keeloq_lib
  3. VERSION 1.0.0
  4. DESCRIPTION "Keeloq library"
  5. LANGUAGES CXX)
  6. add_library(keeloq STATIC ./src/keeloq.cpp)
  7. #target_compile_features(keeloq PRIVATE cxx_std_11)
  8. target_include_directories(keeloq INTERFACE ./include)
  9. set_target_properties(keeloq
  10. PROPERTIES
  11. VERSION ${PROJECT_VERSION})
./keeloq/include/keeloq.hpp
  1. #ifndef _KEELOQ_H_
  2. #define _KEELOQ_H_
  3. #include <stdint.h>
  4. uint32_t keeloq_enc(uint32_t pr,uint64_t kr);
  5. uint32_t keeloq_dec(uint32_t cr,uint64_t kr);
  6. #endif
./keeloq/src/keeloq.cpp
  1. #include <stdint.h>
  2. uint32_t keeloq_enc(uint32_t pr,uint64_t kr){
  3. uint32_t nlf_table=0x3a5c742e;
  4. uint32_t nlf_arg;
  5. uint32_t nlf;
  6. uint32_t newz;
  7. uint32_t i;
  8. for(i=0;i<528;i++){
  9. nlf_arg=((pr&0x80000000)>>(31-4))
  10. |((pr&0x04000000)>>(26-3))
  11. |((pr&0x00100000)>>(20-2))
  12. |((pr&0x00000200)>>(9-1))
  13. |((pr&0x00000002)>>(1-0));
  14. nlf=((nlf_table>>nlf_arg)&0x00000001);
  15. newz=nlf^((pr&0x00010000)>>16)^(pr&0x00000001)^(uint32_t)(kr&0x0000000000000001);
  16. pr=(newz<<31)|(pr>>1);
  17. kr=((kr&0x0000000000000001)<<63)|(kr>>1);
  18. }
  19. return pr;
  20. }
  21. uint32_t keeloq_dec(uint32_t cr,uint64_t kr){
  22. uint32_t nlf_table=0x3a5c742e;
  23. uint32_t nlf_arg;
  24. uint32_t nlf;
  25. uint32_t newz;
  26. uint32_t i;
  27. for(i=0;i<528;i++){
  28. nlf_arg=((cr&0x40000000)>>(30-4))
  29. |((cr&0x02000000)>>(25-3))
  30. |((cr&0x00080000)>>(19-2))
  31. |((cr&0x00000100)>>(8-1))
  32. |((cr&0x00000001)>>(0-0));
  33. nlf=((nlf_table>>nlf_arg)&0x00000001);
  34. newz=nlf^((cr&0x00008000)>>15)^((cr&0x80000000)>>31)^(uint32_t)((kr&0x0000000000008000)>>15);
  35. cr=(cr<<1)|(newz);
  36. kr=((kr&0x8000000000000000)>>63)|(kr<<1);
  37. }
  38. return cr;
  39. }

相変わらずの、いきなりな感じ。まぁ詳しくは参考サイトを見てほしす。おじさんはただただ賢者の足跡をたどるのみ。
はいー。うまく行きましたよ。
イイネCMake。


0 件のコメント:

コメントを投稿