Perusahaan saya (sebut saja Acme Technology) memiliki perpustakaan sekitar seribu file sumber yang awalnya berasal dari grup riset Acme Labs, diinkubasi dalam grup pengembangan selama beberapa tahun, dan baru-baru ini diberikan kepada beberapa pelanggan di bawah tanpa pengungkapan. Acme bersiap-siap untuk melepaskan mungkin 75% dari kode ke komunitas open source. 25% lainnya akan dirilis nanti, tetapi untuk saat ini, tidak siap untuk digunakan pelanggan atau berisi kode yang terkait dengan inovasi masa depan yang mereka butuhkan untuk tetap berada di luar tangan para pesaing.
Kode saat ini diformat dengan #ifdefs yang memungkinkan basis kode yang sama untuk bekerja dengan platform pra-produksi yang akan tersedia untuk para peneliti universitas dan berbagai pelanggan komersial yang jauh lebih luas begitu masuk ke open source, sementara pada saat yang sama menjadi tersedia untuk eksperimen dan pembuatan prototipe serta pengujian kompatibilitas maju dengan platform masa depan. Mempertahankan basis kode tunggal dianggap penting untuk ekonomi (dan kewarasan) grup saya yang akan mengalami kesulitan mempertahankan dua salinan secara paralel.
File di basis kami saat ini terlihat seperti ini:
> // Copyright 2012 (C) Acme Technology, All Rights Reserved.
> // Very large, often varied and restrictive copyright license in English and French,
> // sometimes also embedded in make files and shell scripts with varied
> // comment styles.
>
>
> ... Usual header stuff...
>
> void initTechnologyLibrary() {
> nuiInterface(on);
> #ifdef UNDER_RESEARCH
> holographicVisualization(on);
> #endif
> }
Dan kami ingin mengubahnya menjadi seperti:
> // GPL Copyright (C) Acme Technology Labs 2012, Some rights reserved.
> // Acme appreciates your interest in its technology, please contact [email protected]
> // for technical support, and www.acme.com/emergingTech for updates and RSS feed.
>
> ... Usual header stuff...
>
> void initTechnologyLibrary() {
> nuiInterface(on);
> }
Apakah ada alat, parse library, atau skrip populer yang dapat menggantikan hak cipta dan menghapus tidak hanya #ifdefs, tetapi variasi seperti #jika ditentukan (UNDER_RESEARCH), dll.?
Kode saat ini di Git dan kemungkinan akan di-host di suatu tempat yang menggunakan Git. Akankah ada cara untuk menautkan repositori dengan aman bersama sehingga kita dapat mengintegrasikan kembali perbaikan kami dengan versi open source secara efisien? Saran tentang perangkap lain dipersilahkan.
sumber
Jawaban:
Tampaknya seperti itu tidak akan terlalu sulit untuk menulis script untuk mengurai preprosesor, membandingkannya dengan daftar konstanta didefinisikan (
UNDER_RESEARCH
,FUTURE_DEVELOPMENT
, dll) dan, jika direktif dapat dievaluasi untuk keterberian palsu apa yang didefinisikan, menghapus semuanya ke yang berikutnya#endif
.Dengan Python, saya akan melakukan sesuatu seperti,
Saya yakin ada cara yang lebih elegan untuk melakukannya, tetapi ini cepat dan kotor dan sepertinya menyelesaikan pekerjaan.
sumber
Saya berpikir tentang meneruskan kode Anda melalui preprocessor untuk hanya memperluas makro, sehingga hanya menghasilkan bagian yang menarik di
#ifdef
s.Sesuatu seperti ini seharusnya bekerja:
Tapi:
-CC
untuk (melestarikannya), tetapi Anda tetap harus menghapus pemberitahuan hak cipta yang lama#include
s juga diperluas, sehingga Anda akan berakhir dengan file besar yang berisi semua konten dari file header yang disertakanMungkin ada cara untuk membatasi makro mana yang diperluas; Namun saran saya di sini adalah untuk membagi hal-hal, daripada melakukan pemrosesan (berpotensi berbahaya) pada file (omong-omong, bagaimana Anda berencana untuk mempertahankannya setelah itu? misalnya memperkenalkan kembali kode dari versi opensource ke sumber tertutup Anda?).
Yaitu, coba letakkan kode yang Anda inginkan untuk membuka sumber di pustaka eksternal sebanyak mungkin, lalu gunakan kode itu seperti yang Anda lakukan dengan pustaka lain, diintegrasikan dengan pustaka sumber tertutup "khusus" lainnya.
Mungkin butuh sedikit lebih lama pada awalnya untuk mengetahui cara merestrukturisasi sesuatu, tapi itu jelas cara yang tepat untuk mencapai ini.
sumber
Saya punya solusi tetapi akan membutuhkan sedikit usaha
pypreprocessor adalah perpustakaan yang menyediakan preprocessor c-style murni untuk python yang juga dapat digunakan sebagai GPP (General Purpose Pre-Processor) untuk jenis kode sumber lainnya.
Inilah contoh dasar:
Preprosesor sangat sederhana. Itu membuat melewati sumber dan kondisional mengomentari sumber berdasarkan apa yang didefinisikan.
Tentukan dapat diatur baik melalui pernyataan #define di sumber atau dengan mengaturnya di daftar pypreprocessor.defines.
Mengatur parameter input / output memungkinkan Anda untuk secara eksplisit menentukan file mana yang dibuka / ditutup sehingga satu preprocessor dapat diatur untuk batch memproses sejumlah besar file jika diinginkan.
Mengatur parameter removeMeta ke True, preprocessor harus secara otomatis mengekstrak setiap dan semua pernyataan preprocessor hanya menyisakan kode pasca-pemrosesan.
Catatan: Biasanya ini tidak perlu diatur secara eksplisit karena python menghapus kode komentar secara otomatis selama kompilasi menjadi bytecode.
Saya hanya melihat satu case edge. Karena Anda mencari sumber preprocess C, Anda mungkin ingin mengatur prosesor mendefinisikan secara eksplisit (yaitu melalui pypreprocessor.defines) dan memintanya untuk mengabaikan pernyataan #define dalam sumber. Itu seharusnya mencegahnya secara tidak sengaja menghapus konstanta yang dapat Anda gunakan dalam kode sumber proyek Anda. Saat ini tidak ada parameter untuk mengatur fungsionalitas ini tetapi akan sepele untuk menambahkan.
Berikut ini contoh sepele:
Lalu sumbernya:
Catatan: Jelas, Anda harus memilah cara untuk mengatur file input / output tetapi itu tidak terlalu sulit.
Pengungkapan: Saya adalah penulis asli pypreprocessor.
Selain itu: Saya awalnya menulisnya sebagai solusi untuk masalah pemeliharaan 2k / 3x python yang ditakuti. Pendekatan saya adalah, lakukan pengembangan 2 dan 3 dalam file sumber yang sama dan hanya menyertakan / mengecualikan perbedaan menggunakan arahan preprocessor. Sayangnya, saya menemukan cara yang sulit bahwa tidak mungkin untuk menulis preprocessor murni murni (yaitu tidak memerlukan c) karena python lexer menandai kesalahan sintaks dalam kode yang tidak kompatibel sebelum preprocessor mendapatkan kesempatan untuk berjalan. Apa pun itu, tetap bermanfaat dalam berbagai keadaan termasuk kondisi Anda.
sumber
Mungkin itu ide yang bagus
1. tambahkan tag komentar seperti:
2. Tulis skrip untuk pembuat sumber terbuka untuk memeriksa semua file dan mengganti teks antara tag COPYRIGHT-BEGIN-TAG dan COPYRIGHT-ENG-TAG
sumber
Saya tidak akan menunjukkan kepada Anda alat untuk mengonversi basis kode Anda, banyak jawaban sudah melakukannya. Sebaliknya, saya menjawab komentar Anda tentang cara menangani cabang untuk ini.
Anda harus memiliki 2 cabang:
Preprosesor seharusnya tidak ada. Anda memiliki dua versi berbeda. Dan basis kode bersih secara keseluruhan.
Anda takut mempertahankan dua salinan secara paralel? Jangan khawatir, Anda bisa bergabung!
Jika Anda membuat modifikasi pada cabang komunitas, gabungkan saja di cabang profesional. Git menangani ini dengan sangat baik.
Dengan cara ini, Anda menyimpan 2 salinan basis kode yang dikelola. Dan melepaskan satu untuk open source semudah pie.
sumber